Ebben a feladatban 2db csv fájlt kell beolvasni és feldolgozni, és 1db csv fájlt kell létrehozni.
Mindkét forrás fájl ugyanolyan szerkezetű, a versenyzők adatait tartalmazzák soronként. Minkettő fájlnak van fejléce, amivel nem kell most semmit csinálni, elég átugrani. Megoldandó probléma, hogy tizedesvessző helyett pontot tartalmaz mindkét csv, tehát le kell cserélni beolvasáskor tizedesvesszőre. (Replace(mit,mire)) Természetesen konvertálni kell double típusra is.
Az első feladatot osztály segítségével oldottuk meg. Felvettem egy osszPont nevű változót is, ami a versenyző összpontszámát fogja tárolni.
A második feladat egyszerű, csak a rovidprogram lista elemszámát kell kiíratni.
A harmadik feladat is egyszerű, sima eldöntés. Meg kell vizsgálni, van-e magyar versenyző a döntőben. Ha igen, akkor nem is folytatjuk tovább a keresést, kilépünk a for ciklusból.
A negyedik feladatban írtam egy függvényt, ami egy paramétert vár: a versenyző nevét, és az összpontszámot adja vissza.
Ötödik feladat első része sima adatbekérés, másik része megint egy eldöntés. Ha van adott nevű versenyző, akkor a hatos feladatban ki kell számolni és megjeleníteni az összpontszámát. Tehát a bekért nevet fogjuk hasonlítani a lista i-edik elemének nevéhez.
Hetes feladat: statisztika. Legegyszerűbb szótárral megvalósítani. Ha az adott ország már szerepel a szótárban, akkor növeljük a kulcshoz tartozó értéket, ha még nem szerepel, akkor hozzáadjuk a szótárhoz 1-es kezdőértékkel. Kiíratásnál figyeljünk, hogy csak azokat az országokat kell kiírani, ahonnan egynél több versenyző érkezett!
A nyolcadik feladatban ki kell számolni az összpontszámát minden versenyzőnek. Ehhez célszerű felvenni az osztálynál egy összpontszám tulajdonságot. Ezután végigmegyünk a lista elemein, felhasználjuk az osszPontSzam függvényt, és elmentjük az eredményt egy átmeneti egyednek, majd ennek értékét az eredeti egyedbe. A lista elemeit pontszám szerint kell rendezni, ehhez használhatunk LINQ-t, illetve lambda kifejezesét is. Mivel 11. évfolyamon még nincs LINQ, ezért nem azt használtam. Mivel csökkenő sorrend szüséges, ezért még egy Reverse() függvényt is alkalmazni kellett. A fájlba írás innentől már egyszerű, csak végig kell menni a listán, és kiírni fájlba. Mivel a StreamWriter, StreamReader alapértelmezetten utf8-as karakterkódot használ, ezért nem adtam meg külön a karakterkódolást.
Feladat:
Forrás fájlok:
Megoldás:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace korcsolya { class versenyzo { public string nev { get; set; } public string orszagKod { get; set; } public double techPont { get; set; } public double kompPont { get; set; } public double hibaPont { get; set; } public double osszPont { get; set; } public versenyzo(string sor) { string[] tomb = sor.Split(';'); this.nev = tomb[0]; this.orszagKod = tomb[1]; this.techPont = double.Parse(tomb[2].Replace('.',',')); this.kompPont = double.Parse(tomb[3].Replace('.', ',')); this.hibaPont = double.Parse(tomb[4].Replace('.', ',')); } } class Program { static double osszPontSzam(string nev) { double osszPont = 0; foreach(versenyzo i in listaRovidPrg) { if (i.nev == nev) { osszPont += i.techPont + i.kompPont - i.hibaPont; } } foreach (versenyzo i in listaDonto) { if (i.nev == nev) { osszPont += i.techPont + i.kompPont - i.hibaPont; } } return osszPont; } static List<versenyzo> listaRovidPrg = new List<versenyzo>(); static List<versenyzo> listaDonto = new List<versenyzo>(); static void Main(string[] args) { StreamReader srRovid = new StreamReader("rovidprogram.csv"); StreamReader srDonto = new StreamReader("donto.csv"); //fejléc! srRovid.ReadLine(); srDonto.ReadLine(); //adatok beolvasása soronként - Döntő while (!srDonto.EndOfStream) { listaDonto.Add(new versenyzo(srDonto.ReadLine())); } srDonto.Close(); //adatok beolvasása - rövidprogram while (!srRovid.EndOfStream) { listaRovidPrg.Add(new versenyzo(srRovid.ReadLine())); } srDonto.Close(); Console.WriteLine("2.feladat: \n\tA rövidprogramban {0} induló volt",listaRovidPrg.Count); //Console.WriteLine("2.feladat: A döntőn-n {0} induló volt", listaDonto.Count); bool vanMagyar = false; for(int i=0;i<listaDonto.Count; i++) { if(listaDonto[i].orszagKod == "HUN") { vanMagyar = true; break; } } if (vanMagyar == true) { Console.WriteLine("3.feladat:\n\t A magyar versenyző bejutott a kűrbe!"); } else Console.WriteLine("3.feladat: \n\tA magyar versenyző nem jutott be a döntőbe!"); string bekert; Console.WriteLine("5. feladat:\n\t Kérem a versenyző nevét!"); bekert = Console.ReadLine(); bool vane = false; for (int i = 0; i < listaRovidPrg.Count; i++) { if (listaRovidPrg[i].nev == bekert) { vane = true; break; } } if (vane == false) { Console.WriteLine("Ilyen nevű induló nem volt!"); } else { Console.WriteLine("6.feladat:\n\t A versenyző összpontszáma: {0}",osszPontSzam(bekert)); } //7. feladat: statisztika szótárral Console.WriteLine("7.feladat:"); Dictionary<string, int> szotar = new Dictionary<string, int>(); foreach(versenyzo i in listaDonto) { string orszag = i.orszagKod; if (szotar.ContainsKey(orszag)) { szotar[orszag]++; } else { szotar[orszag] = 1; } } //szótár elemeinek kiíratása foreach(KeyValuePair<string,int>i in szotar) { if(i.Value > 1) { Console.WriteLine("\t{0}: {1} versenyző", i.Key, i.Value); } } //8.feladat StreamWriter iro = new StreamWriter("vegeredmeny.csv"); for(int i=0; i<listaDonto.Count; i++) { versenyzo uj = listaDonto[i]; uj.osszPont = osszPontSzam(listaDonto[i].nev); listaDonto[i] = uj; } // LAMBDA kifejzés listaDonto.Sort((v1,v2) => v1.osszPont.CompareTo(v2.osszPont)); //csökkenő sorrend: listaDonto.Reverse(); //fájlba írás int sorszam = 1; foreach(versenyzo i in listaDonto) { iro.WriteLine("{0} {1} {2} {3}",sorszam, i.nev,i.orszagKod,i.osszPont); sorszam++; } iro.Close(); Console.ReadLine(); } } } |