Problem bei C++ Programm



  • berndderbernd schrieb:

    Ne das ist eine Aufgabe aus meinem C++ Unterricht an einer Uni 🙂

    Jetzt mal ernsthaft, hol dir ein gutes Buch. Das ist gesünder als diese "Uni".

    Die Idee mit meinem A-Style Formattierer war gar nicht so unsinnig 🤡



  • Für den Unterricht an meiner UNi kann ich nichts 🙂
    So ich bin jetzt schon ein bisschen weiter jedoch heult er jetzt nach eingabe der Werte rum und bricht das Programm ab. Weiß jemand warum? Eigendlich heult er im Main rum, da ihm da i.was fehlt.....

    // StudentTyp.cpp
    #include <string>
    #include <iostream>
    using namespace std;
    
    struct beleg
    {
    double delta; // delta - Veränderung des Sparguthabens in einem Jahr
    double zinsg;
    double kapital;
    };
    
    void einlesen()
    {
    double anfKap;
    double zins;
    double volumen;
    int n;
    
    cout<<"Kapital?: ";cin>>anfKap;
    cout<<"Zinssatz?: ";cin>>zins;
    cout<<"Sparvolumens?: ";cin>>volumen;
    cout<<"Laufzeit?: ";cin>>n;
    }
    
    beleg ein(float anfKap, float zins)
    {
    	beleg b;
    	b.kapital=anfKap;
    	b.zinsg=zins;
    	b.delta=anfKap*zins;
    	return b;
    }
    
    void verzins(int n, float anfKap, float volumen, float zins, struct beleg b[])
    {
    	int i=2;
    
    	for(i;i<n;i++)
    	{
    		b[i].delta = (b[i-1].kapital+volumen) *zins/100;
    		b[i].zinsg=zins;
    		b[i].kapital=b[i-1].kapital+volumen+b[i].delta;
    	}
    }
    
    void zeig(int n ,beleg b[])
    { int i=1;
    
    cout<<"\nAuszug \tZuwachs \tZinsgewinn \tKapital "<<endl;
    for(i;i<n;i++)
    {
    	cout<<i<<"\t"<<b[i].delta<<"\t"<<b[i].zinsg<<"\t"<<b[i].kapital<<endl;
    }
    }
    
    int main()
    { int n=1;
      float anfKap, volumen, zins;
      beleg b[100];
    
    einlesen(); cout<<endl;
    
    b[n]=ein(anfKap,zins);
    
    verzins(n,anfKap,volumen,zins,b);
    
    zeig(n,b);
    
    cout<< endl << endl;
    system("PAUSE");
    return 0;
    }
    

  • Mod

    Drück dich doch mal präzise aus. Glaubst du wirklich, irgendjemand könnte mit

    jedoch heult er jetzt nach eingabe der Werte rum

    oder

    Eigendlich heult er im Main rum, da ihm da i.was fehlt

    auch nur irgendetwas anfangen? Lies dir bitte mal den ersten und den dritten Link in meiner Signatur durch.

    Auch ganz wichtig: Stelle Compilerwarnungen an, behandle Warnungen wie Fehler, denn bei Anfängern sind die Warnungen meistens auch welche. Dein Programm liefert bei meinem Compiler:

    test.cc: In function ‘void verzins(int, float, float, float, beleg*)’:
    test.cc:41:8: warning: statement has no effect [-Wunused-value]
       for(i;i<n;i++)
            ^
    test.cc: At global scope:
    test.cc:36:6: warning: unused parameter ‘anfKap’ [-Wunused-parameter]
     void verzins(int n, float anfKap, float volumen, float zins, struct beleg b[])
          ^
    test.cc: In function ‘void zeig(int, beleg*)’:
    test.cc:53:8: warning: statement has no effect [-Wunused-value]
       for(i;i<n;i++)
            ^
    test.cc: In function ‘int main()’:
    test.cc:67:24: warning: ‘anfKap’ may be used uninitialized in this function [-Wuninitialized]
       b[n]=ein(anfKap,zins);
                            ^
    test.cc:67:24: warning: ‘zins’ may be used uninitialized in this function [-Wuninitialized]
       b[n]=ein(anfKap,zins);
                            ^
    test.cc:69:35: warning: ‘volumen’ may be used uninitialized in this function [-Wuninitialized]
       verzins(n,anfKap,volumen,zins,b);
    

    Und tatsächlich: Alles sind dicke Fehler.

    Wobei ich geschummelt habe, denn eigentlich sagt er:

    test.cc: In function ‘int main()’:
    test.cc:74:17: error: ‘system’ was not declared in this scope
       system("PAUSE");
                     ^
    

    Da du Funktionen benutzt, ohne die passenden Header einzubinden. Abgesehen davon, dass es sowieso Unsinn ist (siehe FAQ), ist system nämlich aus cstdlib. Verlasse dich niemals auf indirekte Abhängigkeiten.



  • Okay.. Also nach eingabe der Werte bricht er das Programm ab und gibts folgene Fehlermeldung aus.

    Run-Time Check Failure #3 - The variable 'zins' is being used without being initialized.
    Run-Time Check Failure #3 - The variable 'anfKap' is being used without being initialized.
    Run-Time Check Failure #3 - The variable 'zins' is being used without being initialized.

    Damit bezieht er sich auf den Code im Main().


  • Mod

    berndderbernd schrieb:

    Okay.. Also nach eingabe der Werte bricht er das Programm ab und gibts folgene Fehlermeldung aus.

    Run-Time Check Failure #3 - The variable 'zins' is being used without being initialized.
    Run-Time Check Failure #3 - The variable 'anfKap' is being used without being initialized.
    Run-Time Check Failure #3 - The variable 'zins' is being used without being initialized.

    Damit bezieht er sich auf den Code im Main().

    Das ist doch eindeutig, was soll man dazu noch sagen? Außer dass der Compiler dir das auch so schon hätte sagen können, siehe mein edit im vorherigen Beitrag. Eine genaue Erklärung, warum dein Programm falsch ist, hat dir asc schon vor Stunden gegeben.



  • Sorry aber ich habe Informatik erst seit 3 Monaten und dann auch nur alle 2 Wochen und kann daher mit dieser Fehlermeldung überhaupt nichts anfangen. Ich weiß leider nicht was ich verändern muss & da ich das Programm nur einreichen kannm, wird es auch schwer jemanden an meiner Uni zu finden der mit meine Fehler erklären kann.


  • Mod

    berndderbernd schrieb:

    Sorry aber ich habe Informatik erst seit 3 Monaten und dann auch nur alle 2 Wochen und kann daher mit dieser Fehlermeldung überhaupt nichts anfangen. Ich weiß leider nicht was ich verändern muss & da ich das Programm nur einreichen kannm, wird es auch schwer jemanden an meiner Uni zu finden der mit meine Fehler erklären kann.

    Tut mir leid, dann kann ich dir nicht anders helfen, als für dich deine Hausaufgabe zu machen. Und das mach ich nicht. Was ist an der Fehlermeldung und ascs Erklärung denn nicht verständlich? Verstehst du das Englisch nicht?



  • 1>c:\users\marvin\documents\visual studio 2010\projects\bb\bb\bbb.cpp(58): warning C4700: Die nicht initialisierte lokale Variable "zins" wurde verwendet.
    1>c:\users\marvin\documents\visual studio 2010\projects\bb\bb\bbb.cpp(58): warning C4700: Die nicht initialisierte lokale Variable "volumen" wurde verwendet.
    1>c:\users\marvin\documents\visual studio 2010\projects\bb\bb\bbb.cpp(58): warning C4700: Die nicht initialisierte lokale Variable "anfKap" wurde verwendet.

    Das versteh ich einfach nicht, da ich sie ja initialisiert habe...



  • Wo initialisierst du denn deine Variablen? Du initialisierst keine dieser 3, du list auch keine Werte mittels std::cin>> für diese Variablen ein.
    Das Problem ist, dass du in

    void einlesen()
    

    geneau die 3 Variablen definiert hast, die du in main() definiert hast.

    Praktisch so:

    int main()
    {
        double anfkap, zins, volumen;
        //dann die Funktion
        void einlesen()    //dort gibt es die gleichen Variablen, denen du über std::cin werte zuweist
    

    Überleg mal genau, welchen du Werte zuweist und welchen nicht.
    Wenn du lokale Variablen ohne initialisierung bzw. ohne dass du ihnen Werte zuweist, verwendest, dann ist das undefiniertes Verhalten.
    Tipp: hol dir ein Buch, arbeite dieses sorgfältig durch. Denn dieser Code wird selbst nach Initialisierung deiner Variablen nicth das machen, wofür es programmiert ist.

    gruß
    syntax



  • Ja die die ich in "void einlesen" habe denen weise ich ja darunter werte zu. Oder lasse sie einlesen.
    In die, die ich in Main definiert habe denen weise ich keine werte zu aber wenn ich diese nicht dort definiere kann ich die funktion verzinse(...) nicht in main aufrufen ohne das das programm meckert das "anfkap,volumen, etc" nicht definiert sind.



  • berndderbernd schrieb:

    Ja die die ich in "void einlesen" habe denen weise ich ja darunter werte zu. Oder lasse sie einlesen.

    Prinzipiell ist aber eine Funktion sinnlos, die nur lokale Werte verwendet. Dir sind sicherlich schon Funktionsparameter bekannt, und entweder (was ich hoffe) Referenzen als Parameter, oder zumindest Zeiger (was der C-Stil wäre).

    Ich bin mal sehr freundlich:

    void einlesen(double& kapital, double& zinssatz, double& sparvolumen, int& laufzeit)
    {
    //...
    }
    

    Hilft dir das schon einmal ein wenig auf die Sprünge?



  • Ja das kommt mir bekannt vor.. Zeiger hatten wir damals glaub ich immer so

    double * zins
    

    definiert



  • berndderbernd schrieb:

    Ja das kommt mir bekannt vor.. Zeiger hatten wir damals glaub ich immer so

    double * zins
    

    definiert

    Ich hoffe doch, dass du den Unterschied zwischen Zeigern und Referenzen kennst.
    Man würde doch glauben, dass Studenten C++ besser beherrschen als drittklassige Hobbyprogrammierer wie ich...



  • Naja c++ interessiert mich nicht wirklich, also hast du als hobbyprogrammierer wissen als ich , da du dich immerhin mehr dafür interessiert.... ich kenne den unterschied nicht und lasse das programm jetzt einfach so, da ich des rätels lösung nicht kenne.



  • berndderbernd schrieb:

    Naja c++ interessiert mich nicht wirklich, also hast du als hobbyprogrammierer wissen als ich , da du dich immerhin mehr dafür interessiert.... ich kenne den unterschied nicht und lasse das programm jetzt einfach so, da ich des rätels lösung nicht kenne.

    Aha. C++ ist aber sehr tückisch. Besser du weißt, was du überhaupt schreibst, bevor du noch ausversehen deine Festplatte formattierst, oder dein PC anfängt zu brennen... (Tipp: so wenig reinterpret_cast wie möglich) 🤡



  • berndderbernd schrieb:

    Naja c++ interessiert mich nicht wirklich, also hast du als hobbyprogrammierer wissen als ich , da du dich immerhin mehr dafür interessiert.... ich kenne den unterschied nicht und lasse das programm jetzt einfach so, da ich des rätels lösung nicht kenne.

    Anders gesagt: du hast dir erhofft, hier eine Komplettlösung zu erhalten. Dich wirklich mit dem Problem ausienanderzusetzen hast du keine Lust, interessiert dich ja eh nicht.

    Wenn du dich an das allgemein übliche gute Benehmen im Netz gehalten hättest und die mit wichtig gekennzeichneten Threads im Forum vor deinem ersten Post gelesen hättest, wüsstest du, dass hier weder Hausaufgaben gemacht werden noch Leuten ohne Eigeninitiative geholfen wird. Das hätte dir und uns ne Menge Zeit gespart.


Anmelden zum Antworten