4

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Dicker Hobbit

Betreff: 4

BeitragDo, Jul 07, 2011 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey leute ich möchte ein programm schreiben das zahlen zwischen 1 und 100 ausrechnet es dürfen aber nur rechenzeichen (plus minus mal durch) und 4 vieren verwendet werden (z.b8+8+8+8 = 16).
leider hab ich keine idee wie man das am besten anstellt
danke schonmal im vorraus
 

HavockToxx

BeitragDo, Jul 07, 2011 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
1. brauchst du n Abfrage, Welche Zahlen oder welche Vorzeichen genutzt werden darf.
2. eine Auswertungsystem, welcher dir dann das Ergebnis liefern soll.
3. eine Ausgabe in Form von Console oder Gui. Das hengt davon ab, ob du lieber n Console oder n Gui bei punkt 1 Verwenden willst.

1.1 Frage ist....
Formel = Wert +Vorzeichen+Wert2 +Anfrage ob mehr Dazukommt?

2.1 Wenn dann
Wenn Anfrage = Ja dann
Formel = Formel + VorzeichenNeu + WertNeu + Anfrage ob mehr dazukommt?

Wenn Anfrage = Nein dann
Ergebnis = Formel

3.1 Ausgabe

in der Console "Print Ergebnis"

Das alles ist nur Theoretisch. Wird dir aber n Denkanstoss geben, wie du selber auf so ein Taschenrechner kommst.

MFG
Havock Toxx

Mr.Hyde

Newsposter

BeitragDo, Jul 07, 2011 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Weiterer Tipp:
Mit Mod kannst du prüfen, ob eine Zahl durch eine andere, also wie in deinem Beispiel die 4, teilbar ist.
BBP News RSS | Chaos Interactive | Watanien 2 Screens, Infos und Download | Watanien 2 Worklog | PuzzleMasters
http://abgeordnetenwatch.de - http://www.regierungs-beratung.de - Der Regierung auf die Finger schauen

Midimaster

BeitragFr, Jul 08, 2011 8:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider geht aus deinem Beitrag nicht hervor, ob der User das ganze wie einen Taschenrechner betreiben wird, oder ob er die Aufgabe als einen Gesamttext erst mal angibt und dann der Computer die Aufgabe lösen soll.

Was du dann wahrscheinlich brauchst nennt sich "Parser". Das ist ein Code, der Texte (Strings) in seine einzelnen Elemente zerlegt und dann darauf mit bestimmten Funktionen reagiert.

Deine Aussage mit den "4 Vieren" verstehe ich nicht. Danach schreibst Du ein Beispiel, bei dem 4 "Achten" vorkommen und die Lösung auf der rechten Seite ist auch noch falsch: 8+8+8+8=32 und nicht "16" ?!? Wie meinst Du das?

Erläutere das bitte noch mal etwas genauer!

Dicker Hobbit

BeitragFr, Jul 08, 2011 9:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja 4 * 8 ist naturlich 32 ich hatte mich verscrieben und meinte naturlich 4*4 Wink

um zu verdeutlichen was ich meine hab ich einen kleinen code geschrieben der aber noch nicht funktioniert.

Ich würde mich freuen wenn ihr mir diesbezüglöich helfen könntet:

BlitzBasic: [AUSKLAPPEN]

vier="4"
plus= "+"
minus= "-"
mal= "*"
durch= "/"



Repeat
Cls
operator1= Rnd(plus, minus, mal, durch)

operator2= Rnd(plus, minus, mal, durch)

operator3= Rnd(plus, minus, mal, durch)




Print vier+operator1+vier+operator+vier+operator+vier
WaitKey

Until KeyDown (1)

count-doku

BeitragFr, Jul 08, 2011 9:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Problem ist, wie dir der Debugger sicherlich auch gesagt hat,
dass Rand/Rnd nur 2 Parameter annimmt.
Einen Min- und einen Maxwert...

D.h. du musst die Variablen in ein Array packen, damit du da die Indexes abrufen kannst.
Gleiche Frage und die Lösung gabs hier schonmal: https://www.blitzforum.de/foru...hp?t=37364

Und am Besten noch Rnd zu Rand machen. Rnd liefert auch Kommawerte - Rand nicht.

BlitzBasic: [AUSKLAPPEN]
vier="4"
Dim Operator$(3) ; Definiert ein Feld mit 4 Werten (0-3)
Operator(0)= "+" ; Werte einsetzen
Operator(1)= "-"
Operator(2)= "*"
Operator(3)= "/"


Repeat
operator1= Rand(0,3)

operator2= Rand(0,3)

operator3= Rand(0,3)




Print vier+Operator(Operator1)+vier+Operator(operator2)+vier+Operator(Operator3)+vier
WaitKey
Until KeyHit(1)=1


lg,
count-doku

Midimaster

BeitragFr, Jul 08, 2011 9:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier einige Gedanken zum Errechnen des Ergebnis aus dem Textstring:

also geht es um einen TextString. Da brauchst Du einen "Parser".

Der Text wird von links nach rechts Zeichen für Zeichen zerlegt. Dabei treten folgende Schritte auf

(Beispiel-String:
Zitat:
3 + 4 - ...


A:
Das aktuelle Zeichen "3" ist eine Zahl. Die wird gespeichert als ZAHL_A.

B:
Das aktuelle Zeichen "+" ist ein Rechenzeichen. Die Rechenoperation ("Addition") entdeckt und vermerkt.

C:
Das aktuelle Zeichen "4" ist eine Zahl. Die wird gespeichert als ZAHL_B.

D:
Das aktuelle Zeichen "-" ist ein Rechenzeichen. Die vorherige Rechenoperation wird zuerst abgeschlossen: Da nun ZAHL_A und ZAHL_B vorliegen kann die Rechenoperation beginnen. Du verzweigst in die Funktion Addition() und errechnest 3+4=7. Das Ergebnis wird zur neuen ZAHL_A. Die neue Rechenoperation ("Subtraktion") entdeckt und vermerkt.

bei weiteren Schritten geht es bei C: weiter.

Reduzierung des Codes:

Schritt B und D sind fast identisch. Schritt A und C auch, aber...

Die Schritte A und B laufen nur einmal ab. Da das erste Entdecken eines Rechenzeichens ja noch keinen Abschluss der "vorherigen" Rechenoperation auslösen kann, scheint für die erste Zahl und das erste Rechenzeichen die Vorgehensweise anders zu sein.

Du kannst das aber geschickt umgehen, indem du einfach behauptest, die ZAHL_A stünde von Anfang an fest ("0") und auch die erste Rechenoperation ("+") wäre schon vorgegeben. So könntest Du mit der ersten Zahl "3" gleich bei C: einsteigen.

Beispiel:

Lass die ZAHL_A vor Beginn der Aktion "0" sein und die erste Rechenoperation ein "+". Dann ergibt sich bei einem Einstieg in C: 0 + 3 = 3 in Zahl_A.

Das ist genau das gleiche was du mit den Schritten A und B erreicht hättest. So brauchst Du nur die Schritte C und D verwirklichen.

Tipp: Entdeckt der Parser das Ende des String muss er noch die letzte Rechenoperation abschließen. Hier könnte noch einen Schritt E: nötig sein.... Auch hier gibt es einen Trick um das mit Schritt D: hinzubekommen: Hänge vor der Aktion an den String einfach ein "=" dran:

Zitat:
vom rnd():

4 x 4 - 4 + 4

besser:

4 x 4 - 4 + 4 =


. So "entdeckt" der Parser ein Rechenzeichen ("=") und reagiert automatisch mit Schritt D.



FRAGE:

Wirst du "Punkt vor Strich" rechnen?

4 + 4 x 4 = 32
oder
4 + 4 x 4 = 20

???
  • Zuletzt bearbeitet von Midimaster am Fr, Jul 08, 2011 10:15, insgesamt einmal bearbeitet

Dicker Hobbit

BeitragFr, Jul 08, 2011 10:08
Antworten mit Zitat
Benutzer-Profile anzeigen
danke schonmal für eure hilfe allerdings hab ich jetzt das problem das der operator jetzt als string gewertet wird und nicht eben als operator für eine rechnung (so weit ich das sehe)

Mein ziel war es das dann auch auszurechnen .... jetzt hab ich die frage wie ich das am besten anstelle mit
meinem lösungsansatz funktioniert es nicht

BlitzBasic: [AUSKLAPPEN]

ergebnis= vier+Operator(Operator1)+vier+Operator(operator2)+vier+Operator(Operator3)+vier



Print vier+Operator(Operator1)+vier+Operator(operator2)+vier+Operator(Operator3)+vier+ "= "+ ergebnis

Noobody

BeitragFr, Jul 08, 2011 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
DickerHobbit hat Folgendes geschrieben:
Hey leute ich möchte ein programm schreiben das zahlen zwischen 1 und 100 ausrechnet es dürfen aber nur rechenzeichen (plus minus mal durch) und 4 vieren verwendet werden

Aber es sind doch gar nicht alle Zahlen erreichbar? 100 zum Beispiel ist unmöglich so darstellbar (oder ich bin einfach zu dumm, um eine Darstellung zu finden).

Um das ganze mit einem Programm auszurechnen, gehst du mit Rand schon mal in die richtige Richtung. Das Problem hier ist aber, dass du mit Rand ja nie sicher bist, ob du alle Kombinationen durchprobiert hast. Besser also wäre es, wenn du gleich eine verschachtelte Schleife nimmst: BlitzBasic: [AUSKLAPPEN]
For Operator1 = 0 To 3
For Operator2 = 0 To 3
For Operator3 = 0 To 3
;Tu irgendwas
Next
Next
Next

Wenn die Schleife durchgelaufen ist, bist du sicher, dass du alle Kombinationen durchprobiert hast.

Um das ganze dann auszurechnen, kannst du ja direkt die Operatoren benutzen, anstatt zuerst einen String zusammenzusetzen und den dann auszurechnen. Hier mal ein Beispiel, wie man es machen könnte: BlitzBasic: [AUSKLAPPEN]
Dim Operator$(3)
Operator(0)= "+"
Operator(1)= "-"
Operator(2)= "*"
Operator(3)= "/"

For Operator1 = 0 To 3
For Operator2 = 0 To 3
For Operator3 = 0 To 3
Local Result

Result = DoOperation(Operator1, 4, 4)
Result = DoOperation(Operator2, Result, 4)
Result = DoOperation(Operator3, Result, 4)

Print "4 " + Operator(Operator1) + " 4 " + Operator(Operator2) + " 4 " + Operator(Operator3) + " 4 = " + Result
Next
Next
Next

WaitKey()

Function DoOperation(Operator, A, B)
Select Operator
Case 0
Return A + B
Case 1
Return A - B
Case 2
Return A*B
Case 3
Return A/B
End Select
End Function

Diese Methode beachtet kein Punkt-Vor-Strich, wenn du das benötigst, musst du dir noch was überlegen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Midimaster

BeitragFr, Jul 08, 2011 10:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist ein großer Unterschied, ob Dein Code auf ein + oder einen String mit "+" stößt. Das eine ist ein Rechenzeichen, das andere ein Text, der so aussieht wie ein Rechenzeichen.

Daher musst Du diese Texte "auswerten" und in entsprechende Rechenoperationen uminterpretieren:

BlitzBasic: [AUSKLAPPEN]
If RechenZeichen="+" Then
Ergebnis= ZahlA + ZahlB
ElseIf RechenZeichen="-" Then
Ergebnis= ZahlA - ZahlB
ElseIf RechenZeichen="x" Then
Ergebnis= ZahlA * ZahlB
ElseIf RechenZeichen="/" Then
Ergebnis= ZahlA / ZahlB
EndIf


Nachfragen:

Wird es sich immer nur um die Zahl 4 handeln?
Ist auch 44 erlaubt?
Wie ist das nun mit "Punkt vor Strich"?
Wie meinst Du das mit den Zahlen bis 100? 4*4*4*4 wäre ja deutlich mehr als 100...
Brauchst Du alle möglichen 64 Ergebnisse oder wirklich nur die, die sich per Zufall ergeben?

Dicker Hobbit

BeitragFr, Jul 08, 2011 11:01
Antworten mit Zitat
Benutzer-Profile anzeigen
ok also es sind nur die 4 vieren erlaubt (es geht übrigens um eine Hausaufgaben Smile )
also weder 44 noch 4.4
außerdem wäre punkt vor strichrechnung auf alle fälle wichtig
danke nochmal für diese große hilfe im forum

Dicker Hobbit

BeitragFr, Jul 08, 2011 11:03
Antworten mit Zitat
Benutzer-Profile anzeigen
es dürfen nur ergebniss unter hundert herauskommen (hab ich schon selbst gelöst) und ich benötige alle 64 ergebnisse

Dicker Hobbit

BeitragFr, Jul 08, 2011 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
hm also ich hab jetzte die ganze zeit versucht punkt vor strichrechnung einzubauen aber es will mir nicht gelingen ...kann mir jemand einen denkanstoß geben ?? Very Happy

Midimaster

BeitragFr, Jul 08, 2011 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Den "Denkanstoß", den dir Noobody gegeben hatte, war ja schon fast die gesamte Hausaufgabe....

also gut:

bei Punkt vor Strich scannst Du die gesamte Zeile vor der ersten Aktion und suchst das "*" oder das "/"-Zeichen. Ist eines drin, dann schneidest Du aus dem String den Teil "ab der Zahl davor bis zur Zahl danach" heraus, sendest das an die Berechnung und setzt in den String an der herausgenommenen Stelle die Ergebniszahl wieder ein. Dann scannst Du wieder die gesamte Zeile und wiederholst gegebenenfalls diese Aktion.

Beispiel:


Code: [AUSKLAPPEN]
4 + 4 * 4 / 4 =
4 +       / 4 =
Berechnung: 4*4=16
4 + 16    / 4 =
4 +           =
Berechnung: 16/4=4
4 + 4         =
 


Erst in einem zweiten Schritt wird nun auf "+" oder "-" gescannt


Zum Zerlegen des Strings wirst Du Funktionen wie LEFT$(), MID$() benötigen.

Soll das ganze aus der "Noobody"-Hausaufgabe entstehen, dann kannst du jetzt beweisen, dass Du nicht nur abschreibst. Allerdings wird der Weg jetzt komplizierter als wenn du von anfang an mit einem Parser gearbeitet hättest.
 

HavockToxx

BeitragSa, Jul 09, 2011 8:38
Antworten mit Zitat
Benutzer-Profile anzeigen
HavockToxx hat Folgendes geschrieben:
1. brauchst du n Abfrage, Welche Zahlen oder welche Vorzeichen genutzt werden darf.
2. eine Auswertungsystem, welcher dir dann das Ergebnis liefern soll.
3. eine Ausgabe in Form von Console oder Gui. Das hengt davon ab, ob du lieber n Console oder n Gui bei punkt 1 Verwenden willst.

1.1 Frage ist....
Formel = Wert +Vorzeichen+Wert2 +Anfrage ob mehr Dazukommt?

2.1 Wenn dann
Wenn Anfrage = Ja dann
Formel = Formel + VorzeichenNeu + WertNeu + Anfrage ob mehr dazukommt?

Wenn Anfrage = Nein dann
Ergebnis = Formel

3.1 Ausgabe

in der Console "Print Ergebnis"

Das alles ist nur Theoretisch. Wird dir aber n Denkanstoss geben, wie du selber auf so ein Taschenrechner kommst.

MFG
Havock Toxx


Das kommt halt dabei raus wenn man Zuwenige Infos bekommt um zu Helfen zu können. Smile

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group