Hilfe bei Programm(Anfänger)



  • Ich habe mir fest vorgenommen C++ zu lernen. Ich habe mir deshalb das Buch "Jezt lerne ich C++" besorgt und bin damit unzufrieden. Das Buch ist eher eine Art Lexikon. Es fordert einen also nicht heraus ein Prog zu schreiben. Hab ihr mir eine Buchempfehlung?

    Ich habe als Anfang folgendes Programm geschrieben, wobei ich den Fehler aber nicht finde. Hilfreich wären auch andere Lösungsvorschläge.

    Das Programm soll das Volumen und die Oberfläche von einem Zylinder und einem Kegel berechnen können.

    #include <iostream.h>
    #include <conio.h>
    
    int main()
    {   
        int wahl,r,h,s;
        cout << "Programm zur Berechnung von Koerpern:\n";
    
        cout << "1. Kegel:\n" << "1.1 Volumen\n" << "1.2 Oberflaeche\n\n";
        cout << "2. Zylinder:\n" << "2.1 Volumen\n" << "2.2 Oberflaeche\n\n";
    
    Anfang:    cout << "Bitte Waehlen sie die Nummer gewuenschten Berechnung aus: "; // Anfang=Label für goto Anweisng am Ende
               cin  >> wahl;
    
        if (wahl == 1.1)
             cout << "Radius: ";
             cin  >> r; 
             cout << "Hoehe: ";
             cin  >> h;
             cout << "Volumen=" << 1/3*3.14*r*r*h;
    
             if (wahl == 1.2)
                cout << "Radius: ";
                cin  >> r;
                cout << "Seitenkantenlänge: ";
                cin  >> s;
                cout << "Oberflaeche: " << 3.14*r*(r+s);
    
                if (wahl == 1.3)
                   cout << "Radius: ";
                   cin  >> r; 
                   cout << "Hoehe: ";
                   cin  >> h;
                   cout << "Volumen: " << 3.14*r*r*h;
    
                   if (wahl == 1.4)
                      cout << "Radius: ";
                      cin  >> r; 
                      cout << "Hoehe: ";
                      cin  >> h;
                      cout << "Oberflaeche: " << 2*3.14*r*h;
    
                      if (wahl != 1.1,1.2,2.1,2.2)
                         cout << "Bitte Eingabe wiederholen!" ;
                         goto Anfang; 
    
        getch();
        return 0;
    }
    


  • #include <iostream.h>
    

    dein buch scheint schon sehr alt zu sein. iostream.h ist veraltet, es heißt jetzt iostream (ohne .h).

    Anfang:    cout << "Bitte Waehlen sie die Nummer gewuenschten Berechnung aus: "; // Anfang=Label für goto Anweisng am Ende
    [...]
    goto Anfang;
    

    vergiss auf der stelle goto. such in deinem buch nach "while-schleife" und versuch es damit zu lösen.

    int wahl,r,h,s;
    [...]
    cin  >> wahl;
    if (wahl == 1.1)
    

    wahl ist ein integer. also eine ganzzahl. so gehts also nicht.

    if (wahl != 1.1,1.2,2.1,2.2)
    

    das geht so nicht, es muss heissen

    if(wahl != 1 && wahl!= 2 && ...)
    


  • nicknack2002 schrieb:

    Ich habe mir fest vorgenommen C++ zu lernen. Ich habe mir deshalb das Buch "Jezt lerne ich C++" besorgt und bin damit unzufrieden. Das Buch ist eher eine Art Lexikon. Es fordert einen also nicht heraus ein Prog zu schreiben. Hab ihr mir eine Buchempfehlung?
    Das in meinen Augen absoulut beste C++ Buch ist 'C++ - Das Grundlagen Buch - ist zwar ein tausend Seiten Wälzer, aber dementsprechend informativ

    Ich habe als Anfang folgendes Programm geschrieben, wobei ich den Fehler aber nicht finde. Hilfreich wären auch andere Lösungsvorschläge.

    Das Programm soll das Volumen und die Oberfläche von einem Zylinder und einem Kegel berechnen können.
    [cpp]
    #include <iostream.h>
    /* #include <conio.h> Hab ich zum Kommentar degradiert, siehe ganz unten */
    #define PI 3.141592654

    int main()
    {
    float wahl,r,h,s;
    cout << "Programm zur Berechnung von Koerpern:\n";

    cout << "1. Kegel:\n" << "1.1 Volumen\n" << "1.2 Oberflaeche\n\n";
    cout << "2. Zylinder:\n" << "2.1 Volumen\n" << "2.2 Oberflaeche\n\n";

    Anfang: cout << "Bitte Waehlen sie die Nummer gewuenschten Berechnung aus: "; // Anfang=Label für goto Anweisng am Ende
    cin >> wahl;
    cin.get(); // Zeilenumbruchzeichen aus dem Eingabepuffer
    // entfernen

    if (wahl == 1.1){ // Es sollen ja mehrere Anweisungen ausgeführt
    // werden, nicht nur cout << "Radius:";

    cout << "Radius: ";
    cin >> r;
    cin.get(); // Schon wieder

    cout << "Hoehe: ";
    cin >> h;
    cin.get(); // Und noch einmal, das komfortable Arbeiten
    // mit den Standard-C++ Streams
    cout << "Volumen=" << 1/3PI*r*rh; // PI haben wir ja
    // schön ganz oben
    // definiert
    } // Ende der if-Bedingung

    else if (wahl == 1.2){ // Es kann ja nur entweder
    // wahl==1.1 oder wahl==1.2
    // eingegeben worden sein, also
    // ist else if korrekter.
    cout << "Radius: ";
    cin >> r;
    // ...
    cout << "Seitenkantenlänge: ";
    cin >> s;
    // ...
    cout << "Oberflaeche: " << PI*r*(r+s);
    }

    else if (wahl == 1.3){
    cout << "Radius: ";
    cin >> r;
    // ...
    cout << "Hoehe: ";
    cin >> h;
    // ...
    cout << "Volumen: " << PI*r*r*h;

    /* .../ if (wahl == 1.4) {
    cout << "Radius: ";
    cin >> r;
    // cin.get()
    cout << "Hoehe: ";
    cin >> h;
    // ...
    cout << "Oberflaeche: " << 2
    PI*r*h;

    if (wahl != 1.1,1.2,2.1,2.2)
    cout << "Bitte Eingabe wiederholen!" ;
    }
    goto Anfang;

    cin.get(); // So sparst Du Dir conio.h
    return 0;
    }
    [/cpp]

    Wo ich // ... hingeschrieben habe, solltest Du ja dann mittlerweile wissen,
    was da hin gehört.
    Und überleg Dir, C++ Das Grundlagen Buch (Data Becker), zu beschaffen, das Buch ist die #1 wenn's um's Erwerben der Standard-C++ - Kenntnisse geht.
    😃



  • hi, also int sind ganze zahlen , da kannst net 1.1 einschreiben ... das is der datentyp float ... und weil du alle als int deklariert hast wird zum schluß auch nur eine ganze zahl ausgegeben ....
    probie mal double statt int...
    das goto würde ich weglassen ... ist kein guter stil ...
    probiers mit ner schleife while ...

    also das geht auch net ... (wahl != 1.1,1.2,2.1,2.2)
    probier mal so if (wahl!=1.1 && wahl!=1.2 && wahl != 2.2 && wahl != 2.2)
    und nach der if( irgendwas ) wird nur immer der nächste befehl ausgeführt also nur einer ....
    wenn mehrere befehle in dein if packen willst muss da {} drumherum machen
    hab mal ne kleine korrigierte version geschrieben

    #include <iostream.h>
    #include <conio.h>
    
    void main(void)  
    {   
        double wahl=1,r,h,s;  // wahl = 1 damit er in die while schleife sprint 
         while(wahl != 9)
          { 
         clrscr();   // löscht den bildschirm ;
        cout << "Programm zur Berechnung von Koerpern:\n";
    
        cout << "1. Kegel:\n" << "1.1 Volumen\n" << "1.2 Oberflaeche\n\n";
        cout << "2. Zylinder:\n" << "2.1 Volumen\n" << "2.2 Oberflaeche\n\n";
        cout << "9 zum beenden"; 
                cout << "Bitte Waehlen sie die Nummer gewuenschten Berechnung
             aus: "; 
               cin  >> wahl;
    
                if (wahl == 1.1)
                { 
                 cout << "Radius: ";
                 cin  >> r; 
                 cout << "Hoehe: ";
                 cin  >> h;
                 cout << "Volumen=" << 1/3*3.14*r*r*h;
                }
               if (wahl == 1.2)
               { 
                cout << "Radius: ";
                cin  >> r;
                cout << "Seitenkantenlänge: ";
                cin  >> s;
                cout << "Oberflaeche: " << 3.14*r*(r+s);
               } 
               if (wahl == 1.3)
               {
                 cout << "Radius: ";
                   cin  >> r; 
                   cout << "Hoehe: ";
                   cin  >> h;
                   cout << "Volumen: " << 3.14*r*r*h;
               }    
                   if (wahl == 1.4)
                 {
                      cout << "Radius: ";
                      cin  >> r; 
                      cout << "Hoehe: ";
                      cin  >> h;
                      cout << "Oberflaeche: " << 2*3.14*r*h;
                  }    
              if  (wahl!=1.1 && wahl!=1.2 && wahl != 2.2 && wahl != 2.2) 
                {
                         cout << "Bitte Eingabe wiederholen!" ;
                } 
          }   // ende der while schleife       
    
        getch();
    }
    

    ach ja also normalweise macht man das net das mal fließkommazahlen auf gleichheit überpürüft ..das is zu gefährlich ...mach doch einfach 1,2,3 als whal und dann int wahl, den rest würde ich double machen gibst ja auch kommawerte ein ... 1.2 z.B ....
    .. und schau dir mal die switch .. case schleife an .... wäre bei dir auch möglich..... naja hoffe hab dir bischen helfen können ..
    chris



  • @Chri5
    Wobei du auf jedenfall noch folgende Korrekturen vornehmen solltest:

    -Nach aktuellem C++-Standard heißt es <iostream> im namespace std; und nicht <iostream.h>
    Also:

    #include <iostream>
    using namespace std;
    

    - Es heißt int main() und nicht void main()

    @nicknack2002
    Um ein gutes C++-Buch zu erhalten, solltest du mal hier im Forum unter der Rubrik Bücher nachschauen und/oder dir diesen Thread anschauen.

    Caipi



  • Wieso hört niemand auf borg?

    #include <iostream>
    using namespace std;
    

    edit: ups zu spät

    mecnels Lösung ist fehlerhaft:

    double statt float, sonst funzt der Vergleich nicht. Außerdem hört seine noch so tolle goto-pseudo-Schleife nie auf...



  • hi,
    also ich hab im letzten semester prog besucht ... und da hat man uns das halt so beigebracht ..... naja ..is das denn schlimmm mit dem *.h .....
    ok ich glaub wir haben so c und c++ gemsicht gemacht ..deswegen wahrscheinlich auhc void main (void) ...
    chris



  • Danke ihr habt mir sehr sehr geholfen! Ich werde jetzt versuchen eure Tipps umzusetzen. Goto wollte ich nur benutzen weil es eh nur einmal vorkommt. In meinem Buch wurde mir ausdrücklich davor gewarnt 😉



  • chri5 schrieb:

    hi,
    also ich hab im letzten semester prog besucht ... und da hat man uns das halt so beigebracht ..... naja ..is das denn schlimmm mit dem *.h .....
    ok ich glaub wir haben so c und c++ gemsicht gemacht ..deswegen wahrscheinlich auhc void main (void) ...
    chris

    Bzg. Standardheader siehe hier.
    Und bzg. void main() siehe hier.
    😉

    Caipi



  • an chri5 und mecnels, man kann float nicht auf gleichheit überprüfen!!!!!
    das funktioniert so wie ihr das gemacht habt im zweifelsfall nicht.



  • Das Programm funktioniert jetzt einwandfrei.
    Es wird jetzt nur überprüft ob eine Zahl eingegeben wurde. Es hängt sich aber auf wenn man Buchstaben etc. eingibt! Wei kann ich das Problem lösen?!



  • borg schrieb:

    an chri5 und mecnels, man kann float nicht auf gleichheit überprüfen!!!!!
    das funktioniert so wie ihr das gemacht habt im zweifelsfall nicht.

    +1



  • nicknack2002 schrieb:

    Danke ihr habt mir sehr sehr geholfen! Ich werde jetzt versuchen eure Tipps umzusetzen. Goto wollte ich nur benutzen weil es eh nur einmal vorkommt. In meinem Buch wurde mir ausdrücklich davor gewarnt 😉

    Goto ist übrigens auch ein Standard C++ Befehl, und zwar einer der ältesten überhaupt. Weil sich (theoretisch zumindest) jedes Programm auch ohne goto schreiben lässt, sieht es ein bisschen unbeholfen aus. Außerdem wird es ziemlich kompliziert, dem Programmverlauf zu folgen, wenn man mit goto um sich wirft. Trotzdem - es gibt auch Fälle, in denen ist man doch ganz froh, tief verschachtelte Schleifen einfach mit goto abbrechen zu können (z.B. weil break nur die innerste Schleife beenden würde, man aber aus allen Schleifen sofort hinaus springen möchte. Also ganz so ist das nicht, dass goto immer schlecht ist.
    In Deinem Programm bewirkt das goto allerdings leider, dass das Programm endlos läuft. Vielleicht führst Du einen weiteren Menüpunkt ein, etwa '1.6 für Beenden', dann wär' auch dieses Problem behoben.

    M.

    🙂



  • ja, im zweifelsfall gehts nicht .... aber hier wirds wohl schon noch klappen ... hab ich auch geschrieben das man so was net macht 😉 ...
    chris



  • Mein Programm sieht jetzt so aus:

    #include <iostream.h>
    #include <conio.h>
    
    int main()
    {
         double wahl,r,h;
         cout << "Copyright 15.1.2004 by nicknack2002\n\n\n";
         while (wahl != 9) 
         {
    
               cout << "Volumenberechnung oder Oberfleachenberechnung eines Zylinders:\n\n";
               cout << "1. Oberflaeche\n" << "2. Volumen\n\n" << "9.Beenden\n" << "Bitte Weahlen: ";
               cin >> wahl;
            if (wahl == 1)
               {
               cout << "\nHoehe: ";
               cin >> h;
               cout << "\nRadius: ";
               cin >> r;
               cout << "\nOberflaeche: " << 2*3.14*r*(r+h);
               }
            if (wahl == 2)
               {
               cout << "\nHoehe: ";
               cin >> h;
               cout << "\nRadius: ";
               cin >> r;
               cout << "\nVolumen: " << 3.14*r*r*h;
               }
            if (wahl != 1 && wahl != 2 && wahl != 9)   
               {
               cout << "Bitte wiederholen sie ihre Eingabe!\n\n\n\n";
               }
               }
    
        return 0;
    
    }
    

    Wenn ich jetzt bei der Wahl keine Zahl sondern einen Buchstaben schreibe läuft die schleife endlos-was kann ich machen(außer jeden Buchstaben einzugeben...) ?



  • #include <iostream>
    using namespace std;
    
    int eingabe( )
    {
        int i;
        while (!(cin >> i))
        {
            cout << "das war kein int!" << endl;
            cin.clear( );
            cin.get( );
        }
        return i;
    }
    
    int main()
    {
         cout << "Copyright 15.1.2004 by nicknack2002\n\n\n";
         int wahl = 0;
         while (wahl != 9)
         {
               cout << "Volumenberechnung oder Oberfleachenberechnung eines Zylinders:\n\n";
               cout << "1. Oberflaeche\n" << "2. Volumen\n\n" << "9.Beenden\n" << "Bitte Weahlen: ";
               wahl = eingabe( );
               if (wahl == 1)
               {
                    cout << "\nHoehe: ";
                    int h = eingabe( );
                    cout << "\nRadius: ";
                    int r = eingabe( );
                    cout << "\nOberflaeche: " << 2*3.14*r*(r+h);
               }
               if (wahl == 2)
               {
                    cout << "\nHoehe: ";
                    int h = eingabe( );
                    cout << "\nRadius: ";
                    int r = eingabe( );
                    cout << "\nVolumen: " << 3.14*r*r*h;
               }
               if (wahl != 1 && wahl != 2 && wahl != 9)  
                    cout << "Bitte wiederholen sie ihre Eingabe!\n\n\n\n";
         }
    }
    

    herausfinden ob die eingabe korrekt war kannst du mit

    if( cin.fail() ) //true, falls falsche eingabe
    

    man kann aber auch einfach schreiben

    if( !cin )
    

    das ist das gleiche

    also machen wir daraus doch einfach

    while (!(cin >> i) )
    

    damit wir nicht in einer endlosschleife landen müssen wir in der schleife noch machen

    cin.clear( ) // clear setzt die Zustandsflags wieder auf "alles heile"
    cin.get( ) // zeilenumbruch rausholen
    


  • HansImSuff schrieb:

    M.

    🙂

    M wie Mecnels?



  • Mecnels schrieb:

    Und überleg Dir, C++ Das Grundlagen Buch (Data Becker), zu beschaffen, das Buch ist die #1 wenn's um's Erwerben der Standard-C++ - Kenntnisse geht. 😃

    Das erklärt einiges ...



  • Walli schrieb:

    Mecnels schrieb:

    Und überleg Dir, C++ Das Grundlagen Buch (Data Becker), zu beschaffen, das Buch ist die #1 wenn's um's Erwerben der Standard-C++ - Kenntnisse geht. 😃

    Das erklärt einiges ...

    Das Buch ist klasse!

    Mein Nick ist ein Anagramm.
    Ich bin natürlich nicht 59 sondern 25 (ist meine Angewohnheit, das Klima
    in Foren, auf denen ich neu bin, durch Aufsetzen von Masken zu erforschen,
    sorry :))
    Jedenfalls sind die meisten von Euch hier total ok.
    Was ich auf Eurem Board vermisse ist ein Unterforum, auf dem sich Neue
    Forenmitglieder vorstellen können, außerdem ist mir bis jetzt immer noch
    kein PM - Feature ins Auge gesprungen, viel Geflamme wär sonst sicher nicht
    nötig gewesen.
    Mein Studium der Informatik hab ich nach anderthalb Jahren enttäuscht
    abgebrochen, weil
    erstens: Dinge gelehrt wurden, die ich mit 11 Jahren an meinem Amiga 500
    schon gewusst hab
    zweitens: die Ausstattung der Unis in punkto Rechnern und OS in meinen Augen
    Substandard ist
    drittens: es eine Frechheit ist, nach zehn Jahren begeisterten eigenständigen
    Studiums der Programmiersprachen C und C++, an der Uni
    plötzlich das viel langsamere JAVA aufgezwungen zu bekommen
    viertens: eine Sprache nicht ausschließlich auf ihre Grammatik zu reduzieren
    ist (angenommen ihr würdet die Grammatik der Französischen Sprache perfekt
    beherrschen, aber fast gar keine Vokabel können, dann macht Ihr Urlaub in
    Paris - trotz perfekter Kenntnis der Grammatik habt ihr keine Chance, Euch
    auch nur einigermaßen zu verständigen, weil Euch einfach die Vokabel fehlen;
    ich betrachte Programmiersprachen ganz ähnlich wie 'echte' Sprachen, man
    kann die 'Grammatik' von C/C++ - also etwa das Wissen, wie Polymorphismus
    prinzipiell funktioniert, noch so perfekt beherrschen, man wird trotzdem
    kein einziges vorzeigbares Programm mit diesem grammatischen Wissen allein
    zu stande bringen. Zumindest nicht innerhalb einer angemessenen Zeit.
    Vokabel sind beim Erlernen einer Sprache genauso wichtig, wie das Erlernen
    der Grammatik, die Vokabeln sind, im Falle von Programmiersprachen
    die konkreten Bezeichner (nur um ein Beispiel zu nennen: 'CreateFile',
    'WM_GETTEXT', natürlich sind auch 'ofstream' oder 'cout' nur
    Vokabel - Eine Sprache kennt oft mehrere Begriffe, die
    ähnliche Bedeutung haben)
    fünftens: ich einem lukrativen Angebot einer Firma nicht widerstehen konnte
    sechstens: mittlerweile trotzdem schon seit drei Jahren in der Branche bin
    siebtens: mich Professoren, die sich mit MS-Feindlichkeit vor 18-20 jährigen
    Studenten profileren wollen, ankotzen

    Tja, etwas verspätet, aber doch - Klartext.
    (mal ehrlich, die Maske habt Ihr mir doch alle abgekauft :))



  • EhrlicherMecnels schrieb:

    Mein Studium der Informatik hab ich nach anderthalb Jahren enttäuscht
    abgebrochen, weil
    erstens: Dinge gelehrt wurden, die ich mit 11 Jahren an meinem Amiga 500
    schon gewusst hab

    das ist doch schön für dich, wenn du dinge schon kennst?

    EhrlicherMecnels schrieb:

    zweitens: die Ausstattung der Unis in punkto Rechnern und OS in meinen Augen
    Substandard ist

    was hat denn ein informatik-studium mit rechnern oder dem os auf diesen zu tun? waren die rechner so schnell und das os so gut das man texte drauf verfassen und programme drauf kompileren konnte? was brauchst du mehr?

    EhrlicherMecnels schrieb:

    drittens: es eine Frechheit ist, nach zehn Jahren begeisterten eigenständigen
    Studiums der Programmiersprachen C und C++, an der Uni
    plötzlich das viel langsamere JAVA aufgezwungen zu bekommen

    das ist doch super, stell dir vor sie hätten dir c++ beigebracht, dann hättest du doch nichts gelernt.

    EhrlicherMecnels schrieb:

    viertens: eine Sprache nicht ausschließlich auf ihre Grammatik zu reduzieren
    ist (angenommen ihr würdet die Grammatik der Französischen Sprache perfekt
    beherrschen, aber fast gar keine Vokabel können, dann macht Ihr Urlaub in
    Paris - trotz perfekter Kenntnis der Grammatik habt ihr keine Chance, Euch
    auch nur einigermaßen zu verständigen, weil Euch einfach die Vokabel fehlen;
    ich betrachte Programmiersprachen ganz ähnlich wie 'echte' Sprachen, man
    kann die 'Grammatik' von C/C++ - also etwa das Wissen, wie Polymorphismus
    prinzipiell funktioniert, noch so perfekt beherrschen, man wird trotzdem
    kein einziges vorzeigbares Programm mit diesem grammatischen Wissen allein
    zu stande bringen. Zumindest nicht innerhalb einer angemessenen Zeit.
    Vokabel sind beim Erlernen einer Sprache genauso wichtig, wie das Erlernen
    der Grammatik, die Vokabeln sind, im Falle von Programmiersprachen
    die konkreten Bezeichner (nur um ein Beispiel zu nennen: 'CreateFile',
    'WM_GETTEXT', natürlich sind auch 'ofstream' oder 'cout' nur
    Vokabel - Eine Sprache kennt oft mehrere Begriffe, die
    ähnliche Bedeutung haben)

    du hast leider nicht erfasst worum es in einem informatik studium geht, das erlernen einer programmiersprache nimmt nur einen kleinen teil eines informatikstudiums ein. da kann man dann halt nicht so weit in die tiefe gehen. man baut ja in einem physikstudium auch keine atomkraftwerke. auch wenn die atomkraft ein interessantes teilgebiet der physik ist.

    EhrlicherMecnels schrieb:

    siebtens: mich Professoren, die sich mit MS-Feindlichkeit vor 18-20 jährigen
    Studenten profileren wollen, ankotzen

    tja, andere kotzt halt dein ms-quelltext-geposte an.

    EhrlicherMecnels schrieb:

    Tja, etwas verspätet, aber doch - Klartext.
    (mal ehrlich, die Maske habt Ihr mir doch alle abgekauft :))

    das gehört hier übrigens nicht in den thread...


Anmelden zum Antworten