Problem mit C++ in verbindung mit ADT`s
-
Hallo zusammen
Um mein Problem zu beschreiben, muss ich kurz erleutern was ich eig. vor habe.
Ich arbeite mit Visual Studios C++ 2010 und möchte ein kleines Programm, Quasi ein Adressbuch schreiben. Es soll ein menue kommen das mich fragt "Suchen" "Datei ändern" "Datei löschen" und so weiter.Jetzt zu meiner frage:
Wir sollen als Datenbank der ganzen Namen und Adressen Ein ADT verwenden.in der Aufgabe steht:
Mehrere "Struct" wären hilfreich und die Adressen sollen in einem Array vom Typ
"struct" verwaltet werden.
und genau damit kann ich leider nichts anfangen... wenn mir nur vllt jemand sagen könnte "auf Hochdeutsch"
was diese Aussage bedeutet, wäre mir vllt schon geholfen 
danke schonmal

-
Tabtaste schrieb:
in der Aufgabe steht:
Mehrere "Struct" wären hilfreich und die Adressen sollen in einem Array vom Typ
"struct" verwaltet werden.
und genau damit kann ich leider nichts anfangen... wenn mir nur vllt jemand sagen könnte "auf Hochdeutsch"
was diese Aussage bedeutet, wäre mir vllt schon geholfen 
Das überrascht mich nicht, dass du damit nichts anfangen kannst. Denn derjenige, der diese Aufgabe geschrieben hat, hat wohl genauso viel Ahnung von C++, wie du.
1. struct ist kein Typ, sondern ein Keyword, mit dessen Hilfe du deinen eigenen Datentypen definieren kannst.
2. Du brauchst also nicht mehrere "Struct", sondern mehrere Instanzen deines selbst definierten Datentyps.
-
hi
okay danke schonmal für die antwort, leider bin ich nicht viel schlauer
wenn ich gerne mit c++ eine datenbank nutzen will, muss ich mir dann vorher eine "machen" und dann mit dem geschriebenen programm darauf zugreifen oooder kann ich mit einem befehl in dem programm eine datenbank erstellen die das programm dann nutzt... muss dazu sagen mir fehlt jegliches hintergrund wissen über irgendwelche datenbanken !
-
tabtaste schrieb:
hi
okay danke schonmal für die antwort, leider bin ich nicht viel schlauer
wenn ich gerne mit c++ eine datenbank nutzen will, muss ich mir dann vorher eine "machen" und dann mit dem geschriebenen programm darauf zugreifen oooder kann ich mit einem befehl in dem programm eine datenbank erstellen die das programm dann nutzt... muss dazu sagen mir fehlt jegliches hintergrund wissen über irgendwelche datenbanken !
Es soll ja eine C++ Übung sein. Sprich mit SQL etc. hat das Ganze nichts am Hut. Die Grundstruktur deines Programms sollte dann so aussehen:
#include <iostream> #include <string> #include <vector> using namespace std; struct Anschrift { string strasse; string hausnummer; string postleitzahl; string wohnort; }; struct Adressbuch { string name; Anschrift adresse; }; int main() { vector<Adressbuch> datenkbank; char eingabe; do { cout << "Eintrag erstellen (1)" << '\n'; cout << "Eintrag suchen (2)" << '\n'; cout << "Eintrag loeschen (3)" << '\n'; cout << "Datenbank loeschen (4)" << '\n'; cout << "Programm beenden (0)" << '\n'; cout << "Ihre Eingabe: "; cin >> eingabe; switch( eingabe ) { case '1': { break; } case '2': { break; } case '3': { break; } case '4': { break; } case '0': { break; } } }while( eingabe!='0' ); }Jetzt musst du noch die case-Fälle implementieren und fertig ist deine Übung.

-
Also nochmal: Dein Array (hier std::vector) ist deine Datenbank.
-
okaaaay danke danke
das heißt: das ist jetzt quasi meine oberfläche und ich füge in die case fälle nur noch das ein was das programm mit der datenbank tuen soll? und durch die oberen befehle erstellt sich das programm ne datenbank auf die es nach jedem programmstart wieder zufreift? hab ich das jetzt richtig verstanden?
-
tabtaste schrieb:
das heißt: das ist jetzt quasi meine oberfläche und ich füge in die case fälle nur noch das ein was das programm mit der datenbank tuen soll? und durch die oberen befehle erstellt sich das programm ne datenbank
Ja genau, das ist die Idee dahinter.

tabtaste schrieb:
auf die es nach jedem programmstart wieder zufreift? hab ich das jetzt richtig verstanden?
Nein, das geht noch nicht. Dafür brauchst du noch ofstream (um die Datenbank bei Programmende in einer Datei abzuspeichern) und ifstream (um die Datenbank beim Programmstart wieder auszulesen. Aber das würde ich erstmal ganz hinten anstellen. Du solltest erstmal versuchen es überhaupt so hinzubringen.
-
okay, dann hab ich jetzt verstanden! danke
ich versteh nur nicht gsnz das er mir eine fehlermeldung raus haut das er den vokimpilierten header nicht finden kann ...
-
okay hat sich erledigt mit der fehlermeldung
wenn ich im jetzt unter den case einweisungen sage was er in die datenbank schreiben soll und so weiter und dann mit deinen befehlen im sage das er sie speichern und öffnen soll... dann hab ich doch eigentlich oder ?
-
tabtaste schrieb:
wenn ich im jetzt unter den case einweisungen sage was er in die datenbank schreiben soll und so weiter und dann mit deinen befehlen im sage das er sie speichern und öffnen soll... dann hab ich doch eigentlich oder ?
Ja schon.

-
hey ich hab jetzt mal ein c++ buch gelesen und meine unterteilungen und menue punkte in das programm eingefügt .. ich komm aber nicht weiter, wei auch gar nicht wie ich das angehen soll oder wo ich nachschlagen kann oder was ich googlen kann... finde nichts was mich in meinem fall weiter bring
#include <iostream> #include <string> #include <vector> using namespace std; struct Adresse { string strasse; string hausnummer; string postleitzahl; string wohnort; }; struct Telefon { string Mobilnummer; string Festnetznummer; }; struct Firma { string Strasse; string Hausnummer; string plz; string ort; }; struct Ansprechpartner { string Mobilnummer; string Festnetznummer; string Email; }; struct Praxispartner { Firma Firma; Ansprechpartner Ansprechpartner; }; struct Adressbuch { string Matrikelnummer; string name; string Vorname; Adresse adresse; Telefon telefon; string Email; string Studiengang; Praxispartner praxispartner; }; int main() { vector<Adressbuch> datenbank; char eingabe; do { cout << "Datei eingeben (1)" << '\n'; cout << "Daten auf Bildschirm ausgeben (2)" << '\n'; cout << "Daten von HD lesen (3)" << '\n'; cout << "Datensatz suchen (4)" << '\n'; cout << "Daten auf HD speichern (5)" << '\n'; cout << "Datensatz löschen (6)" << '\n'; cout << "Datensatz ändern (7)" << '\n'; cout << "Programm beenden (0)" << '\n'; cout << "Ihre Eingabe: "; cin >> eingabe; switch( eingabe ) { case '1': { break; } case '2': { break; } case '3': { break; } case '4': { break; } case '5': { break; } case '6': { break; } case '7': { break; } case '0': { break; } } }while( eingabe!='0' ); }
-
1. Das macht nicht viel Spaß, all diese Daten durch einen Benutzer eingeben zu lassen. Darum kürze ich das mal stark ab.
2. Ich geb dir mal eine Kostprobe, der Rest geht dann analog. (Bei solch einer Übung kann man verschiedenste C++-Gebiete durchgehen)
3. Du brauchst keine Daten von der HDD zu lesen, sie sind bei Eintritt in die Schleife bereits in der Datenbank.#include <iostream> #include <algorithm> #include <string> #include <fstream> #include <vector> using namespace std; struct Adresse { string strasse; string hausnummer; string postleitzahl; string wohnort; }; ostream& operator<<(ostream& out, Adresse a) { out << a.strasse << ' '; out << a.hausnummer << ' '; out << a.postleitzahl << ' '; out << a.wohnort << ' '; return out; } istream& operator>>(istream& in, Adresse& a) { in >> a.strasse; in >> a.hausnummer; in >> a.postleitzahl; in >> a.wohnort; return in; } void ausgabe_tabelle(ostream& out, const vector<Adresse>& datenbank) { for(vector<Adresse>::const_iterator it=datenbank.begin(); it!=datenbank.end(); ++it) out << *it << endl; } void lade_datenbank(vector<Adresse>& datenbank) { ifstream file("db.txt"); if( file.is_open() ) { for(Adresse a; file>>a; datenbank.push_back(a)); } } void speichere_datenbank(const vector<Adresse>& datenbank) { ofstream file("db.txt"); if( file.is_open() ) { ausgabe_tabelle(file, datenbank); } } struct suche_datensatz_praedikat { string suche; suche_datensatz_praedikat(const string& suche) : suche(suche) {} bool operator()(const Adresse& a) const { if( a.hausnummer==suche || a.postleitzahl==suche || a.strasse==suche || a.wohnort==suche ) return true; return false; } }; vector<Adresse>::const_iterator suche_datensatz(const vector<Adresse>& datenbank) { cout << endl << "Suchwort: "; string suchwort; cin >> suchwort; return find_if( datenbank.begin(), datenbank.end(), suche_datensatz_praedikat(suchwort) ); } int main() { vector<Adresse> datenbank; lade_datenbank(datenbank); char eingabe; do { cout << "Daten auf Bildschirm ausgeben (1)" << '\n'; cout << "Datensatz eingeben (2)" << '\n'; cout << "Datensatz suchen (4)" << '\n'; cout << "Datensatz löschen (6)" << '\n'; cout << "Programm beenden (0)" << '\n'; cout << "Ihre Eingabe: "; cin >> eingabe; switch( eingabe ) { case '1': { ausgabe_tabelle(cout,datenbank); break; } case '2': { Adresse a; cin >> a; datenbank.push_back(a); break; } case '4': { vector<Adresse>::const_iterator it = suche_datensatz(datenbank); if( it!=datenbank.end() ) { cout << endl << *it; } else { cout << "Kein Treffer!"; } break; } case '6': { vector<Adresse>::const_iterator it = suche_datensatz(datenbank); datenbank.erase(it); break; } case '0': { speichere_datenbank(datenbank); break; } } }while( eingabe!='0' ); }Was du dir unbedingt anschauen solltest:
1. Kontrollstrukturen
2. call by value und call by reference
3. Den Spezialcontainer std::string und auch was der Unterschied zwischen getline und >> bei einer Stringeingabe ist.
4. Den STL Container std::vector.
5. Dateiverarbeitung (ofstream und ifstream). Vor allem wie man korrekt aus einer Datei ließt.
6. Operatorüberladung (http://www.c-plusplus.net/forum/232010)
7. (find_if und iteratoren würd ich erstmal hinten anstellen, 1-6 genügt ja bereits für einen Anfänger.)Viel Spaß die nächsten Stunden/Tage.

-
tabtaste schrieb:
hey ich hab jetzt mal ein c++ buch gelesen
Hoffentlich hats auch was gebracht.

-
hi
das funktioniert schon alles ganz gut
einzig was ich nicht verstehe ist, wie ich einfüge das beim einspeichern der daten vom pogramm sowas eingezigt bekomme wiename:
und das ich dann das eingebe
also das mir gezeigt wir was ich einzugeben habe und das ich bei plz zb nur zahlen zulasse
lg
tabtaste
-
Tabtaste schrieb:
Wir sollen als Datenbank der ganzen Namen und Adressen Ein ADT verwenden.
unter der Abkürzung ADT versteht man lt. Wiki u.a. 'Abstrakter Datentyp'. Wobei mir überhaupt nicht klar ist, wo man bei einer Anfängerübung mit Adressbuch einen abstrakten Datentyp braucht.
Gruß
Werner
-
@werne ne das verstehe ich auch nicht.
tabtaste schrieb:
einzig was ich nicht verstehe ist, wie ich einfüge das beim einspeichern der daten vom pogramm sowas eingezigt bekomme wie
name:
und das ich dann das eingebe
also das mir gezeigt wir was ich einzugeben habe und das ich bei plz zb nur zahlen zulasse
weiß denn jemand wie das geht?
lg
tabtaste
-
tabtaste schrieb:
weiß denn jemand wie das geht?
Ja.
Solltest du eigentlich auch wissen, und wenn nicht dann sollte die Eingabe/Ausgabe von Text und Zahlen über die Konsole in den ersten Kapiteln des Grundlagenbuches deiner Wahl beschrieben werden (Stichworte: std::cin, std::cout).
-
pumuckl schrieb:
Ja.
Solltest du eigentlich auch wissen, und wenn nicht dann sollte die Eingabe/Ausgabe von Text und Zahlen über die Konsole in den ersten Kapiteln des Grundlagenbuches deiner Wahl beschrieben werden (Stichworte: std::cin, std::cout).ja das mit der einfachen ein und ausgabe hab ich doch alles verstanden, weiß nur nicht an welcher stelle ich mir das ins pogramm hau...
case '2': { Adresse a; cin >> a; datenbank.push_back(a); break; }das ist der befehl zum datensatz einlesen, wo soll ich denn da ein "cout" oder mehrere "cout"s einsetzen ?
oder kommt der befehl cout in
struct Adresse { string strasse; string hausnummer; string postleitzahl; string wohnort; };und wie ich dann die postleitzahl auf 5 zahlen begrenze weiß ich sowieso nicht...kann ich denn überhaupt variablen begrenzen? auf 5 ziffern oder auf eine gewisse anzahl von zeichen ?
-
tabtaste schrieb:
ja das mit der einfachen ein und ausgabe hab ich doch alles verstanden, [...] oder kommt der befehl cout in
struct Adresse { string strasse; string hausnummer; string postleitzahl; string wohnort; };Nach der Frage würde ich sagen, dass du das mit der einfache Ein/Ausgabe noch nicht wirklich verstanden hast.
tabtaste schrieb:
das ist der befehl zum datensatz einlesen, wo soll ich denn da ein "cout" oder mehrere "cout"s einsetzen ?
Dass die Befehle einfach einer nach dem anderen abgearbeitet werden ist dir bewusst? Quizfrage: willst du die Ausgabe (z.B. das "name:") vor oder nach der Eingabe durch den Nutzer stattfinden lassen?
tabtaste schrieb:
und wie ich dann die postleitzahl auf 5 zahlen begrenze weiß ich sowieso nicht...
Eine Zahl. 5 Ziffern.
kann ich denn überhaupt variablen begrenzen? auf 5 ziffern oder auf eine gewisse anzahl von zeichen ?
Jein. Zahlen kann man nicht begrenzen. Zeichenketten schon. Was der User eingibt, kannst du natürlich nicht vorher kontrollieren, erst nachdem er es eingegeben hat. Für die Eingabe von Zahlen und Fehlerbehandlung bei der Eingabe sollte es im Buch deiner Wahl aber auch mindestens ein beispiel geben.
-
okay...
natürlich vor der eingabe das ist mir bewusst! aber wenn ich einen datensatz eingebe also im pogramm die 2 drücke und dann zum eingeben komme, muss ich 4 mal was eingeben und 4 mal enter drücken
case '2': { Adresse a; cout << strasse; cout << hausnummer cout << postleitzahl cout << wohnort cin >> a; datenbank.push_back(a); break; }wenn ich das so eingebe, würde er mir doch einfach die 4 sachen unter einander schreiben....
ich will aber das er ausgibt "strass" ich was eingebe , und dann erst kommt hausnummer
Jein. Zahlen kann man nicht begrenzen. Zeichenketten schon. Was der User eingibt, kannst du natürlich nicht vorher kontrollieren, erst nachdem er es eingegeben hat. Für die Eingabe von Zahlen und Fehlerbehandlung bei der Eingabe sollte es im Buch deiner Wahl aber auch mindestens ein beispiel geben.
das ist ja genau das was ich möchte... das er mir wenn ich als plz 6 zahlen eingebe das er zb sagt "das ist keine plz" ....
-
tabtaste schrieb:
ich will aber das er ausgibt "strass"
Dann solltest du das ausgeben, und nicht den inhalt irgendeiner Variablen, die zufälligerweise so heißt.
... ich was eingebe , und dann erst kommt hausnummer
Wenn du zwischen deinen Ausgaben Eingaben haben möchtest, dann musst du wohl zwischen den Ausgaben mit cin was einlesen. Kann doch nicht so schwer sein?
Für die Eingabe von Zahlen und Fehlerbehandlung bei der Eingabe sollte es im Buch deiner Wahl aber auch mindestens ein beispiel geben.
das ist ja genau das was ich möchte... das er mir wenn ich als plz 6 zahlen eingebe das er zb sagt "das ist keine plz" ....
Dann würde ich sagen, such nach dem entsprechenden beispiel im Buch deiner Wahl. Aber frag bitte nicht wie du das abtippen sollst...