Hilfe beim arbeiten mit Feldern
-
So würde ich das lösen, wenn die Aufgabenstellung wäre:
Verwende nur den iostream:#include <iostream> using namespace std; int main() { char Binaer[7]; int Dezimal; int E0,E1,E2,E3,E4,E5,E6,E7; do{ cout<<"8 Bits eingeben: "; cin>>Binaer; cout<<Binaer[0]<<Binaer[1]<<Binaer[2]<<Binaer[3] <<Binaer[4]<<Binaer[5]<<Binaer[6]<<Binaer[7]<<endl; }while((Binaer[0] != '0' && Binaer[0] != '1') ||(Binaer[1] != '0' && Binaer[1] != '1') ||(Binaer[2] != '0' && Binaer[2] != '1') ||(Binaer[3] != '0' && Binaer[3] != '1') ||(Binaer[4] != '0' && Binaer[4] != '1') ||(Binaer[5] != '0' && Binaer[5] != '1') ||(Binaer[6] != '0' && Binaer[6] != '1') ||(Binaer[7] != '0' && Binaer[7] != '1')); if (Binaer[7] == '1') E7 = 1; else E7 = 0; if (Binaer[6] == '1') E6 = 2; else E6 = 0; if (Binaer[5] == '1') E5 = 4; else E5 = 0; if (Binaer[4] == '1') E4 = 8; else E4 = 0; if (Binaer[3] == '1') E3 = 16; else E3 = 0; if (Binaer[2] == '1') E2 = 32; else E2 = 0; if (Binaer[1] == '1') E1 = 64; else E1 = 0; if (Binaer[0] == '1') E0 = 128; else E0 = 0; Dezimal = E7+E6+E5+E4+E3+E2+E1+E0; cout<<"Die Dezimalzahl ist: "<<Dezimal<<endl; return 0; }
-
@theAnfänger77
Du weißt wie man Schleifen benutzt?
Die ganze Kaskade kann man ohne Hilfsvariablen in einer einzigen Schleife lösen.- Initialisiere das Ergebnis mit 0
- für jedes Zeichen im String:
- Schiebe Ergebnis 1 bit nach links
- setze Bit 0 im Ergebnis, falls das aktuelle Zeichen eine '1' ist
-
@theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:
char Binaer[7];
Das ist ja noch schlimmer als die Lösung von @RBS2.
-
An die Anfänger/Neulinge:
bitte kompiliert euren Code immer mit eingeschalteten Warnungen!Wenn ich den Code von @theAnfänger77 kompiliere, ergibt sich:
$ clang++-7 -Wall -Wextra forum.cpp forum.cpp:14:48: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds] <<Binaer[4]<<Binaer[5]<<Binaer[6]<<Binaer[7]<<endl; ^ ~ forum.cpp:7:5: note: array 'Binaer' declared here char Binaer[7]; ^ forum.cpp:22:16: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds] ||(Binaer[7] != '0' && Binaer[7] != '1')); ^ ~ forum.cpp:7:5: note: array 'Binaer' declared here char Binaer[7]; ^ forum.cpp:22:36: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds] ||(Binaer[7] != '0' && Binaer[7] != '1')); ^ ~ forum.cpp:7:5: note: array 'Binaer' declared here char Binaer[7]; ^ forum.cpp:24:9: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds] if (Binaer[7] == '1') ^ ~ forum.cpp:7:5: note: array 'Binaer' declared here char Binaer[7]; ^ 4 warnings generated.
Also - so funktioniert es nicht. Vergesst
am Anfang erst einmaldie Arrays und nehmt stattdessenstd::string
für Char-Arrays undstd::vector
für alle anderen Array-Typen. Ich verwende in C++ praktisch überhaupt keine C-Style-Arrays.
-
@manni66 sagte in Hilfe beim arbeiten mit Feldern:
@theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:
char Binaer[7];
Das ist ja noch schlimmer als die Lösung von @RBS2.
Was sagt der große Meister dazu?
char Binaer[8]; cin >> setw(8) >> Binaer;
Immer noch Buffer Overflow?
-
@RBS2 sagte in Hilfe beim arbeiten mit Feldern:
@manni66 sagte in Hilfe beim arbeiten mit Feldern:
@theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:
char Binaer[7];
Das ist ja noch schlimmer als die Lösung von @RBS2.
Was sagt der große Meister dazu?
char Binaer[8]; cin >> setw(8) >> Binaer;
Immer noch Buffer Overflow?
Herrgott noch mal...
std::string ScheissEgalWievieleZeichenVerdammtNochMal = ""; std::cin >> ScheissEgalWievieleZeichenVerdammtNochMal;
Ich schwöre, ich poste hier gleich die fertige Lösung, damit hier endlich Ruhe ist....
-
@RBS2 sagte in Hilfe beim arbeiten mit Feldern:
Was sagt der große Meister dazu?
char Binaer[8]; cin >> setw(8) >> Binaer;
Immer noch Buffer Overflow?
Wieviele Bits kann man da jetzt eingeben?
Aber warum sollte man eine einfache Lösung verwenden, wenn man sich doch mit char-Arrays auf unendlich vielen Wegen in den Fuß schießen kann?
-
@manni66 sagte in Hilfe beim arbeiten mit Feldern:
Wieviele Bits kann man da jetzt eingeben?
Ich seh's schon. Es wird wieder eine überflüssige Null angehängt.
-
@It0101 sagte in Hilfe beim arbeiten mit Feldern:
Herrgott noch mal...
std::string ScheissEgalWievieleZeichenVerdammtNochMal = "";
std::cin >> ScheissEgalWievieleZeichenVerdammtNochMal;Der Herrgott kann nichts dafür. Das war bestimmt der Teufel, der 'cin' auch char-Arrays befüllen lässt.
-
Ach du heilige... ^^
Zerfleischt euch jetzt nicht wegen einer Anfängerfrage.
-
So ungefähr würde wohl eine halbwegs gescheite Lösung aussehen. Um das Thema hier mal zu beschließen
int main( int argc, char **argv ) { unsigned long long Dezimal = 0; // Zahl eingeben std::cout << "Gib eine Binaerzahl ein, beginnend mit dem niederwertigsten Bit: "; std::string Binaer = ""; std::cin >> Binaer; // Bits berenzen if ( Binaer.size() > sizeof( Dezimal ) * 8 ) { std::cout << "Zuviele Bits fuer Zieldatentyp\n"; return 0; } // Eingabe ueberpruefen for ( const char &bit : Binaer ) { if ( bit != '0' && bit != '1' ) { std::cout << "Binaerzahlen duerfen nur aus 0 oder 1 bestehen\n"; return 0; } } std::cout << "Binaerzahl erfolgreich eingelesen\n"; // Umrechnen in unsigned long long BitValue = 1; for ( const char &bit : Binaer ) { if ( bit == '1' ) Dezimal |= BitValue; BitValue = BitValue << 1; } std::cout << "Binaerzahl " << Binaer << " ins Dezimalsystem umgerechnet ergibt " << Dezimal << "\n"; return 0; }
-
Warum die explizite Zuweisung in Zeile 5? Das erledigt doch schon der Konstruktor?
Und warum steht das niederwertigste Bit am Anfang des strings und nicht am Ende?
-
@DocShoe sagte in Hilfe beim arbeiten mit Feldern:
Warum die explizite Zuweisung in Zeile 5? Das erledigt doch schon der Konstruktor?
Für den C++ noob könnte so der Eindruck enstehen, 'cin' würde die Eingabe an den String anhängen.