Autor |
Beitrag |
Zoltamor
Hält's aus hier
Beiträge: 8
|
Verfasst: Di 29.11.11 22:36
Hallo Forum, ich hoffe das ist das richtige Unterforum!
Also, ich muss für ein Projekt folgende Aufgabe übernehmen:
Grundlegendes: Es gibt ein Programm, dass Fragen stellt. Wenn man auf Antwort klickt, sieht man die Antwort, anschließend kann man bewerten wie schwierig man die Frage selbst gefunden hat, von 1-3, 1 ist leicht, 3 ist schwer.
So weit so gut, meine Aufgabe ist eine Funktion, die die Fragen einer Gruppe in einer bestimmten Reihenfolge kommen lässt. Die Funktion wird nach jeder Frage neu aufgerufen, und gibt nur die Fragennummer zurück. Abhängig ist die Reihenfolge von Bewertung und Auftreten, wobei das Auftreten am Ende des Quizes wieder auf 0 zurückgeht.
Also, einfaches Beispiel, es gibt 5 Fragen in der Gruppe.
es kommt Frage - wird bewertet mit
Frage 1 - schwer
Frage 2 - leicht
Frage 3 - mittel
dann wieder Frage 1 da vorhin mit schwer beantwortet
dann Frage 4 - leicht
Frage 5 - leicht
und dann nochmal Frage 3
oder so ähnlich, muss jetzt nicht genau so sein.
Meine Frage nun: Wie gehe ich das am besten an? Ich bekomme eine Datenbank übergeben, wo die einzelnen Fragen inklusive Antworten, Bewertungen und Auftreten dabei sind.
Bin für jede Hilfe dankbar, Grundlagen der Programmierung kann ich.
MFG Zoltamor
Zuletzt bearbeitet von Zoltamor am Mi 30.11.11 12:38, insgesamt 1-mal bearbeitet
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 30.11.11 10:11
Hallo Zoltamor
du meinst sicherlich "Algorithmus" im Titel, oder? 
|
|
Zoltamor 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 30.11.11 12:39
Hoppla, natürlich
Habs schon ausgebessert. Vielleicht findet sich jetzt eher wer der mir helfen kann
MFG Zoltamor
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 30.11.11 13:42
Hallo Zoltamor,
ich hatte heute morgen nicht soviel Zeit, um deine Frage konkret zu lesen und zu beantworten.
Als Stichwort fällt mir da "Priority Queue" ein, d.h. anhand der Bewertung die Frage einsortieren (und evtl. einen Zufallswert zusätzlich noch zu nehmen, um ein bißchen Abwechslung zu schaffen). Sehe ich das richtig, daß leichte Fragen dann komplett aus der Liste rausfallen sollen, also nicht mehr nachgefragt werden?
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 30.11.11 15:19
Delphi hat doch so hübsche dynamische Arrays, ich würde da garnicht groß mit der Priority-Queue-Keule schwingen:
 Am Anfang alle Fragen (nur die Nummern) in ein array of integer packen.
 Mit dem Befehl random( Lenght(MeinArray) ) wählst du nun eine Frage aus.
 Wird sie mit "leicht" bewertet, dann fliegt sie aus dem Array raus (Effizient: Das letzte Element des Arrays in die Lücke ziehen, Array eins kleiner machen).
Randomize nicht vergessen
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Zoltamor 
Hält's aus hier
Beiträge: 8
|
Verfasst: Do 01.12.11 01:31
Die Idee gefällt mir sehr gut, hab mir das selbst auch so ähnlich gedacht (unter zahlreichen anderen gescheiterten Versuchen  )
Stellt sich nur die Frage, wie realisiere ich das alles in C#?
Ein Array erstellen, und die random Funktion drüber laufen lassen dürfte kein Problem sein.
Aber: wenn sie mit leicht bewertet ist --> Wie werfe ich sie dann raus und mache das Array kleiner?
Und vor allem: Schwere und Mittlere Fragen sollten ja nach einer gewissen Zeit nochmal auftauchen, wie kommt das da mit rein?
Danke schon Mal für die Hilfe!
MFG Zoltar
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Do 01.12.11 09:29
Hi,
das ist jetzt schon das zweite mal dass ich eine Delphi-spezifische Antwort gebe, es aber eigentlich um C# geht  Bitte poste es dann im C#-Forum
Kurzes Googlen sagt mir nämlich: C# kann keine dynamischen Arrays, du kannst also das Array garnicht kleiner machen. Du müsstest also von Hand speichern, wieviele Einträge noch im Array sind (die letzten Elemente wären dann "leer"). Immer wenn du ein Element rausnimmst, dann machst du den Wert kleiner (Achtung, du musst das letzte wie im vorherigen Post nach vorne in die Lücke ziehen).
Die mittleren/schweren Fragen werden dann wieder gezogen, da sie ja noch im Array sind. Nur die leichten Fallen raus.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Do 01.12.11 09:39
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 01.12.11 10:37
Hallo zusammen,
unter C# gibt es die generischen Container, z.B. List<T> bzw. Queue<T>.
Aber so wie ich die Aufgabenstellung verstehe, sollen die Fragen ja anfangs in einer bestimmten Reihenfolge erscheinen. Und dafür eignet sich nun mal eine PriorityQueue.
Eine generische Version davon gib es unter www.codeproject.com/...elp-of-heap-data-str
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 01.12.11 12:10
Da die Laufzeit quasi egal ist, würde ich eine lineare Suche nach dem (wie auch immer gearteten) maximalen Element trotzdem bevorzugen  .
_________________ >λ=
|
|
Zoltamor 
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 02.12.11 15:37
Oh, tut mir Leid dass ich das nicht erwähnt habe, aber ja, es geht um C#!
Danke schon Mal für die vielen hilfreichen Antworten, nur so wirklich die Lösung hab ich leider noch immer nicht.
Die Fragen müssen nicht unbedingt in einer bestimmten Reihenfolge kommen, es geht nur darum, dass leicht bewertete dann nicht mehr kommen, mittlere noch 2 Mal und schwere noch 3 Mal, und halt innerhalb einer gewissen Zeit. Das ist das wichtige, und das, wo ich meine Probleme habe!
MFG Zoltamor
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Fr 02.12.11 18:10
Es wäre gut, wenn du mal ganz klar aufschreibst, was der Algorithmus genau tun soll. Die Anforderung "leicht bewertete dann nicht mehr kommen, mittlere noch 2 Mal und schwere noch 3 Mal, und halt innerhalb einer gewissen Zeit" lässt sich aus deinem Beispiel nicht ableiten. Auch der Begriff "gewisse Zeit" sollte klar definiert werden, sollen Wiederholungsfragen erst gestellt werden, wenn alle Fragen einmal durch sind oder schon vorher?
|
|
Zoltamor 
Hält's aus hier
Beiträge: 8
|
Verfasst: So 04.12.11 13:13
Ok ich erklärs nochmal:
Also:
Ich muss ein Programm schreiben, dass eine Fragennummer ausgibt. Je nach Fragennummer wird dann eine Frage ausgegeben (eh klar)
Das Programm soll ermitteln, welche Frage die nächste sein soll, und zwar nach Bewertung (1=leicht, 2=mittel, 3=schwer) und auch Auftreten. Am besten wäre es so, ich mach Mal ein konkretes Beispiel:
In der Datenbank stehen 50 Fragen. Die erste Frage wird zufällig gewählt, angezeigt, und bewertet.
Wird sie mit leicht bewertet, kommt sie nicht mehr! Wird sie mit mittel bewertet, soll sie nach ein paar Fragen, sagen wir 8, wieder kommen. Wird sie mit schwer bewertet, soll sie nach 5 Fragen wieder kommen. Und dazwischen halt immer andere Fragen!
Zu Ende ist das Quiz wenn alle leichten Fragen 1 Mal, alle mittleren Fragen 2 Mal und alle schweren Fragen 3 Mal aufgetreten sind! Vor jedem Quizbeginn wird das Auftreten wieder auf 0 gesetzt.
Hoffe es ist jetz klar und bedanke mich Mal wieder für die Hilfe die bis jetzt schon kam!
MFG Zoltamor
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 04.12.11 13:38
Hallo Zoltamor,
du hast den Algorithmus ja jetzt schon genau aufgeschrieben.
Hierfür reicht wirklich eine einfache Liste (anstatt meiner vorgeschlagenen PriorityQueue).
1. List<int> erzeugen
2. alle Fragen (bzw. deren Nummer) in die Liste eintragen
3. Liste shuffeln (random)
4. Jeweils die erste Frage anzeigen (bis Liste leer ist)
4a. Bewertung durchführen:
- leicht: erste Frage entfernen
- mittel: Frage an Position 8 verschieben (bzw. zufällig in einem Bereich von 5-10)
- schwer: Frage an Position 5 verschieben (... von 3-7)
Einzige Frage ist noch, ob bisher bewertete Fragen nochmals neu bewertet werden sollen, oder ob sie dann automatisch aus der Liste gelöscht werden sollen? Im zweiten Fall müßtest du noch zusätzlich die Bewertung mitspeichern (z.B. in einem eigenen Array oder aber eine eigene Klasse mit Fragennummer und Bewertung anlegen und diese dann in der Liste verwenden).
Wobei ich deinen Satz "Zu Ende ist das Quiz wenn alle leichten Fragen 1 Mal, alle mittleren Fragen 2 Mal und alle schweren Fragen 3 Mal aufgetreten sind!" eher so deute, daß du dann die schwere Frage zweimal in die Liste zurückeintragen sollst (und es keine neue Bewertung geben soll).
|
|
Zoltamor 
Hält's aus hier
Beiträge: 8
|
Verfasst: So 04.12.11 22:20
Danke vielmals schon Mal, hat mir denke ich echt weitergeholfen!
Und nein, die Bewertung soll nach jeder Frage neu erfolgen, wodurch sich jetzt eventuell ein bisschen was ändern kann.
Und noch eine Frage, wo finde ich am besten erklärt (oder würde das hier wer machen?  ) wie ich mit Listen arbeite? Weil die sind mir bisher völlig unbekannt.
MFG Zoltamor
|
|
Zoltamor 
Hält's aus hier
Beiträge: 8
|
Verfasst: Di 06.12.11 23:12
Über ein letztes bisschen Hilfe mit Listen wäre ich wirklich dankbar, hab zwar auch schon gegoogelt aber so wirklich was brauchbares kann ich nicht finden..
Danke schonmal!!!
MFG Zoltar
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 07.12.11 09:27
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Zoltamor 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 07.12.11 09:55
Ok vielen Dank, das sollte helfen!
MFG Zoltamor
|
|
|