Problem mit Binärrechner, Array und Compilerausgabe
-
@f.-th.
Danke, so funktioniert es. Ist eigentlich logisch:for(zaehler=1; zaehler<ceil(y)+1; zaehler++) { printf("%i ",bin[zaehler]); };
Die for - Schleife beginnt bei 1. Solange der Zähler noch kleiner ceil(y)+1 ist, wird der Zähler inkrementiert und als Arraynummer verwendet.
Das geht sicher eleganter, nur bin ich schon froh, dass ich das so hinbekommen habe. Außerdem wollte ich einen Binärumrechner programmieren, der eine variable Länge von Zahlen umrechnen kann. Da hab ich bis jetzt immer nur Beispiele mit fester länge gefunden.
-
Ich hab noch einen Fehler gefunden:
Immer wenn ich eine Zahl eingegeben habe, die nur ein 1 und den Rest 0 erzeugte, gab es ein fehlerhafte Darstellung:
Bitte eine Zahl eingeben: 4 Binäre Länge: 2.000000 , also ist sie 2 Bits lang 0 0 Process returned 0 (0x0) execution time : 1.837 s Press any key to continue.
Hier nochmal der vollständige und funktionierende Code:
#include <math.h> #include <stdio.h> int main() { double y; int x=0, i=0, rest=0, uebertrag=0, zaehler=0; printf("\nBitte eine Zahl eingeben: "); scanf("%i",&x); y = log(x)/log(2); /*Länge der binären Zahl ermitteln*/ y=y+0.0001; printf("\n\nBin\x84re L\x84nge: %lf , also ist sie %1.lf Bits lang\n\n\n", y, ceil(y)); i=ceil(y); int bin[i]; for(i=ceil(y); i>0; i--){ rest=x%2; bin[i]=rest; uebertrag=x/2; i--; rest=uebertrag%2; bin[i]=rest; x=uebertrag/2; }; for(zaehler=1; zaehler<ceil(y)+1; zaehler++) { printf("%i ",bin[zaehler]); }; printf("\n\n"); return 0; }
Vielen Dank an alle für die Geduld und Hilfe.
@DirkB: Sehr elegant gelöst
-
Der Quelltext von mir ist bestenfalls ausreichend. Da ist noch Zeug doppelt drin.
Bau das raus. Du beschreibst dein Array 2 mal an der selben Position. WarumUnd mit der Zählweise - nimm besser die Variante, die gebräuchlicher ist.
Das ist auch eine Übung damit zukünftiger Quelltext besser wirdIch vermute das der Quelltext ohne Änderungen nicht auf allen Compilern läuft, da C99 Merkmale da drin sind.
MfG f.-th.
-
Über die elegante Version reden wir, wenn dein Programm läuft. :xmas1:
-
Da bald Weihnachten ist:
#include <math.h> #include <stdio.h> int main() { double y; int x=0, i=0; printf("\nBitte eine Zahl eingeben: "); scanf("%i",&x); y = log(x)/log(2) + 0.001; /*Länge der binären Zahl ermitteln + Korrekturfaktor*/ printf("\n\nBin\x84re L\x84nge: %2.1f , also ist sie %1.f Bits lang\n\n\n", y, ceil(y)); // gcc %lf i=ceil(y)-1; int bin[i]; for(i=i; i>-1; i--) { bin[i]=x%2; x=x/2; }; for(i=0; i<ceil(y); i++) printf("%i ",bin[i]); return 0; }
:xmas1:
-
@DirkB: Das war wohl ein Missverständnis. Ich meinte, dass deine Lösung, die f.-th. so schön in kompletten Code verpackt hat, elegant ist. Meine ist natürlich nicht so schön, eben wegen den Arrays, wie f.-th. schon angesprochen hat. Aber als Anfänger bin ich froh (und erst recht als Basic - Anwender, der sich immer gescheut hat, C zu lernen), dass es schonmal zu dem gewünschten Ergebnis führt. Danke euch, ich hab wieder mal viel lernen können.
-
Ich habe ja nur die eine Schleife geändert. Man kann auch das ganze darum auch ändern und da die Vorzüge von C ausspielen.
Von mir gibt es das heute Abend nicht mehr
Vielleicht geben die andern ein paar Beispiele mit Erklärung.
-
Wenn's nur um die Ausgabe geht, hätte ich da noch etwas anzubieten:
#include <stdio.h> void binprint(unsigned x) { if(x > 1) { binprint(x / 2); } putchar(x % 2 + '0'); } int main(void) { unsigned x; scanf("%u", &x); binprint(x); putchar('\n'); return 0; }
-
Sehr sehr schick, Seldon. Auf so was wäre ich NIE gekommen
-
Mach dir da mal keinen Kopf drum, mit der Zeit entwickelt man einen Blick für Rekursion. Wichtig ist vor allem, zu lernen, große Probleme in kleinere aufzuspalten, dann drängt sich so etwas ggf. von selbst auf. Zwar ist in diesem speziellen Fall die Ausgabe einer Zahl in Binärdarstellung nur mit Mühe als großes Problem zu begreifen, aber aufspalten lässt sich das prima: 0 und 1 kann man direkt verarbeiten, bei größeren Zahlen muss erst der vordere Teil (also x / 2) binär ausgegeben werden und dann das was übrig bleibt.
Es sei allerdings dazu gesagt: Rekursion beinhaltet einen gewissen Overhead. Jeder Funktionsaufruf bedeutet Arbeit für den Prozessor, und die lokalen Variablen einer rekursiven Funktion liegen vielfach gleichzeitig im Speicher. In manchen Fällen ist dieser Mehraufwand vernachlässigbar, in anderen kann er kräftig Performance und Speicher kosten - bei großen Rekursionstiefen oder hohem Speicherverbrauch innerhalb rekursiver Funktionen kann einem schnell der Stack überlaufen. Auch wenn sich viele Sachverhalte elegant rekursiv darstellen lassen, ist mitunter ein weniger hübscher iterativer Ansatz zweckmäßiger. In unserem Fall dürfte Performance keine Rolle spielen, daher ist das so durchaus vertretbar, aber im Grunde ist es schon ein bisschen dekadent, für jede Ziffer einen eigenen stack frame aufzumachen.