Hilfe bei ersten simplen Programm mit Methoden und Klassen. Letzte frage zu Initialisierung...



  • spell schrieb:

    wenn jetzt noch eine Abfrage hinzukommen soll, ob ein gültiger integerwert eingegeben wurde, muss ich dann die minuten als char einlesen, dann über diese ACII tabelle abfragen ob der wert zwischen x und y liegt (in dieser tabelle) und mit, ich glaube atoi(), in einen integer umwandeln?

    oder gibts da in c++ nich irgendwas eleganteres ala "if (minuten =! int) break; oder so?

    if(std::cin >> minuten)
      std::cout << "Eingabe richtig\n";
    else
      std::cout << "Eingabe falsch\n";
    

    Wenn nämlich in eine int-Variable eingelesen werden soll und die Eingabe nicht passt geht cin in einen Fehlerzustand. Den kann man abfragen.

    spell schrieb:

    des weiteren wollte ich in der Main() eine while(1) Schleife reinmachen und die break Bedinung in einer Methode abbruch() in der Minuten.cpp einbinden, was aber wohl nicht geht...

    😕 Willst du bei einer falschen Eingabe die Schleife in der main unterbrechen, oder was ist der Zweck der Sache?

    spell schrieb:

    wenn ich in der Main.cpp die minuten abfragen will, geht dies aber auch nicht weil sie private sind ...

    gibts da was?

    Mach minuten public oder füge eine Methode hinzu, die dir den Wert von minuten zurückgibt.



  • spell schrieb:

    oder gibts da in c++ nich irgendwas eleganteres ala "if (minuten =! int) break; oder so?

    Sag mal liest du meine Posts überhaupt? 🙄
    Das ist doch echt unglaublich.

    Sone schrieb:

    if(std::cin >> i) ///Wenn das Einlesen erfolgreich war, dann ergibt dieser Ausdruck zu bool konvertiert 'true', sonst 'false'



  • hab ich überlesen bzw konnte zu dem Zeitpunkt nichts mit anfangen.

    Es will alles et so wie ich will ... 😡 habe ein get_eingabe hinzugefügt was die minuten enthalten soll weil die ja private sind ... (war halt schon so vorgegeben).. aber auch wenn ich die publi mache ändert das nichts am ablauf

    Minuten.h

    class Minuten {
    
    public:
    
    void eingabe();
    unsigned int get_eingabe;
    unsigned int berechneStunden();
    unsigned int berechneMinuten();
    void ausgabe();
    unsigned int minutenTotal();
    
    private:
    unsigned int minuten;
    
    };
    

    Minuten.cpp

    void Minuten::eingabe()
    
    { cin >> minuten;
      unsigned int get_eingabe=minuten;}
    
    unsigned int Minuten::berechneStunden() 
    
    {return (minuten/60);}
    
    unsigned int Minuten::berechneMinuten()
    
    {return (minuten%60);}
    
    void Minuten::ausgabe()
    
    { cout << Minuten::berechneStunden() << ":" << Minuten::berechneMinuten() <<endl; }
    
    unsigned int Minuten::minutenTotal() 
    
    { unsigned int minutenTotal;
      return (minutenTotal = minutenTotal + minuten);}
    

    Main.cpp

    int _tmain(int argc, _TCHAR* argv[])
    {
    
    while(1){
    
    Minuten Instanz;
    
    	cout << "Geben Sie die Zeit in Minuten ein: " << endl;
    
    	if (cin >> Instanz.get_eingabe)	{
    
    	Instanz.eingabe();
    	Instanz.berechneMinuten();
    	Instanz.berechneStunden();
    	Instanz.ausgabe();
    									}
    
        else (cout << "Eingabe beendet. Minuten Total: \n" << Instanz.minutenTotal() << endl);
        break;
    	   }
    
    	system ("PAUSE");
    
    	return 0;
    }
    

    er soll halt einfach die Schleife solange durchlaufen bis irgendein zeichen eingegeben wurde. Dann sollen die gesamteingegebenen minuten ausgegeben werden und das programm soll beendet werden...

    Akuell passiert folgendes:

    erste zahl eingeben -> enter -> nix passiert
    zweite zahl eingeben -> enter -> normale ausgabe in std:min
    dritte zahl nicht möglich. "drücken sie eine beliebige taste bla bla..."



  • spell schrieb:

    Es will alles et so wie ich will ...

    ...

    er soll halt einfach die Schleife solange durchlaufen bis irgendein zeichen eingegeben wurde. Dann sollen die gesamteingegebenen minuten ausgegeben werden und das programm soll beendet werden...

    Akuell passiert folgendes:

    erste zahl eingeben -> enter -> nix passiert
    zweite zahl eingeben -> enter -> normale ausgabe in std:min
    dritte zahl nicht möglich. "drücken sie eine beliebige taste bla bla..."

    Das ist halt das blöde an C++: es macht nicht, was man will, sondern was man programmiert.
    Wenn man in zwei Variablen etwas einliest, muss man eben zwei mal etwas eingeben. Und wenn man break in eine Endlosschleife schreibt, wird sie beendet.



  • sie soll ja nur beendet werden wenn kein gültiger integerwert eingegeben wurde...

    edit: oh das break war falsch....

    if (cin >> Instanz.get_eingabe)	{
    
    	Instanz.eingabe();
    	Instanz.berechneMinuten();
    	Instanz.berechneStunden();
    	Instanz.ausgabe();
    									}
    
        else {cout << "Eingabe beendet. Minuten Total: \n" << Instanz.minutenTotal() << endl; 
    
    	break;}
    

    so .. nun läuft es weiter. aber leider ließt er nur jede zweite zahl ...

    http://www.abload.de/img/clipboard-hp4672ozqee.jpg

    also liegt das daran weil ich im main() dieses cin für die korrekte abfrage habe und dann nochmal das cin in der methode .. hab jetzt einfach in der methode geschrieben minuten=get_eingabe

    dann passt jetzt alle bis auf die total minuten... wahrscheinlich weil ich sie immer =0 setze nach jedem durchlauf .. aber wo initialisier ich sie denn sonst? wenn ich das =0 weglasse, spuckt er immer irgend n rießen zahl aus... MUSS ich das jetzt mit nem konstruktor machen?



  • keiner ne Idee?

    Ich müsste es halt evtl außerhalb der Schleife initialisieren..

    Aber wie genau schreibt man das dann? Minuten::minutentotal_=0; geht leider nicht



  • Hallo,

    im Konstruktor der Minuten-Klasse minutentotal_ auf Null setzen, in Minuten::eingabe() kannst du dann die aktuell eingegebenen Minuten zu minutentotal_ addieren.

    MfG,

    Probe-Nutzer



  • ah ok, ich habe es jetzt mit dem Konstruktor versucht und die berechnung zu minutenTotal bei der Methode eingabe() mit bei geschrieben.

    aber nach wie vor gibt er mir nicht die gesamtminuten aus sondern nur den zuletzt eingegebenen wert.

    ich habe auch einen fehler in der main.cpp. dort wird seit der änderung "Instanz" rot unterstrichen mit der Meldung, dass kein Standardkonstruktor vorhanden sei.

    minuten.h

    class Minuten {
    
    public:
    
    Minuten(unsigned int minTotal=0);		// Konstruktor
    
    void eingabe();
    unsigned int get_eingabe;
    unsigned int berechneStunden();
    unsigned int berechneMinuten();
    void ausgabe();
    unsigned int minTotal;
    
    ~Minuten();
    
    private:
    
    unsigned int minuten;
    

    minuten.cpp

    Minuten::Minuten(unsigned int minTotal=0)
    {}
    
    void Minuten::eingabe()
    
    { minuten=get_eingabe; 
    
      minTotal=minTotal+get_eingabe;}
    
    unsigned int Minuten::berechneStunden() 
    
    {return (minuten/60);}
    
    unsigned int Minuten::berechneMinuten()
    
    {return (minuten%60);}
    
    void Minuten::ausgabe()
    
    { cout << Minuten::berechneStunden() << ":" << setw(2) << right << setfill ('0') << Minuten::berechneMinuten() <<endl; }
    
    Minuten::~Minuten()
    {}
    

    main.cpp

    int _tmain(int argc, _TCHAR* argv[])
    {
    
    Minuten Instanz;
    
    while(1){
    
    	cout << "Geben Sie die Zeit in Minuten ein: " << endl;
    
    	if (cin >> Instanz.get_eingabe)	{
    
    	Instanz.eingabe();
    	Instanz.berechneMinuten();
    	Instanz.berechneStunden();
    	Instanz.ausgabe();
    									}
    
        else {cout << "Eingabe beendet. Minuten Total: " << Instanz.minTotal << endl; 
    
    	break;}
    
    	   }
    
    	system ("PAUSE");
    
    	return 0;
    }
    

    edit: komisch. jetzt ließ sich das Programm mit "unsigned int minTotal=0" (wie oben) gar nicht mehr starten weil die exe nicht gefunden wurde 😕

    habe "unsigned int minTotal=0" gelöscht, compiliert, wieder eingefügt, compliliert und jetzt gehts wieder. Instanz is auch ich mehr rot unterstrichen. Jetzt gibt er mit aber wieder 6546848644 oder so für minutenTotal aus ...



  • Hallo,

    deine Variable 'minTotal' im Konstruktor ist eine andere als die der Klasseninstanz - du mußt diese erst noch initialisieren:

    Minuten::Minuten(unsigned int minTotal) // der Defaultwert kann hier entfallen, da schon im Header gesetzt
      : minTotal(minTotal) // <- Stichwort "Initialisierungsliste"
    {}
    

    Alternativ kannst (und solltest du vllt. auch 😉 die beiden Variablen unterschiedlich benennen:

    Minuten::Minuten(unsigned int total)
      : minTotal(total) // <- Stichwort "Initialisierungsliste"
    {}
    


  • 😕

    wieso auf einmal 2 Variablen?

    ich will doch einfach nur einen Wert nach einer Eingabe um diese Eingabe erhöhen.

    in c is das doch auch nur eine kleine Codezeile... wieso muss das in c++ alles so kompliziert sein?

    ok, wenn ich deins so reinkopiere geht es endlich...

    nur die Zeile ": minTotal(minTotal)" ist mir nicht so ganz klar

    Ich Initialisiere ↑dadrüber↑ die Variable minTotal, damit keine komischen hohen Zahlen rauskommen. Was genau macht die andere Zeile?


Anmelden zum Antworten