C++ While Fehler



  • Hey!

    Ich bin Anfänger auf dem Gebiet C++ und fleißig am Lernen. Ich hab gestern mich ein bisschen versucht mit While-Schleifen und ein naja etwas sinnloses Testprogramm dazu geschrieben. Auch Strukturen sind drinnen vertreten. Doch immer wenn ich es debuggen will, bricht er in der hälfte circa ab. Errors oder Warnings gibt es jedoch vor dem compilen nicht.

    #include "stdafx.h"
    #include <iostream>
    #include <Windows.h>
    #include <string>
    using namespace std;
    
    struct konto
    {
    	string name;
    	int kontonummer;
    	double kontostand;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	konto konto;
    	double eingabe = konto.kontostand;
    
    	cout << "Herzlich Willkommen bei dem Kontoverwalter" << endl;
    	cout << endl;
    	cout << endl;
    	cout << endl;
    	cout << endl;
    
    	printf("Ihr Name: ");
    	cin >> konto.name;
    	getchar();
    	cout << endl;
    
    	printf("Wunschkontonummer: ");
    	cin >> konto.kontonummer;
    	getchar();
    	cout << endl;
    
    	cout << "Wieviel wollen sie einlegen? (Maximal 20000): ";
    	cin >> konto.kontostand;
    	getchar();
    
    	while(eingabe > 20000.00)
    	{
    		cout << "So viel Geld haben Sie nicht. Bitte geben Sie eine neue Summe ein: " ;
    		cin >> konto.kontostand;
    		getchar();
    	}
    
    	cout << endl;
    
    	//printf("Konto (%i) wurde erstellt mit %d Euro wurde auf den Namen %s erstellt", konto.kontonummer, konto.kontostand, konto.name);
    	cout << endl;
    	getchar();
    	return 0;
    }
    

    bin mir sicher es ist irgendein anfängerfehler

    MfG



  • 1. Bei der Zuweisung in Zeile 17 hat kontostand überhaupt keinen Wert.
    Schreib einen Default-Konstruktor für die Struktur.

    2. Desweiteren wolltest du vielleicht eine Referenz statt einer Variablen.
    Ersetz Zeile 17 durch

    double &eingabe = konto.kontostand;
    

    Trotzdem brauchst du eingabe garnicht. Ersetz eingabe einfach durch konto.kontostand.

    Außerdem heißt es könnte es main() statt _tmain(), und char* statt _TCHAR* sein.
    Statt endl nimm '\n';
    Und getchar() kannst du weglassen.

    P.S.: Der Benutzer könnte statt höher 20000 auch kleiner 0 angeben.

    Und wieso nimmst du printf ?



  • Hacker schrieb:

    Außerdem heißt es main() statt _tmain(), und char* statt _TCHAR*.

    Nö, _tmain ist schon ok (VC++).



  • Was ist ein Default-Konstruktor?

    jo eingabe ist jetzt raus.

    while(konto.kontostand > 20000.00 && konto.kontostand > 0)
    	{
    		cout << "So viel Geld haben Sie nicht. Bitte geben Sie eine neue Summe ein: " ;
    		cin >> konto.kontostand;
    		getchar();
    	}
    

    wäre das dann die richtige while Schleife?

    warum sollte ich das getchar weglassen? dann würde das programm ja abbrechen, oder?



  • Mach doch gleich lieber sowas:

    #include <iostream>
    #include <string>
    
    struct konto
    {
        std::string name;
        unsigned kontonummer;
        float kontostand;//Man könnte auch ein int nehmen, und in Cent rechnen
    
        konto():
        name("Unbekannt")//Konstruktor für name wird aufgerufen;
        {
            kontonummer = 0;
            kontostand = 0; //Kein Startguthaben ;)
        }
    };
    
    int main()
    {
        using std::cout;//Kannst in diesem Beispiel auch ganz normal using namespace std; verwenden,
        using std::cin;//einige sagen aber, man soll einzelne Bezeichner (Namen für variablen,Funktionen,Klassen) einzeln inmportieren um namenskonflikte zu vermeiden.
    
        konto Konto;
    
        cout << "Herzlich Willkommen bei dem Kontoverwalter !\n\n"
                 "Ihr Name: ";
        std::getline(cin, Konto.name);
    
        cout << "\nWunschkontonummer: ";
        cin >> Konto.kontonummer;
    
        cout << "\nWieviel wollen sie einlegen? (max. 20000, min 1): ";
        cin >> Konto.kontostand;
    
        while(Konto.kontostand > 20000.00 || Konto.kontostand <= 0)
        {
            cout << "Die Summe liegt außerhalb des g\201ltigen Wertebereichs. Bitte geben Sie eine neue Summe ein: " ;
            cin >> Konto.kontostand;
        }
    
        cout << "\nKonto ("<< Konto.kontonummer <<") wurde mit "<< Konto.kontostand <<" Euro auf den Namen "<< Konto.name << " erstellt !\n";
    
        cin.ignore();
        cin.get();//Guck dir solche Sachen umbedingt nochmal an, das ist jetzt nur flüchtig eine Lösung
    }
    

    In diesem Fall ist vielleicht auch empfehlenswert, eine Abfrage bei den Eingaben einzubauen, um
    Fehlern vorzubeugen.

    Edit: Das Problem war garnicht die while-Schleife.
    Sag mal, wie lernst du eigentlich? Buch, Tutorial, etc.?



  • _matze schrieb:

    Hacker schrieb:

    Außerdem heißt es main() statt _tmain(), und char* statt _TCHAR*.

    Nö, _tmain ist schon ok (VC++).

    Wozu compilerabhängig programmieren? _tmain wird ohnehin zu main bzw wmain aufgelöst, je nachdem ob _UNICODE gesetzt ist.
    Als absoluter Anfänger sollte man sich das MS-Zeugs erst garnicht gewöhnen - das kann man später immernoch nutzen.



  • ULLLIIK schrieb:

    warum sollte ich das getchar weglassen? dann würde das programm ja abbrechen, oder?

    Und das ist gut so. Denn man Konsolenprogramme allgemein auch aus Scripts raus starten können.

    Du startest das Programm aus der IDE aus einfach mit Strg+F5 statt nur mit F5, dann wird die Konsole von der IDE aufgehalten.



  • @Hacker: mit diesem Quellcode kann ich leider noch wenig anfangen. außerdem gibt er bei mir einige Errors. also ist dieses kleine Programm nicht so leicht programmierbar wie ich gedacht habe? weil ich bin ja noch am basics lernen.

    @volkard: ah danke

    PS: gehört jetzt nicht hier zum Topic, aber welche C++ Lernbücher sind denn empfehlenswert? gibts einen Thread?

    MfG



  • ULLLIIK schrieb:

    PS: gehört jetzt nicht hier zum Topic, aber welche C++ Lernbücher sind denn empfehlenswert? gibts einen Thread?

    Empfehlung: C++ Primer oder Der C++ Programmierer
    Link: http://www.c-plusplus.net/forum/251551



  • ULLLIIK schrieb:

    @Hacker: mit diesem Quellcode kann ich leider noch wenig anfangen. außerdem gibt er bei mir einige Errors.

    Hmmm... ? Kenn mich gar nicht mit Visual C++ aus, bei mir kompiliert und funktioniert es allerdings problemlos.

    Edit²: Hier is es jetz richtig.



  • @Hacker: Man kann ein bisschen erkennen, dass du was dazugelernt hast, dennoch sind mir da viele Sachen aufgefallen.

    1)Wenn du schon eine Initialisierungsliste verwendest, dann bitte auch für alle Member, wenn möglich. Im Falle der Kontonummer ist das sogar erforderlich.
    2)Wenn schon float, dann vergleiche auch bitte mit float-Literalen.
    3)Der Name einer Person kann sich sehr wohl ändern. Denke nur mal an transsexuelle. Du schließt diese Gruppe von Menschen von der Benutzung des Programms aus. Das findet PI nicht besonders nett.
    4)Wieso initialisierst du den Namen mit "Unbekannt"? Völlig unnötig.

    Stilmäßig:
    5)PI findet const nach dem Datentypen viel schöner, weil PI von rechts nach links liest.
    6)PI findet es komisch, dass Hacker die Klasse "konto" nennt und die Instanz "Konto". PI fände es schöner, wenn Hacker das entweder umgekehrt machte, oder die Instanz z.B. "k", "ko" oder "knt" nannte.
    7)PI mag deine Art zu kommentieren nicht. PI findet sowohl vor, als auch nach den zwei Slahes einen Abstand schöner.
    8)PI hat bemerkt, dass Hacker schon wieder das 'ü' unter Zuhilfenahme einer Escape-Sequenz ausgegeben hat. PI mag Konstanten lieber.
    9)PI findet es unschön, dass du bei der letzten Ausgabe Abstände gespart hast.
    10)PI findet es doof, dass du dem Benutzer nicht erlauben willst, 0 Euro einzulegen oder im Einlegevorgang etwas abzuheben.

    Und natürlich: Hör auf zu plenken !



  • Hab ein paar Fehler schon vor dir erkannt und verbessert.
    Natürlich sind die Konstanten nicht mal Kompilierbar. Der Name wird hier ja nach dem Aufruf des D.Konstruktors initialisiert.
    Hacker findet alle Kommentare zum Stil etwas abgehackt:

    5. Du liest von rechts nach links? Krank. Ich finde das const dahinter eigentlich auch schöner, da man erkennt das der Wert der Variablen Konstant bleibt. const dahinter liest sich, so denkt Hacker, besser.
    2. Versteht Hacker nicht. Macht das überhaupt einen Unterschied (wenn ich 'Literale' richtig versteh) ?
    4.Soll ich ihn "Transsexueller Behinderter" nennen ? Oder (jetz ernst gemeint) "Kein Name vorhanden"?

    Dazu möchte der Hacker noch an die für ihn und PI erstellte Spielwiese erinnern.



  • Wohl eher verschlechtbessert.



  • lieber doch main schrieb:

    _matze schrieb:

    Hacker schrieb:

    Außerdem heißt es main() statt _tmain(), und char* statt _TCHAR*.

    Nö, _tmain ist schon ok (VC++).

    Wozu compilerabhängig programmieren? _tmain wird ohnehin zu main bzw wmain aufgelöst, je nachdem ob _UNICODE gesetzt ist.
    Als absoluter Anfänger sollte man sich das MS-Zeugs erst garnicht gewöhnen - das kann man später immernoch nutzen.

    Gegen so eine Erklärung wie deine habe ich nichts (ich benutze übrigens auch nie _tmain). Aber Hackers Beitrag hörte sich so an, als sei es ein Fehler (es heißt main statt _tmain!), und das ist es nicht.

    Btw, ich glaube, vielen Anfängern und auch vielen Fortgeschrittenen ist Unabhängigkeit vom Compiler, vom OS usw. ziemlich egal. Viele schießen sich auf ein System ein und bleiben für eine ganze Weile dabei. Und dann ist es wirklich nicht tragisch, die eine oder andere compilerspezifische Erweiterung zu nutzen (kann ja durchaus von Vorteil sein).



  • EDIT: Hat sich erledigt.



  • Jonas OSDever schrieb:

    Hacker schrieb:

    ULLLIIK schrieb:

    @Hacker: mit diesem Quellcode kann ich leider noch wenig anfangen. außerdem gibt er bei mir einige Errors.

    Hmmm... ? Kenn mich gar nicht mit Visual C++ aus, bei mir kompiliert und funktioniert es allerdings problemlos.

    Edit²: Hier is es jetz richtig.

    Visual C++ (genauer VS 2010 Prof.) frisst es anstandslos...
    @ULLLIIK: Poste mal die Fehlermeldungen.

    Ne, das waren Fehlermeldungen vor den Edits am QuellCode, der war vorher klar falsch.



  • Achso, Sorry...



  • Hacker schrieb:

    5. Du liest von rechts nach links? Krank.

    Ich find es auch durchaus sinnvoll, von rechts nach links zu lesen. Oder wie fasst du z.B. das in Worte, wenn du von links nach rechts ließt?

    int*** p;
    

    edit: @Hacker ok 🙂



  • _matze schrieb:

    lieber doch main schrieb:

    _matze schrieb:

    Hacker schrieb:

    Außerdem heißt es main() statt _tmain(), und char* statt _TCHAR*.

    Nö, _tmain ist schon ok (VC++).

    Wozu compilerabhängig programmieren? _tmain wird ohnehin zu main bzw wmain aufgelöst, je nachdem ob _UNICODE gesetzt ist.
    Als absoluter Anfänger sollte man sich das MS-Zeugs erst garnicht gewöhnen - das kann man später immernoch nutzen.

    Gegen so eine Erklärung wie deine habe ich nichts (ich benutze übrigens auch nie _tmain). Aber Hackers Beitrag hörte sich so an, als sei es ein Fehler (es heißt main statt _tmain!), und das ist es nicht.

    Nope, ich wusst ja nicht, dass es bei VisualC++ genutzt werden kann.

    Edit: @Gugelmoser, das ist jetzt absolut non-Topic (und dazu noch Geschmacksache). Lassen wirs.



  • Hacker schrieb:

    5. Du liest von rechts nach links? Krank.

    Ich lese Datentypen von rechts nach links 😉

    Hacker schrieb:

    2. Versteht Hacker nicht. Macht das überhaupt einen Unterschied (wenn ich 'Literale' richtig versteh) ?

    Für das Programm macht das wohl keinen Unterschied. Ich finde es aber "korrekter".

    Hacker schrieb:

    4.Soll ich ihn "Transsexueller Behinderter" nennen ? Oder (jetz ernst gemeint) "Kein Name vorhanden"?

    Gibt auch Leute, die sich umtaufen lassen, wenn dir das besser gefällt.


Log in to reply