Keresés

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

  • Jester01

    veterán

    válasz vimes #5566 üzenetére

    csharp> int x = 125;
    csharp> Math.Round(x/100.0,0)*100
    100
    csharp> int x = 175;
    csharp> Math.Round(x/100.0,0)*100
    200

    Vagy

    csharp> int x = 125;
    csharp> int mod = x % 100;
    csharp> x - mod + ((mod >= 50) ? 100 : 0);
    100
    csharp> int x = 175;
    csharp> int mod = x % 100;
    csharp> x - mod + ((mod >= 50) ? 100 : 0);
    200

    Negatív számokkal vigyázni ;)

  • Karma

    félisten

    válasz vimes #5473 üzenetére

    Nagyon hasonlít a többdimenziós tömbre, épp csak semmi köze hozzá. :U

    A lényegi különbség az, hogy míg a tömböket az elemek sorszámával indexeled, és csak így tudsz benne keresni; a dictionaryben lévő elemeket a kulcs (első paraméter) szerint közvetlenül előszedheted, nem kell ciklusban bejárni.

    Például ha van egy Dictionary<string, List<string>>-ed, amiben a következő elemeket tárolod (pszeudokód, nem C#!):

    d = {
    "6262" => ["mama", "nana"],
    "272" => ["arc"],
    ...
    }

    Akkor d["6262"] hívással azonnal megkapod a hozzá tartozó kételemű listát.

    De persze csinálhatsz többdimenziós tömböket is, éljen a korlátolt Pascal szelleme, mit érdekel engem... Feltéve hogy ha mérnök informatikus pályára készülsz megfogadod, hogy mindezt a tébolyt elfelejted és megtanulod rendesen használni a nyelvet.

  • Karma

    félisten

    válasz vimes #5464 üzenetére

    Változtatás nélkül futtattam a kódod, nekem rendben kiírta a fájlt. Valamit elnézhettél.

    Széljegyzetek vol. 2:
    - Az egy darab stringnek felesleges külön structot létrehozni, használd közvetlenül a string típust.
    - Kézzel csukogatás helyett használd a using kulcsszót a StreamReader és a StreamWriter használata körül. Egyébként is szerencsésebb azonnal lezárni a fájlt amint végeztél vele, mint a program végén.
    - A szó-szám konverziót mégiscsak ki kéne tenni külön metódusba, mert felesleges háromszor leírni. Sőt.

  • Karma

    félisten

    válasz vimes #5464 üzenetére

    Azt még nem látom (telefonon olvasva a kódot), hogy mi baja van a kiírásnak - látom a writer le van zárva, az lett volna az első gyanúsítottam.

    A 7-8-9. feladatokhoz az kellene, hogy a mostani szólista helyett egy Dictionaryt építs, ami a az egyes kódokhoz hozzárendeli azon szavak listáját, amikhez az a kód tartozik.

    Így a hetedik feladat egy egyszerű kiíratás, a nyolcadik egy tökegyszerű ciklusban kiíratás, a kilencedik meg egy maximumkeresés (a leghosszabb listát keresed a dictionaryben).

    Széljegyzet: Az abc char[] teljesen felesleges, mert a stringnek is van [] művelete, és pont ugyanazt csinálja, mint a házi char[]-öd.

  • Goose-T

    veterán

    válasz vimes #5405 üzenetére

    Teljesen normális, hogy ilyen a programozás oktatásának a színvonala. Aki rendesen ért a programozáshoz, az minek szívjon tanári fizetésért, amikor röhögve megkeresheti a többszörösét itthon? Én tíz éve többet kerestem totál kezdő programozóként, mint most egy tanár. :D Egy dologra jó, hogy oktatják a középiskolában: aki fogékony, annak talán felkelti a figyelmét, és önszorgalomból megtanul rendesen programozni, mert érdekli. Én is így voltam még a kilencvenes években, amikor Videoton TV Computereken tanítgattak nekünk BASIC-et. :) Semmit nem ért az oktatás, de "megcsapott a mozdony füstje", és onnantól rá voltam kattanva a programozásra.

  • 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 #5367 üzenetére

    Most csak ezt módosítottam, azért nem látsz változtatást.

  • 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 { };
    }
    }
    }
    }

  • vimes

    senior tag

    válasz vimes #5364 üzenetére

    Jah, a forráskód kimaradt:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;

    namespace futar2
    {
    class Program
    {
    struct adat
    {
    public int nap, dik, tav;
    }
    static adat[] fuvar = new adat[280];
    static int ind = 0;
    static void Main(string[] args)
    {
    //1. feladat:
    Console.WriteLine("1. feladat: Az adatok beolvasása.");
    StreamReader sr = new StreamReader ("tavok.txt");
    string sor = sr.ReadLine();
    while (sor != null)
    {
    string egy = "";
    string ketto = "";
    string harom = "";
    int index = 0;
    int hossz = sor.Length - 1;
    while (sor[index] != ' ')
    {
    egy += sor[index];
    index++;
    }
    index++;
    while (sor[index] != ' ')
    {
    ketto += sor[index];
    index++;
    }
    index++;
    while (index <= hossz)
    {
    harom += sor[index];
    index++;
    }
    fuvar[ind].nap = int.Parse(egy);
    fuvar[ind].dik = int.Parse(ketto);
    fuvar[ind].tav = int.Parse(harom);
    ind++;
    sor = sr.ReadLine();
    }
    //2. feladat:
    Console.Write("2. feladat: ");
    int minnap = 8;
    for (int i = 0; i < ind; i++)
    {
    if (fuvar[i].nap < minnap) minnap = fuvar[i].nap; else { };
    }
    for (int i = 0; i < ind; i++)
    {
    if (fuvar[i].nap == minnap && fuvar[i].dik == 1) Console.WriteLine("A hét legelső útja {0} km volt.", fuvar[i].tav); else { };
    }
    //3. feladat:
    Console.Write("3. feladat: ");
    int maxnap = 0;
    int maxdik = 0;
    for (int i = 0; i < ind; i++)
    {
    if (fuvar[i].nap > maxnap) maxnap = fuvar[i].nap; else { };
    }
    for (int i = 0; i < ind; i++)
    {
    if (fuvar[i].nap == maxnap&&fuvar[i].dik>maxdik) maxdik = fuvar[i].dik; else { };
    }
    for (int i = 0; i < ind; i++)
    {
    if (fuvar[i].nap == maxnap && fuvar[i].dik == maxdik) Console.WriteLine("A hét utolsó útja {0} km volt.", fuvar[i].tav); else { };
    }
    //4. feladat:
    Console.Write("4. feladat: ");
    int h = 0;
    int k = 0;
    int sze = 0;
    int cs = 0;
    int p = 0;
    int szo = 0;
    int v = 0;
    for(int i=0;i<ind;i++)
    {
    switch(fuvar[i].nap)
    {
    case 1: h++;break;
    case 2: k++;break;
    case 3: sze++; break;
    case 4: cs++; break;
    case 5: p++;break;
    case 6: szo++;break;
    case 7: v++;break;
    default: {};break;
    }
    }
    Console.Write("A hét ezen napjain nem dolgozott a futár: ");
    if (h == 0) Console.Write("1. "); else { };
    if (k == 0) Console.Write("2. "); else { };
    if (sze == 0) Console.Write("3. "); else { };
    if (cs == 0) Console.Write("4. "); else { };
    if (p == 0) Console.Write("5. "); else { };
    if (szo == 0) Console.Write("6. "); else { };
    if (v == 0) Console.Write("7. "); else { };
    Console.WriteLine();
    //5. feladat
    Console.Write("5. feladat: ");
    int maxdarab = 40;
    int kulonbseg = 40;
    if ((maxdarab - h) < kulonbseg) kulonbseg = maxdarab - h; else { };
    if ((maxdarab - k) < kulonbseg) kulonbseg = maxdarab - k; else { };
    if ((maxdarab - sze) < kulonbseg) kulonbseg = maxdarab - sze; else { };
    if ((maxdarab - cs) < kulonbseg) kulonbseg = maxdarab - cs; else { };
    if ((maxdarab - p) < kulonbseg) kulonbseg = maxdarab - p; else { };
    if ((maxdarab - szo) < kulonbseg) kulonbseg = maxdarab - szo; else { };
    if ((maxdarab - v) < kulonbseg) kulonbseg = maxdarab - v; else { };
    Console.Write("A hét ezen napján volt a legtöbb fuvar: ");
    if ((maxdarab - h) == kulonbseg) Console.Write("1. "); else { };
    if ((maxdarab - k) == kulonbseg) Console.Write("2. "); else { };
    if ((maxdarab - sze) == kulonbseg) Console.Write("3. "); else { };
    if ((maxdarab - cs) == kulonbseg) Console.Write("4. "); else { };
    if ((maxdarab - p) == kulonbseg) Console.Write("5. "); else { };
    if ((maxdarab - szo) == kulonbseg) Console.Write("6. "); else { };
    if ((maxdarab - v) == kulonbseg) Console.Write("7. "); else { };
    Console.WriteLine();
    //6. feladat:
    Console.WriteLine("6. feladat: Az egyes napokon megtett távok:");
    int elso = 0;
    int masodik = 0;
    int harmadik = 0;
    int negyedik = 0;
    int otodik = 0;
    int hatodik = 0;
    int hetedik = 0;
    for (int i = 0; i < ind; i++)
    {
    switch (fuvar[i].nap)
    {
    case 1: elso+=fuvar[i].tav; break;
    case 2: masodik += fuvar[i].tav; break;
    case 3: harmadik += fuvar[i].tav; break;
    case 4: negyedik += fuvar[i].tav; break;
    case 5: otodik += fuvar[i].tav; break;
    case 6: hatodik += fuvar[i].tav; break;
    case 7: hetedik += fuvar[i].tav; break;
    default: { }; break;
    }
    }
    Console.WriteLine("1. nap: {0} km", elso);
    Console.WriteLine("2. nap: {0} km", masodik);
    Console.WriteLine("3. nap: {0} km", harmadik);
    Console.WriteLine("4. nap: {0} km", negyedik);
    Console.WriteLine("5. nap: {0} km", otodik);
    Console.WriteLine("6. nap: {0} km", hatodik);
    Console.WriteLine("7. nap: {0} km", hetedik);
    //7. feladat:
    Console.Write("7. feladat: Kérek egy tetszőleges távolságot kilométerben: ");
    int bekert = int.Parse(Console.ReadLine());
    if (bekert <= 2) Console.WriteLine("A futár 500 Ft-ot kap."); else { if (bekert <= 5) Console.WriteLine("A futár 700 Ft-ot kap."); else { if (bekert <= 10) Console.WriteLine("A futár 900 Ft-ot kap."); else { if (bekert <= 20) Console.WriteLine("A futár 1400 Ft-ot kap."); else Console.WriteLine("A futár 2000 Ft-ot kap."); } } }
    //8.feladat:
    Console.WriteLine("8. feladat: Az adatok kiírása a dijazas.txt állományba.");
    FileStream fs = new FileStream("dijazas.txt", FileMode.Create);
    StreamWriter sw = new StreamWriter(fs);
    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 { };
    }
    }
    }
    //9. feladat:
    Console.WriteLine("9. feladat: ");
    int osszeg = 0;
    for (int i = 0; i < ind; i++)
    {
    if (fuvar[i].tav <= 2) osszeg += 500; else { if (fuvar[i].tav <= 5) osszeg += 700; else { if (fuvar[i].tav <= 10) osszeg += 900; else { if (fuvar[i].tav <= 20) osszeg += 1400; else osszeg += 2000; } } }
    }
    Console.Write("A futár a heti munkájáért {0} Ft-ot kap.", osszeg);
    Console.ReadKey();
    }
    }
    }

    A gyakorlottaknak nyilván lenne egy-két hozzáfűznivalója a forráskódhoz :)

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

Hirdetés