Erste Programme zum Laufen bringen


  • Administrator

    1. Fehlermeldung immer mit angeben!
    2. Man kann 1^2 schon schreiben, nur bedeutet es in C++ xor.
    3. Du sollst nicht math.h sondern cmath verwenden.
    4. RTFM 😉

    Grüssli



  • Vielen Dank Dravere. Mein Programm funktioniert nun. Habe es so gemacht, wies es bei dem Link angegeben war.
    Ich finds immer toll, wie schnell hier geantwortet wird. Ist super! 🙂

    Eine kleine Verständnisfrage hätte ich noch. math.h ist ja noch von C oder?
    Hat es jetzt irgendwelche Auswirkungen wenn ich dies verwende und nicht das neuere?

    Viele Grüße

    dumdidu



  • Dumdidu1 schrieb:

    Eine kleine Verständnisfrage hätte ich noch. math.h ist ja noch von C oder?
    Hat es jetzt irgendwelche Auswirkungen wenn ich dies verwende und nicht das neuere?

    Ja, <math.h> ist ein C-Header. Die Funktionen werden nicht in den Namensraum std eingebunden, mit <cmath> allerdings schon. Genau genommen wäre es dann z.B. std::pow() .



  • Ich habe wieder ein Problem mit pow():
    Nun soll ich die die Annuität ausrechnen:

    #include <iostream>
    #include <iomanip>
    #include <cmath>
    using namespace std;

    int main()
    {
    cout << "*** Berechnung der jaehrlichen Annuität A ***\n" << endl;

    float a,s,z,erg;

    while (1)
    {

    cout << "Wie hoch ist die Annuitaetenschuld in EURO?" << endl;
    cin >> a;
    if (a == 0) { cout << "Das war ungueltig! " << endl; getch(); return(0); }
    cout << "In wievielen Jahren soll die Annuitaetenschuld getilgt werden?" << endl;
    cin >> s;
    if (s == 0) { cout << "Das war ungueltig! " << endl; getch(); return(0); }
    cout << "Wie hoch ist der Zinssatz?" << endl;
    cin >> z;
    if (z == 0 || z>1) { cout << "Das war ungueltig! " << endl; getch(); return(0); }

    cout << "Ihre eingegebenen Werte im Ueberblick: " << endl;
    cout << "Annuitaetenschuld:";
    cout << setfill ('.') << setw (20);
    cout << a << endl;
    cout << "Jahre:";
    cout << setfill ('.') << setw (28);
    cout << s << endl;
    cout << "Zinssatz:";
    cout << setfill ('.') << setw (20);
    cout << z << endl;

    erg = s * (z/(1-(1/((pow(1+z,s))));

    cout >> erg;

    }
    getch();
    }

    Fehlermeldung kann ich leider nicht kopieren -.-.
    Das Programm geht, solange bis ich das schwarz gedruckte eingebe. Dann funktioniert nichts mehr.



  • Irgendwie sind die Klammern falsch. Wieso zwei um pow() ?

    Außerdem hast du gar keine Abbruchsequenz für die while schleife

    Dazu noch "cout >>" statt "cout <<" Also ungefähr so:

    erg = s * (z/(1-(1/(pow(1+z,s)))));

    cout << erg << endl;



  • Das mit der Abbruchsequenz wollt ich eigentlich so haben, sodass man dass immer wieder durchmachen kann, ohne abzubrechen.
    An sich wird jetzt keine Fehlermeldung mehr angezeigt:

    In meinem Buch steht die Formel:
    Annunitätenschuld: 60000€
    8% / 0.08 jährliche Verzinsung
    Laufzeit : 5 Jahre

    Annuität = 60000*(0.08/(1-(1/1.08^5))) = 15027,39, was ich auch mit dem Taschenrechnen ausgerechnet habe.

    erg = s * (z/(1-(1/(pow(1+z,s))))); ist ja auch das gleiche, nur kommt was ganz anderes raus... Seht ihr da den Fehler? Ich sehe ihn nicht.

    Danke erstmal für deine Hilfe TheCrip, jetzt steht schonmal was da ^^.


  • Administrator

    1. Wieso kannst du die Fehlermeldung nicht kopieren?
    2. Wieso kannst du keine Beschreibung zum Fehler geben? "Funktioniert nichts mehr" kann alles heissen. Ungenauer kann man es gar nicht beschreiben.
    3. Nimm solche Formeln auseinander und mach Zwischenschritte rein.
    4. Verwende mehr Leerschläge.
    5. Du machst pow(1 + z, s) , 1.08^60000 . Korrekt wäre wohl eher pow(1 + z, 5) .
    Edit: Boah, kommt von diesen schecklichen Variablennamen (6.), dass s ist ja die Laufzeit, dass a die Schuld. Also sollte es a * z / (1 - (1 / pow(1 + z, s))) heissen, wenn mich nicht alles täuscht. Also wirklich Punkt 6: Verwende Variablen mit sinnvollen Namen.

    Grüssli



  • Zu 1. : Die Fehlermeldung erscheint bei mir in Visual Studio 2008-Eingabeaufforderung und dort kann ich nichts markieren und mit STRG+C kopieren bzw. auch so nicht kopieren, weil ich nichts - wie soll ich es sagen - greifen kann.
    Zu 2. : Man muss dazusagen, dass sich ja der Fehler auf die schwarz gekennzeichnete Zeile bezieht und das habe ich ja dazugeschrieben.
    Zu 3. und 4. : Werde ich bei den weiteren Schritten beachten. Ich hoffe, dass ich da nicht mehr auf euch zurückkommen muss :).
    Zu 5. und 6. : Oh jetzt sehe ich den Fehler erst.
    Ich stehe halt noch am Anfang und muss mich da erstmal zurecht finden und ich denke mal das solche Fehler am Anfang normal sind.
    Ich versuche aber, das nächste Mal meine Punkte konkreter zu nennen bzw. auch den Variablen sinnvollere Namen zu geben.
    Sry, aber ich hoffe, du kannst das nochmal durchgehen lassen ^^. Irgendwie muss ich mich da halt durchkämpfen, weil am Schluss ne Prüfung ansteht 🙂

    Grüsse



  • Dumdidu schrieb:

    Zu 1. : Die Fehlermeldung erscheint bei mir in Visual Studio 2008-Eingabeaufforderung und dort kann ich nichts markieren und mit STRG+C kopieren bzw. auch so nicht kopieren, weil ich nichts - wie soll ich es sagen - greifen kann.

    Doch, kannst du. Einfach im "Ausgabe"-Fenster nachschauen.

    Dumdidu schrieb:

    Zu 2. : Man muss dazusagen, dass sich ja der Fehler auf die schwarz gekennzeichnete Zeile bezieht und das habe ich ja dazugeschrieben.

    Es wäre trotzdem besser, du könntest uns den entsprechenden Fehler mitteilen. Zunächst einmal können sehr viele Dinge falsch sein.



  • Die Funktion braucht 2 Parameter. Der erste ist die Basis und der zweite der Exponent. Also: 4² wird zu pow(4, 2)



  • Eine Frage habe ich zu einem neueren Problem:

    #include <iostream>
    #include <math.h>
    using namespace std;

    int main()
    {
    float n,l,i,j,erg,erg1;

    cout << "*** Abschreibung ***\n" << endl;

    cout << "Wie hoch ist der Nettobetrag? ";
    cin >> n;
    if (n == 0) {cout << "Das war ungueltig!" << endl; getch(); return(0); }
    cout << "Wieviele Jahre soll es LINEAR abschreiben?";
    cin >> l;
    if (l == 0) {cout << "Das war ungueltig!" << endl; getch(); return(0); }
    cout << "Abschreibungen | Restbuchwert" << endl;

    for (i=0;i<l;i++)
    {

    erg = n/l;
    cout << erg << endl;

    }

    getch(); return(0);
    }

    Ich hab mir jetzt schon einige Zeit den Kopf zerbrochen, wie ich es schaffen soll in den Bereich Restbuchwert die jeweiligen Abschreibungen pro Jahr reinzuschreiben.
    Als Beispiel benutz ich immer 21.000 Euro als Nettobeitrag und 7 Jahre Abschreibung.
    Auf der linken Spalte wird 3000 abgebildet, nur habe ich keinen Schimmer wie ich die jeweiligen Beiträge in den Jahren in "Restbuchwert" eintragen kann.
    Ich hab es geschafft, wenn ich:

    erg1 = n - erg;
    cout << erg1 << endl;

    in die for Anweisung einfüge, dass 18.000, der Betrag vom 1. Jahr ausgespuckt wird. Problem ist nur, dass dann immer 18.000 und 3000 ausgegeben werden und nicht wie es eigentlich sein solllte: 15.000,12.000....
    Was sollte ich da an der For-Anweisung ändern? Eine 2. For-Schleife?
    Bitte gebt mir einen Denkanstoß... 🙂



  • Ich weiss weder was eine Abschreibung ist noch was ein Restbuchwert ist.

    Aber so könntest du es lösen [Vielleicht wäre das Tutorial hier auch ganz interessant für dic http://www.cpp-tutor.de/cpp/hinweise.html]:

    #include <iostream>
    #include <math.h> 
    using namespace std; 
    
    int main() 
    { 
    float n,l,i,j,erg,erg1; 
    
    cout << "*** Abschreibung ***\n" << endl; 
    
    cout << "Wie hoch ist der Nettobetrag? "; 
    cin >> n;
             if (n == 0)
             {
    
                    cout << "Das war ungueltig!"<<endl;
                    system("PAUSE");
                    return 0;
             }
    
    cout << "Wieviele Jahre soll es LINEAR abschreiben?";
    cin >> l;
    
            if (l == 0)
            {
                    cout << "Das war ungueltig!" << endl;
                    system("PAUSE");
                    return 0;
    
            }
    
    cout << "Abschreibungen | Restbuchwert" << endl;
    
    // Abschreibung berechnen
    for (i=0;i<l;i++)
    {
            erg = n/l;
    }
    
    /*/
    
    Hier soll der Restbuchwert berechnet werden
    
    /*/
    
    //  cout << erg <<"           |" << restbuchwert <<endl;
    
    system("PAUSE");
    
    }
    

  • Administrator

    Wie wäre es damit, dass du den Nettobetrag nicht wegwirfst? Pseudocode:

    var Nettobetrag := einlesen.
    var Jahre := einlesen.
    var AbschreibungProJahr := Nettobetrag / Jahre.
    
    var AktuellAbschreibung := AbschreibungProJahr.
    
    for(var i; i < Jahre; ++i)
    {
      print AktuelleAbschreibung.
      print Nettobetrag - AktuelleAbschreibung.
    
      AktuelleAbschreibung += AbschreibungProJahr.
    }
    

    Irgendsowas ...
    Man könnte theoretisch die for-Schleife und deren Zählvariable durch AktuelleAbschreibung und Nettobetrag ablösen. Sobald die AktuelleAbschreibung dem Nettobetrag entspricht, kann man abbrechen. Bei float müsste man halt einfach mit dem Vergleich aufpassen.

    Grüssli



  • Hallo,

    wir nehmen gerade Funktionen durch. Mittlerweile ist es auch so, dass wir statt C++ C für die Prüfung lernen müssen.
    Daher sind die Programme, die jetzt machen muss in C.

    Ich habe ein Problem bei folgender Aufgabe:

    #include <stdio.h>
    #include <conio.h>
    #define quad(a) (a*a)

    int Berechnung(int);

    int Berechnung(int x)
    { int erg; int summe = 0;
    for(int i=0;i<=x;i++)
    { erg = quad(i);
    printf(" %i ",erg);
    summe = summe + erg;
    }
    printf("Die Summe lautet: %i ", summe);
    return erg;

    }

    int main()
    {
    int zahl;
    printf("Geben Sie eine positive Ganze Zahl ein: ");
    scanf("%i", &zahl);
    int Berechnung(zahl);

    getch();return(0);
    }

    Wenn ich es ausführe komme ich nur soweit, dass ich eine ganze positive Zahl eingeben kann, aber weiter kommt nicht. Gerade die Funktion Berechnung() wird nichts ausgegeben.
    Ich habe dasselbe Programm dann mal in einer Hauptfunktion geschrieben:

    #include <stdio.h>
    #include <conio.h>
    #define quad(a) (a*a)

    int main()
    {
    int zahl;
    printf("Geben Sie eine positive Ganze Zahl ein: ");
    scanf("%i", &zahl);

    int erg; int summe = 0;
    for(int i=0;i<=zahl;i++)
    { erg = quad(i);
    printf(" %i ",erg);
    summe = summe + erg;
    }
    printf("\nDie Summe lautet: %i ", summe);

    getch();return(0);
    }

    Dort gehts. Liegt das irgendwie an dem Rückgabewert? Ich habs jetzt schon paar Mal verändert, aber irgednwie geht es nicht weiter.


  • Mod

    int Berechnung(zahl);
    

    Das ist kein Funktionsaufruf, sondern macht dir einen int mit dem Namen Berechnung und dem Wert zahl. So rufst du deine Funktion auf:

    Berechnung(zahl);
    

    Zu dem Rest des Codes spare ich mir mal lieber jeden Kommentar, außer dem, dass for(int i=0;i<=x;i++) in Standard-C nicht erlaubt ist.


Anmelden zum Antworten