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

3 Lösungen Lösungen öffentlich
#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.

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
vote_ok
von pocki (4190 Punkte) - 21.09.2014 um 20:40 Uhr
Hier meine Lösung:
Meine XML-Datei sieht so aus:
Quellcode ausblenden XML-Code
<?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.
Quellcode ausblenden C#-Code
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:
Quellcode ausblenden C#-Code
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

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben