Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Projekt: Quiz hat einen Fehler im Quellcode

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
MikelUVW



Anmeldungsdatum: 23.08.2020
Beiträge: 6
Wohnort: München

BeitragVerfasst am: 28.11.2020, 16:59    Titel: Projekt: Quiz hat einen Fehler im Quellcode Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1059
Wohnort: Ruhrpott

BeitragVerfasst am: 28.11.2020, 21:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4385
Wohnort: ~/

BeitragVerfasst am: 28.11.2020, 21:45    Titel: Antworten mit Zitat

grindstone ist gemein und antwortet viel schneller als ich traurig
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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1059
Wohnort: Ruhrpott

BeitragVerfasst am: 28.11.2020, 21:57    Titel: Antworten mit Zitat

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
Code:
ChDir szfileF
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
Benutzer-Profile anzeigen Private Nachricht senden
MikelUVW



Anmeldungsdatum: 23.08.2020
Beiträge: 6
Wohnort: München

BeitragVerfasst am: 29.11.2020, 14:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1059
Wohnort: Ruhrpott

BeitragVerfasst am: 29.11.2020, 20:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4385
Wohnort: ~/

BeitragVerfasst am: 30.11.2020, 20:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1059
Wohnort: Ruhrpott

BeitragVerfasst am: 30.11.2020, 21:48    Titel: Antworten mit Zitat

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. grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz