Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Tobsi_

Frischling

  • »Tobsi_« ist der Autor dieses Themas

Beiträge: 83

Wohnort: Sachsen Anhalt

Beruf: Schülerin

  • Private Nachricht senden

1

24.11.2012, 16:16

Binär-In-Dezimal-codierer endet in Endlosschleife

Ich habe ein kleines Programm geschrieben, das eine 16Stellige Binärzahl in eine Dezimalzahl umwandeln soll. (Ich weiß der Windowsrechner kann das auch, aber ich wollts mal ausprobieren.) Wenn ich die Zahl 0000 0000 0000 1001 eingebe, funktioniert das Programm. Aber wenn ich 1001 0011 0101 0001 eingebe, endet alles in einer Endlosschleife. Ich hab schon den Debugger laufen lassen, aber da hat sich dann ein neues Fenster geöffnet, das voll mit code war, den ich nicht geschrieben habe und damit konnte ich dann nichts anfangen...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
void BinaerInDezimal ()
{
    int Ergebnis = 0;
    int Zahl[16];
    int Binaer = 0;
    cout << "Bitte Binearzahl eingeben (mit 16 Stellen, Rest mit Null auffüllen, weil mehr kann ich nicht): " << endl;
    cin >> Binaer;

    // BInaerzahl in einzelne Ziffern zerlegen, die dann in Zahl[] gespeicher werden
    Zahl[0]=static_cast <int> (Binaer/1000000000000000);
    Binaer=Binaer%1000000000000000;
    Zahl[1]=static_cast <int>(Binaer/100000000000000);
    Binaer=Binaer%100000000000000;
    Zahl[2]=static_cast <int>(Binaer/10000000000000);
    Binaer=Binaer%10000000000000;
    Zahl[3]=static_cast <int>(Binaer/1000000000000);
    Binaer=Binaer%1000000000000;
    Zahl[4]=static_cast <int>(Binaer/1000000000000);
    Binaer=Binaer%100000000000;
    Zahl[5]=static_cast <int>(Binaer/10000000000);
    Binaer=Binaer%10000000000;
    Zahl[6]=static_cast <int>(Binaer/1000000000);
    Binaer=Binaer%1000000000;
    Zahl[7]=static_cast <int>(Binaer/100000000);
    Binaer=Binaer%100000000;
    Zahl[8]=static_cast <int>(Binaer/10000000);
    Binaer=Binaer%10000000;
    Zahl[9]=static_cast <int>(Binaer/1000000);
    Binaer=Binaer%1000000;
    Zahl[10]=static_cast <int>(Binaer/100000);
    Binaer=Binaer%100000;
    Zahl[11]=static_cast <int>(Binaer/10000);
    Binaer=Binaer%10000;
    Zahl[12]=static_cast <int>(Binaer/1000);
    Binaer=Binaer%1000;
    Zahl[13]=static_cast <int>(Binaer/100);
    Binaer=Binaer%100;
    Zahl[14]=static_cast <int>(Binaer/10);
    Binaer=Binaer%10;
    Zahl[15]=static_cast <int>(Binaer/1);
    Binaer=Binaer%1;
    for (int i=0; i<16; i++)
    {cout << Zahl[i];}
    
    //Mithilfe von Zahl[] die Dzimalzahl ausrechnen
    for (int i=0; i<16; i++)
    {
        Ergebnis=Ergebnis*2+Zahl[i];
    }
    cout << "Dezimalzahl: " << Ergebnis-1 << endl;
}//BinaerInDezimal


(Wenn mir noch jemand sagen könnte wie man eine Zahl mit weniger Aufand in ihre einzelnen Ziffern zerlegen kann, wär das auch nett ;) )

2

24.11.2012, 17:00

Überleg die mal, wie groß 1001001101010001 als Dezimalzahl ist und wie groß dann Binaer sein müsste. (Tipp: Ist ein int32 groß genug?)
Sinnvoller wäre es, du liest deine Eingabe als string ein und greifst dann auf die einzelnen Zeichen zu (operator[])
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

24.11.2012, 17:04

1000000000000000 ist zu groß für einen 32-Bit-Integer.
100000000000000 auch.
10000000000000 auch.
1000000000000 auch.
100000000000 auch.
10000000000 auch.
1000000000 nicht ;)

Entweder benutzt du 64-Bit-Integer und ein "LL"-Postfix oder du fängst erst bei der Zahl an, die noch passt.

Mal davon abgesehen kann in dem Programm gar keine Endlosschleife entstehen. Es gibt nur zwei Schleifen und die brechen garantiert nach 16 Iterationen ab.

PS: Zeilen 16 und 18 dividieren durch dieselbe Zahl.

Tobsi_

Frischling

  • »Tobsi_« ist der Autor dieses Themas

Beiträge: 83

Wohnort: Sachsen Anhalt

Beruf: Schülerin

  • Private Nachricht senden

4

24.11.2012, 17:16

Ach so! Daran, dass der Variablentyp zu klein sein könnte, habe ich gar nicht gedacht.
Dann werde ich das ganze mal umschreiben und strings benutzen. Dann komm ich wenigstens nicht mehr mit den ganzen Nullen und Einsen durcheinander und dividiere deshalb mit falschen Zahlen :)

Danke ihr beiden! :thumbsup:

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

5

25.11.2012, 18:30

Um den Code ein bisschen schöner zu gestalten, kannst du aus den Zeilen 9 bis 41 eine kurze Schleife machen. Zehnerpotenzen kannst mit pow() erhalten.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

25.11.2012, 18:36

Zehnerpotenzen kannst mit pow() erhalten.


Ist vielleicht etwas kleinlich, aber gerade hier biete sich doch an pow() durch eine Multiplikation zu ersetzen:

C-/C++-Quelltext

1
2
3
4
for (int i = 0, iPower10 = 1; i < numberOfIterations; ++i)
{
  iPower10 *= 10;
}
@D13_Dreinig

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

25.11.2012, 19:14

Zehnerpotenzen kannst mit pow() erhalten.

Keine gute Idee. pow arbeitet mit Fließkommazahlen, hier sind Ganzzahlen gefragt. Wenn man das wieder zu einem int castet, könnte man falsche Zahlen durch Genauigkeitsprobleme kriegen.

Tobsi_

Frischling

  • »Tobsi_« ist der Autor dieses Themas

Beiträge: 83

Wohnort: Sachsen Anhalt

Beruf: Schülerin

  • Private Nachricht senden

8

02.12.2012, 16:01

Eine Frage hab ich dann doch noch...
Wenn ich die Zahl in einem String speicher, kann ich mir zwar die einzelnen Ziffern ausgeben lassen, aber nicht mit ihnen rechnen:

C-/C++-Quelltext

1
2
3
4
string Binaerzahl;
cin >> Binaerzahl;
cout << Binaerzahl[0]; // Das funktioniert
cout << Binaerzahl[0]+1; // Das funktioniert nicht, da kommen dann so Zahlen wie 50 raus, obwohl höchstens 2 rauskommen kann

Ich hab das jetzt so verstanden, dass das nicht geht, weil ein String eigentlich nur ein weiterentwickeltes char-Array ist und deshalb die Zahlen nicht als "wirkliche" Zahlen speichert, sondern als Text oder Ascii Code (oder irgendwie so). Also müsste ich jede Stelle des Strings in einen Int casten. Im Internet steht, dass das mit atoi () gehen soll. Aber irgendwie funktioniert das nicht so wie ich mir das vorstelle.

(wundert euch bitte nicht dass mir das Problem erst jetzt auffällt, ich komm nur am Wochende mal dazu mich damit zu beschäftigen)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Tobsi_« (02.12.2012, 16:18)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

02.12.2012, 16:09

Du kannst es auch so machen:

int x = deinString.at(4) - '0';
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

10

02.12.2012, 16:16

Da hast du Recht. Wenn Binaerzahl nur ein char-Array ist, dann enthält jedes Element den ASCII-Code der jeweiligen Zahl. Mit diesen Werten möchtest du nicht rechnen. Ich würde dir empfehlen, deine komplette Binärzahl als Zahl (z.B. als Integer) zu speichern und mit den Schiebeoperatoren und dem bitweisen UND auf die einzelnen Binärziffern zuzugreifen.

Beispiel:

Quellcode

1
2
int zahl = 0b101110;
char zifferN = (zahl & (1 << N)) >> N;

Werbeanzeige