von binär in dezimal...

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • von binär in dezimal...

    Folgende Aufgabe:

    Schreiben Sie ein C++-Programm, das eine bin¨are Ziffernfolge einliest (nur Betrag, kein Vorzeichen),
    z.B. 1101, und den entsprechenden dezimalen Wert ausgibt. Die bin¨are Ziffernfolge
    wird zeichenweise von der Tastatur eingelesen. Jedes Zeichen wird unmittelbar verwendet, um
    das Ergebnis zu aktualisieren.
    Hinweis: Lesen Sie die einzelnen Zeichen in eine char-Variablen ein. Verwenden Sie hierzu das
    Kommando cin.get(Variablenname), wobei Variablenname der Name der char-Variablen
    ist. Der Kopf der Schleife k¨onnte somit folgendes Aussehen haben:
    while (cin.get(c) && ( c == ’0’ || c == ’1’))
    {
    ...
    }
    Gehen Sie bei der Berechnung des dezimalen Wertes einer bin¨aren Zahl von der Potenzreihendarstellung
    zur Basis 2 aus:
    z.B. 1101: 1*2³ + 1*2² + 0*2^1 + 1*2^0


    Das Umrechnen ist kein Problem, aber wie soll ich das machen, dass der das immer "live" umrechnet? Hab bisher nur den nackten Quelltext... :( Ich probier mal weiter aber vll hat ja jemand nen Denkanstoß...

    Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. int main ()
    4. {
    5. cout << "Dieses Programm rechnet von binären Zahlenfolgen in dezimale Zahlenwerte um! " << endl;
    6. cout << " " << endl;
    7. cout << "Bitte Zahlen eingeben (nur 0 und 1 werden akzeptiert): " << endl;
    8. char c;
    9. while (cin.get(c) && ( c == ’0’ || c == ’1’))
    10. {
    11. }
    12. }
    Alles anzeigen
    :roll:

    EDIT: Ich weiß vorallem nicht wie ich das hinkriegen soll, dass sich die Exponenten der Zahl 2 bei jeder Eingabe um 1 erhöhen...
  • Quellcode

    1. #include <iostream>
    2. #include <bitset>
    3. int main()
    4. {
    5. char c;
    6. std::bitset<sizeof(long)*8> bset;
    7. std::cout<<"Bits eingeben:\n";
    8. while (std::cin.get(c) && ( c == '0' || c == '1'))
    9. {
    10. bset = bset<<1;
    11. if(c=='0')
    12. bset.set(0,false);
    13. else
    14. bset.set(0,true);
    15. std::cin.get();//return konsumieren
    16. }
    17. std::cout<<bset.to_string()<<std::endl;
    18. std::cout<<bset.to_ulong()<<std::endl;
    19. return 0;
    20. }
    Alles anzeigen


    An deinen Programmierkenntnissen musst du unbedingt was machen.
    Sonst wirst du im Informatikstudium noch enorme Probleme bekommen.

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • "void" schrieb:

    Quellcode

    1. #include <iostream>
    2. #include <bitset>
    3. int main()
    4. {
    5. char c;
    6. std::bitset<sizeof(long)*8> bset;
    7. std::cout<<"Bits eingeben:\n";
    8. while (std::cin.get(c) && ( c == '0' || c == '1'))
    9. {
    10. bset = bset<<1;
    11. if(c=='0')
    12. bset.set(0,false);
    13. else
    14. bset.set(0,true);
    15. std::cin.get();//return konsumieren
    16. }
    17. std::cout<<bset.to_string()<<std::endl;
    18. std::cout<<bset.to_ulong()<<std::endl;
    19. return 0;
    20. }
    Alles anzeigen


    An deinen Programmierkenntnissen musst du unbedingt was machen.
    Sonst wirst du im Informatikstudium noch enorme Probleme bekommen.

    Gruß void


    vielen Dank, ja du hast Recht, wir haben eben egrade erst angefangen, und ich hab nebenbei total viele Aufgaben zu mathematischer Modellierung, zu Rechnerarchitektur und zu Algebra auf, sonst würde ich mich da mal richtig ransetzen und Tutorials durchackern. Hoffe ich komme bald dazu.

    Das mit dem bitset hatten wir beispielsweise noch gar nicht. Ich habs gerade mal probiert. Irgendwie gibt es 2 Probleme. Ich verstehe die Schleife nicht wirklich, und das Programm gibt auch nicht nach jeder Biteingabe den String als Dezimalzahl aus... ich probier mal weiter. Danke erstmal :)

    EDIT: achso, wenn man das hier

    std::cout<<bset.to_string()<<std::endl;
    std::cout<<bset.to_ulong()<<std::endl;
    IN die Schleife packt gehts wie gewünscht. :roll:

    cewbie kann gar nicht mehr denken heute :shock:
  • Wenn ihr noch keine bitsets etc. hattet solltest du sowas besser auch nicht benutzen.
    Ausser du nimmst das Risiko in Kauf dass dir jemand unangenehme Fragen zur Funktionsweise "deines" Programms stellt.
    Ne einfachere Variante wäre diese hier:

    Quellcode

    1. #include <iostream>
    2. #include <bitset>
    3. int main()
    4. {
    5. char c;
    6. long value=0;
    7. std::cout<<"Bits eingeben:\n";
    8. while (std::cin.get(c) && ( c == '0' || c == '1'))
    9. {
    10. value <<= 1;
    11. if(c=='1')
    12. value +=1;
    13. std::cout<<"Aktueller Wert:"<<value<<std::endl;
    14. std::cin.get();//return konsumieren
    15. }
    16. return 0;
    17. }
    Alles anzeigen


    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • fein danke! :wink:

    Eine Frage habe ich noch:

    value <<= 1;
    if(c=='1')
    value +=1;


    kannst du das mal näher erklären? Was soll <<= bedeuten?
    und wenn man value um eines erhöhen will schreibt man dann nicht normalerweise
    value=value+1;
    Das += kannte ich bisher nicht.

    EDIT: und warum ist da kein pow drin? Wo wird denn der Exponent bestimmt?

    und warum schreibst du immer das std:: vor cout und cin? Ohne gehts nicht :? (habs probiert )

    mfg,

    cewbie

    Entschuldige meine Unwissenheit... :?
  • value <<= 1

    Der Wert "1" wird an value übergeben.


    value +=1

    Der Wert von value wird um den Wert "1" erhöht.

    Bin mir aber nicht 100% sicher weil es schon ein bißchen her ist das ich C++ in der Schule hatte. :wink:
    ~|__/
    ..o.o &lt;------------------- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world Domination.
  • "DasBunny" schrieb:

    value <<= 1

    Der Wert "1" wird an value übergeben.
    :


    Das kann nicht stimmen. Wenn du dir das Programm von void ansiehst, und man gibt nur eine Null ein, müsste das Programm nach deiner Logik fälschlicherweise eine 1 ausgeben, da value der Wert 1 zugewiesen worden sein müsste. Das Programm gibt aber korrekt 0 aus.

    Auf der Seite von dir steht


    Genauso wie mit Hilfe des arithmetischen Operators + ein kombinierter Zuweisungsoperator += gebildet werden kann, können mit anderen Operatoren folgende kombinierte Zuweisungsoperatoren gebildet werden: -=, *=, /=, %=, &=, |=, ^=, <<= und >>=.


    Aber das hilft mir nicht. Eigentlich dürfte das Programm von void nicht funktionieren... hab mit mehreren Kommilitonen geredet. Es funktioniert aber eben trotzdem :?

    Gruß

    cewbie
  • "phax" schrieb:

    Quellcode

    1. value <<= 1;

    ist eine Kurzversion von

    Quellcode

    1. value = value << 1;


    << steht für Shift-Left

    << 1 ist ein Spezilefall und ist die performanteste Variante eine Multiplikation mit 2 durchzuführen


    danke :) dann müsste ich das ganze ja auch durch value = value*2 ersetzen können, so funktioniert das Programm jedoch nicht richtig