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:

Boolsche Operatoren (and , or oder gibt es noch weitere?)
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1262
Wohnort: Ruhrpott

BeitragVerfasst am: 22.11.2023, 08:52    Titel: Re: Boolsche Operatoren Antworten mit Zitat

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

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 E-Mail senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 365

BeitragVerfasst am: 22.11.2023, 15:08    Titel: Re: Boolsche Operatoren Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2524
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 22.11.2023, 16:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1262
Wohnort: Ruhrpott

BeitragVerfasst am: 23.11.2023, 09:04    Titel: Re: Boolsche Operatoren Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 149

BeitragVerfasst am: 18.10.2024, 16:43    Titel: Boolsche operatoren Antworten mit Zitat

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



Anmeldungsdatum: 26.12.2022
Beiträge: 149

BeitragVerfasst am: 18.10.2024, 20:49    Titel: Boolsche operatoren Antworten mit Zitat

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



Anmeldungsdatum: 10.01.2005
Beiträge: 365

BeitragVerfasst am: 19.10.2024, 09:34    Titel: Antworten mit Zitat

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 zwinkern :
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



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

BeitragVerfasst am: 29.10.2024, 09:29    Titel: Antworten mit Zitat

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
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 QBasic. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
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