Daiana Geschrieben 22. Dezember 2003 Teilen Geschrieben 22. Dezember 2003 Hallo ihr Lieben. Bin mal wieder am Üben und komme einfach nicht weiter. Ich versuche ein Programm zu schreiben, dass dezimale Zahlen in duale Zahlen umwandelt. Mein Problem dabei ist nicht der Rechenweg oder so sondern die Bildschirmausgabe. Ich versuche das ganze über ein Array zu lösen, aber mein Programm will mal wieder nicht so wie ich gerne will. Was mache ich falsch? Hier mein Versuch: #include <stdlib.h> #include <stdio.h> #include <string.h> /*Programm zum Umrechnen einer Dezimalzahl in eine Dualzahl*/ int main(void) { int dezahl, duzahl[8], i=0 ; printf ("Dieses Programm rechnet Dezimalzahlen in Dualzahlen um. \n\n"); printf ("Bitte geben Sie eine Dezimalzahl ein: "); scanf ("%i", &dezahl); printf ("\n\n\n"); system("PAUSE"); system("cls"); printf ("Ihre Dezimalzahl war: %i \n\n", dezahl); printf ("Die Dualzahl ist: "); while (i != 8) { if (dezahl % 2 == 0 && dezahl >= 1) { duzahl[7-i]= 0; dezahl = dezahl/2; } else if (dezahl % 2!= 0 && dezahl >= 1) { duzahl[7-i]= 1; dezahl = dezahl/2; dezahl = dezahl-0,5 ; } else if (dezahl =1) { duzahl[7-i] = 0 ; } i =i+1; } printf ("%i", duzahl); printf ("\n\n\n"); system("PAUSE"); return 0; Das Programm läuft zwar, gibt aber total unsinnige Zahlen aus. Kann mir jemand einen Hinweis geben, wo mein Fehler liegen könnte? Bitte schreibt nicht das komplette Programm für mich auf. Ich versuche das soweit wie möglich selber zu schaffen, aber diese dumme Array-Geschichte kriege ich irgendwie nicht hin. Danke im Vorraus, Daiana Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Master Z Geschrieben 22. Dezember 2003 Teilen Geschrieben 22. Dezember 2003 Hi hab das Programm mal geschrieben! Die Zahlen sind von unten nach oben zu lesen! bsp 0 0 1 1 ->->1100 ->->-> Dez 12 #include <stdio.h> int main (void) { int zahl,x,a; long y=0; printf("Bitte geben Sie eine Zahl ein!"); scanf("%i",&zahl); printf("Ihre Zahl in dualer Schreibweise lautet:\n\n"); for(y=0;zahl;y++) { y = zahl%2 ; zahl = zahl / 2; printf("%ld\n",y); } fflush (stdin); getchar (); return 0; } Ich hoffe ich konnte dir weiterhelfen hab leider noch nicht mit Arrays gearbeitet ich hoffe ich konnte dir trotzdem helfen! :rolleyes: :floet: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. Dezember 2003 Teilen Geschrieben 22. Dezember 2003 Original geschrieben von Daiana Bitte schreibt nicht das komplette Programm für mich auf. Original geschrieben von Master Z Hi hab das Programm mal geschrieben! @Daiana: Vier Fehler sind mir aufgefallen: Erstens initialisierst du dein Array nicht mit Nullen, füllst aber auch nicht unbedingt alle Stellen. Eins von beidem solltest du tun. Zweitens sollte es bei else if (dezahl =1) ein == sein. Drittens musst du die Ausgabe auch in eine Schleife (z.B. eine for-Schleife) verpacken. Du gibst nur eine Zahl aus, noch dazu mit ungültigem Index (8). Viertens muss du zum Abziehen von 0,5 einen Dezimalpunkt benutzen, kein Komma. @Master Z: fflush(stdin) bewirkt undefiniertes Verhalten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Master Z Geschrieben 22. Dezember 2003 Teilen Geschrieben 22. Dezember 2003 @Klotzkopp was meinst du mit undefinierten Verhalten!fflush(stdin) bewirkt, dass der Tastaturpuffer gelöscht wird!Es werden alle Zeichen, die in die Tastatur eingelesen wurden gelöscht!Ich programmiere mit Dev-C++ und wenn ich nicht immer fflush(stdin) machen würde, würden manche Programme nicht laufen weil der Tastaturpuffer nicht leer ist! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. Dezember 2003 Teilen Geschrieben 22. Dezember 2003 Original geschrieben von Master Z was meinst du mit undefinierten Verhalten!fflush(stdin) bewirkt, dass der Tastaturpuffer gelöscht wird! Dann entwickelst du zufälligerweise auf einer Plattform und mit einem Compiler, bei dem das so funktioniert. Laut Standard ist das Verhalten von fflush auf Eingabeströme (zu denen auch stdin zählt), undefiniert. Bei einem anderen Compiler oder auf einem anderen BS kann dir das um die Ohren fliegen (oder einfach gar nichts tun). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Master Z Geschrieben 22. Dezember 2003 Teilen Geschrieben 22. Dezember 2003 Original geschrieben von Klotzkopp Dann entwickelst du zufälligerweise auf einer Plattform und mit einem Compiler, bei dem das so funktioniert. Laut Standard ist das Verhalten von fflush auf Eingabeströme (zu denen auch stdin zählt), undefiniert. Bei einem anderen Compiler oder auf einem anderen BS kann dir das um die Ohren fliegen (oder einfach gar nichts tun). Da magst du wohl recht haben!Bei meinem Compiler ist es notwendig fflush(stdin) anzuwenden wenn ich mit VisualStudio programmiere dann funzt es nicht da hast du schon recht! Bei VisualStudio ist es nicht notwendig fflush(stdin) anzuwenden!Ist halt von Compiler zu Compiler verschieden!Also wenn ich das nächste mal Poste, dann wundere dich nicht, wenn wieder fflush(stdin) auftaucht!Ist halt bei meinem Compiler so! Danke noch mal für deine Erklärung!:uli :uli :uli :uli :uli Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Daiana Geschrieben 22. Dezember 2003 Autor Teilen Geschrieben 22. Dezember 2003 Erstmal Danke. Habe jetzt einige Sachen geändert, und wenigstens gibt das Programm schon mal Nullen und Einsen aus. - Wenn auch noch nicht so ganz die Richtigen. Seid mir nicht böse, wenn ich das fertige Programm einfach mal ignoriere, aber ich lerne mehr dabei, wenn jemand einen Blick auf meine kleinen Fortschritte und Rückschritte wirft und mir direkt sagt, wo was falsch ist. Was meinst du mit "mit 0 indizieren"? Noch nie was von gehört. Mein Progr. wie es jetzt aussieht: #include <stdlib.h> #include <stdio.h> #include <string.h> /*Programm zum Umrechnen einer Dezimalzahl in eine Dualzahl*/ main() { int dezahl; int duzahl[8], i=0 ; printf ("Dieses Programm rechnet Dezimalzahlen in Dualzahlen um. \n\n"); printf ("Bitte geben Sie eine Dezimalzahl ein: "); scanf ("%i", &dezahl); printf ("\n\n\n"); system("PAUSE"); system("cls"); printf ("Ihre Dezimalzahl war: %i \n\n", dezahl); printf ("Die Dualzahl ist: "); for (i=0; i<=7; ++i) { if (dezahl % 2 == 0 && dezahl >= 1) { duzahl[7-i]= 0; dezahl = dezahl/2; printf ("%i", duzahl[7-i]); } else if (dezahl % 2!= 0 && dezahl >= 1) { duzahl[7-i]= 1; dezahl = dezahl/2; dezahl = dezahl-0.5 ; printf ("%i", duzahl[7-i]); } else if (dezahl ==1) { duzahl[7-i] = 0 ; printf ("%i", duzahl[7-i]); } } system("PAUSE"); return 0; } Wäre superlieb, wenn ihr euer kritisches Auge noch mal drüberlaufen lasst. Ich hoffe ich nerve euch nicht mit meinen unqualifizierten Fragen, aber ich hab da momentan echt noch Verständnisschwierigkeiten. Liebe Grüße Daiana Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Master Z Geschrieben 22. Dezember 2003 Teilen Geschrieben 22. Dezember 2003 Original geschrieben von Daiana Erstmal Danke. Habe jetzt einige Sachen geändert, und wenigstens gibt das Programm schon mal Nullen und Einsen aus. - Wenn auch noch nicht so ganz die Richtigen. Seid mir nicht böse, wenn ich das fertige Programm einfach mal ignoriere, aber ich lerne mehr dabei, wenn jemand einen Blick auf meine kleinen Fortschritte und Rückschritte wirft und mir direkt sagt, wo was falsch ist. Was meinst du mit "mit 0 indizieren"? Noch nie was von gehört. { duzahl[7-i]= 1; dezahl = dezahl/2; dezahl = dezahl-0 ;//nur die 0.5 durch 0 ersetzen//:uli printf ("%i", duzahl[7-i]); } Wäre superlieb, wenn ihr euer kritisches Auge noch mal drüberlaufen lasst. Ich hoffe ich nerve euch nicht mit meinen unqualifizierten Fragen, aber ich hab da momentan echt noch Verständnisschwierigkeiten. Liebe Grüße Daiana Das Programm gibt die Zahlen zwar von links nach rechts aus du musst aber andersrum denken Beispiel: Programm: 12 =0011 Es muss aber andersherum sein 1100 !Aber es funzt!Das Prog läuft richtig! Du musst nur vor jeder ausgabe ein /n setzen dann zeigt es die zahl so an: 0 0 1 1 dann sind die zahlen von unten nach oben zu lesen und so hin zu schreiben 1100! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Daiana Geschrieben 22. Dezember 2003 Autor Teilen Geschrieben 22. Dezember 2003 :confused: Was soll man dazu sagen... Mit der 0,5 durch 0 ersetzen funktioniert im Programm, aber warum??? :confused: Ich komme eher aus der Mathematik und wenn ich das da mache, ändert sich nix an der Zahl. Jetzt habe ich ein Programm, aber ich bin noch verwirrter als vorher;) Gibt es echt keine Möglichkeit die Zahlen umzudrehen? Ich meine, die Zahlen so ausgeben könnte ich ja auch ohne array und dann verstehe ich nicht, warum ichs überhaupt brauche. Aber trotzdem schonmal einen riesigen Dank. Daiana Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Timon Geschrieben 22. Dezember 2003 Teilen Geschrieben 22. Dezember 2003 dezahl = dezahl-0; Macht keinen Sinn. Ist genau das gleiche wie dezahl = dezahl; und das macht auch (normalerweise) wenig Sinn. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Daiana Geschrieben 22. Dezember 2003 Autor Teilen Geschrieben 22. Dezember 2003 Gut, das ist exakt, was ich dachte, nur: warum muß da keine 0,5 hin? Wenn ich eine ungerade Zahl durch 2 dividiere, dann bekomme ich xxx,5 heraus. Und xxx,5 % 2 kann niemals wieder null ergeben, oder? Das ist das Problem, dass ich dabei habe. Warum funktioniert das trotzdem? Rundet C denn automatisch ab? :beagolisc Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. Dezember 2003 Teilen Geschrieben 22. Dezember 2003 Original geschrieben von Daiana Wenn ich eine ungerade Zahl durch 2 dividiere, dann bekomme ich xxx,5 heraus. Und xxx,5 % 2 kann niemals wieder null ergeben, oder? Das ist das Problem, dass ich dabei habe. Warum funktioniert das trotzdem? Rundet C denn automatisch ab?So etwas Ähnliches. Du hast einen Ganzzahltyp (nämlich int) verwendet. Ein int kann nur ganze Zahlen aufnehmen, daher werden Nachkommastellen abgeschnitten. Genauer gesagt ist es sogar so, dass bei einer Division eines int durch einen andere Ganzzahl (wie in deinem Fall das Literal 2) gar keine Nachkommastellen entstehen, weil eine sogenannte Ganzzahldivision durchgeführt wird. Wenn du dann 0.5 subtrahierst, wird, um das Ergebnis der Subtraktion aufzunehmen, eine temporäre Variable vom Typ double erstellt. Das ist ein Fließkommatyp, der auch Werte mit Nachkommastellen - wenn auch mit beschränkter Genauigkeit - aufnehmen kann. Das macht der Compiler automatisch, weil er erkennt, dass einer der beiden Operanden (nämlich das Literal 0.5) kein Ganzzahltyp sein kann. Danach weist du dieses Ergebnis aber wieder einem int zu, mit dem Resultat, dass wieder in einen Ganzzahltyp konvertiert wird. Dabei werden - wie oben beschrieben - alle Nachkommastellen abgeschnitten. Dein - 0.5 wirkt also wie ein - 1. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Daiana Geschrieben 22. Dezember 2003 Autor Teilen Geschrieben 22. Dezember 2003 :bimei *Freude* Gut, das kann ich jetzt auch nachvollziehen. Du bist ein Schatz :hodata Meine letzte Frage: Warum kann ich die Zahlen nicht in umgekehrter Reihenfolge auf dem Monitor abbilden? Danach lass ich euch in Ruhe.... versprochen LG Daiana Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Knuddlbaer Geschrieben 27. Dezember 2003 Teilen Geschrieben 27. Dezember 2003 Falls es jemanden Interessiert: Hier ein komplettes Beispiel mit hilfe eines Bitsets: #include <bitset> #include <iostream> #include <string> using namespace std; int main() { // unsigned long zahl; long zahl; cout<<"Bitte geben Sie eine Dualzahl ein\n"; cin>>zahl; cout<<"Ihre Zahl "<<zahl<<"ergibt"; cout<<"\n(32 Bit)\n"<<bitset<32>(zahl); // Das Abschneiden führender 0 schaut etwas komplexer aus bitset<32> t(zahl); string temp(t.template to_string<char,char_traits<char>,allocator<char> >()); temp.erase(0,temp.find_first_of("1")); cout<<"\nDie Zahl "<<zahl<<" als max 32 Bit mit fehlenden 0 am Anfang:\n"<<temp; }[/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sill-el-Mot Geschrieben 7. Januar 2004 Teilen Geschrieben 7. Januar 2004 Hi ich weis das ich ein bissl spät bin aber macht hoffentlich nix . Also - wenn ich nichts überlesen habe - hast du als noch keine Antwort auf die Frage Was meinst du mit "mit 0 indizieren"? bekommen. Antwort: Mit "0" initialisieren bedeutet, dass du in jede Stelle deines Arrays eine "0" reinschreibst. Wenn du ein neues Array anlegst wird ja nur ein Teil in deinem Arbeitsspeicher reserviert, da können aber auch schon andere Werte drinstehen (auch wenn das bei mir noch nie vorgekommen ist). D.h. es kann sein, dass in deinem Array schon Werte drinstehen, die da nichts zu suchen haben, deswegen initialisiert man ein Array (oder auch andere Variablen) mit Werten die du haben willst (z.B. 0). Das ist dasselbe, wie du es mit deiner i variable gemacht hast int dezahl, duzahl[8], i=0 ; initialisieren tust du dein Array am besten in einer Schleife, in der du jede Stelle durchläufst und eine 0 an jede Stelle schreibst. Warum kann ich die Zahlen nicht in umgekehrter Reihenfolge auf dem Monitor abbilden?Wenn du die Ausgabe nicht gleich hinter der Berechnung machst, sondern erst die Berechnung (und das Ergebnis ins Array speichern - so wie du das schon machst) und dann eine extra Schleife mit der Ausgabe machst, wo du das Array von vorne (Stelle 0) nach hinten ausgibst müsste es theoretisch funktionieren. Ich hab dein Prog nämlich gerade mal auf Papier ausprobiert: Du berechnest erst die erste Stelle deiner Dualzahl und gibst diese dann gleich aus, danach die zweite Stelle und gibst diese dann dahinter aus -> deine Dualzahl wird verkehrt herum ausgegeben (wie du ja schon festgestellt hast ) Also ERST berechnen, dann Ausgeben. Und noch was : du kannst den _____________________ else if (dezahl ==1) { duzahl[7-i] = 0 ; printf ("%i", duzahl[7-i]); } _____________________ Teil aus deinem Prog weglassen, da dein Prog den Teil eh nie ausführt. Die beiden Bedingung die du vorher überprüfst schliessen diese dritte Bedingung mit ein Ich hoffe das war net zuviel Text und ich konnte dir hoffentlich weiterhelfen Liebe Grüße Silly Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
nic_power Geschrieben 7. Januar 2004 Teilen Geschrieben 7. Januar 2004 Original geschrieben von Sill-el-Mot Antwort: Mit "0" initialisieren bedeutet, dass du in jede Stelle deines Arrays eine "0" reinschreibst. Wenn du ein neues Array anlegst wird ja nur ein Teil in deinem Arbeitsspeicher reserviert, da können aber auch schon andere Werte drinstehen (auch wenn das bei mir noch nie vorgekommen ist). Darauf sollte man sich keinem Fall verlassen. Bevor man auf Speicher oder Variablen lesend zugreift, sollte man auch sicherstellen, dass dort vernünftige Werte vorzufinden sind (über eine entsprechende Initialisierung). Das ist dasselbe, wie du es mit deiner i variable gemacht hast initialisieren tust du dein Array am besten in einer Schleife, in der du jede Stelle durchläufst und eine 0 an jede Stelle schreibst. Das ist zwar die naheliegend, aber nicht sehr effizient um Speicherbereiche mit einem Wert zu initialisieren. Die Funktion "memset()" ist wesentlich effizienter und nutzt im Idealfall die speziellen blockmove/blockinit-Befehle auf Prozessorebene bzw. ist handoptimiert für diesen Anwendungszweck (aus dem gleichen Grund sollte man zum kopieren von Speicherbereichen die entsprechenden Bibliotheksfunktionen, wie beispielsweise bcopy(), memmove() usw. verwenden). Nic Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sill-el-Mot Geschrieben 8. Januar 2004 Teilen Geschrieben 8. Januar 2004 Moin Original geschrieben von NIC: Darauf sollte man sich keinem Fall verlassen. Bevor man auf Speicher oder Variablen lesend zugreift, sollte man auch sicherstellen, dass dort vernünftige Werte vorzufinden sind (über eine entsprechende Initialisierung). Ich hab auch nicht gesagt, dass man die Initialisierung nicht machen soll!!! Hab das nur ein paar mal ausprobiert und es stand immer 0 in meiner nicht initialisierten Variablen. mFg Silly Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Knuddlbaer Geschrieben 8. Januar 2004 Teilen Geschrieben 8. Januar 2004 Im Debug oder im Release ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sill-el-Mot Geschrieben 8. Januar 2004 Teilen Geschrieben 8. Januar 2004 Also falls du mich meinst :confused: Das war beim Debug. Ich bin mir vollkommen darüber im Klaren, dass man ALLE Variablen initialisieren soll!!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Knuddlbaer Geschrieben 8. Januar 2004 Teilen Geschrieben 8. Januar 2004 Im Debug wird i.d.r. immer mit 0 Initialisiert. Nimm mal Release und gib den Inhalt der uninitialisierten Variable aus. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
computercrustie Geschrieben 9. Januar 2004 Teilen Geschrieben 9. Januar 2004 Warum löst du das Problem nicht rekursiv ? Dann brauchst du erstens keine Arrays, hast nicht das Problem mit der verdrehten Ausgabe und bist vor allem nicht auf deine 8 Stellen beschränkt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Knuddlbaer Geschrieben 9. Januar 2004 Teilen Geschrieben 9. Januar 2004 Man könnte es auch bequem per C++ und bitset lösen.... ... jedoch handelt es sich hier um eine Übung. Und vllt. wollte man hier einfach genau den Weg Üben ) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
computercrustie Geschrieben 9. Januar 2004 Teilen Geschrieben 9. Januar 2004 Okay. Dann würde ich an deiner Stelle die Berechnung der Binärzahl trotzdem ändern: int zahl=dezahl; do { printf("%d\n",zahl % 2); zahl=(int)(zahl/2); } while (zahl); Damit sparst du dir die gesamte For-Schleife (und 'ne Menge Schreiberei). Willst du trotzdem immer genau 8 Stellen haben, dann kannst du das auch wie folgt machen: int zahl=dezahl, cnt=8; do { printf("%d\n",zahl % 2); zahl=(int)(zahl/2); } while (--cnt); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Daiana Geschrieben 14. Januar 2004 Autor Teilen Geschrieben 14. Januar 2004 ES HAT GEKLAPPT!!!!!! :uli :marine :marine Danke danke danke. Und das beste: Ich habe sogar verstanden warum Danke euch allen. Das war echt total lieb von euch. :e@sy Daiana Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.