|
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 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1262 Wohnort: Ruhrpott
|
Verfasst am: 22.11.2023, 08:52 Titel: Re: Boolsche Operatoren |
|
|
Revilo hat Folgendes geschrieben: |
Kannst du mir die "Spielregeln" für die Klammersetzung bei boolschen Operatoren beibringen?
Idealerweise mit einigen Beispielen nach dem Motto:
So wäre es richtig. So wäre es falsch. |
Das ist leider mit ein paar Worten nicht zu erklären, aber glücklicherweise gibt es einige Tutorials zu diesem Thema, die du vielleicht einmal "durchackern" solltest:
Rechnen mit Vergleichen
Boolsche Algebra und Rechnen im Dualsystem
und aus der Referenz
Ausdrücke und Operatoren
Was die Klammersetzung betrifft, so funktioniert das genauso wie beim "normalen" Rechnen. Zuerst werden -von innen nach aussen- die Klammern aufgelöst, d.h. der Ausdruck in der Klammer wird berechnet und die Klammer durch das Ergebnis dieser Berechnung ersetzt, so lange, bis alle Klammern aufgelöst sind, dann geht es normal von links nach rechts weiter.
Wie die Klammern jeweils korrekt gesetzt werden müssen, hängt von der Aufgabenstellung ab, dafür gibt es keine pauschale Vorschrift. Da mußt du schon den Biocomputer zwischen deinen Ohren bemühen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 365
|
Verfasst am: 22.11.2023, 15:08 Titel: Re: Boolsche Operatoren |
|
|
Revilo hat Folgendes geschrieben: | Ist doch wie in der Mathematik.
|
Es IST Mathematik!
Und es bedarf einiger Erfahrung, bis man damit zurechtkommt. Also Biocomputer an und lernen und xp sammeln! _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2524 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 22.11.2023, 16:36 Titel: |
|
|
Und hier noch ein guter Wikipedia-Artikel als Einstieg
https://de.wikipedia.org/wiki/Wahrheitstabelle
@Revilo: Letztlich würde ich Dein Problem tatsächlich einmal als Wahrheitstabelle formulieren (Bleistift und Papier), d.h. alle Eingangswerte als Spalten, alle Kombinationen davon als Zeilen und in einer Spalte den gewünschten Ausgabewert (True bzw. False).
Anschliessend ist die Boolsche Algebra gefragt, um einen passenden Ausdruck formulieren zu können (und diesen nach Möglichkeit noch vereinfachen), welcher überall den gewünschten Ausgabewert liefert. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1262 Wohnort: Ruhrpott
|
Verfasst am: 23.11.2023, 09:04 Titel: Re: Boolsche Operatoren |
|
|
SpionAtom hat Folgendes geschrieben: | Es IST Mathematik! |
Das Kuriose daran ist, daß die Boolesche Algebra als Hilfsmittel zur Beschreibung philosophischer Probleme entwickelt wurde - lange, bevor es Computer gab.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 149
|
Verfasst am: 18.10.2024, 16:43 Titel: Boolsche operatoren |
|
|
Hallo nemored,
bei der Suche nach einem Lösungsweg für Sudokus stieß ich auf ein Video zum Thema Backtracking. Am Ende wurde auch der Code angegeben, aber leider in Python. Das half mir aber nicht viel weiter, weil ich ja nur QBasic beherrsche.
Hier wurden die Begriffe "True" und "False" verwendet, weil man bei diesem Algorithmus wohl unterscheiden muss, ob es weiter geht oder ob man in einer "Sackgasse" gelandet ist.
Python ist dem QBasic augenscheinlich ähnlich, aber eben nicht dasselbe.
Wenn ich diesen Python - Ansatz nutzen möchte, müßte ich also Python in QBasic quasi "übersetzen". Hast du eine Idee, wie man das elegant hinbekommen kann, gibt es vielleicht ein Tutorial, das darlegt, wie eine Python-Zeile in QBasic aussehen müsste, z.B. bei Schleifen?
"True" und "False" gibt es in QBasic aber bekanntlich nicht.
Kann man sie irgend wie anders ausdrücken, um dieselbe Wirkung zu erzielen?
Meine Idee ist, statt "True" und "False" , die ja Begriffe der Boolschen Arithmetik sind, einfach eine stinknormale Variable "Sackgasse" einzuführen:
Sackgasse = 0 alles ok. es geht weiter, wie bei "True"
Sackgasse = 1 bei Backtracking also 1 Schritt zurück wie bei "False"
Diese Idee zu testen wäre aber erst der zweite Schritt.
Zuerst brauche ich ja eine Übersetzung des Python -Codes in QBasic.
Gruß |
|
Nach oben |
|
|
Revilo
Anmeldungsdatum: 26.12.2022 Beiträge: 149
|
Verfasst am: 18.10.2024, 20:49 Titel: Boolsche operatoren |
|
|
Hallo nemored,
als Ergänzung meiner letzten Mail:
Ich habe mir mal die Mühe gemacht, alles relevante Zeichen für Zeichen abzutippen, damit ich es dir übermitteln kann.
Als notwendiger Parameter wird das zu lösende Sudoku (hier als Beispiel) als zweidimensionale Liste übergeben, in Python wird es so dargestellt:
sudoku = [ [0,0,7,0,0,9,0,4,5],
[9,3,0,7,0,8,0,6,0],
[6,0,0,0,5,0,0,0,7],
[0,0,0,0,8,0,0,7,0],
[0,0,0,0,0,0,0,3,0],
[7,4,2,0,6,3,9,1,0],
[0,0,0,2,0,0,0,0,6],
[0,6,0,9,1,0,0,0,3],
[1,0,3,0,0,0,0,0,0] ]
Wie würde diese Tabelle in QBasic aussehen, oder kann man sie in QBasic
vom Syntax her so 1 zu 1 übernehmen/definieren?
Wie kann ich sicherstellen, dass die gegebenen Zahlen auch an der richtigen Stelle in dieser Tabelle stehen?
Der Code für den Backtracking-Algorithmus sieht dafür in Python so aus:
def backtracking (sudoku):
if alle_felder_ausgefüllt(sudoku):
return True = Sudoku gelöst
zeile, spalte = naechstes_freie_feld(sudoku)
for zahl in range(1,10): = Zahlen von 1 bis 9
if zahl_erlaubt(zeile, spalte, zahl):
sudoku[zeile][spalte] = zahl
geloest = backtracking(sudoku)
if geloest:
return True
sudoku[zeile][spalte] = 0
return False
Wie kann man das in Qbasic übersetzen?
Warum läuft for zahl in range(1,10): von 1 bis 10, wenn doch nur 9 Zahlen für eine Zelle möglich sind?
Welche Vorarbeiten, Definitionen z.B. für Zeile und Spalte wären noch nötig?
Das mag sich lesen, als ob ich eine Komplett-Lösung von dir erwarten würde. Da ich mich inzwischen schon seit 5 Jahren mit diesem Problem umherquäle, wäre ich bestimmt nicht böse, wenn du sie mir fertig liefern würdest. Aber wo bliebe dann der Reiz am eigenen Denken?
Lernen heißt in erster Linie, sich selbst zu bemühen.
Aber manchmal geht es einfach nicht mehr weiter, weil es immer irgend etwas gibt, das man noch nicht weiß. Und dann braucht man mal einen helfenden Hinweis/Tipp/Fingerzeig.
So bitte ich, meine Anfragen auch zu verstehen.
Gruß Revilo |
|
Nach oben |
|
|
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 365
|
Verfasst am: 19.10.2024, 09:34 Titel: |
|
|
Ich kann dir nur empfehlen, eine Nummer kleiner zu beginnen.
Statt eines Solvers, der mit Rekursion arbeitet, schreib doch erstmal ein Programm, welches den Benutzer erlaubt, das Sudoku erstmal selbst zu lösen.
Die Algorithmen selbst sollte man auch unabhängig von der verwendeten Programmiersprache verstehen, bist du schon soweit?
Dann lege ich dir Konzepte nahe wie "Zweidimensionale Arrays", oder "Boolsche Algebra"
Mehr zu den Arrays findest du zb unter diesen Links: http://www.antonis.de/faq/QBMonFAQ-Dateien/324197220.html
http://www.antonis.de/faq/QBMonFAQ-Dateien/74973999.html
Mehr zu Boolsche Algebra findest du unter diesem Link, vielleicht kannst du das nochmal verinnerlichen :
https://forum.qbasic.at/viewtopic.php?p=111833
Zweidimensionale Arrays würde ich wie folgt in QBasic umsetzen
Code: |
Data 0, 0, 0, 1, 2, 3, 0, 8, 0
Data 1, 0, 0, 0, 0, 0, 0, 3, 7
Data 0, 0, 8, 7, 4, 6, 9, 0, 0
Data 3, 0, 5, 0, 0, 0, 6, 2, 9
Data 7, 2, 6, 0, 0, 0, 0, 0, 0
Data 8, 0, 1, 0, 0, 0, 3, 0, 4
Data 0, 0, 7, 9, 0, 0, 2, 0, 3
Data 9, 0, 3, 4, 7, 0, 0, 6, 5
Data 0, 5, 0, 6, 0, 8, 0, 0, 1
DEFINT A-Z
Dim SudokuBoard(0 to 8, 0 to 8)
'Lade ein Sudoku
restore Board1
For zeile = 0 to 8
For spalte = 0 to 8
Read SudokuBoard(spalte, zeile)
Next
Next
|
_________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4679 Wohnort: ~/
|
Verfasst am: 29.10.2024, 09:29 Titel: |
|
|
Ich arbeite seit etwa 20 Jahren nicht mehr mit QBasic, daher kann ich nicht garantieren, dass meine Lösungsvorschläge exakt so funktinieren. Im Moment fehlt mir auch die Zeit, ausführlich auf einen Sudoku-Löser einzugehen, daher nur eine grobe Umsetzung des Backtracking-Algorithmus.
In FreeBASIC gibt es eine Methode, Arrays zu befüllen, die der oben angegebenen Python-Methode sehr ähnelt; in QBasic gibt es diese Möglichkeit noch nicht. Ich würde da ebenfalls den Weg mit DATA und READ gehen, den SpionAtom vorgeschlagen hat.
Hier also eine "Übersetzung" des Backtracking-Algorithmus. Ob sich allerdings in QBasic bereits Arrays übergeben lassen, weiß ich ehrlich gesagt nicht.
Code: | SUB backtracking (sudoku())
IF alle_felder_ausgefüllt(sudoku()) THEN
RETURN True
END IF
naechstes_freie_feld(sudoku(), zeile, spalte)
FOR zahl = 1 TO 9
IF zahl_erlaubt(zeile, spalte, zahl) THEN
sudoku(zeile, spalte) = zahl
END IF
geloest = backtracking(sudoku())
IF geloest THEN RETURN True
NEXT
sudoku(zeile, spalte) = 0
RETURN False
END SUB |
Was dazu aber noch umgesetzt werden muss, ist:
alle_felder_ausgefüllt(sudoku())
gibt zurück, ob e noch unausgefüllte Felder (also mit Wert 0) gibt
naechstes_freie_feld(sudoku(), zeile, spalte)
sucht das nächste unausgefüllte Feld und gibt dessen Zeile und Spalte zurück
zahl_erlaubt(zeile, spalte, zahl)
prüft, ob die angegebene Zahl an die angegebene Stelle eingesetzt werden darf (dass die Zahl also in derselben Zeile / Spalte / Block noch nicht vorkommt). Ich würde ja behaupten, dass dazu auch sudoku() übergeben werden muss.
Und wie gesagt, das ist komplett trocken programmiert, ohne irgendwelche Tests.
Zitat: | Warum läuft for zahl in range(1,10): von 1 bis 10, wenn doch nur 9 Zahlen für eine Zelle möglich sind? |
Das ist eine Eigenart von Python. range(10) läuft von 0 bis 9, range(1, 10) von 1 bis 9, oder allgemein: range(start, ende) läuft von start bis ende-1.
Der Doppelpunkt am Ende gehört übrigens nicht zum range, sondern zum for. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
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.
|
|