| 
				
					|  | 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, 15: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: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 28.11.2020, 20: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, 20:45, insgesamt einmal bearbeitet
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 28.11.2020, 20: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: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 28.11.2020, 20:57    Titel: |   |  
				| 
 |  
				| Stimmt. Die Umwandlung 	  | nemored hat Folgendes geschrieben: |  	  | Und sDateiName = iZufallF & ".txt" würde ebenfalls funktionieren - da wird die Zahl automatisch in einen String umgewandelt. | 
 ist überflüssig. Und  kann man sich auch sparen, wenn man die Datei mit 	  | Code: |  	  | sZufallF = Str(iZufallF) | 
 öffnet. 	  | Code: |  	  | Open szfileF & "\" & sDateiName For Input As #f | 
 
 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, 13: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: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 29.11.2020, 19:05    Titel: |   |  
				| 
 |  
				| 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. 	  | 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? | 
 
 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: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 30.11.2020, 19: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: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 30.11.2020, 20:48    Titel: |   |  
				| 
 |  
				| Du hast recht, das war mir noch nie aufgefallen. Gut zu wissen. 	  | nemored hat Folgendes geschrieben: |  	  | ...das automatische CAST rundet nicht kaufmännisch, sondern mathematisch | 
 
 
 Stimmt. Ohne INT sind die mathematisch gerundeten Zufallszahlen genauso falsch wie die kaufmännisch gerundeten. 	  | nemored hat Folgendes geschrieben: |  	  | Ob kaufmännisch oder mathematisch macht allerdings für die Zufallszahlen praktisch keinen Unterschied. | 
   
 
 Nun ja, wer einmal die Verwendung von 	  | 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 ... | 
 verstanden hat, wird sich kaum noch die Mühe machen, dafür ein Makro zu benutzen. 	  | Code: |  	  | zufallszahl = INT(RND * anzahl) + untergrenze | 
 
 Ü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.
 
 |  |