Hallo zusammen: kann mir einer bitte helfen bei meinem Quelltext



  • Kurz zu meiner Person ich habe vor kurzem Angefangen C++ zu lernen.
    Habe jetzt ein quelltext geschrieben das dezimahlzahlen in dualzahlen umwandeln kann, und Dualzahlen in Dezimahl umwandelt.
    Ich habe folgendes Problem: Der Anwender kann auswählen zwischen 1.(dezi in dual)und 2.(dual in dezi)wenn ich 1. wähle klappt es so wie ich es mir vorstelle bis zu dem punkt wo er mir die dezimalzahl auswirft. jetzt sollte das programm beenden aber stattdessen läuft es weiter und sagt bitte geben sie die dualzahl ein die umgewandelt werden soll. und das will ich nicht wie kann ich das jetzt umbauen mit einer if else verzweigung? oder etwas anderem?

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int eingabe,zahl1,posit=0;
    
        // das Menü erzeugen
        cout<< "\t\t\tTreffen Sie Ihre Wahl\n\n"<<endl;
        cout<< "1. Umrechnen von Dezimahlzahlen in Dualzahlen"<<endl;
        cout<< "2. Umrechnen von Dualzahlen in Dezimahlzahlen\n"<<endl;
        cout<< "Ihre Auswahl 1 oder 2 ?"<<endl;
        cin >>eingabe;
    
        switch(eingabe)
        while(eingabe<=2)
    
        {
        case 1:
            cout<< "Sie haben die Funktion umrechnen von Dezimahlzahlen in Dualzahlen gewaehlt"<<endl;
            break;
        case 2:
            cout<< "Sie haben die Funktion umrechnen von Dualzahlen in Dezimahlzahlen gewaehlt"<<endl;
            break;
        default:
            cout<< "Ihre Auswahl ist nicht gueltig."<<endl;
            cout<< "Probieren Sie es erneut. Ihre Auswahl bitte 1 oder 2 eingeben."<<endl;
            cin >>eingabe;
    
        }
      int zahl, position=0;
      int reste[16];
    
            for (int index=0;index<16;index++)
                reste[index]=0;
    
            do { cout << "Geben Sie den Wert ein, der umgerechnet werden soll(max. 65535): ";
             cin  >>zahl;
             }
      while (zahl>65535);
    
            do {reste[position]=zahl%2;
                position++;
                zahl=zahl/2;
        }
      while (zahl!=0);
            for (int index =15;index>=0;index--)
        {
            cout<<reste[index];
        if (index %4==0)
            cout<<" ";
        }
    {
    
     int zahl;
        int potenzzahl = 1, position = 0, ergebnis = 0;
    
        // das Feld zum Speichern der Ziffern
        int ziffer[16];
    
        // das Feld wird mit 0 besetzt
        for (int index = 0; index < 16; index++)
    
            ziffer[index] = 0;
        // Dualzahl eingeben
        do {
        cout << "\n\n\n Geben Sie die Dualzahl ein die umgerechnet werden soll:";
        cin >> zahl;
        }
        while (zahl > 1111111111);
    
        do  {
                // die letzte Ziffer ablegen
                ziffer[position] = zahl % 10;
                //zur nächsten Position gehen
                position++;
                // durch 10 dividieren um die letzte Ziffer zu löschen
                zahl = zahl / 10;
        }
        while (zahl!=0);
    
        for (int schleife = 0; schleife < 16; schleife++)
    
        {ergebnis = ergebnis + ziffer[schleife] * potenzzahl;
        potenzzahl = potenzzahl * 2;}
    
        cout <<"Im Dezimalsystem hat die Zahl folgende Darstellung: "<< ergebnis << endl;
    
    }
        return 0;
    }
    

    ~edit durch SeppJ: Codetags eingefügt~


  • Mod

    cin >>eingabe;
    
    switch(eingabe)
    while(eingabe<=2)
    {
      case 1:
      // ...
    }
    

    Das sieht ja aus wie irgendein toller Hackertrick. A la Duff's Device. Vermutlich ist es aber einfach nur Unsinn, weil du deine Kontrollstrukturen nicht im Griff hast. Grob gesagt, wird das Programm von oben nach unten ausgeführt. Überleg dir mal, wie das Programm wohl abläuft, wie oft es an cin >>eingabe; vorbeikommt und ob deine switches und whiles wirklich richtig stehen.

    Wenn du das nächste Mal einen Beitrag verfasst, benutze bitte korrekte Codetags! vorne [tag] und hinten [/tag]. Die Buttons unter den Editorfeld (bei den Smileys) machen das bereits semi-automatisch. Erster Klick erzeugt [tag], zweiter erzeugt [/tag]; oder, wenn Text markiert ist, wird dieser automatisch in Tags gesetzt. Ich habe das ausnahmesweise in deinem Beitrag korrigiert, aber wenn du es beim nächsten Mal falsch machst, musst du damit rechnen, dass kaum jemand deinen Beitrag liest.

    PS: Deine Einrückung scheint insgesamt eher Zufallsprodukt zu sein. Guck mal Zeile 58 und 59, was geht da vor? Und das ist nur eines von zig Beispielen. Kein Wunder, dass deine Kontrollstrukturen total verknotet sind, wenn du selber nicht sehen kannst, wo was losgeht und wo aufhört! Viele Entwicklungsumgebungen und Editoren bieten auch automatisches Einrücken an. Nutz das!



  • Ja du hast recht ich habe ein wenig den überblick verloren 😃 .
    Danke für die antwort.



  • // das Feld wird mit 0 besetzt
        for (int index = 0; index < 16; index++)
    

    was machst du denn damit bzw. willst machen?
    die for schleife hat soweit ich gesehen habe keinen schleifenkörper...

    du musst mal schauen das du alle "{" und "}" hast... ich bin mir nicht ganz sicher aber ich glaube manchmal fehlt eines der beiden?

    ist das ein lauffähiges beispiel? habe gerade keinen compiler zurhand?



  • ja irgendwie läuft es



  • edit: oder lass "{" udn "}" konsequent weg... aber entscheide dich für eines

    - schau dir auch mal formatierungsregeln für code an... ist eig in jeder sprache ähnlich... (gibt auch sprachenspezifische eigenheiten aber grundsätzlich: wie man einrückt ... klammern und alles setzt so das man den code besser lesen kann... )
    z.B. wiki programmierstil:
    http://de.wikipedia.org/wiki/Programmierstil

    eine for-schleife:
    entweder so:

    for(int x=0;x<10;x++)
    {
    
       std::cout << "Hi" << std::endl;
    
    }
    

    oder so:

    for(int x=0;x<10;x++)
       std::cout << "Hi" << std::cout
    

    aber ich kann dir nur zum ersten raten ...
    ist meiner meinung nach besser lesbar, da man klar sieht von wo bis wo die schleife geht... wenn du größer projekte später mal umsetzten möchtest wird dir das bei 10000-20000zeilen code sehr helfen... 😉
    aber ist letztendlich geschmackssache...

    das selbe gilt für die einrückung...

    etwas anderes kann ich dazu im moment nicht sagen weil hab keine ide oder compiler zurhand und ohne kann ich deinen nicht wirklich nachvollziehen sry...


  • Mod

    xHelperx schrieb:

    ist das ein lauffähiges beispiel? habe gerade keinen compiler zurhand?

    Ja, das compiliert tatsächlich. Auch wenn selbst so mancher Profi staunen dürfte, dass man switches und Schleifen miteinander verflechten darf.

    die for schleife hat soweit ich gesehen habe keinen schleifenkörper...

    Das wiederum ist doch einfach. Es ist die nächste Anweisung. Die ist hier eben bloß ein paar Zeilen tiefer. Passt sogar zu dem, was hier gewünscht ist.



  • hatt ich eben vergessen:
    der wiki link ist evt. nicht das beste...(aber ein hinweis wollt ich schnell geben 😃 ) must mal googeln oder auf "openbooks"
    schaun obs da ne referenz oder programmierstil bücher gibt für c++ oder so...
    hab gerade nicht so viel zeit zum googeln sry...

    lg



  • SeppJ schrieb:

    xHelperx schrieb:

    ist das ein lauffähiges beispiel? habe gerade keinen compiler zurhand?

    Ja, das compiliert tatsächlich. Auch wenn selbst so mancher Profi staunen dürfte, dass man switches und Schleifen miteinander verflechten darf.

    die for schleife hat soweit ich gesehen habe keinen schleifenkörper...

    Das wiederum ist doch einfach. Es ist die nächste Anweisung. Die ist hier eben bloß ein paar Zeilen tiefer. Passt sogar zu dem, was hier gewünscht ist.

    😃 joa deswegen hatte ich mal gefragt, kanns wie gesagt leider nicht compilieren im moment 😃 ... erstaunlich...

    😃 mhh ... so sicher bin ich mir da nicht...

    funktioniert soetwas auch:

    for(x=0;x<10;x++)
    
       std::cout << "Hi" << std::endl;
    

    weil hier ist ja die nächste zeile "leer" ... ? so etwas hab ich noch nie gesehen geschweigeden versucht zu compilieren oder auszuführen...
    -> ich würde aber mal sagen das das relativ fehleranfällig aussieht und wahrscheinlich auch ist...

    deswegen treteb auch wahrscheinlich unkontrollierte probleme auf...
    dies kann man weitestgehend vermeiden durch einen "sauberen bzw. ordentlichen" programmstil meiner meinung nach...
    also rück orderntlich ein... setzt die klammern oder lass sie konsequent weg...! nur entscheide dich für eines... dies erleichtert eine fehlersuche ungemein und hilft auch dabei "unkontrollierte fehler" weitestgehend zuvermeiden/-hinder ...


  • Mod

    xHelperx schrieb:

    funktioniert soetwas auch:

    for(x=0;x<10;x++)
    
       std::cout << "Hi" << std::endl;
    

    weil hier ist ja die nächste zeile "leer" ... ?

    Selbstverständlich funktioniert das. Whitespace ist vollkommen egal, außer er wird zur Trennung von Tokens gebraucht.

    for                             (
    x
    
    =              0;x                           <
    
    10         ; 
    
    x                           ++               )
    
            std
    
    ::
              cout 
    << 
    "Hi"                                              << 
                                                       std
                            ::
           endl
    ;
    

    Legales C++. (Und das ist noch harmlos, man kann das noch viel weiter treiben)



  • Am schönsten ist immer Quadratische Programmierung.

    for(x=0
    ;x<012;
    x++)std
    ::cout\
    <<"Hi"\
    ""<<std
    ::endl;
    


  • joa das ist schon alles ziemlich hart... aber schaut euch mal das an:
    (keine ahnung ob das stimmt oder nen fake ist 😃 )
    http://de.wikipedia.org/wiki/Brainfuck

    ++++++++++
     [
      >+++++++>++++++++++>+++>+<<<<-
     ]                       Schleife zur Vorbereitung der Textausgabe
     >++.                    Ausgabe von 'H'
     >+.                     Ausgabe von 'e'
     +++++++.                'l'
     .                       'l'
     +++.                    'o'
     >++.                    Leerzeichen
     <<+++++++++++++++.      'W'
     >.                      'o'
     +++.                    'r'
     ------.                 'l'
     --------.               'd'
     >+.                     '!'
     >.                      Zeilenvorschub
     +++.                    Wagenrücklauf
    

    😃

    und das setzt dem ganzen noch die krone auf:

    http://de.wikipedia.org/wiki/Ook!

    😃 einer der witzigsten wiki-artikel die ich je gelesen hab 😃 ...

    lg



  • edit: "!" gehört zum link...



  • 😃

    Die Designkriterien der Sprache-Ook! sind:

    Eine Programmiersprache sollte schreib- und lesbar für Orang-Utans sein.
    Die Syntax sollte einfach sein, leicht zu merken und das Wort Monkey (engl. Affe) vermeiden.
    Bananen sind gut.

    super 😃 ...



  • WerWieWas schrieb:

    joa das ist schon alles ziemlich hart... aber schaut euch mal das an:
    (keine ahnung ob das stimmt oder nen fake ist 😃 )
    http://de.wikipedia.org/wiki/Brainfuck

    Kein Fake. Man kann damit tatsächlich Programme bauen.

    BF eignet sich naturgemäß sehr gut zur Quadratischen Programmierung, also ist es damit viel leichter als z.B. in C, ganz besonders ästhetische Programme zu bauen.

    projecteuler question 2
    >>+>++>+[[-]<[->+<<<+>>
    ]>[-<+>]<[->+<]<[->+<]>
    >[-<+<+>>]<[->+<]<[->+<
    ]>>[-<+<+>>]<[->+<]<[->
    +<]>>[-<+<+>>]<>++++[->
    ++<]>[-<+++++>]<[->++<]
    >[-<+++++>]<[->++<]>[-<
    +++++>]<[->++<]>[-<++++
    +>]<[->++<]>[-<+++++>]<
    [->++<]>[-<+++++>]<<[->
    >+>+<<<]>>>[-<<<+>>>]<[
    ->+<<[->>>]>>-[+<-]<]<]
    <[-]<[-][-][]<[>+++++++
    +++[->>+>+<<<]>>>[-<<<+
    >>>]<-<<<[>>>[->+>+<<]>
    >[-<<+>>]+<[[-]>-<]>[-<
    +>]<[[-][-]<<+<[->>+>+<
    <<]>>>[-<<<+>>>]]<-<<<-
    ]>>[-<<+>>]>[-<<->>]<<-
    +[->+<]<[->+<]>>[-<<+>>
    ]<]<[->+++[->++++<]>[-<
    ++++>]<[-<+>]<.[-][-]<]
    

    23*23



  • volkard schrieb:

    WerWieWas schrieb:

    joa das ist schon alles ziemlich hart... aber schaut euch mal das an:
    (keine ahnung ob das stimmt oder nen fake ist 😃 )
    http://de.wikipedia.org/wiki/Brainfuck

    Kein Fake. Man kann damit tatsächlich Programme bauen. Eins von mir unter http://www.c-plusplus.net/forum/264697-full

    wow, sieht echt gut aus... aber ist mega schwer zu lesen find ich ... 🙂
    also mit kommentaren geht es vll... 🙂
    ich habe damit nur etwas rumgespielt, einfach weil ich es i.wie interessant fand... 🙂 -> bzw. um was zu lernen 🙂 ...



  • Wir hatten auch mal nen Contest wo es darum ging den kürzesten Brainfuck Interpreter zu schreiben:
    http://www.c-plusplus.net/forum/292057


  • Mod

    hustbaer schrieb:

    Wir hatten auch mal nen Contest wo es darum ging den kürzesten Brainfuck Interpreter zu schreiben:
    http://www.c-plusplus.net/forum/292057

    Müsste man solch einen Brainfuckinterpreter nicht naturgemäß in Brainfuck schreiben?



  • Habs hinbekommen 😃

    #include <iostream>
    
    using namespace std;
    void dezi()
    {
    int zahl;
    int potenzzahl = 1, position = 0, ergebnis = 0;
    int ziffer[16];// das Feld zum Speichern der Ziffern
    for (int index = 0; index < 16; index++)// das Feld wird mit 0 besetzt
        ziffer[index] = 0;
    do {
        cout << "\n\n\nGeben Sie die Dualzahl ein die umgerechnet werden soll:";// Dualzahl eingeben
        cin >> zahl;
        }
    while (zahl > 1111111111);
    do {ziffer[position] = zahl % 10; // die letzte Ziffer ablegen
        position++; //zur nächsten Position gehen
        zahl = zahl / 10;// durch 10 dividieren um die letzte Ziffer zu löschen
    }
    while (zahl!=0);
    for (int schleife = 0; schleife < 16; schleife++)
       {ergebnis = ergebnis + ziffer[schleife] * potenzzahl;
        potenzzahl = potenzzahl * 2;}
    cout <<"Im Dezimalsystem hat die Zahl folgende Darstellung: "<< ergebnis << endl;
    }
    
    void dual ()
    {
    int zahl, position=0;
    int reste[16];
    for (int index=0;index<16;index++)
                reste[index]=0;
    
    do {
        cout << "Geben Sie den Wert ein, der umgerechnet werden soll(max. 65535): ";
        cin  >>zahl;
    }
    while (zahl>65535);
    do {reste[position]=zahl%2;
        position++;
        zahl=zahl/2;
    }
    while (zahl!=0);
    for (int index =15;index>=0;index--)
    {
        cout<<reste[index];
    if (index %4==0)
        cout<<" ";
    }
    }
    int main()
    {
    int eingabe;
        // das Menü erzeugen
        cout<< "\t\t\tTreffen Sie Ihre Wahl\n\n"<<endl;
        cout<< "1. Umrechnen von Dezimahlzahlen in Dualzahlen"<<endl;
        cout<< "2. Umrechnen von Dualzahlen in Dezimahlzahlen\n"<<endl;
        cout<< "Ihre Auswahl 1 oder 2 ?"<<endl;
        cin >>eingabe;
    if (eingabe==1)
        dual();
    else if (eingabe==2)
        dezi();
    else if (eingabe!=1||2)
        cout<<" Ihre eingabe ist nicht gueltig.";
    
    return 0;
    }
    


  • so hinbekommen


Anmelden zum Antworten