C# :: Aufgabe #67 :: Lösung #1
3 Lösungen

#67
Quiz mittels LINQ in einer Xml-Datei
Fortgeschrittener - C#
von Miako
- 17.09.2014 um 21:13 Uhr
Schreibe ein Quiz-Programm, welches seine Fragen und Antworten durch LINQ (XmlReader-Klasse ist tabu) aus einer Xml-Datei bezieht.
Die Xml-Datei soll frei erweiterbar sein, sofern ein vorgegebenes Schema eingehalten wird.
Das Programm soll die Xml-Datei auslesen und dem Benutzer die Fragen in eine zufällige Reinfolge ausgeben. Bereits verwendete Fragen sollen kein zweites mal an die Reihe kommen. Die Anzahl der möglichen Antworten bleibt euch überlassen. Natürlich soll geprüft werden, ob die Antwort des Benutzers korrekt ist. Zu guter Schluss soll die korrekte Antwort in der Xml-Datei angegeben werden können.
Viel Spaß beim Planen und schreiben. Ich freue mich auf eure Fragen und Lösungen!
Die Xml-Datei soll frei erweiterbar sein, sofern ein vorgegebenes Schema eingehalten wird.
Das Programm soll die Xml-Datei auslesen und dem Benutzer die Fragen in eine zufällige Reinfolge ausgeben. Bereits verwendete Fragen sollen kein zweites mal an die Reihe kommen. Die Anzahl der möglichen Antworten bleibt euch überlassen. Natürlich soll geprüft werden, ob die Antwort des Benutzers korrekt ist. Zu guter Schluss soll die korrekte Antwort in der Xml-Datei angegeben werden können.
Zitat:
Tipps und Hinweise
Am besten benutzt ihr für das Einlesen der Fragen und Antworten, sowie das Entfernen beantworteter Fragen ein Array, oder eine Liste.
Zum bestimmen der korrekten Antwort eignet sich ein Attribut für die jeweiligen Antwort in der Xml-Datei.
Viel Spaß beim Planen und schreiben. Ich freue mich auf eure Fragen und Lösungen!
#1

von pocki (4190 Punkte)
- 21.09.2014 um 20:40 Uhr
Hier meine Lösung:
Meine XML-Datei sieht so aus:
XML-Code
Mit dem Attribut "istrue" gibt man an, ob diese Antwort die richtige ist.
C#-Code
die darin enthaltenen Extension-Methods:
C#-Code
Meine XML-Datei sieht so aus:

<?xml version='1.0' encoding='UTF-8'?> <quiz> <frage wortlaut="Hier ist die 1. Frage?"> <antwort wortlaut="richtige Antwort" istrue="true" /> <antwort wortlaut="falsche Antwort 1" istrue="false" /> <antwort wortlaut="falsche Antwort 2" istrue="false" /> </frage> <frage wortlaut="Hier ist die 2. Frage?"> <antwort wortlaut="richtige Antwort" istrue="true" /> <antwort wortlaut="falsche Antwort 1" istrue="false" /> <antwort wortlaut="falsche Antwort 2" istrue="false" /> <antwort wortlaut="falsche Antwort 3" istrue="false" /> </frage> </quiz>
Mit dem Attribut "istrue" gibt man an, ob diese Antwort die richtige ist.

void Main() { string xmlFile = "quiz.xml"; var xmlDoc = XDocument.Load(xmlFile); var fragen = xmlDoc.Descendants("frage").Select(f=> new Frage { Wortlaut = f.Attribute("wortlaut").Value, Antworten = f.Descendants("antwort").Select(a => new Antwort() { Wortlaut = a.Attribute("wortlaut").Value, isTrue = a.Attribute("istrue").Value.ToLower() == "true"}).ToArray() }); //Fragen in zufällige Reihenfolge bringen var randomFragen = fragen.ToList().ShuffleSimple(); //Antworten der Fragen in zufällige Reihenfolge bringen randomFragen.ForEach(x=>x.Antworten = x.Antworten.ShuffleSimple().ToArray()); for (int i = 0; i < randomFragen.Count; i++) { //Frage ausgeben Console.WriteLine(string.Format("Frage {0}: {1}", (i+1), randomFragen[i].Wortlaut)); //Antworten dazu ausgeben for (int j = 0; j < randomFragen[i].Antworten.Count(); j++) { Console.WriteLine(string.Format("\t{0}) {1}", (j+1), randomFragen[i].Antworten[j].Wortlaut)); } Console.Write("Deine Antwort: "); string antw = Console.ReadLine(); if (randomFragen[i].Antworten[int.Parse(antw)-1].isTrue) { Console.WriteLine("richtig\n"); } else { Console.WriteLine("falsch\n"); } } } public class Frage { public string Wortlaut { get; set; } public Antwort[] Antworten { get; set; } } public class Antwort { public string Wortlaut { get; set; } public bool isTrue { get; set; } }
die darin enthaltenen Extension-Methods:

public static IList<T> ShuffleSimple<T>(this IList<T> list) { Random rng = new Random(); int n = list.Count; while (n > 1) { n--; int k = rng.Next(n+1); T value = list[k]; list[k] = list[n]; list[n] = value; } return list; } public static void ForEach<T>(this IEnumerable<T> collection, Action<T> action) { foreach (T v in collection) action(v); }
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1