|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
MikelUVW
Anmeldungsdatum: 23.08.2020 Beiträge: 6 Wohnort: München
|
Verfasst am: 28.11.2020, 16:59 Titel: Projekt: Quiz hat einen Fehler im Quellcode |
|
|
Hallo,
ich schreib zur Zeit ein kleines Programm. Es soll ein kleines Quiz sein. Das Programm meldet beim Ausführen keine Fehler und soweit funktioniert alles bis zu einem bestimmten Punkt.
Nach der ersten Frage zeigt er mir die Antwort an und dann soll er zur zweiten Fragen springen, aber dann wird mir die zweite Frage nicht angezeigt sondern wenn ich dann eine Taste drücke, zeigt er mir nur die Antwort zu der Frage, die er mir nicht anzeigt hat an.
Ich verstehe nicht was ich im Quellcode falsch gemacht habe.
Ich hoffe jemand kann mir weiterhelfen.
Ich bin selbst kein gelernter Programmierer. Ich habe mir das alles soweit selbst beigebracht. Ich bin natürlich auch für Tipps offen, wie ich den Quellcode besser gestalten könnte.
Code: |
'Projekt: Quiz
'Dort wo die exe-Datei liegt, müssen auch noch zwei Ordner erstellt werden mit dem Titel "Fragen" und "Antworten"
'In den Ordner "Fragen" kommen ".txt" Datein rein in der eine Frage drin steht.
'In den Ordner "Antworten" kommen auch ".txt" Datein rein mit den jeweiligen Antworten auf die Fragen.
'Die Datein fangen an mit "1" aufsteigend. z.B. 1.txt, 2.txt usw.
'z.B. Ist eine Frage in "1.txt" dann muss in Antworten Ordner in der Datei "1.txt" die Antwort drin stehen
#Include "file.bi"
DECLARE FUNCTION Zaehlung(a AS String) AS Integer
Dim szfile As String = ExePath 'Speicherort der exe
Dim szfileF As String
Dim szfileA As String
Dim iAnzahl As Integer
Dim iAnzahlF As Integer
Dim iAnzahlA As Integer
Dim iAnzahlF2 As Integer 'Wird bei den Fragen gebraucht/verwendet
dim iZufallF as Integer
Dim sDateiName As String
Dim sZufallF As String
DIM zeile AS String
Dim f AS INTEGER = FreeFile
'Dim iSpielaus As Integer = 0
'Arbeitsverzeichnis erstellt
szfileF = szfile & "\Fragen"
szfileA = szfile & "\Antworten"
iAnzahlF2 = Zaehlung(szfileF)
'Erstes Fenster: Zeigt Anzahl der Fragen und Antworten
Locate 4, 40
Print "Quiz:"
Locate 6, 0
Print Tab(24); "======================================"
Print Tab(24); "|"; Tab(61);"|"
Print Tab(24); "|" ; Tab(28); "Es wurde folgendes gefunden:"; Tab(61);"|"
Print Tab(24);"|"; Tab(61);"|"
Print Tab(24);"|"; Tab(32); "Fragen:"; " ";iAnzahlF2; Tab(61);"|"
Print Tab(24);"|"; Tab(32); "Antworten:"; Zaehlung(szfileA) ; Tab(61);"|"
Print Tab(24);"|"; Tab(61);"|"
Print Tab(24);"|"; Tab(61);"|"
Print Tab(24);"====================================="
Print ""
Print Tab(24); "Druecke eine Taste fuer Weiter."
Sleep
'Funktion die Fragen und Antworten zählt
FUNCTION Zaehlung(a AS String) AS Integer
Dim iMax As Integer = 0
Dim inumber As Integer = 0
Dim sznumber As String
Dim szpfad As String
Dim izaehler As Integer = 0
Do Until iMax = 1 'Nur wenn iMax = 1, dann wird Schleife unterbrochen
szpfad = a
'inumber wird um eins erhöht
inumber = inumber +1
'Umwandlung Integer zu String
sznumber = Str(inumber)
'Ganzer Pfad wird erstellt
szpfad = szpfad & "\" & sznumber & ".txt"
If FileExists(szpfad) Then 'Programm zeigt mir hier einen Fehler an
izaehler = izaehler + 1
Else
iMax = 1
EndIf
Loop
Return izaehler
END Function
Cls
Do
'Zufallszahl wird erzeugt
randomize Timer
iZufallF= rnd * iAnzahlF2
ChDir szfileF
sZufallF = Str(iZufallF)
sDateiName = sZufallF & ".txt"
OPEN sDateiName FOR INPUT AS #f
DO UNTIL EOF(f)
LINE INPUT #f, zeile
PRINT zeile
LOOP
CLOSE #f
Print ""
Print ""
Print "Druecke eine Taste um die Antwort anzuzeigen!"
Print ""
Print ""
SLEEP
ChDir szfileA
OPEN sDateiName FOR INPUT AS #f
DO UNTIL EOF(f)
LINE INPUT #f, zeile
PRINT zeile
LOOP
Sleep
CLS
Loop
|
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 28.11.2020, 21:33 Titel: |
|
|
Hallo MikelUVW,
du hast vergessen, die geöffnete Antwortdatei wieder zu schliessen.
Außerdem ist die Zufallszahlenerzeugung fehlerhaft, das implizite Umwandeln in eine Ganzzahl erzeugt Zufallszahlen zwischen 0 und iAnzahlF2 statt wie beabsichtigt zwischen 1 und iAnzahlF2.
Zudem habe ich mir erlaubt, einige stilistische Verbesserungsvorschläge einzuarbeiten, alle Änderungen habe ich entsprechend gekennzeichnet:
Code: |
'Projekt: Quiz
'Dort wo die exe-Datei liegt, müssen auch noch zwei Ordner erstellt werden mit dem Titel "Fragen" und "Antworten"
'In den Ordner "Fragen" kommen ".txt" Datein rein in der eine Frage drin steht.
'In den Ordner "Antworten" kommen auch ".txt" Datein rein mit den jeweiligen Antworten auf die Fragen.
'Die Datein fangen an mit "1" aufsteigend. z.B. 1.txt, 2.txt usw.
'z.B. Ist eine Frage in "1.txt" dann muss in Antworten Ordner in der Datei "1.txt" die Antwort drin stehen
''TESTDATEIGENERATOR
'MkDir ExePath + "\Fragen"
'MkDir ExePath + "\Antworten"
'For x As Integer = 1 To 5
' Open ExePath + "\Fragen\" + Str(x) + ".txt" For Output As #1
' Print #1, "Frage "; Str(x)
' Close #1
' Open ExePath + "\Antworten\" + Str(x) + ".txt" For Output As #1
' Print #1, "Antwort "; Str(x)
' Close #1
'Next
'
'?"OK"
'Sleep
'End
#Include "file.bi"
Declare Function Zaehlung(a As String) As Integer
Dim szfile As String = ExePath 'Speicherort der exe
Dim szfileF As String
Dim szfileA As String
Dim iAnzahl As Integer
Dim iAnzahlF As Integer
Dim iAnzahlA As Integer
Dim iAnzahlF2 As Integer 'Wird bei den Fragen gebraucht/verwendet
Dim iZufallF As Integer
Dim sDateiName As String
Dim sZufallF As String
Dim zeile As String
Dim f As Integer = FreeFile
'Dim iSpielaus As Integer = 0
'Arbeitsverzeichnis erstellt
szfileF = szfile & "\Fragen"
szfileA = szfile & "\Antworten"
iAnzahlF2 = Zaehlung(szfileF)
'Erstes Fenster: Zeigt Anzahl der Fragen und Antworten
Locate 4, 40
Print "Quiz:"
Locate 6, 0
Print Tab(24); "======================================"
Print Tab(24); "|"; Tab(61);"|"
Print Tab(24); "|" ; Tab(28); "Es wurde folgendes gefunden:"; Tab(61);"|"
Print Tab(24);"|"; Tab(61);"|"
Print Tab(24);"|"; Tab(32); "Fragen:"; " ";iAnzahlF2; Tab(61);"|"
Print Tab(24);"|"; Tab(32); "Antworten:"; Zaehlung(szfileA) ; Tab(61);"|"
Print Tab(24);"|"; Tab(61);"|"
Print Tab(24);"|"; Tab(61);"|"
Print Tab(24);"====================================="
Print ""
Print Tab(24); "Druecke eine Taste fuer Weiter."
Sleep
'Funktion die Fragen und Antworten zählt
Function Zaehlung(a As String) As Integer
'Dim iMax As Integer = 0 '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Dim inumber As Integer = 0
Dim sznumber As String
Dim szpfad As String
Dim izaehler As Integer = 0
'Do Until iMax = 1 'Nur wenn iMax = 1, dann wird Schleife unterbrochen
Do '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
szpfad = a
'inumber wird um eins erhöht
'inumber = inumber +1
inumber += 1 '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
'Umwandlung Integer zu String
sznumber = Str(inumber)
'Ganzer Pfad wird erstellt
szpfad = szpfad & "\" & sznumber & ".txt"
If FileExists(szpfad) Then 'Programm zeigt mir hier einen Fehler an
'izaehler = izaehler + 1
izaehler += 1 '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Else
'iMax = 1
Exit Do '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
EndIf
Loop
Return izaehler
End Function
Cls
Randomize Timer '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Do
'Zufallszahl wird erzeugt
'Randomize Timer '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
'iZufallF= rnd * iAnzahlF2 '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
iZufallF = Int(Rnd * iAnzahlF2) + 1 '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ChDir szfileF
sZufallF = Str(iZufallF)
sDateiName = sZufallF & ".txt"
Open sDateiName For Input As #f
Do Until EOF(f)
Line Input #f, zeile
Print zeile
Loop
Close #f
Print ""
Print ""
Print "Druecke eine Taste um die Antwort anzuzeigen!"
Print ""
Print ""
Sleep
ChDir szfileA
Open sDateiName For Input As #f
Do Until EOF(f)
Line Input #f, zeile
Print zeile
Loop
Close #f '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Sleep
Cls
Loop |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Zuletzt bearbeitet von grindstone am 28.11.2020, 21:45, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 28.11.2020, 21:45 Titel: |
|
|
grindstone ist gemein und antwortet viel schneller als ich
Ergänzend hätte ich jetzt nur noch zu sagen, dass unter FreeBASIC der Befehl RANDOMIZE auch ohne Parameter verwendet werden kann; das ist sogar noch ein bisschen besser als RANDOMIZE TIMER.
Und sDateiName = iZufallF & ".txt" würde ebenfalls funktionieren - da wird die Zahl automatisch in einen String umgewandelt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 28.11.2020, 21:57 Titel: |
|
|
nemored hat Folgendes geschrieben: | Und sDateiName = iZufallF & ".txt" würde ebenfalls funktionieren - da wird die Zahl automatisch in einen String umgewandelt. | Stimmt. Die Umwandlung Code: | sZufallF = Str(iZufallF) | ist überflüssig. Und kann man sich auch sparen, wenn man die Datei mit Code: | Open szfileF & "\" & sDateiName For Input As #f | öffnet.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
MikelUVW
Anmeldungsdatum: 23.08.2020 Beiträge: 6 Wohnort: München
|
Verfasst am: 29.11.2020, 14:58 Titel: |
|
|
Hallo,
Danke für die schnelle Antwort.
Einmal Danke grindstone. Das hab ich total übersehen, die geöffnete Antwortdatei zu schließen.
Danke, dass du mir das korrigiert hast mit der "Zufallszahlerzeugung". Kannst du mir das bitte erklären, warum er bei mir zwischen 0 und iAnzahlF2 eine Zufallszahl erzeugt hat und nicht zwischen 1 und iAnzahlF2?
Soweit blicke ich bei deinen Änderungen durch.
Danke nemored für deine Antwort.
Ich hab anscheinend hier manches doppelt gemoppelt.
Ich werd versuchen eure Vorschläge mit in meinen Quellcode einzufügen. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 29.11.2020, 20:05 Titel: |
|
|
MikelUVW hat Folgendes geschrieben: | Kannst du mir das bitte erklären, warum er bei mir zwischen 0 und iAnzahlF2 eine Zufallszahl erzeugt hat und nicht zwischen 1 und iAnzahlF2? | Das liegt an der unterschiedlichen Rundung der Zahlen. INT schneidet die Nachkommastellen ab, während bei der impliziten Umwandlung (= automatisches CASTen nach INTEGER) kaufmännisch gerundet wird, d.h. ab einem Nachkommawert von .5 wird aufgerundet.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 30.11.2020, 20:32 Titel: |
|
|
Kleine Korrektur (*klugscheißmodus) - das automatische CAST rundet nicht kaufmännisch, sondern mathematisch, d. h. bei .5 wird auf die nächste gerade Zahl gerundet (also z. B. 0.5 abgerundet auf 0 und 3.5 aufgerundet auf 4)
Ob kaufmännisch oder mathematisch macht allerdings für die Zufallszahlen praktisch keinen Unterschied.
Ich habe zu den Zufallszahlen vor längerem mal ein Tutorial geschrieben:
https://www.freebasic-portal.de/tutorials/zufallszahlen-verwenden-96.html
Die Frage nach der Rundung mit INT wird dort auf Seite 3 behandelt.
edit: Übrigens ist es immer wieder gut, seine eigenen Texte zu lesen ... gerade fiel mir auf Seite 4 ein grober Leichtsinnsfehler im '#DEFINE zufahlszahl(von, bis)' auf, der offenbar fast zehn Jahre lang niemanden gestört hat ... _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 30.11.2020, 21:48 Titel: |
|
|
nemored hat Folgendes geschrieben: | ...das automatische CAST rundet nicht kaufmännisch, sondern mathematisch | Du hast recht, das war mir noch nie aufgefallen. Gut zu wissen.
nemored hat Folgendes geschrieben: | Ob kaufmännisch oder mathematisch macht allerdings für die Zufallszahlen praktisch keinen Unterschied. | Stimmt. Ohne INT sind die mathematisch gerundeten Zufallszahlen genauso falsch wie die kaufmännisch gerundeten.
nemored hat Folgendes geschrieben: | ...gerade fiel mir auf Seite 4 ein grober Leichtsinnsfehler im '#DEFINE zufahlszahl(von, bis)' auf, der offenbar fast zehn Jahre lang niemanden gestört hat ... | Nun ja, wer einmal die Verwendung von Code: | zufallszahl = INT(RND * anzahl) + untergrenze | verstanden hat, wird sich kaum noch die Mühe machen, dafür ein Makro zu benutzen.
Übrigens tobt im internationalen Forum gerade eine heisse Debatte über den besten Zufallszahlengenerator.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|