Brauche Hilfe bei C++ - Übungsaufgaben (Anfängerlevel)



  • zum Bsp 13:

    Das "using namespace std" kann ich mir bei diesem Beispiel sparen, oder? Laut google ist das nur gegen Namenskollidierungen, seh in dem Beispiel aber keine.

    cout, endl und cin liegen in dem namespace std... entweder du machst using namespace std oder du scheibst vor das cout, endl und cin std::... sonst gibts fehler!(zumindest bei mir)

    cin.get() macht was genau?

    dies ist dazu dar, damit das programm sich nicht sofort wieder schließt... es wartet solang bis man ENTER eingegeben hat.



  • lustig schrieb:

    Ach ja, noch zu Nr.2, da steht "mit Hilfe der Ziffernsumme überprüft, ob die eingegebene Zahl durch 3 teilbar ist", das heisst, du solltest wahrscheinlich nicht nur % verwenden sondern eher (Ziffer1+Ziffer2+Ziffer3)%3. Das hat zwar den gleichen Effekt, wird aber in der Aufgabenstellung so gefordert.

    Yep, seh ich genauso. Sonst wärs auch irgenwie zu einfach und würde nicht ins Aufgabenbild passen.

    N-Ice schrieb:

    den befehl static_cast hatten wir noch nicht

    [info]static_cast ist kein Befehl, da es in C++ keine Befehle gibt. Es ist nicht mehr und nicht weniger als ein Schlüsselwort.[/info]
    Du kannst das Beispiel natürlich auch ohne static_cast machen. Dann wird dir ein guter Compiler aber mitteilen, dass uU Genauigkeit verlorengeht, da int nunmal den Wertebereich von double nicht abdeckt. In diesem Beispiel teilst du dem Compiler mit static_cast einfach mit, dass er sich keine Sorgen machen brauch, da du weisst was du tust.



  • Hi ihrs,

    erstmal VIELEN DANK für die Hilfe! Die ersten 3 Beispiele hab ich nun tatsächlich lösen können, und das Mod sickert langsam bei mir durch 😉 .. werd trotzdem noch ne Weile üben müssen.

    Das 2. und 3. Beispiel hab ich allerdings relativ umständlich und langwierig gelöst, gibt sicher vereinfachendere Befehle, müßte aber grundsätzlich stimmen *hoff*

    /*
    Bsp. 2
    */

    #include <iostream.h>
    #include <math.h>

    int main()
    {
    int a,b,x,y,z,zahl,zs,tb;

    cout << "Bitte geben Sie eine dreistellige Zahl ein.";
    cin >> zahl;

    x=zahl/100;
    a=zahl%100;
    y=a/10;
    b=a%10;
    z=b;

    zs=x+y+z;

    tb = zs%3;
    if (tb==0)
    {
    cout << "Diese Zahl ist durch 3 teilbar.";
    }
    else
    {
    cout << "Diese Zahl ist nicht durch 3 teilbar.";
    }

    return 0;
    }

    /*
    Bsp. 3
    */

    #include <iostream.h>
    #include <math.h>

    int main()
    {
    int a,b,x,y,z,zahl;

    cout << "Bitte geben Sie eine dreistellige Zahl ein.";
    cin >> zahl;

    x=zahl/100;
    a=zahl%100;
    y=a/10;
    b=a%10;
    z=b;

    cout<<"Die Umkehrung der Ziffernfolge ergibt "<< z << y << x <<'\n';

    return 0;
    }

    hmm.. meine Gedankengänge dazu.

    lg, N-Ice



  • Sieht doch schon mal ganz gut aus. Ein paar kleine Anmerkungen trotzdem noch

    #include <iostream> // iostream.h ist veraltet und falsch
    //#include <cmath> // math.h ist ebenfalls veraltet -> cmath ist korrekt
                       // da wir aber keine speziellen Mathe-Funktionen brauchen, koennen wir uns die Header-Datei sparen
    using namespace std; // damit wir uns std:: ersparen
    
    int main()
    {
    //    int a, b, x, y, z, zahl, zs, tb; // unnoetig, wir definieren Variablen dort, wo sie gebraucht werden
        cout << "Bitte geben Sie eine dreistellige Zahl ein:";
        int zahl;
        cin >> zahl;
        if (zahl < 0)
        {
            cout << "Spassvogel!";
            return 0;
        }
        if (zahl > 999)
        {
            cout << "Ich sagte dreistellig!";
            return 0;
        }
        int a = zahl % 10; // 1. Stelle (10^0)
        zahl /= 10; // oder zahl = zahl / 10, falls du die Assignment Operatoren nicht kennst
        int b = zahl % 10; // 2. Stelle (10^1)
        zahl /= 10;
        int c = zahl % 10; // 3. Stelle (10^2)
        int quersumme = a + b + c;
        if (quersumme % 3 == 0)
        {
            cout << "Diese Zahl ist durch 3 teilbar." << endl;
        }
        else
        {
            cout << "Diese Zahl ist nicht durch 3 teilbar." << endl;
        }
        return 0;
    }
    

    Nicht, dass deine Vorgehensweise falsch war. Sie wird jedoch bei Realisierung mit Schleifen komplizierter.

    btw:
    Benutze in Zukunft bitte die C/C++ Code-Tags.



  • Danke für die Anmerkungen. Ist so auf jeden Fall übersichtlicher als mit zig verschiedenen Variablen. Wußte mir nur nicht wirklich anders zu helfen.

    Mit iostream.h und math.h arbeiten wir in den Übungen. Verwenden dort auch den GNU C++ Compiler in der Version 2.95.2, sollte das wesentlich sein. Deswegen verwende ich diese, weil bei uns nur das gewertet wird, was am dortigen Server funktioniert und vor Ort präsentiert werden kann. So bin ich auf der sichereren Seite, denk ich.

    Dieses "using namespace std;" hatten wir, wie gesagt, auch noch nicht durch. Aber bisher funktionierte alles, was ich gelöst habe, auch ohne dem und ohne std:: 😕
    Hatten aber noch nie was mit ^2 odgl gelöst, weil wir in Sachen Hochkomma auf später vertröstet wurden, weil das "jetzt noch nicht geht". Sollte das damit zusammenhängen.

    Benutze in Zukunft bitte die C/C++ Code-Tags.

    Sorry, übersehen. Gelobe Besserung 😉

    Vielen Dank nochmals & Gute Nacht!

    N-Ice



  • groovemaster
    deine idee eine dreistellige ziffer abzufangen ist nicht grad richtig.
    du prüft nur ob kleiner 0 und dann noch ob grösser 999 ist.

    wenn er 3 eingibt, ist die ziffer einstellig, aber bei deinem code korrekt.

    Was ich machen würde ist ein

    while konstrukt, welches solange abfrägt bis endweder ende oder eine dreistellige ziffer eingegeben wird.

    kann man so machen ( wenns falsch ist bitte korrigieren

    ......
    
    double x = 0;
    int eingabe;
    while( x<1 || x>9.99)
    {
        cout << "Geben Sie eine dreistellige Ziffer ein: " << endl;
        cin >> eingabe;
        x = eingabe;
        x = x / 100;
    }
    
    ......
    

    Der Algorithmus müsste passsen, ist aber Ausgabetechnisch nicht ganz so toll.
    Wenn man möchte könnte man auch überprüfen ob einer einen ganzzahligen wert eingibt, denn 5,22 ist auch dreistellig sogesehen. hmmm



  • newkid schrieb:

    denn 5,22 ist auch dreistellig

    Würde mich wundern, wenn cin da nicht meckert, immerhin wird eine Ganzzahl erwartet.

    newkid schrieb:

    wenn er 3 eingibt, ist die ziffer einstellig, aber bei deinem code korrekt.

    Yep. Ich hatte noch irgenwie im Kopf, dass die Zahl mindestens 3 Stellen haben soll. Wenn es genau 3 Stellen sein sollen, dann müsste

    if (zahl < 100 || zahl > 999)
        {
            cout << "Ich sagte dreistellig!";
            return 0;
        }
    

    eigentlich reichen. Damit wären dann auch negative Werte abgefangen. Keine Ahnung, ob sowas erlaubt sein soll. Mann soll bei so simplen Beispielen ja nicht gleich das Abfangen von Benutzerfehlern übertreiben.

    @N-Ice
    Eigentlich unverantwortlich, dass man zu Lehrzwecken zu solch alten Lehrmitteln greift. Immerhin ist der aktuelle C++ Standard auch schon 6 Jahre alt und der GCC 2.95.2 ist auch nicht mehr gerade der neueste (aktuell 3.4.x). Den könnte man schon mal aktualisieren, immerhin ist das ein freier Compiler und kostet die Schule nicht mehr als ein bisschen Zeit. Ich persönliche würde meinen Lehrer darauf ansprechen, das hängt aber halt von den beteiligten Charakteren ab. Wenn es euer Lehrer für richtig hält, die .h Header-Dateien zu verwenden, dann mach's auch so (immerhin gibt er letztendlich eine Note für eure Ergüsse 🙂 ) und lass die using Direktive weg. Du solltest aber trotzdem im Hinterkopf behalten, dass das eigentlich falsch ist.
    ➡ 17.4.1.2 Headers

    N-Ice schrieb:

    Hatten aber noch nie was mit ^2 odgl gelöst

    Das wird in dem Beispiel auch nicht funktionieren, da der Operator ^ in C++ eine andere Bedeutung hat als Potenzieren. 10^2 (zB) sollte nur zum mathematischen Verständnis dienen, da "10 hoch 2" irgendwie seltsam aussieht.



  • Und wie kann man Bsp-1 lösen? also ich gebe 2 Zahlen(m un n) ein, und das Program soll die n-te Ziffer der Zahl m ausgeben. Ich habe den ganzen Tag mit if und for versucht aber kann es nicht machen.



  • Division durch 10 und mod 10.



  • @leka:
    Hab erst jetzt wieder ins Forum geschaut. Ich habe Bsp1 dann so gelöst:

    #include <iostream.h>
    #include <math.h>
    
    int main()
    {
       int a,z,x,zahl;
    
       cout << "Bitte geben Sie eine Zahl ein.";
       cin >> a; 
    
       cout << "Bitte geben Sie die gewuenschte Stelle (von rechts) dieser Zahl ein.";
       cin >> z;
    
       while (x < z )
       {
         a = a/10;
         x = x + 1;
       }
       zahl = m % 10;
    
       cout<<"Die gewünschte Ziffer lautet "<<zahl<<'\n'; 
    
       return 0;
    }
    

    @groovemaster:
    Wir behalten vorerst die "altmodische Art" bei, weil die gesamte Vorlesung darauf aufgebaut ist, folglich auch die Übungen und die Übungsbeispiele, die wir zu lösen haben.
    Wir können uns dann weiter spielen, wenn wir es beherrschen, aber erklärt wird's uns halt anhand dieser Versionen.

    lg,

    N-Ice



  • N-Ice schrieb:

    while (x < z )
    

    Das hat UB (undefiniertes Verhalten), da x noch nicht initialisiert wurde.


Anmelden zum Antworten