Keresés

Új hozzászólás Aktív témák

  • Karma

    félisten

    válasz vimes #5365 üzenetére

    Nos akkor.

    Egy általános észrevétel előre. Úgy látom a közoktatás le van ragadva azon a szinten, hogy korlátozott Pascal programozást tanítanak C# nyelven. (Erről már volt szó korábban, csak bebizonyosodik.)ű

    Azt még elfogadom sok szemöldökborzolás mellett, hogy a LINQ 2 Objectset nem tanítják - mert így az összes érettségi feladat megoldható lenne egy-egy sorban -, de tömbök? Komolyan? Mindkettőtöknél nagyon megy ez, ezért hiszem hogy valami központi oka van...

    Konkrétan akkor a bajok. A kozmetikai dolgokba, mint kis-nagybetűk, nem megyek bele.

    Ott kezdődik, hogy static tagváltozókban van az adat, de mégis minek? A main függvény dolgozik csak vele, simán mehet oda lokális változónak. A static adatmezők, más néven globális változók csak bajt hoznak, ha hozzászoktok, és mondjuk a jövőben programozni is akartok. Más szakmák esetén mindegy; de akkor a hozzászólásom többi része is irreleváns.

    Az adat struktúra elmegy szódával, viszont mint mondtam, nem tömbben kéne tárolni. Vannak a C#-ban nagyon jó lista szerkezetek, amik tudják magukról, hogy hány elem van bennük - ezzel az ind változó feleslegessé válik.

    A List<T> a legegyszerűbb ezek közül. A Count-on keresztül eléred az aktuális darabszámot, és vannak metódusai elem hozzáadáshoz (Add) és törléshez is (Remove). Meg lehet szögletes zárójellel az akárhanyadik elemet manipulálni.

    Tehát így néz ki a program eleje eddig:

    ...

    class Program
    {
    struct adat
    {
    public int nap, dik, tav;
    }

    static void Main(string[] args)
    {
    var fuvar = new List<adat>();
    ... folyt köv...
    }
    }

    Az első feladatnál is kéne használni usingot a StreamReader köré. Ezen kívül a karakterenként feldolgozás feleslegesen lábbalhajtós. A soronkénti beolvasásig jó, utána kitör a WWIII. A sort fel tudod darabolni a Split metódussal a szóközök mentén, és azonnal kipotyog a három külön szöveg.

    // 1. feladat
    string sor = sr.ReadLine();

    while (sor != null)
    {
    string[] elemek = sor.Split(' ');
    adat f = new adat();
    f.nap = int.Parse(elemek[0]);
    f.dik = int.Parse(elemek[1]);
    f.tav = int.Parse(elemek[2]);
    fuvar.Add(f);

    sor = sr.ReadLine();
    }

    Egy csöppet rövidebb és olvashatóbb, nem?

    Aztán mivel nincs ind, a ciklusokat fuvar.Count-ig kell járatni. Ez több helyen változtat a dolgon.

    Na most első körben itt megállnék, mert nem akarom túlterhelni a fórumot. Egy kicsit nehezemre esik LINQ nélkül gondolkodni, mert tényleg egy sorba összeesnének vele a feladatok :) De lehet inkább beadom a derekam és bevillantom a szebb világ képét.

    Még annyi, hogy az üres else {} ágakat teljesen felesleges kiírni, de legalább olvashatatlan.

  • Karma

    félisten

    válasz vimes #5365 üzenetére

    Erre kapásból látszik a válasz: nem zártad be a fájlt. A legegyszerűbb, ha rászoksz a using kulcsszó használatára.

    Vannak itt azért más gondok is, de a konkrét kérdésedre ez a válasz.
    Holnap ki tudom fejteni a többit.

    using(StreamWriter sw = new StreamWriter(new FileStream("dijazas.txt", FileMode.Create))
    {
    for (int i = 1; i <= 7; i++)
    {
    for (int j = 1; j <= 40; j++)
    {
    for (int g = 0; g < ind; g++)
    {
    if (fuvar[g].nap == i && fuvar[g].dik == j)
    {
    sw.Write("{0}. nap {1}. út: ", i, j);
    if (fuvar[g].tav <= 2) sw.WriteLine("500 Ft"); else { if (fuvar[g].tav <= 5) sw.WriteLine("700 Ft"); else { if (fuvar[g].tav <= 10) sw.WriteLine("900 Ft"); else { if (fuvar[g].tav <= 20) sw.WriteLine("1400 Ft"); else sw.WriteLine("2000 Ft"); } } }
    }
    else { };
    }
    }
    }
    }

Új hozzászólás Aktív témák