---

Für Fragen von Einsteigern und Programmieranfängern...
Mathias
Beiträge: 6165
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Quiz mit zufälligen Fragen

Beitrag von Mathias »

Kannst du das mit dem Array of Boolean aufschreiben, ich bin mit Arrays wirklich noch nicht so bewandt.

Etwa so habe ich das gemeint, aber du musst aufpassen, das es mehr Fragen gibt, als welche du stellen willst, ansonsten gibt es eine Endlosschleife.

Code: Alles auswählen

var
  gefragt: array of boolean;
...
    SetLength(gefragt, sl.Count);
...
    repeat
      nr := Random(sl.Count);
    until gefragt[nr] = False;
    gefragt[nr] := True;



Wie kann man auslesen, welcher RadioButton gecheckt ist?

Code: Alles auswählen

    if RadioButton?.Checked then mache_was;
 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

derg
Beiträge: 10
Registriert: Sa 27. Mai 2017, 09:04

Re: Quiz mit zufälligen Fragen

Beitrag von derg »

Mathias hat geschrieben:
weil das mit der Auswertung nicht klar komme.

Am besten machst du einen Antworte-Button, und in diesem Ereigniss vergleichst du die RadioButtons mit der Antwort.
Anschliessend holst du die nächste Frage.

Das eine Frage nicht doppelt kommt, machst du am besten eine Array of Boolean welche gleich gross ist, wie die SL.Count.


Wie bereits privat geschrieben, das mit dem Array of Boolean verstehe ich nicht, deshalb wäre Hilfe nicht schlecht.
Desweiteren wäre ein dritter Knopf, der nach Beantworten von 10 Fragen freigeschaltet wird um die Auswertung insgesamt vor zu nehmen nicht schlecht.
Ich hab auch etwas verändert, sodass die Frage beim Drücken des Buttons nicht mehr aktualisiert/geändert wird, kannst du mir den Fehler vielleicht nennen?
Zuletzt geändert von derg am Di 30. Mai 2017, 21:25, insgesamt 1-mal geändert.

AndreasMR
Beiträge: 98
Registriert: Di 4. Aug 2015, 15:29
OS, Lazarus, FPC: Linux, Raspbian, Windows
CPU-Target: 64/32 Bit

Re: Quiz mit zufälligen Fragen

Beitrag von AndreasMR »

Hallo derg,

so funktioniert aber
- weder Programmieren
- noch etwas neues Lernen
- noch dieses Forum (soweit ich es verstanden habe)


derg hat geschrieben:Eher auf freiwilliger Basis, ich möchte mich damit anfreunden und einfache Möglichkeiten lernen etwas zu lösen, jedoch hat Lazarus viele Möglichkeiten und deren Lösung im Internet zu finden ist schwer, außer man findet Leute, die bereits wissen, wie das Ganze funktioniert.


Wenn man etwas Neues lernen will, dann beschäftigt man sich im stillen Kämmerlein. Z.B. gibt es Tutorials zu Delphi (im Grundlagenbereich weitgehend kompatibel zu Lazarus / FreePascal) und auch zu Lazarus / FreePascal. Es gibt aber auch recht brauchbare Bücher, in die man sich einarbeiten kann. Suche mal danach - und Du wirst da einiges finden.

Auf diese Weise sammeln sich Ideen und Code-Schnipsel an, die so nach und nach die eigenen Vorstellungen zur Realität reifen lassen. Dann - und erst dann - ist es angebracht hier im Vorum aufzuschlagen, seine Gedanken vorzutragen, den bisher erarbeiteten Code zu bringen. Wenn Du dann sagst, "das und das funktioniert nicht so richtig - hat wer'n Tip?" dann wirst Du einige User finden, die Dir mit 5 Code-Zeilen aushelfen.

Es ist sogar auch OK, wenn Du keinen Code bringst und einfach nur Fachbegriffe anforderst, unter denen Du nachschlagen kannst. Diese Fachbegriffe hast Du nun zuhauf erhalten. Eigentlich liegt es jetzt an Dir, dies in Code zu wandeln.


Mein Eindruck ist auch der, dass niemand hier Dir Aufgaben (Schule, Uni, Arbeit) lösen wird. Insbesondere dann nicht, wenn Du die vielen Anregungen bislang nicht umsetzen konntest. Mangelnde Eigeninitiative wird selten belohnt.

Programmieren besteht auch nicht darin, im Internet Lösungen zusammenzuklöppeln. Und auch nicht darin, jemanden zu finden, der das schonmal gemacht hat.

Programmieren besteht darin, dass Du Dich mit den Möglichkeiten der Programmiersprache beschäftigst, deren Syntax lernst, ein Gefühl dafür entwickelst, wie weit Dir die IDE auf dem Weg zur Lösung weiterhelfen kann. Und da die Lazarus-IDE zu den besten gehört, die überhaupt jemals für Programmiersprachen entwickelt wurden, hast Du von Haus aus schon ziemlich gute Voraussetzungen , fast bis zum Ziel getragen zu werden. Dies gilt insbesondere bei solch recht einfachen Aufgaben.


Wie würdest Du es finden, wenn ein Mitschüler deswegen eine bessere Note als Du bekommen würde, nur weil er den besseren Programmierer gefunden hat als Du?

Nutze die Zeit als Schüler, Wissen anzuhäufen, zu lernen (nicht für die Schule sondern für Dich) und zu das Gelernte auch zu verstehen und anzuwenden.


Beste Grüße

Andreas
Ubuntu 14.04 LTS / Raspbian / Windows: Lazarus ab 0.9 bis 3.0

derg
Beiträge: 10
Registriert: Sa 27. Mai 2017, 09:04

Re: Quiz mit zufälligen Fragen

Beitrag von derg »

Mathias hat geschrieben:
Kannst du das mit dem Array of Boolean aufschreiben, ich bin mit Arrays wirklich noch nicht so bewandt.

Etwa so habe ich das gemeint, aber du musst aufpassen, das es mehr Fragen gibt, als welche du stellen willst, ansonsten gibt es eine Endlosschleife.

Code: Alles auswählen

var
  gefragt: array of boolean;
...
    SetLength(gefragt, sl.Count);
...
    repeat
      nr := Random(sl.Count);
    until gefragt[nr] = False;
    gefragt[nr] := True;



Wie kann man auslesen, welcher RadioButton gecheckt ist?

Code: Alles auswählen

    if RadioButton?.Checked then mache_was;
 


Ich hab jetzt soweit eine, notgedrungene, Variante der Auswertung.
Das mit dem Array of Boolean verstehe ich nicht, beziehungsweise verändert es nicht, weshalb ich denke, dass ich es falsch implementiert habe.
Das Programm hängt sich nach Durchlauf einiger Fragen auf, kannst du mir den Grund dafür nennen und vielleicht eine korrigierte Version als Anhang reinsenden?

Beste Grüße,
derg
Zuletzt geändert von derg am Di 30. Mai 2017, 21:25, insgesamt 1-mal geändert.

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Quiz mit zufälligen Fragen

Beitrag von Thandor »

Denk mal etwas logisch nach.

Kannst du etwas verwenden, bevor du es gekauft hast?
Du verwendest nr, bevor du nr, mit Random einen Wert vergibst.

mein Lazarus kann mit "sl[nr].Split(',');" nix anfangen. Was ist sl? Was kann sl? Das solltest du mal in der Dokumentation nachschlagen.

Dein Programm wird sich immer nach genau 20x klicken auf "Antworten" aufhängen, wel er aus deiner Repeat-Schleife nicht mehr raus kommt. Du solltest also noch prüfen, ob noch fragen vorhanden sind, die noch nicht gefragt wurden.
Das Boolen-Array nach einem vorkommen von FALSE duchsuchen und dann erst in die Repeat-Schleife gehen.

Diese drei Zeilen solltest du nicht in der ButtonClick-Methode ausführen:

Code: Alles auswählen

 
sl := TStringList.Create;
sl.LoadFromFile('fragen.csv');
SetLength(gefragt, sl.Count);   
 

Dies solltest du beim erstellen deiner Form erledigen, da sonst dein Programm wegen Festplattenzugriffe aus gebremst wird. Gerade dann wenn du sehr viele Fragen laden möchtest.

Nun mal als pseudocode:

Code: Alles auswählen

 
Methode: Start:
    Lade CSV-Datei
    erstelle Array <gefragt>
    Zeige erste Frage an
 
Methode: Antwort Click:
    Existieren Fragen, die noch nicht gefragt wurden? (<gefragt>)
    JA:
        Wiederhole:
             nächste Frage = ziehe Zufallsnummer
        Wiederholung ende, wenn nächste Frage noch nicht gefragt
        Zeige nächste Frage an
    NEIN:
       Zeige Nachricht: "Alle Fargen beantwortet"
 
Methode: Existieren Fragen, die noch nicht gefragt wurden:
   Rückgabewert=FALSE
   für alle Elemente aus Array <gefragt>:
      ist Element=FALSE dann:
          Rückgabewert = TRUE
          abbrechen
 


eine vollständige fertige Implementierung wird die hier keiner geben.

Mathias
Beiträge: 6165
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Quiz mit zufälligen Fragen

Beitrag von Mathias »

Ein kleiner Tip, die Record-Array sieht so aus:

Code: Alles auswählen

    Fragen: array of record
      Frage: string;
      Antworten: array[0..2] of string;
      Richtig: integer;
      Gefragt: boolean;
    end;

Diese Array fülle ich bei Create mit den Daten von der csv-Datei und setze "Gefragt" auf false..
Und später wen eine Frage kommt, wir "Gefragt" auf true gesetzt.

Ich hoffe dies hilft weiter.

Mit nicht mal 150 Zeilen braucht das Programm.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: ---

Beitrag von Thandor »

Nur weil er kein fertiges Programm bekommt löscht er seinen ersten Beitrag?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: ---

Beitrag von mschnell »

Nicht nur dumm und dreist, sondern auch noch feige.
(Es gibt Foren_Software, mit der man sich Änderungs-Geschichte jedes Beitrags anschauen kann).
-Michael

Mathias
Beiträge: 6165
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ---

Beitrag von Mathias »

Ich hatte mal noch viel etwas krasseres erlebt, da hat ein Admin ein ganzes Forum in seiner Frust gelöscht. :cry:
Diese Forum war auch schon relativ gross und hatte viel Beiträge.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: ---

Beitrag von mschnell »

Mathias hat geschrieben:da hat ein Admin ein ganzes Forum in seiner Frust gelöscht. :cry:

Beim Verhalten so mancher User kann man das verstehen :( .
-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: ---

Beitrag von Christian »

Hallo Leute, ich bin derzeit noch sehr unerfahren und möchte euch fragen, was ich nun noch machen muss.
Ich habe zwar eine Idee, bin mir auch sicher, dass es so klappt, weiß jedoch nicht, wie ich es in Pascal/Lazarus umsetzen soll.

Problemstellung: Ich muss ein Quizprogramm schreiben, bei dem von einem Fragenpool von 20 Fragen, zehn Fragen gestellt werden sollen mit anschließender Auswertung.

Nun habe ich folgendes Problem, ich kann zwar für jede Frage einzeln Radiobuttons erstellen und für diese dann einzeln das gleiche Schreiben, jedoch möchte ich, dass die drei möglichen Antwortfelder und die Caption mit der Frage beim Drücken auf den "Nächste Frage" Knopf angepasst wird an die nächste Frage.

Desweiteren weiß ich auch nicht, wie ich die einzelnen Fragen importiere, bei einer Frage ist es ja schon klar, aber ich weiß nicht, wie und in welcher Form ich die Fragen auslesen.

Code: Alles auswählen

 
    procedure TForm1.sendClick(Sender: TObject);
    begin
       if antwort1.checked then qpkt:=+1;
          if antwort1.checked then qpktm :=+1;
       if antwort2.checked then qpkt:=+0;
          if antwort2.checked then qpktm:=+1;
       if antwort3.checked then qpkt :=+0;
          if antwort3.checked then qpktm:=+1;
    end;
 
    procedure TForm1.auswClick(Sender: TObject);
    begin
      ShowMessage(IntToStr(qpkt)+' von '+IntToStr(qpktm));
    end;
 

Der angehangene Code ist auch nur möglich, wenn ich nur eine Frage habe, sonst würde ja immer die erste Antwortmöglichkeit einen Punkt bekommen und die anderen beiden nicht oder?

Ich habe bereits in anderen Threads geschaut, aber ich blicke dort z.T. gar nichts, weil dort nur Auszüge aus den Programmen sind.


Ups
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Mathias
Beiträge: 6165
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ---

Beitrag von Mathias »

Dies wird aber derg gar nicht gefallen. :mrgreen:

Mathias hat geschrieben:
da hat ein Admin ein ganzes Forum in seiner Frust gelöscht. :cry:

Beim Verhalten so mancher User kann man das verstehen :( .
-Michael

Wegen 1-2 User, die Müll schreiben muss man ja nicht das Ganze Forum löschen.
User sperren würde auch reichen,
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten