BME MOGI Gépészeti informatika 12. 1. feladat Készítse el szövegszerkesztővel, majd mentse osztály.txt néven a következő tartalmú szöveges fájlt: Matematika;Fizika;Történelem;Irodalom;Nyelvtan;Angol;Testnevelés; Elek Kiss Anna;2;4;5;1;2;2;3; Soós Pálma;1;2;3;5;4;4;4; Horváth Mihály Péter;4;5;5;5;4;2;5; Vass Albert Géza;3;5;2;2;4;1;2; A fájlról a következőket tudjuk: az első sor tartalmazza a tantárgyneveket, hogy mennyit, azt nem tudjuk, maximum 10-et, a második sortól tanulók adatai találhatók a fájlban, mégpedig a nevük és pontosan annyi darab érdemjegy, ahány tárgynév szerepel az első sorban, egy tanulónak kettőnél több szóból is állhat a neve, a fájlban az adatokat pontosvessző választja el, a sorok száma nem ismert, csak annyit tudunk, hogy maximum 30 sort tartalmaz a fájl. Végezze el a következő feladatokat! a. Olvassa be a fájlt, írja ki a tanulók beolvasott adatait a képernyőre! b. Számítsa ki a tanulók tanulmányi átlagát és a tantárgyankénti átlagokat! c. Írja ki a tantárgyankénti átlagokat a tantárgyak nevével együtt az átlag.txt szöveges fájlba, a tárgyátlagok szerinti növekvő sorrendben! Megoldási mód: konzolalkalmazás Oktatási cél: szöveges fájlok írásának és olvasásának bemutatása A programkód: using System.IO; static void Main(string[] args) const int ntárgy = 10, ntanuló = 30; string[] név = new string[ntanuló]; double[] átlag = new double[ntanuló]; double[] tárgyátlag = new double[ntárgy]; char[] jelek = ';' ; int jegy = 0; StreamReader be = new StreamReader("osztály.txt"); string[] tárgynév = be.readline().split(jelek, StringSplitOptions.RemoveEmptyEntries); int tárgyszám = tárgynév.length; Array.Clear(átlag, 0, ntanuló); Array.Clear(tárgyátlag, 0, tárgyszám); int tanulóindex = 0; while (be.peek() > -1) string[] puffer = be.readline().split(jelek, StringSplitOptions.RemoveEmptyEntries); 1
név[tanulóindex] = puffer[0]; Console.Write("0,20 ", név[tanulóindex]); for (int i = 0; i < tárgyszám; i++) jegy = int.parse(puffer[i + 1]); átlag[tanulóindex] += jegy; tárgyátlag[i] += jegy; Console.Write("0,3", jegy); átlag[tanulóindex] /= tárgyszám; Console.WriteLine("0,10:0.00", átlag[tanulóindex]); tanulóindex++; be.close(); for (int i = 0; i < tárgyszám; i++) tárgyátlag[i] /= tanulóindex; Array.Sort(tárgyátlag, tárgynév, 0, tárgyszám); StreamWriter ki = new StreamWriter("átlag.txt"); for (int i = 0; i < tárgyszám; i++) ki.writeline("0 1,10:0.00", tárgynév[i], tárgyátlag[i]); ki.close(); Console.ReadLine(); 2. feladat Egy 15 sort és soronként 20 széket tartalmazó színházterem egy előadására elkelt helyekről ad információt a foglaltság.txt állomány. Az állományban x jelöli a foglalt, s a szabad helyeket. Az állomány első néhány sora a következő: xxxxxxxxxxxsxsxxxxxx xxxxsxxxxxsxxsxsxxxx xxxxxxxxxxxsxxxxxxsx xxxxsxxsxxsxxxxsssxx xxxxxxxxxxxxxsxxsxxx xxxxxxxxxxxsxxsxxxxx A jegyek négy kategóriába soroltak, a kategória.txt állomány tartalmazza, hogy melyik helyre mennyibe kerül a jegy. Az állomány első néhány sora a következő: 22221111111111112222 2
22222221111112222222 Az négy árkategória jegyárai a következők: Kategória Jegyár 1 5400 Ft 2 4500 Ft 3 3700 Ft 4 2900 Ft Töltse le az állományokat a tanszéki honlapról, és végezze el a következő feladatokat! a. Kérje be az állományok nevét, majd olvassa be a fájlokat, és tárolja az adatokat egy-egy kétdimenziós tömbben! b. Számítsa ki a befogadóképességet, a foglalt helyek számát, a terem kihasználtságát és a bevételt! Az eredményeket egy-egy TextBox vezérlőbe jelenítse meg! Megoldási mód: Windows Forms alkalmazás Oktatási cél: szöveges fájlok soronként, illetve karakterenkénti olvasásának bemutatása Az elkészítendő form: A Form1 osztályba írandó programkód: using System.IO; const int székekszáma = 20; int[] ár = 0, 5400, 4500, 3700, 2900 ; int foglalt = 0, bevétel = 0; int sor = 0; private void button1_click(object sender, EventArgs e) string[] fogl = File.ReadAllLines(textBox1.Text); sor = fogl.length; int[,] kat = new int[sor, székekszáma]; 3
StreamReader be = new StreamReader(textBox2.Text); for (int i = 0; i < sor; i++) for (int j = 0; j < székekszáma; j++) kat[i, j] = be.read() - '0'; // karakterből számjegy if (fogl[i][j] == 'x') foglalt++; bevétel += ár[kat[i, j]]; be.readline(); be.close(); textbox3.text = (sor * székekszáma).tostring(); textbox4.text = foglalt.tostring(); textbox5.text = ((double)foglalt / (sor * székekszáma)).tostring("p2"); textbox6.text = bevétel.tostring("c0"); private void Form1_Load(object sender, EventArgs e) textbox1.text = Path.GetDirectoryName(Application.ExecutablePath) + "\\foglaltság.txt"; textbox2.text = Path.GetDirectoryName(Application.ExecutablePath) + "\\kategória.txt"; 4
Gyakorló feladatok szöveges fájlok kezelése 1. Egy baráti társaság tagjai rendszeresen járnak kulturális rendezvényekre. Négy hétig feljegyezték, hogy ki hány rendezvényen vett részt hetente, az adatokat a barátikör.txt szöveges állomány tartalmazza, szóközzel tagolva. A sorok száma nem ismert, de maximum 15 lehet. Az állomány első néhány sora a következő! Anna 2 1 4 1 Péter 0 3 1 1 Sándor 1 2 1 0 Készítsen Windows Forms alkalmazást, amely elvégzi a következő feladatokat! a. Olvassa be az állományt, és tárolja az adatokat tömbökben! b. Számítsa ki, hogy ki hány rendezvényen vett részt összesen az adott időszak alatt! Az eredményeket egy ListBox vezérlőben jelenítse meg a névvel együtt! c. Írja ki a kevés.txt állományba azok neveit vesszővel elválasztva, akik az adott időszakban egyetlen eseményen sem vettek részt! d. Készítse el a több.txt szöveges állományt, mely azok neveit tartalmazza, akik az átlagnál többször vettek részt rendezvényen! Az állományban a név mellett a darabszám is jelenjen meg, az adatok darabszám szerint növekvő sorrendbe legyenek rendezve! 2. Egy meteorológiai állomáson egy héten keresztül naponta többször megmérték a hőmérsékletet, hogy hányszor naponta az változó volt. Az adatokat a hőmérséklet.txt állomány tartalmazza pontosvesszővel elválasztva, rendezetlenül, mégpedig egy sorban a nap sorszáma (1-7 közötti érték), a mérés napon belüli sorszáma és a mért hőmérséklet található. Az állományban maximum 50 mérési eredmény található. Az állomány első néhány sora: 3;8;11,4 7;1;12,6 7;3;13,1 3;10;13,8 1;5;14,1 Készítsen konzolalkalmazást, melyben elvégzi a következő feladatokat! a. Beolvassa az állományt és tárolja az adatokat megfelelő tömbökben! b. Meghatározza, hogy hány mérés volt naponta és mennyi a napi átlaghőmérséklet! c. Kiírja a napiátlagok.txt szöveges állományba a nap sorszáma szerint növekvő sorrendben rendezve a napi átlaghőmérsékleteket! 3. A mátrix.txt állományban egy mátrix elemei találhatók soronként. Nem ismerjük a mátrix méretét, csak azt tudjuk, hogy minden sorban ugyanannyi elem van. Az adatok valósak is lehetnek, az elválasztójel közöttük egy vagy több szóköz. Írjon konzolalkalmazást, mely beolvassa a mátrixot, megjeleníti a képernyőn, majd kiírja a mátrix transzponáltját a transzponált.txt szöveges fájlba! 4. Készítsen Windows Forms alkalmazást egy földterületről készült légi felvétel kiértékelésére! Az adatok a légifelvétel.txt fájlban találhatók, minden karakter egy 15 m x 15 m-es területet jelöl. A karakter mutatja a földterület hasznosítását a következők szerint: 5
Karakter s l e u Hasznosítás szántó legelő erdő út A fájlban az egy sorban található karakterek száma nem ismert, de minden sorban ugyanannyi karakter van. A fájl maximum 50 sort tartalmaz. A fájl első néhány sora: eeeessssusssssssllll Végezze ez a következő feladatokat! a. Kérje be a fájl nevét az elérési úttal együtt, majd olvassa be a fájl tartalmát egy sztring tömbbe! b. Számítsa ki a mezőgazdasági földterületek nagyságát hektárban, és jelenítse meg az eredményt TextBox vezérlőkben! (1 hektár 10 4 m 2.) c. Számítsa ki az utak hosszát! Az utak egyenesek, sor vagy oszlop irányban egymás melletti vagy alatti karakterek jelzik őket. Jelenítse meg a kiszámított értéket a formon! d. Írja ki a művelt területek nagyságát a hasznosítás megnevezésével együtt a művelés.txt szöveges fájlba területnagyság szerint növekvő sorrendben! 6