Binärrechner

Martin78

Grünschnabel
Hallo,

ich bin neu hier im Forum und versuche mich auch erst seit kurzem in der Programmiersprache PHP (was man an meine geposteten Code wahrscheinlich sehr schnell feststellen wird). Als Einstieg versuche ich zur Zeit eine kleinen Taschenrechner zu programmieren. Bis zu den Grundrechenarten hat alles mehr schlecht als recht (keine Fehlerabfrage z.B: wenn man Buchstaben statt Zahlen eingibt) funktioniert. Jetzt versuche ich eine kleine Umrechner von Dezimalzahlen ins Binärsystem zu programmieren. Doch leider komme ich damit nicht weitert. Habe schon mehrere Threads durch geschaut aber leider nichts gefunden. Das Problem liegt auch mehr darin das ich nicht weiß wo der Fehler liegt. Denn geh ich meine Code gedanklich durch müsste es (eigentlich) klappen.
Bin auch der Meinung das der Code soweit richtig ist nur meine Stringausgabe nicht funktioniert, da er immer die auszugebende Variable überschreibt. Hab schon versucht die Variablen mit "." zu verbinden. Allerdings klappt das nicht so richtig.

Kurz zu meinem Code:
Hab ein HTML-Formular geschrieben das eine Zahl an eine php-Datei schickt. Dies funktioniert auch (hab mir die Zahl mit "echo" ausgeben lassen). Hab eine if-Schleife gebastelt die solange durchlaufen werden sollange die Bedingung ($ergebnis) >=0 ist, Rufe in der Schleife eine Funktion auf "binaer()" die einmal mit "%"-Rechnung den Rest berechnet und einem mit "/"-Rechnung das Ergebnis für den nächsten Schritt (nächsten Schleifendurchlauf) berechnet. Nun bin ich mir auch leider nicht sicher ob die Schleife bis zum Bedingungsabbruch durchläuft (Leider gibt es in Dreamweaver keinen Debugmodus wie in Eclipse oder Microsoft Visual Studio wo man den Code Zeile für Zeile mit Ausgabe durchgehen kann). Mein zweites Ziel ist dann nach jedem Funktionsaufruf das Ergebnis der Restberechnung ($anzahl_4) an einem String zu ketten und auszugeben. Was wie oben schon beschrieben nicht funktioniert. Was die Reihenfolge der Ausgeb der Binärwerte angeht habe ich mir noch keinen Kopf gemacht (da sie ja erstmal verkehrt herum ausgegeben werden). Um einen Sortierungsalgorithmus wollt ich mich erst später kümmern wenn ich das Ausgabe bzw. Berechnungsproblem im Griff habe.

Der Code:

<?php

$anzahl_1 = $_POST['zahl1'];
echo("<br> Eingabe: $anzahl_1");

$zwei = 2;

$ergebnis = $anzahl_1;


if($ergebnis >= 0){

function binaer(){

$GLOBALS[ergebnis_1] = $GLOBALS[ergebnis] / $GLOBALS[zwei];
$GLOBALS[anzahl_4] = $GLOBALS[ergebnis] % $GLOBALS[zwei];

$ergebnis_2 = (int)$GLOBALS[ergebnis_1];

echo("<br><br>$GLOBALS[anzahl_4]");

$GLOBALS[ergebnis] = $ergebnis_2;


}
binaer();

$ausgabe;

$neu = $ausgabe.$anzahl_4;
echo $neu;

}

?>


Mein gedankliches Ziel ist (Bsp: Zahl 49):

49 : 2 = 24 Rest: 1
24 : 2 = 12 Rest: 0
12 : 2 = 6 Rest: 0
6 : 2 = 3 Rest: 0
3 : 2 = 1 Rest: 1
1 : 2 = 0 Rest: 1

Resultat: 110001

Ausgegeben werden soll aber nur das Resultat.



Über eure Hilfe würde ich mich sehr freuen, da ich schon vieles Versucht habe und absolut nicht weiß wo mein Denkfehler ist.

Viel Dank schon mal im vorraus und Grüße Martin
 
Hi,

ich bin zwar selbst nicht so der php-Könner, aber ich versuch trotzdem mal dir zu helfen.
Was mir auffällt: Ist das wirklich eine Schleife?

Für mich wirkt es als würde folgendes passieren:
1. er prüft, ob ergebnis größer gleich 0 ist
2. wenn ja ruft er binaer() auf
3. hängt das ergebnis an ausgabe (welche ja leer ist)
4. ende

Also wie soll es zu einem erneuten Aufruf kommen? Da wäre doch
PHP:
while($ergebnis >=0)
eher angebracht. Dann musst du auf jeden Fall noch $ausgabe außerhalb der Funktion definieren.

leider kenn ich mich mit $GLOBALS nicht aus, sodass ich dir nicht sagen kann ob deine definitionen da richig sind, auf mich wirken sie etwas seltsam.
 
Also ich würde es so machen:

(Leider kann ich es gerade nicht testen, deshalb hoffe ich mal dass sich keine Fehler einschleichen ;)

PHP:
$ergebnis = $anzahl_1
$anzahl_mod;
$anzahl_dif;
$ausgabe;

while($ergebnis > 0)
{
   $anzahl_mod = $ergebnis % 2;
   $anzahl_dif = floor($ergebnis / 2);
   $ausgabe = $ausgabe . $anzahl_mod;
   $ergebnis = $anzahl_dif;
}

echo $ausgabe;

Was mir bei dir aufgefallen ist :
PHP:
if($ergebnis >= 0)
ist immer falsch, da durch die division $ergebnis niemals kleiner 0 werden kann.

EDIT: UUUPS FEHLER ;)
 
Zuletzt bearbeitet:
Hallo,

Danke erstmal für deine schnelle Antwort. Hab gerade versucht die if-Schleife in eine while-Schleife um zuwandeln. Leider gibt er mir dann folgende Fehlermeldung aus:

Fatal error: Cannot redeclare binaer() (previously declared in D:\Server\htdocs\Binaerrechner1.php:25) in D:\Server\htdocs\Binaerrechner1.php on line 23


Zu der If-Schleife muss ich nochmal kurz was schreiben. Hab ich leider grad erst festgestellt. Ich glaube das die Schleife soweit ersteinmal funktioniert, da sie bei mir bei Eingabe der Zahl 48 eine 0 ausgibt. Hab mal die Zahl 48 per Hand ausgerechnet und kamm auf das Ergebnis "110000". Demzufolge denke ich das er die Schleifen bis zur letzten Stelle (die letzte Null) durchlaufen haben muss. Sorry, hab die Zahl 48 gerade erst mit meinem Prog probiert. Hätte ich natürlich vor dem Threaderöffnung probieren sollen. Könnte mir also denken das eventuell das Probelm in der Ausgabe liegt.

PS: Was allerdings der oben beschrieben Fehler bedeutet weiß ich allerdings auch nicht. Da ja (wie ich mir das denke) while-Schleifen genaus programmiert werden wie if-Schleifen wenn ich mich nicht irre.


Trotzdem nochmal danke für deine schnelle Antwort.
 
Das Problem ist da deine Funktionsdefinition. Du darftst eine Funktion nur 1x definieren. Was aber bei dir passiert:

1. er geht in die schleife
2. definiert dort binaer()
3. führt binaer() aus
4. wiederholt die schleife

Somit würde er binaer() erneut definieren wollen, was nicht geht. setze den ganzen "function binaer()"-Block außerhalb der schleife und rufe dort nur binaer() auf.

Außerdem ist eine "if"-Anweisung NIEMALS eine Schleife. Schleifen sind nur "for(...), while(...), do(...)". "if" ist nur eine einmalige Abzweigung!

Ein weiteres Problem ist, dass der Divisionsoperator "/" in PHP kein DIV ist, sondern die normale Division. Also 49 / 2 = 24,5 dafür musst du mit floor(wert) auf die nächste ganze Zahl abrunden.
 
Zuletzt bearbeitet:
Sorry, da muss ich ja noch vieles ändern.

Das mit der einmaligen Funktionsdefinition wusste ich nicht. Werd das gleich mal ändern. Außerdem werd ich das mit den Schleifen mir auch gleich noch angucken.

Das Problem mit den 49 / 2 = 24,5 dacht ich, hab ich mit der Zeile:

$ergebnis_2 = (int)$GLOBALS[ergebnis_1];

gelöst. Ist dem nicht so? Wandelt er damit nicht die 24,5 in eine 24 um?



Nochmals vielen Dank für deine Mühen.
 
Das Problem mit den 49 / 2 = 24,5 dacht ich, hab ich mit der Zeile:

$ergebnis_2 = (int)$GLOBALS[ergebnis_1];

gelöst. Ist dem nicht so? Wandelt er damit nicht die 24,5 in eine 24 um?

Das kommt darauf an, wie PHP denn rundet. Wenn es mathematisch rundet, dann wird 24,5 zu 25 aufgerundet. Kannst du ja einfach mal rausfinden mit
PHP:
$test = 24,5;
$test2 = (int)$test;
echo $test2;

mfg
 
1. Hab das mal mit dem Runden probiert. Er runde ab. 24.5 wird zu 24.

2. Hab mir deine Tipps zu Herzen genommen. Funktionsblock hab ich ausgelagert und meine "if-Schleife" (Anweisung) ;-) ist jetzt eine while-Schleife. Und weiß du was, jetzt t es. Danke nochmal. Er gibt mir jetzt die Binärwerte in genau umgekehrter Reihenfolge aus (48 = 000011). D.h. die Ausgabe t auch und jetzt muss ich mich "nur noch" um eine Algorithmus kümmern der die Zeichenkette umdreht. Danke nochmal für alles. Falls ich mit dem Sortieralgo probleme hab werde ich mich bestimmt nochmal melden.

Wünsch dir noch ein angenehmes Wochenende.

CYA Martin
 
Kein Problem ;)

Aber das mit dem umdrehen brauchst du garnicht. Einfach die Reihenfolge umdrehen, in der du die Strings verkettest.

Also z.B. statt
PHP:
 $ausgabe = $ausgabe . $ergebnis;
einfach
PHP:
$ausgabe = $ergebnis . $ausgabe;
voilà ;)
 
Zurück