Többdimenziós tömbből értékeket szeretnék beolvasni, de nem sikerül megoldanom, hogyan lehetne ezt megvalósítani? (többi lent)
ZH-n egy akasztófás játékot kellett csinálni, graphics osztállyal kellett kirajzolni, egy pontosvesszővel tagolt tömbből az értékeket, és nem sikerül az értékek megfelelő kiolvasása, egy 10 soros és 4 oszlopos mátrixba kellene beolvasnom az értéket, az elv meg is van, és működik is csak nem megfelelően
StreamReader sr = new StreamReader("akasztófa.csv");
while (!sr.EndOfStream)
{
for (int i = 0; i < 10; i++)
{
string sor = sr.ReadLine();
string[] seged = sor.Split(';');
for (int j = 0; j < 4; j++)
{
koordináták[i, j] = int.Parse(seged[j]);
}
}
}
itt lenne az a programkód rész, ami nem működik megfelelően, betettem egy breakpointot és néztem az értékeket, amiket beolvas, és az a baj hogy a sor változóból ugyanazokat az értékeket olvassa ki mindig, mivel amíg a for cikluson nem megy túl, addig nem ugrik vissza a while ciklusra és olvassa be a következő sort a tömbbe, már próbálgattam a ciklusokat máshogy egymásba ágyazni, de sehogyan sem akar sikerülni.
Amúgy itt a teljes kód:
class Akasztófa : PictureBox
{
private int _HibákSzáma;
public int HibákSzáma
{
get { return _HibákSzáma; }
set {
Rajzol();
_HibákSzáma = value; }
}
private int[,] koordináták = new int[10, 4];
public Akasztófa()
{
this.Height = 320;
this.Width = 320;
StreamReader sr = new StreamReader("akasztófa.csv");
while (!sr.EndOfStream)
{
for (int i = 0; i < 10; i++)
{
string sor = sr.ReadLine();
string[] seged = sor.Split(';');
for (int j = 0; j < 4; j++)
{
koordináták[i, j] = int.Parse(seged[j]);
}
}
}
sr.Close();
}
private void Rajzol()
{
Graphics g = this.CreateGraphics();
g.Clear(Akasztófa.DefaultBackColor);
Pen toll = new Pen(Color.Black, 1);
for (int i = 0; i < 10; i++)
{
if (i < HibákSzáma && i!= 5)
{
g.DrawLine(toll, koordináták[i, 0], koordináták[i, 1], koordináták[i,2], koordináták[i,3]);
}
else if (i==5)
{
g.DrawEllipse(toll, koordináták[i, 0], koordináták[i, 1], koordináták[i, 2], koordináták[i, 3]);
}
}
}
}
Elöljáróban jó tanácsok (tudom, hogy kezdő vagy, de épp azért írom):
1) Szokj rá az angol nevek használatára.
2) Nézz meg egy Microsoft ajánlást a névkonvenciókra
3) A fájl beolvasását rakd egy using blokkba:
using (var sr = new StreamReader("akasztofa.csv")) {
// Beolvasás
}
4) Fájlbeolvasást nem illik konstruktorban megírni
5) A "HibákSzáma" property-ben előbb írd meg az új értéket, és aztán rajzolj
Lássuk...
Túl sok a ciklusod. A külső while ciklust én így írnám meg:
string line;
int row = 0;
while ((line = sr.ReadLine()) != null) {
string rowData = line.Split(';');
for (var j = 0; j < 4; j++) {
coordinates[row, j] = int.Parse(rowData[j]);
}
row++;
}
Vagyis: Beolvasol egy új sort a while ciklus feltételében, és rögtön meg is nézed, hogy kaptál-e valamit. Ha null, amit kaptál, tutira elérted a fájl végét, nincs több dolgod. A while ciklus magjában a beolvasott sort ugyanúgy feldolgozod, mint eddig, majd a ciklus után eggyel növeled a 'row' változódat, ami az aktuális tömbre mutat.
Ezt a kódot még ki kell egészítened az alábbiak kezelésével:
1) Mi van, ha több, mint 10 sor van?
2) Mi van, ha kevesebb, mint 4 oszlop van egy sorban?
3) Mi van, ha egy cella értéke nem alakítható át integerre? (Mert üres, vagy az van benne, hogy 'okosmajom')
Köszönöm szépen a segítséget! Igen még viszonylag kezdő vagyok 2-3 hónapos tudással, de az angolra való áttérést már elkezdtem csak itt elég sok minden meg volt adva, hogyan legyen elnevezve, és ha már a függvények magyarul vannak elnevezve, nem akartam keverni a nyelveket is, meg zh közben erre nem is annyira figyeltem, a konstruktorban való beolvasás pedig ugyancsak a feladatlapon volt. Igen a kivétel kezelés is hiányos, mivel adott volt a fájl, és ezért csak abból lévén a beolvasás nem igazán fordulhat elő más eset.
Itt a feladatsorról egy kép:
Esetleg ha érdekel
Kíváncsi voltam a feladatlapra, de a kepfeltoltes.hu fertőzött. Sajnos ismerem a helyzetet, hogy az iskolákban a programozás tanítás finoman szólva is hagy kívánni valókat maga után.
Persze, értem én, hogy az éremnek két oldala van: tudok sok olyan helyről, ahol nem tartozik a legfontosabb tárgyak közé a programozás, és csak a kreditekért mennek, ezért az oktatók a hallgatók számára a létező legegyszerűbben akarják megoldani a dolgot, csak nem feltétlen értek egyet vele.
Persze ha a vizsgán így kérik, akkor így kell csinálni... :/
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!