Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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: :rolleyes: :floet:

Geschrieben
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!

:rolleyes:

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

Geschrieben

@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!

Geschrieben
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).

Geschrieben
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

Geschrieben

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

Geschrieben
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!

Geschrieben

: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

Geschrieben

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

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

Geschrieben

: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

Geschrieben

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]

  • 2 Wochen später...
Geschrieben

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 :D :

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

Geschrieben
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

Geschrieben

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

Geschrieben

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);

Geschrieben

ES HAT GEKLAPPT!!!!!!

:D :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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...