Fehler E2034 Konvertierung von float nach konto nicht möglich



  • hey 🙂 ich programmiere erst seit kurzem und schreibe mein Abi(IV-Leistungskurs)bereits in einer Woche. Deswegen wollte ich fragen ob mir jemand sagen kann, was an meinem Programm falsch ist. VIELEN DANK schon mal im voraus 😉

    Ich soll 10 Konten erstellen
    Kontonummern sind von 1 bis 10
    die Einzahlung beträgt 500€ mal die Kontonummer
    (zB Kontonr 1 hat 500 €, Konto 2 1000€ usw.)
    der Zinssatz ist Kontonummer/100
    (zB Zinssatz von Kontonr 1 = 0,01%)

    so das ist mein Programm, wie gesagt es kommt immer die Meldung "Konvertierung von float nach konto nicht möglich":

    #include<iostream.h>
    #include<conio.h>
    
    class konto
    {
    private:
     int Einz;
     float Zins, Erge;
    public:
     konto(int, float, float) ;
     konto(){Einz=0; Zins=0; Erge=0; return;}
     ~konto();
    
    int ausgabeEinzahlung()
      {
      return Einz;
      }
    
    float ausgabeZinssatz()
      {
      return Zins;
      }
    
    float ausgabeErgebnis()
      {
      return Erge;
      }
    }
    ;
    
    void main()
    {
    const int anz= 10;
    int Einzahlung;
    float Zinssatz, Erg;
    
    for(int i=1; i<=anz; i++)
     {
     konto kto[anz];
     Einzahlung= i*500;
     Zinssatz=i/100;
     Erg=Einzahlung*Zinssatz;
     kto[i]=(Einzahlung, Zinssatz, Erg);
    
     kto[i].ausgabeEinzahlung();
     cout<<"Das Konto Nr"<<i<<" hat eine Einzahlung von:"<<Einzahlung<<". "<<endl;
     kto[i].ausgabeZinssatz();
     cout<<"einen Zinssatz von: "<< Zinssatz<< endl;
     kto[i].ausgabeErgebnis();
     cout<<"und ein Erg von "<< Erg <<endl;
     }
    
    getch();
    }
    


  • Lies dir bitte mal den Link in meiner Signatur durch und mach dich vor allem mit den [ cpp ]-Tags vertraut, dann kannst du deinen Code nochmal schön formatiert und lesbar hier posten 🙂

    Die Zeile

    kto[i]=(Einzahlung, Zinssatz, Erg);
    

    macht nicht was du denkst. Du versuchst, das Ergebnis des Ausdrucks "(Einzahlung, Zinssatz, Erg)" einem Konto-Objekt zuzuweisen. Der Ausdruck ist eine Reihung von Komma-Operatoren. Der Komma-Operator wertet aber nur beide Argumente aus und hat das zweite Argument als Ergebnis. In dem Fall kommt also Erg raus, d.h. du weist dem Konto-Objekt den Wert von Erg zu.
    Ich vermute mal, dass du diese Art der Zuweisung nicht irgendwo gelernt hast sondern einfach rumprobierst. Das ist schlecht, denn mit rumprobieren kommst du nicht weit. Du solltest dir ein gutes Buch oder Tutorial gründlich durcharbeiten, dann kommt es auch nciht zu solchen Fehlern.
    Sollte sowas allerdings in einem Buch stehen, dann ist es noch nicht zu spät: auch wenn Ostern schon vorbei ist gibts sicherlich noch irgendwo ein schönes Feuerchen, dein Buch hätte dann nämlich nur Brennwert 😉



  • Nutze doch mal bitte die C++-Code-Tags, das würde eine Hilfe sehr erleichtern.
    Finde es immer anstrengend sich so durch nen Code zu lesen.

    Lg freeG

    Edit: Ups zu langsam



  • kto[i] = Konto(Einzahlung, Zinssatz, Erg);
    

    müsstes du schreiben (hab aber nicht geguckt und nichts getestet)



  • danke 🙂 aber so will´s auch nicht funktionieren.

    ich muss wohl nochmal des ganze Programm überdenken



  • konto kto[anz];
    

    muss zwei Zeilen höher, über die for Schleife (wobei du dir in deinem Fall auch ein Array ganz sparen kannst, das Program ist nach der Schleife ja vorbei).



  • der fehler liegt darin, dass ich dachte ich bekomme es so hin :

    kto[i]=(Einzahlung, Zinssatz, Erg);
    

    was wohl leider nicht der fall ist ;P



  • wenn ich es hochsetze bleibt der fehler leider trotzdem



  • Vielleicht klappt's mit

    kto[i].Einz = i*500;
    kto[i].Zins = i/100;
    kto[i].Erge = kto[i].Einz * kto[i].Zins;
    


  • was du da hochgesetzt hast, ist die deklaration (und in diesem fall auch die definition)

    das beeinflusst nur die lebensdauer. so wie du es zuerst hattest, war das array nur innerhalb der schleife gültig und existent, am ende wurde es dann gelöscht und am anfang wieder neu erstellt
    nach der schleife ist sogar ganz weg und nicht mehr gültig



  • [Rewind] schrieb:

    Vielleicht klappt's mit

    kto[i].Einz = i*500;
    kto[i].Zins = i/100;
    kto[i].Erge = kto[i].Einz * kto[i].Zins;
    

    eine gute idee vielen dank 😉 ich probier´s mal aus

    @Skym0sh0 danke ich hab jetzt verstanden was du meintest



  • so ^^ ich hab´s probiert, aber nun geht gar nichts mehr...
    fällt jmd vielleicht ein anderer lösungsweg ein?



  • ManuEllen schrieb:

    [Rewind] schrieb:

    Vielleicht klappt's mit

    kto[i].Einz = i*500;
    kto[i].Zins = i/100;
    kto[i].Erge = kto[i].Einz * kto[i].Zins;
    

    eine gute idee vielen dank 😉 ich probier´s mal aus

    @Skym0sh0 danke ich hab jetzt verstanden was du meintest

    ManuEllen schrieb:

    so ^^ ich hab´s probiert, aber nun geht gar nichts mehr...
    fällt jmd vielleicht ein anderer lösungsweg ein?

    Kann ja eg auch nicht funzen, da die Member ja privat sind oder nicht?
    Es wäre auch nützlich wenn du die Fehler immer aufführst oder sagst was nicht läuft

    Lg freeG



  • ich hab im private nur

    int Einz;
    float Zins, Erge;
    

    im public hab ich dann

    konto(int, float, float) ;
    konto(){Einz=0; Zins=0; Erge=0; return;}
    ~konto();
    

    Also mein Problem ist:
    ich soll ja 10 Konten machen, ich würde die gerne als schleife machen da ich sonst den Zinssatz usw. jedesmal eingeben müsste

    aber dass:

    kto[i]=(Einzahlung, Zinssatz, Erg);
    

    funktioniert nicht

    und ich weiß nicht wie ich die werte dann richtig zuweisen muss



  • #include <iostream>
    
    using namespace std;
    
    class konto
    {
        private:
            int Einz;
            float Zins, Erge;
    
        public:
            konto(int ein, float zin, float erg) : Einz( ein ), Zins( zin ), Erge( erg ) {}
            konto(){Einz=0; Zins=0; Erge=0; return;}
    
            int ausgabeEinzahlung()
            {
                return Einz;
            }
    
            float ausgabeZinssatz()
            {
                return Zins;
            }
    
            float ausgabeErgebnis()
            {
                return Erge;
            }
    };
    
    int main()
    {
        const int anz= 10;
    
        konto kto[anz];
    
        for(int i=1; i<=anz; i++)
        {
            int Einzahlung = i * 500;
            float Zinssatz = static_cast< float >(i) / 500;
            float Erg = Einzahlung * Zinssatz;
            kto[i-1]=konto(Einzahlung, Zinssatz, Erg);
    
            cout<<"Das Konto Nr"<<i<<" hat eine Einzahlung von:"<< kto[i-1].ausgabeEinzahlung() <<". "<<endl;
            float output1 = kto[i-1].ausgabeZinssatz();
            cout<<"einen Zinssatz von: "<< output1 << endl;
            float output2 = kto[i-1].ausgabeErgebnis();
            cout<<"und ein Erg von "<< output2 <<endl;
        }
    
        cin.get();
    }
    

    So sollte es gehen. Allerdings ist das ganze finde ich richtig unschön. Ich würde z.B. Vektoren statt Arrays nutzen und und und...
    Außerdem scheint es mir, als hättest du die Grundlagen nicht so recht verstanden, oder sie sind Euch falsch beigebracht worden. Da waren ein paar grundlegende Fehler drin.

    Lg freeG

    EDIT: Habe nur die Einrücken und die Formatierung vom Code ein bisschen geändert, sodass es leichter zu lesen ist.



  • Du hast gleich mehrere Probleme:

    Sowohl für den Konstruktor konto(int, float, float) als auch für den Destruktor ~konto() existiert zwar eine Deklaration aber keine Definition, wie du sie z.B. für den Konstruktor konto() hingeschrieben hast.

    Dann würde ich die Arraydefinition konto kto[anz] aus der Schleife herausnehmen.

    Und letztlich bei der Zuweisung kto[i]=(Einzahlung, Zinssatz, Erg) einfach mit Hilfe des entsprechenden Konstruktors ein Objetk erzeugen. So ungefähr: kto[i]= konto(Einzahlung, Zinssatz, Erg);

    Dann noch die Berechnung vom Zinsatz. Wenn du innerhalb von int eine Division machst wird der Wert hinter dem Komma einfach weggeworfen. D.h du musst dafür sorgen, dass dein Ausdruck vor der Berechnung nach float konvertiert wird. Dies erreichst du einfach indem du aus dem integer Literal 100 das float Literal 100.0 machst.

    Zu den Headern und der Standardproblematik mit void main() usw. wird sich vermutlich noch jemand äußern. 🙂



  • VIELEN DANK 😉
    ich hab mir schon gedacht, dass mein "Programm" eine katastrophe ist ^^

    einiges wo du verwendet hast, haben wir bisher noch nicht gehabt
    (genau so wie vektoren)

    Aber Daaaaaaaaaanke !!



  • hast du zufällig ein gutes tutorial für anfänger ?



  • ManuEllen, bitte lies dir einmal den Link in meiner Signatur durch und beherzige ihn! Sowas wie "funktioniert immer noch nicht", ohne deinen neuen Code (in lesbarer Form bitte!) und die Fehlermeldung zu zeigen, bringt weder dich noch die Helfer hier vorwärts. Das ist für alle reine Zeitverschwendung!



  • du hast am ende folgenden code

    fr33g schrieb:

    cin.get();
    

    EDIT:
    was bezweckt er?
    dadurch wird ja ein Zeichen eigelesen oder?



  • ManuEllen schrieb:

    VIELEN DANK 😉
    ich hab mir schon gedacht, dass mein "Programm" eine katastrophe ist ^^

    einiges wo du verwendet hast, haben wir bisher noch nicht gehabt
    (genau so wie vektoren)

    Aber Daaaaaaaaaanke !!

    Nichts zu Danken, aber wie gesagt, dass waren einige elementare Fehler. Habe auch nicht alle in deinem Code verbessert, die meisten( die die hmpf nochmals erwähnte ) hab ich allerdings geändert.

    Nur um noch ein paar zu nennen:
    Der Destrutor ist sowieso in deinem Fall unnötig...
    Der Standardkonstruktor sollte auch die Elementinitialisierungsliste verwenden...
    Deine Klasse sollte in einer Header-Datei definiert werden...die Elementfunktionen sollten dann in einer getrennten .cpp Datei definiert werden, außer du möchtest sie inlinen...

    Lg freeG

    EDIT:

    Zu deinem letzten post bezüglich des

    cin.get();
    

    :
    http://www.cplusplus.com/reference/iostream/istream/get/

    Hab ich nur für dich reingemacht 😉 , du hattest ja vorher getch() benutzt. Aus dem gleichen Grund, damit das Programm erst nach einer Eingabe endet, hab ich das cin.get() eingeführt. Denn getch() ist ja eg noch von C und cin.get() ist C++. wird natürlich nicht nur dafür benutzt, sondern um Eingaben einzulesen, siehe Link oben.

    Lg freeG


Anmelden zum Antworten