static void Main(string[] args) { Színes.Init(); Színes.WriteLine("[red]{Adatbázisokat} szeretnél összevetni vagy [blue]{Programokat} tesztelni?"); Színes.WriteLine("[red]{a}: Adatbázisok"); Színes.WriteLine("[blue]{más}: Programtesztelés"); if (Console.ReadKey().Key == ConsoleKey.A) { ReadmeAB(); } else { ReadmeP(); } debugmode = Színes.Be("\nNyomj egy entert, ha készen állsz! (debug-módhoz írd be azt is, hogy [blue]{debug}!)") == "debug"; string debug = ""; Tanuló.Setup(debug); Tanuló.Pontozás(debug); foreach (Teszt teszt in Teszt.szótár.Values) { teszt.Eredmények_Kiírása(debug); } Teszt.Eredmények_Összesítésének_Kiírása(debug); Színes.Be("A program futása véget ért, nyomj egy entert az ablak bezárásához!"); }
public static void Setup(string debug) { debug += "Tanuló.Setup" + dbj; Színes.WriteLine("Add meg, hogy mely könyvtárba lettek kiválogatva a dolgozatok! (A readme-ben az [green]{ide} könyvtár.)"); Teszt.root = Színes.Be(); #region Teszt-objektumok létrehozása Színes.WriteLine(debug + dbj + "[blue]{Teszt-objektumok létrehozása}"); foreach (string path in Directory.EnumerateDirectories(Directory.GetCurrentDirectory() + "\\" + Teszt.root).Where(x => !Path2name(x).StartsWith("-"))) { new Teszt(path); } #endregion #region Tanuló-objektumok létrehozása Színes.WriteLine(debug + dbj + "[blue]{Tanuló-objektumok létrehozása}"); Tanuló t; foreach (string tanulópath in Directory.EnumerateDirectories(Teszt.szótár.Values.First().path)) { if (tanulópath.Split('\\').Last()[0] != '-') // a kötőjellel kezdődőeket nem veszi figyelembe. { t = new Tanuló(tanulópath); Színes.Write(debug + $"[green]{{{t.név}}}"); Console.Write(" tanuló inicializálva"); if (t.ezamegoldókulcs) { Színes.Write(" [blue]{<-- ez a megoldókulcs!}"); } Console.WriteLine(); } } #endregion // létrehozza az ALT-okat. #region ALT (Adatbázis-Lekérdezés-Típus) rendezett hármasok beolvasása a setup.exe-ből. Színes.WriteLine(debug + dbj + "[blue]{ALT-objektumok létrehozása} (Adatbázis-Lekérdezés-Típus: rendezett hármasok beolvasása a setup.exe-ből.)"); using (StreamReader f = new StreamReader("setup.txt", Encoding.UTF8)) { while (!f.EndOfStream) { string sor = f.ReadLine(); if (sor[0] != '%') // megjegyzés, nem mentjük el { new ALT(sor); } } } Színes.WriteLine(debug + "setup.txt beolvasva:"); Színes.WriteLine("[blue]{adatbázis neve}\t[blue]{lekérdezés neve}\t -> \t[blue]{lekérdezés típusa}"); Színes.WriteLine("---------------------------"); foreach (ALT nnt in ALT.szótár.Values) { Console.WriteLine("{0}\t{1}\t -> \t{2}", nnt.adatbázisfájl, nnt.lekérdezésfájl, nnt.tipus); } #endregion }
static void ReadmeAB() { Színes.WriteLine("\t [red]{README: ACCDB ADATBÁZISOK LEKÉRDEZÉSEINEK ÉS TÁBLÁINAK ELLENŐRZÉSÉHEZ} "); Színes.WriteLine("[red]{--------------------------------------------------------------}"); Színes.WriteLine("[red]{------------- UNDER CONSTRUCTION ------------------------------}"); Színes.WriteLine("[red]{--------------------------------------------------------------}"); { } }
public static string Be(string megj = "") { if (megj != "") { Színes.WriteLine(megj); } Színes.Write("[green]{>> }"); return(Console.ReadLine()); }
private Dictionary <ALT, Dictionary <Teszt, Válasz> > Válaszai() { Dictionary <ALT, Dictionary <Teszt, Válasz> > válaszlista = new Dictionary <ALT, Dictionary <Teszt, Válasz> >(); foreach (ALT alt in ALT.szótár.Values) { Dictionary <Teszt, Válasz> teszt_válaszai = new Dictionary <Teszt, Válasz>(); foreach (Teszt teszt in Teszt.szótár.Values) { // teszt_válaszai.Add(teszt, new Válasz(teszt.path + "\\" + this.név + "\\" + alt.adatbázisfájl.Split('.').First() + "_" + alt.lekérdezés + ".txt", this)); teszt_válaszai.Add(teszt, new Válasz($"{teszt.path}\\{this.név}\\output_{alt.adatbázis}_{alt.lekérdezés}.txt", this, teszt, alt)); if (debugmode) { Színes.WriteLine($"[green]{{{this.név}}} [blue]{{{teszt.név}}} tesztre adott [blue]{{{teszt_válaszai[teszt].feladatnév}}} válasza beolvasva."); } } válaszlista.Add(alt, teszt_válaszai); } return(válaszlista); }
static void ReadmeP() { Színes.WriteLine("[red]{--------------------------------------------------------------}"); Színes.WriteLine("\t [red]{README: PROGRAMTESZTELÉSHEZ} "); Színes.WriteLine("[red]{--------------------------------------------------------------}"); Színes.WriteLine("[red]{E)\t Előkészületek}"); Színes.WriteLine("[red]{--------------------------------------------------------------}"); Színes.WriteLine("[red]{E-1)}\t Válassz egy [blue]{R} könyvtárat, ahova az összes tanuló és a megoldókulcs könyvtárát bemásolod. Mindegy, hogy mi a könyvtárak belső szerkezete. Figyelj viszont arra, hogy}"); Színes.WriteLine("[red]{E-1.1}\t A tanulók könyvtárainak a neve legyen [red]{\"vezetéknév keresztnév\"}, tehát más szöveg (vagy 2-nél több szóköz) ne legyen benne, mert ronda lesz a vége.}"); Színes.WriteLine("[red]{E-1.2}\t A megoldókulcs könyvtárneve kezdődjön felkiáltójellel ([red]{!})."); Színes.WriteLine("[red]{E-2)}\t A következő exe fájlokat gyűjtsd ki valahova: [blue]{Kiszedegető.exe}, [blue]{InputokSzétosztásaÉsAFuttatás.exe}, [blue]{Összehasonlító.exe}"); Színes.WriteLine("[red]{E-3)}\t A programok teszteléséhez szükséges inputfájlok könyvtáraiból álló inputfájlrendszert gyűjtsd ki egy [blue]{I} könyvtárba."); Színes.WriteLine("[red]{E-4)}\t Hozz létre egy [green]{setup.exe}-t, amely néhány %-kal kezdődő sor (komment) után egy 3 oszlopos tabulátorokkal tagolt táblázatot tartalmaz. Az oszlopok tartalma: "); Színes.WriteLine("\t[red]{E-4.1) 1. oszlop:}\t A dolgozat címe. (Programteszteléskor ennek nincs jelentősége.) "); Színes.WriteLine("\t[red]{E-4.2) 2. oszlop:}\t Az elemzendő outputfájl neve kiterjesztéssel együtt. "); Színes.WriteLine("\t[red]{E-4.3) 3. oszlop:}\t A tartalom típusa, ami az elemzéshez szükséges. A következő opciók állnak jelenleg rendelkezésre:"); Színes.WriteLine("\t\t[red]{E-4.3.1) logikai:}\t A megoldás egy logikai érték, a [blue]{true}/[blue]{false} értékek valamelyike."); Színes.WriteLine("\t\t[red]{E-4.3.2) szám-}[green]{n}[red]{:}\t A megoldás egy szám, amelynek pontossága a megoldókulccsal [green]{n} tizedesjegyig meg kell egyezzen."); Színes.WriteLine("\t\t[red]{E-4.3.3) rendezett halmaz:}\t A megoldás egy tabulátorokkal tagolt táblázat, amelyben a rekordok sorrendje és multiplicitása számít."); Színes.WriteLine("\t\t[red]{E-4.3.4) multihalmaz:}\t a megoldás egy tabulátorokkal tagolt táblázat, amelyben a rekordok multiplicitása számít, de a sorrendjük nem."); Színes.WriteLine("\t\t[red]{E-4.3.5) halmaz:}\t ugyanaz, mint a multihalmaz, de ha a megoldókulcs megoldásában nincs multiplicitás, akkor nyilván ez lesz megkövetelve a tanulók megoldásaival szemben is."); Színes.WriteLine("[red]{E-5)}\t Figyeljünk oda arra, hogy a setup.txt-ben ne legyenek hibák. A vizsgálandó outputfájlokat és az összevetés módját is innen olvassa ki a program."); Színes.WriteLine("[red]{--------------------------------------------------------------}"); Színes.WriteLine("[red]{K)\t Kiszedegetés:}"); Színes.WriteLine("[red]{--------------------------------------------------------------}"); Színes.WriteLine("[red]{K-1)}\t Tedd a [blue]{Kiszedegető.exe}-t az [blue]{R} könyvtárba."); Színes.WriteLine("[red]{K-2)}\t Ha pl. [red]{17} inputfájllal akarsz tesztelni, akkor futtasd le a [blue]{Kiszedegető.exe}-t a következő paraméterekkel:"); Színes.WriteLine("[blue]{R} = [green]{.*\\.exe}, [blue]{F} = [green]{}, [blue]{C} = [green]{ide}, [blue]{O} = [green]{sok2}[red]{17} "); Színes.WriteLine("(Az [green]{ide} könyvtár ne kezdődjön kötőjellel ([red]{-}), mert attól összeakad a tesztelőprogram!)"); Színes.WriteLine("[red]{--------------------------------------------------------------}"); Színes.WriteLine("[red]{T)\t Tesztelés:}"); Színes.WriteLine("[red]{--------------------------------------------------------------}"); Színes.WriteLine("[red]{T-1)}\t Tedd az inputfájlos könyvtárakat tartalmazó könyvtárat (könyvtárak könyvtára!) az [green]{ide} könyvtárba. Mindenképp kötőjellel ([red]{-}) kezdődjön a fájlnév!"); Színes.WriteLine("[red]{T-2)}\t Tedd a [blue]{InputokSzétosztásaÉsAFuttatás.exe}-t az [green]{ide} könyvtárba és futtasd le!"); Színes.WriteLine("[red]{--------------------------------------------------------------}"); Színes.WriteLine("[red]{Ö)\t Összehasonlítás a megoldókulccsal}"); Színes.WriteLine("[red]{--------------------------------------------------------------}"); Színes.WriteLine("[red]{Ö-1)}\t Futtassuk le az [blue]{Összehasonlító.exe}-t."); Színes.WriteLine("[red]{Ö-2)}\t A végén bekér majd egy fájlnevet, ahova elmentheti az eredményeket."); Színes.WriteLine("[red]{--------------------------------------------------------------}"); }
public static bool operator ==(Válasz v, Válasz m) { string hiba; if (v.tábla[0, 0].StartsWith("HIÁNYZIK")) { hiba = $"[red]{{Hiányzási hiba a [green]{{{v.tulajdonos.név}}} tanuló [blue]{{{v.teszt.név}}} tesztjének [blue]{{{v.lekérdezés}}} válaszában: {{{v.tábla[0, 0]}}}"; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } if (v.tábla[0, 0] == nemválaszolt) { hiba = $"[red]{{Nem válaszolt}}: [green]{{{v.tulajdonos.név}}} tanuló [blue]{{{v.teszt.név}}} tesztjének [blue]{{{v.lekérdezés}}} kérdésére nem válaszolt."; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } if (v.Size[0] < m.Size[0]) // precautions { hiba = $"[red]{{Mérethiba (X<):}} [green]{{{v.tulajdonos.név}}} tanuló [blue]{{{v.teszt.név}}} tesztjének [blue]{{{v.lekérdezés}}} válaszában hiányzik [blue]{{{(m.Size[0] - v.Size[0]).ToString()}}} db sor.\n"; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } if (v.Size[0] > m.Size[0]) // precautions { hiba = $"[red]{{Mérethiba (X>):}} [green]{{{v.tulajdonos.név}}} tanuló [blue]{{{v.teszt.név}}} tesztjének [blue]{{{v.lekérdezés}}} válaszában több ([blue]{{{(v.Size[0] - m.Size[0]).ToString()}}} db) sor van a kelleténél.\n"; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } if (v.Size[1] < m.Size[1]) // precautions { hiba = $"[red]{{Mérethiba (Y<):}} [green]{{{v.tulajdonos.név}}} tanuló [blue]{{{v.teszt.név}}} tesztjének [blue]{{{v.lekérdezés}}} válaszában hiányzik [blue]{{{(m.Size[1] - v.Size[1]).ToString()}}} db oszlop.\n"; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } if (v.Size[1] > m.Size[1]) // precautions { hiba = $"[red]{{Mérethiba (Y>):}} [green]{{{v.tulajdonos.név}}} tanuló [blue]{{{v.teszt.név}}} tesztjének [blue]{{{v.lekérdezés}}} válaszában több ([blue]{{{(v.Size[1] - m.Size[1]).ToString()}}} db) sor van a kelleténél.\n"; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } string típus = ALT.szótár[v.lekérdezés].tipus; if (Regex.IsMatch(típus, @"^szám-\d*$")) { double mx = 0, vx = 0; int pontosság = int.Parse(típus.Split('-')[1]); if (v.tábla[0, 0] == m.tábla[0, 0]) { return(true); // erre csak azért van szükség, hogy ha pl. a keresés esetében "nincs a listában" lenne a válasz, akkor ne húzza ki az ilyen válaszokat. } try { vx = Math.Round(double.Parse(v.tábla[0, 0]), pontosság); mx = Math.Round(double.Parse(m.tábla[0, 0]), pontosság); } catch (Exception) { hiba = $"[red]{{Típuseltérési hiba}}: [green]{{{v.tulajdonos.név}}} tanuló [blue]{{{v.teszt.név}}} tesztjének [blue]{{{v.lekérdezés}}} válaszában nem számmal válaszolt."; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } if (mx != vx) { hiba = $"[red]{{rossz számérték}}: [green]{{{v.tulajdonos.név}}} tanuló [blue]{{{v.teszt.név}}} tesztjének [blue]{{{v.lekérdezés}}} válaszában rosszul számolt."; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } } if (típus == "logikai") { if ((m.tábla[0, 0] != v.tábla[0, 0])) { hiba = $"[red]{{rossz logikai érték}}: [green]{{{v.tulajdonos.név}}} tanuló [blue]{{{v.teszt.név}}} tesztjének [blue]{{{v.lekérdezés}}} válaszában rosszul döntött."; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } } if (típus == "rendezett halmaz") { for (int i = 0; i < v.Size[0]; i++) { for (int j = 0; j < v.Size[1]; j++) { if (v.tábla[i, j] != m.tábla[i, j]) { hiba = $"[red]{{Rekord- vagy sorrendhiba:}} " + $"[green]{{{v.tulajdonos.név}}} tanuló a " + $"[blue]{{{v.teszt.név}}} teszt " + $"[blue]{{{v.lekérdezés}}} feladatában a(z) " + $"[blue]{{{i.ToString()}}}.sor " + $"[blue]{{{j.ToString()}}}.oszlopában: " + $"[green]{{{m.tábla[i, j]}}} helyett " + $"[red]{{{v.tábla[i, j]}}} szerepel.\n"; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } } } } if (típus == "multihalmaz" || típus == "halmaz") { if (v.halmaz == m.halmaz) { return(true); } if (v.halmaz < m.halmaz || v.halmaz > m.halmaz) { (string hibácska, int k, int l) = Multihalmaz <string> .Részhalmaz_Első_Hibával(v.halmaz, m.halmaz); hiba = $"[red]{{Rekordhiba (multiplicitás):}} " + $"[green]{{{v.tulajdonos.név}}} tanuló " + $"[blue]{{{v.teszt.név}}} tesztre adott " + $"[blue]{{{v.lekérdezés}}} válaszában a " + $"[red]{{{hibácska}}} csak " + $"[red]{{{k}}} alkalommal szerepel " + $"[blue]{{{l}}} helyett.\n"; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } hiba = $"[red]{{Rekordhiba (részhalmaz):}} " + $"[green]{{{v.tulajdonos.név}}} tanuló " + $"[blue]{{{v.teszt.név}}} tesztre adott " + $"[blue]{{{v.lekérdezés}}} válasza " + "és a megoldókulcs válasza közül egyik sem részhalmaza a másiknak.\n"; Színes.WriteLine(hiba); v.tulajdonos.hibalista.Add(hiba); return(false); } return(true); }
public Válasz(string path, Tanuló tanuló, Teszt test, ALT a) { alt = a; teszt = test; tulajdonos = tanuló; feladatnév = Path2name(path); if (feladatnév.Split('_').Length >= 3) // adatbázisok esetéen egy feladatnév mindig így néz ki: output_cukraszda_4laktozmentes.txt { adatbázis = feladatnév.Split('_')[1]; lekérdezés = feladatnév.Split('_')[2].Split('.')[0]; } else // programok outputjai esetében nincsen adatbázisnév és lekérdezésnév, ott az csak így néz ki: output4.txt { adatbázis = ""; lekérdezés = feladatnév.Split('.')[0]; } List <string[]> beolvasástartalma = new List <string[]>(); #region beolvasás: beolvasástartalma try { using (f = new StreamReader(path, Encoding.UTF8)) { while (!f.EndOfStream) { beolvasástartalma.Add(f.ReadLine().Split('\t')); } } } catch (Exception) { Színes.WriteLine($"[red]{{{path}}} nem található."); beolvasástartalma.Add(new string[1] { nemválaszolt }); } #endregion #region tábla kialakítása Size[0] = beolvasástartalma.Count; if (Size[0] != 0) { Size[1] = beolvasástartalma[0].Length; tábla = new string[Size[0], Size[1]]; for (int i = 0; i < Size[0]; i++) { for (int j = 0; j < Size[1]; j++) { tábla[i, j] = beolvasástartalma[i][j]; } } } else { tábla = new string[1, 1]; tábla[0, 0] = "Üres a tábla!"; } #endregion halmaz = new StringMultihalmaz(tábla, Size[0], Size[1]); }
public static void Eredmények_Összesítésének_Kiírása(string debug) { debug += "Teszt.Eredmények_Összesítésének_Kiírása" + dbj; Színes.WriteLine("---------------- " + debug + " ----------------------"); Színes.WriteLine("A tesztek összesítése:"); int p; Console.Write("\t"); string result = "\t"; foreach (ALT alt in ALT.szótár.Values) { Színes.Write("\t[blue]{" + alt.lekérdezésfájl.Substring(0, Math.Min(7, alt.lekérdezésfájl.Length)) + "}"); result += "\t" + alt.lekérdezésfájl.Substring(0, Math.Min(7, alt.lekérdezésfájl.Length)); } Console.WriteLine(); Console.Write("\t"); result += "\r\n\t"; foreach (ALT alt in ALT.szótár.Values) { Színes.Write($"\t[blue]{{{Monogram(alt.tipus)}}}"); result += "\t" + Monogram(alt.tipus); } Console.WriteLine(); result += "\r\n"; int sum; foreach (Tanuló tanuló in Tanuló.szótár.Values) { Színes.Write($"[green]{{{Monogram(tanuló.név)}}}"); result += Monogram(tanuló.név); // tanuló összes pontja sum = 0; foreach (ALT alt in ALT.szótár.Values) { sum += tanuló.pontjai[alt]; } Színes.Write($"\t[blue]{{{sum}}} <- "); result += "\t" + sum; foreach (ALT alt in ALT.szótár.Values) { Console.Write("\t"); result += "\t"; p = tanuló.pontjai[alt]; if (tanuló.pontjai[alt] == Tanuló.megoldókulcs.pontjai[alt]) { Színes.Write($"[green]{{{p}}}"); } else if (tanuló.pontjai[alt] > 0) { Színes.Write($"[yellow]{{{p}}}"); } else { Színes.Write($"[red]{{{p}}}"); } result += p.ToString(); } Console.WriteLine(); result += "\r\n"; } string eredménykönyvtárnév = "Results"; string hibakönyvtár = $"{Directory.GetCurrentDirectory()}\\{eredménykönyvtárnév}"; Directory.CreateDirectory(hibakönyvtár); Console.WriteLine("Add meg a fájlnevet (kiterjesztés nélkül), ahova menteni szeretnéd az eredményeket!"); string outputfájlnév = $"{hibakönyvtár}\\table.txt"; using (StreamWriter output = new StreamWriter(outputfájlnév)) { output.WriteLine(result); } Színes.WriteLine($"A kapott pontok kiírva a [blue]{{{eredménykönyvtárnév}}} könyvtár tabulátorokkal tagolt [blue]{{table.txt}} állományba."); // Clipboard.SetText(result); // Console.WriteLine("Táblázat kimásolva a vágólapra."); StreamWriter tanulóhibakiíró; string hibafájlnév; // tanulónként külön fájlokba a hibák kiírása foreach (Tanuló tanuló in Tanuló.szótár.Values) { if (tanuló.hibalista.Count != 0) { hibafájlnév = $"{hibakönyvtár}\\Hibalista_{tanuló.név}.txt"; using (tanulóhibakiíró = new StreamWriter(hibafájlnév)) { foreach (string hiba in tanuló.hibalista) { tanulóhibakiíró.WriteLine(Színes.Fehérítő(hiba)); } } Színes.WriteLine($"[green]{{{tanuló.név}}} hibái kiírva a [blue]{{{eredménykönyvtárnév}\\{hibafájlnév}}} fáljba [blue]{{({tanuló.hibalista.Count} db)}}."); } } // összes tanuló hibájának egy közös fájlba való kiírása Színes.WriteLine("[red]{+} [blue]{---------------------------------}"); hibafájlnév = $"{hibakönyvtár}\\!Hibalista_összesített.txt"; using (tanulóhibakiíró = new StreamWriter(hibafájlnév)) { foreach (Tanuló tanuló in Tanuló.szótár.Values) { foreach (string hiba in tanuló.hibalista) { tanulóhibakiíró.WriteLine(Színes.Fehérítő(hiba)); } } } Színes.WriteLine($"[green]{{Tanulók}} hibái kiírva a [blue]{{{eredménykönyvtárnév}\\{hibafájlnév}}} fáljba [blue]{{({Tanuló.szótár.Values.Sum(x => x.hibalista.Count)} db)}}."); }
public void Eredmények_Kiírása(string debug) { debug += "Teszt.Eredmények_Kiírása" + dbj; Színes.WriteLine("---------------- " + debug + " ----------------------"); Színes.WriteLine($"A [blue]{{{név}}} teszt eredményeinek összefoglalása:"); int p; Console.Write("\t"); string result = "\t"; foreach (ALT alt in ALT.szótár.Values) { Színes.Write("\t[blue]{" + alt.lekérdezésfájl.Substring(0, Math.Min(7, alt.lekérdezésfájl.Length)) + "}"); result += "\t" + alt.lekérdezésfájl.Substring(0, Math.Min(7, alt.lekérdezésfájl.Length)); } Console.WriteLine(); Console.Write("\t"); result += "\r\n\t"; foreach (ALT alt in ALT.szótár.Values) { Színes.Write($"\t[blue]{{{Monogram(alt.tipus)}}}"); result += "\t" + Monogram(alt.tipus); } Console.WriteLine(); result += "\r\n"; int sum; foreach (Tanuló tanuló in Tanuló.szótár.Values) { Színes.Write($"[green]{{{Monogram(tanuló.név)}}}"); result += Monogram(tanuló.név); // tanuló erre a tesztre kapott összes pontja sum = 0; foreach (ALT alt in ALT.szótár.Values) { sum += tanuló.tesztenkénti_pontjai[alt][this]; } Színes.Write($"\t[blue]{{{sum}}} <-"); result += "\t" + sum; foreach (ALT alt in ALT.szótár.Values) { Console.Write("\t"); result += "\t"; p = tanuló.tesztenkénti_pontjai[alt][this]; switch (p) { case 1: Színes.Write($"[green]{{{p}}}"); break; case 0: Színes.Write($"[yellow]{{{p}}}"); break; case -1: Színes.Write($"[red]{{{p}}}"); break; case -2: Színes.Write($"[magenta]{{{p}}}"); break; } result += p.ToString(); } Console.WriteLine(); result += "\r\n"; } // ITT ezt kéne megcsinálni, minden tesztenkénti mo-t kiírni külön fájlba string outputfájlnév = "testresult_" + this.név + ".txt"; using (StreamWriter output = new StreamWriter(outputfájlnév)) { output.WriteLine(result); } }