Brauche Hilfe



  • Hi ist wusste nicht genau wo dieses thema rein passen könnte

    die aufgabe ist eine Datenbank mit c++ zu erstellen und darunter soll man dem user es ermöglichen zwischen anlegen löschen ändern und anzeigen auszusuchen
    das problem ist allerdings das wir nicht erklärt bekommen haben wie der befehl für anlegen löschen und ändern ist
    ( also falls man das programm schließt und dann nochma neu startet das man dann aussuchen kann was man machen will ^^)
    das hab ich schon alles:

    #include <cstdlib>
    #include <iostream>
    #include <string.h>

    using namespace std;

    int main(int argc, char *argv[])
    //===============================VARIABLENDEKLARATION===========================
    {
    struct tKunde
    {
    int DatNr;
    int PLZ;
    int TelNr;
    string Name;
    string Vorname;
    string Ort;
    string GebDatum;
    string Geschlecht;
    };

    tKunde Kunden [1000];
    int a, b, c, wdg;

    //===============================EINGABE========================================

    cout << "Geben Sie die Daten des Kunden ein" << endl << endl;
    cout << "(Name, Vorname, Tel. Nr., PLZ, Ort, Geb. Datum, Geschlecht):";
    cout << endl << endl;
    for(a=0;a < 3;a++) //Anlegen eines Kunden
    {
    Kunden[a].DatNr = a+1;
    cin >> Kunden[a].Name;
    cin >> Kunden[a].Vorname;
    cin >> Kunden[a].TelNr;
    cin >> Kunden[a].PLZ;
    cin >> Kunden[a].Ort;
    cin >> Kunden[a].GebDatum;
    cin >> Kunden[a].Geschlecht;
    cout << "Geben Sie bitte die Daten fuer den naechsten Kunden ein!" << endl;
    }

    cout << "Welchen Kunden moechten Sie anzeigen lassen?";
    cin >> wdg;
    //for (x = 0; x < 3;x++) {
    //if (Kunden[x].DatNr == EingegebeneNr) {... ausgabe...}}
    for(b = 0; b < 3; b++)
    {
    if(Kunden[b].DatNr == wdg)
    {
    cout << "Die Daten von Kunde " << wdg << ":" << endl;
    cout << Kunden[b].Name << endl << endl;
    cout << Kunden[b].Vorname << endl << endl;
    cout << Kunden[b].TelNr << endl << endl;
    cout << Kunden[b].PLZ << endl << endl;
    cout << Kunden[b].Ort << endl << endl;
    cout << Kunden[b].GebDatum << endl << endl;
    cout << Kunden[b].Geschlecht << endl << endl;
    }
    }

    system("PAUSE");
    return EXIT_SUCCESS;
    }

    ps: bin erst im ersten jahr also anfänger im programmieren 😃

    danke im vorraus



  • Formattiert und Code-Tags:

    #include <cstdlib>
    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    //===============================VARIABLENDEKLARATION===========================
    {
          struct tKunde
          {
                int DatNr;
                int PLZ;
                int TelNr;
                string Name;
                string Vorname;
                string Ort;
                string GebDatum;
                string Geschlecht;
          };
    
          tKunde Kunden [1000];
          int a, b, c, wdg;
    
          //===============================EINGABE========================================
    
          cout << "Geben Sie die Daten des Kunden ein" << endl << endl;
          cout << "(Name, Vorname, Tel. Nr., PLZ, Ort, Geb. Datum, Geschlecht):";
          cout << endl << endl;
          for(a=0;a < 3;a++) //Anlegen eines Kunden
          {
                Kunden[a].DatNr = a+1;
                cin >> Kunden[a].Name;
                cin >> Kunden[a].Vorname;
                cin >> Kunden[a].TelNr;
                cin >> Kunden[a].PLZ;
                cin >> Kunden[a].Ort;
                cin >> Kunden[a].GebDatum;
                cin >> Kunden[a].Geschlecht;
                cout << "Geben Sie bitte die Daten fuer den naechsten Kunden ein!" << endl;
          }
    
          cout << "Welchen Kunden moechten Sie anzeigen lassen?";
          cin >> wdg;
    
          for(b = 0; b < 3; b++)
                if(Kunden[b].DatNr == wdg)
                {
                      cout << "Die Daten von Kunde " << wdg << ":" << endl;
                      cout << Kunden[b].Name << endl << endl;
                      cout << Kunden[b].Vorname << endl << endl;
                      cout << Kunden[b].TelNr << endl << endl;
                      cout << Kunden[b].PLZ << endl << endl;
                      cout << Kunden[b].Ort << endl << endl;
                      cout << Kunden[b].GebDatum << endl << endl;
                      cout << Kunden[b].Geschlecht << endl << endl;
                }
    }
    


  • Ich muss die leider sagen, das Ganze sieht nicht gut aus und ich weiß gar nicht wo ich da anfangen soll zu erklären. Vielleicht fangen wir mal mit einer einfachen Frage an: Musst du den "C++"-Stil nachahmen, den dein Professor in den Vorlesungen an den Tag legt, oder hast du alle Freiheiten?



  • nene bin aufm berufskolleg nicht uni^^
    also ich darf das so machen wie ich will hauptsache es funktioniert.^^

    könnte das vllt weiterhelfen?

    Dateimodus Beschreibung
    ios::in Lesen, verhindert bei Ausgabedateien Löschen
    ios::nocreate Kein Anlegen fehlender Dateien
    ios::out Schreiben; ohne Angabe weiterer Modi werden vorhandene Dateien gelöscht
    ios::app Ausgabe an Datei anhängen
    ios::ate Ausgabe an Datei anhängen, erlaubt nach erster Schreibanweisung Verschieben des Dateipointers

    ios:noreplace Keine vorhandene Datei überschreiben
    ios::trunc Vorhandenen Dateiinhalt löschen

    quelle: https://studentenportal.ch/dokumente/info0/147/



  • Ich hab hier mal einen kleinen Denkanstoß für dich. Da fehlen jetzt natürlich noch die Überprüfungen, ob eine Eingabe auch richtig ist. Außerdem ist der Key für die map nicht sehr glücklich gewählt, da er ja unter Umständen nicht eindeutig ist. Aber wie gesagt, es ist ein guter Denkanstoß, mit dem du weiter arbeiten kannst.

    #include <iostream>
    #include <fstream>
    #include <map>
    #include <string>
    
    void clear_stream()
    {
    	std::cin.clear();
    	std::cin.ignore(64,'\n');
    }
    
    void wait()
    {
    	clear_stream();
    	std::cin.get();
    }
    
    enum Geschlecht
    { 
    	m,
    	w 
    };
    
    struct Kunde
    {
    	std::string Name;
    	std::string TelNr; // Nein, nicht int, oder seit wann rechnet man denn mit Telefonnummern?
    	std::string PLZ;   // Nein, nicht int, oder seit wann rechnet man denn mit PLZ?
    	std::string Ort;
    	std::string GebDatum;
    	Geschlecht g; 
    };
    
    void menu()
    {
    	std::cout << '\n' << "Menu:";
    	std::cout << '\n' << "1) Kunden anlegen";
    	std::cout << '\n' << "2) Kunden loeschen";
    	std::cout << '\n' << "3) Kunden anzeigen";
    	std::cout << '\n' << "4) Kunden suchen";
    	std::cout << '\n' << "5) Beenden";
    }
    
    Kunde kunde_anlegen()
    {
    	Kunde k;
    	std::cout << "Name      : "; std::cin >> k.Name;
    	std::cout << "TelNr     : "; std::cin >> k.TelNr;
    	std::cout << "PLZ       : "; std::cin >> k.PLZ;
    	std::cout << "Ort       : "; std::cin >> k.Ort;
    	std::cout << "GebDatum  : "; std::cin >> k.GebDatum;
    	std::cout << "Geschlecht: ";
    	int i;
    	std::cin >> i;
    	if(i==m) k.g = m;
    	else k.g = w;
    	return k;
    }
    
    std::string welcher_kunde()
    {
    	std::string name;
    	std::cout << '\n' << "Name: ";
    	std::cin >> name;
    	return name;
    }
    
    void kunde_anzeigen(const Kunde& k)
    {
    	std::cout << '\n' << "Name      : " << k.Name;
    	std::cout << '\n' << "TelNr     : " << k.TelNr;
    	std::cout << '\n' << "PLZ       : " << k.PLZ;
    	std::cout << '\n' << "Ort       : " << k.Ort;
    	std::cout << '\n' << "GebDatum  : " << k.GebDatum;
    	std::cout << '\n' << "Geschlecht: ";
    	if( k.g==m ) std::cout << "maennlich" << '\n';
    	else std::cout << "weiblich" << '\n';
    }
    
    int main()
    {
    	using namespace std;
    	typedef map<string,Kunde> liste;
    	liste kunden;
    	char wahl;
    
    	do
    	{
    		menu();
    		cout << '\n' << "Ihre Wahl: ";
    		cin >> wahl;
    		clear_stream();
    		switch(wahl)
    		{
    			case '1':
    			{
    				const Kunde& k = kunde_anlegen();
    				kunden[ k.Name ] = k;
    				break;
    			}
    			case '2':
    			{
    				kunden.erase( welcher_kunde() );
    				break;
    			}
    
    			case '3':
    			{
    				for(liste::const_iterator it=kunden.begin(); it!=kunden.end(); ++it)
    					kunde_anzeigen(it->second);
    				wait();
    				break;
    			}
    			case '4':
    			{
    				liste::const_iterator it = kunden.find(welcher_kunde());
    				const Kunde& k = it->second;
    				kunde_anzeigen(k);
    				wait();
    				break;
    			}
    			default:
    			{
    				cout << '\n' << "Fehlerhafte Eingabe";
    				break;
    			}
    		}
    		for(unsigned i=0; i<20; ++i) cout << '\n'; // Zur Formatierung.
    	}while( wahl!='5' );
    
    	wait();
    	return 0;
    }
    

    Weiter würde es nun z.B. so gehen:
    1. Wenn du das Programm schließst (wahl=5), dann speicherst du die liste in einer Datei ab. Ich glaube der C++ Standard bietet hier nur ofstream::write an.
    2. Wenn du das Programm startest, ließt du zu allererst die liste aus der Datei aus.
    [ Hinweis: i.A. nimmt man für Serialisierung boost::serialization ]

    P.S. Wer das Ganze anders implementieren würde als ich, der möge jetzt bitte sprechen. 🙂



  • dein programm sieht echt toll aus und funzelt auch ( einigermaßen), wenn ich beispielsweise 1 eingebe zum anlegen und dann nach den eingaben wieder 1 fängt der nicht wie beim ersten mit dem namen an sondern mit der tel nr

    und ich versteh viele von den befehlen nicht

    zb das:

    enum Geschlecht
    {
    m,
    w
    };

    was ist enum

    oder du benutzt für vieles std:: was mach das? das hatten wir alles noch nicht 😃

    und das \n versteh ich auch nicht ganz

    aber trotzdem thx ^^



  • DerEineTyp schrieb:

    du benutzt für vieles std:: was mach das? das hatten wir alles noch nicht

    Doch, das hattet ihr schon, wenn auch versteckt. Die Anweisung "using namespace std;" sagt aus, das der Namensraum std ausgeleert wird. Im Namensraum "std" liegen alle Elemente der C++ Standardheader. Namensräume dienen dazu Namenskonflikte auszuschließen.

    Die Schreibweise "std::" vor einem Element/Befehl sagt aus, das explizit der aus dem Namensraum gemeint ist. Viele professionelle Entwickler nutzen aus mehreren Gründen "using namespace" nicht, oder nur vorsichtig (Allgemeine Regel: Niemals in Headern verwenden und nach allen Includes). In einen Header wird damit der Namensraum global entleert, was die Gefahr von Namenskonflikten massiv erhöht.

    Leider steht in vielen Büchern und Heften gerne "using namespace", und nicht selten werden die Probleme über das ganze Buch hinweg verschwiegen.

    DerEineTyp schrieb:

    ich versteh viele von den befehlen nicht... zb das: enum

    enum ist im wesentlichen ein benannter Aufzählungstyp (ganzzahlig), der nur bestimmte, benannte Werte annehmen kann. Es ist häufig leichter benannte werte zu verwenden, als irgendwelche Zahlenwerte die beim Lesen erst einmal einer Erklärung bedürfen.

    enum Geschlecht
    {
        m,
        w
    };
    

    Bedeuted, das du einen ganzahligen Datentyp anlegst (im wesentlichen ein "int") der die Werte 'm' und 'w' erlaubt. Wenn man keine Zahlenangabe verwendet beginnt die zählung bei 0 (In deinem Fall wäre m=0, w=1), was aber zumeist für dein Programm egal sein sollte. enums sind zudem weitgehend typsicher, du kannst ihnen ohne Konvertierung keinen Zahlenwert zuweisen.

    Ich hätte die Kürzel sogar ausgeschrieben:

    enum Geschlecht
    {
        maennlich,
        weiblich
    };
    
    // Verwendung:
    int main()
    {
        Geschlecht geschlecht = weiblich;
        // ...
        if(geschlecht == weiblich)... // <-- verständlicher als etwas wie geschlecht == 1
    }
    

    DerEineTyp schrieb:

    und das \n versteh ich auch nicht ganz

    Der '\' leitet in einem String eine sogenannte Escapesequenz ein, \n ist z.B. der Zeilenvorschub/Zeilenumbruch.



  • enum Geschlecht
    {
        m,
        w
    };
    

    Ist praktisch dasselbe wie

    typedef int const Geschlecht;
    
    Geschlecht m(0), w(m + 1);
    


  • DerEineTyp schrieb:

    wenn ich beispielsweise 1 eingebe zum anlegen und dann nach den eingaben wieder 1 fängt der nicht wie beim ersten mit dem namen an sondern mit der tel nr

    Dann hängt noch ein Zeichen im Puffer. D.h. du müsstest vor der entsprechenden Eingabe noch ein clear_stream machen.

    DerEineTyp schrieb:

    enum Geschlecht
    {
    m,
    w
    };

    was ist enum

    Das ist eine Aufzählung. Wenn es für einen betimmten Typ (hier: Geschlecht) nur eine bestimmte Menge an Werten geben kann (hier: maennlich und weiblich) nimmst du eine Aufzählung. Das macht das Ganze logischer.

    DerEineTyp schrieb:

    oder du benutzt für vieles std:: was mach das?

    Siehe ascs Beitrag.

    DerEineTyp schrieb:

    und das \n versteh ich auch nicht ganz

    endl = \n + flush. Das flushen ist aber total unnötig, weil es sowieso gemacht wird. Darum nimmst du für Zeilenumbrüche \n und nicht endl.



  • thx euch allen


Anmelden zum Antworten