Hilfe zum Thema Adressverwaltung
-
in wieweit der code schon läuft, kann ich nicht sagen. ein bisschen was musst du ja auch selbst machen! wenn du ihn dir aber mal durchschaust und fehlende sachen, wie z.b. die includes, einsetzt, wird das schon recht angenehm aussehen.
kann ich dann auch mehrere namen da eingeben, die der compiler dann ausgibt?
ja.
weitere fragen beantworten
kein problem, aber nicht die ganze arbeit übernehmen!
-
Hi Praktikant!
Also wir haben uns entschlossen anders an die Sache ranzugehen.
Natürlich sind wir noch nicht fertig, aber was hältst du davon? Mit welcher Anweisung könnte man das Speichern und das Laden hinbekommen (siehe unter int Menue())?
Hättest du sonst noch ein paar Tipps für uns, was wir verbessern könnten?Hier ist unser Programm:
#include <stdio.h>
#include <math.h>
#include <conio.h>char auswahl;
int Anzahl, i;
char Namen[5][100];int Menue()
{
do
{
printf ("Menu: ein Menue für Adressverwaltung");
printf ("\n 1. Namen eingeben:");
printf ("\n 2. Namen alle ausgeben:");
printf ("\n 3. Namen allle sortiert ausgeben:");
printf ("\n 4. Namen suchen:");
printf ("\n 5. Datensatz speichern");
printf ("\n 6. Datensatz laden.");
printf ("\n\n\n Bitte wählen Sie: ");
auswahl=getch();
}
while ((auswahl >0) && (auswahl <7));
return 0;
}int Eingeben()
{printf ("\n\nBitte geben Sie die Anzahl der Namen ein: \n");
scanf ("%d", &Anzahl);
i=Anzahl+1;
do
{
printf ("\nBitte geben Sie den Vornamen ein: \n");
scanf ("%s", &Namen[1][i]);
printf ("\nGeben Sie den Nachnamen ein: \n");
scanf ("%s", &Namen[2][i]);
printf ("\n Bitte geben Sie die Strasse ein: \n");
scanf ("%s", &Namen[3][i]);
printf ("\n Bitte geben Sie die Postleitzahl ein, allerdings in Worten: \n");
scanf ("%s", &Namen[4][i]);
printf ("\nBitte geben Sie den Ort ein: \n");
scanf ("%s", &Namen[5][i]);
i--;
}
while (i>0);}
int Alleausgeben()
{
i=Anzahl+1;
do
{
printf ("%s",Namen[1][i]);
printf ("%s",Namen[2][i]);
printf ("%s",Namen[3][i]);
printf ("%s",Namen[4][i]);
printf ("%s",Namen[5][i]);
i--;
}
while (i>0);
}int main()
{
Menue();
switch(auswahl)
{
case 1: Eingeben();
break;
case 2: Alleausgeben();
break;
case 3: Allesortieren();
break;
case 4: Suchen();
break;
case 5: Speichern();
break;
case 6: Laden();
break;
}
return 0;
}
-
Drei Sachen:
1. Quellcode grundsätzlich in die C/C++-Tags setzen! Dann wird auch Syntax-Highlighting darauf angewendet.
2. Euer Code ist reines C. Deshalb ist er hier im C++-Forum ja fast etwas unpassend. Aber solange kein Moderator etwas sagt, wird ja wohl keiner was dagegen haben.
3. Genaueres zu dem Code kann ich noch nicht sagen, werd ich mir morgen mal anschauen. Sieht aber auf den ersten Blick nicht ganz schlecht aus. Vielleicht ein Rückgabewert für die Menue-Funktion, usw.
-
Dirk2904 schrieb:
#include <math.h>
wozu ist die nötig?
char auswahl;
int Anzahl, i;
char Namen[5][100];Globale Variablen sind nicht immer guter Stil, sind aber manchmal auch nur schwer zu umgehen.
int Menue() { ... }
Dass die Funktion einen Rückgabewert hat, ist schonmal gut, leider wird er aber nicht benutzt. Dieser Wert könnte den Menüeintrag enthalten. Dadurch sparst du dir schon die globale Variable "auswahl".
while ((auswahl >0) && (auswahl <7));
"auswahl" enthält ein ASCII-Zeichen. Wenn du also abfragen willst, ob es das Zeichen "0" enthält, musst du schreiben
while ((auswahl > '0') && (auswahl < '7'));
ansonsten wird in diesem Fall geprüft, ob es Steuerzeichen enthält.
Um von '0' auf 0 zurückzurechnen, empfehle ich die Codezeile:return auswahl - '0';
'0' wird dann auch als Zahl interpretiert. (->ASCII-Tabelle: '0' = 48)
Die Funktion gibt dann den Menüpunkt zurück, und zwar als echte Zahl (0...7, nicht '0'...'7')printf ("\nGeben Sie den Nachnamen ein: \n");
scanf ("%s", &Namen[2][i]);So wie ich das sehe, ist das leider einfach nur falsch. Ein char-array, wie du es unter "Namen" angelegt hast, ist nicht das gleiche wie ein String!
Du musst ein 3D-Array anlegen:char Namen[ANZAHL_EINTRAEGE_PRO_PERSON][TEXT_LAENGE_PRO_EINTRAG][ANZAHL_MOEGLICHER_PERSONEN];
An dieser Stelle wäre es eben auch mit einer Klasse wesentlich einfacher. Ich bin mir selbst auch nicht immer sicher, wo nun welche Zahl in diesen mehrdimensionalen stehen müssen. Schön wäre zumindestens - wenn du schon das ganze in C machst - eine Struktur:
struct Person { char Nachname[31]; char Vorname[31]; char PLZ[6]; char Wohnort[31]; }
Davon legst du dann ein Array an und kannst dann über p[2].Nachname auf die Inhalte zugreifen.
wie speichern/laden?
Die einzelnen Structs kannst du durch Trennzeichen (z.b. '#' in eine Zeile schreiben. und diese dann wieder in eine Datei.
Laden geht dann das ganze rückwärts.Nochmal die Frage: Muss es in C sein? Wieviele Personen wird das Programm irgendwann verwalten müssen? Soll es irgendwann mal wirklich eingesetzt werden oder ist es nur ein Beispiel zum lernen?
Genug von mir, du bist wieder dran!
-
Hallo Chef!
Ehm, also wir haben seit einem dreiviertel jahr c/c++ gelernt und versucht zu programmieren. Naja, bei unserem lehrer ist das schwer zu kapieren, da er das nicht so perfekt erklärt. Wir haben bis jetzt drei klausuren geschrieben. Als letzte klausur werden wir ein projekt machen. unsere aufgabe lautet ein programm zu schreiben, dass wie oben beschrieben, alles beinhalten soll.
zu include <math.h> --> haben wir von unserem lehrer gelernt (brauch man bei einem Mathematikprogramm).
Zu deinen Fragen:
muss es in c sein? normal schon allerdings sind unsere rechner in der schule formatiert worden und nun haben wir nur noch c ++ auf denen installiert, somit müssen wir das in c++ programmieren.wieviel personen das programm enthalten soll? --> erstmal 10, aufstocken können wir das dann ja später noch
soll es irgendwann mal wirklich eingesetzt werden oder ist es nur ein beispiel zum lernen? --> wie schon gesagt es gilt als klausurersatz. daher muss es schon funktionieren (es gibt eine note dafür). allerdings werden wir es nicht verkaufen !!!
Also es ist wirklich nicht einfach zu verstehen was du geschrieben hast, z.B das mit "Struct" und mit "array". Mal ne frage: hast du icq? es wäre einfach das mal über icq zu regeln. ansonsten kannst du mir auch per email schreiben. solltest du icq gebe ich dir meine nr. wenn du mir per email antworten würdest (könnte vll. schlecht werden, die hier zu veröffentlichen)
Hoffe auf schnelle antwort.
Bis dann Dirk
-
Praktikant schrieb:
printf ("\nGeben Sie den Nachnamen ein: \n");
scanf ("%s", &Namen[2][i]);So wie ich das sehe, ist das leider einfach nur falsch. Ein char-array, wie du es unter "Namen" angelegt hast, ist nicht das gleiche wie ein String!
Du musst ein 3D-Array anlegen:Das ist schon korrekt so. Das '&' kann man sich bei Arrays jedoch sparen.
mfg
v R
-
Hi Praktikant!
Hier ist unser soweit fast fertiges Programm:
#include <stdio.h> #include <math.h> #include <conio.h> int auswahl; int Anzahl,j; char Namen[5][100][100]; FILE *LeseDatei, *SchreibDatei; Menue(); int Eingeben() { printf ("\n\nBitte geben Sie die Anzahl der Namen ein: \n"); scanf ("%d", &Anzahl); j=Anzahl; do { printf ("\nBitte geben Sie den Vornamen ein: \n"); scanf ("%s", &Namen[1][j]); printf ("\nGeben Sie den Nachnamen ein: \n"); scanf ("%s", &Namen[2][j]); printf ("\nBitte geben Sie die Strasse ein: \n"); scanf ("%s", &Namen[3][j]); printf ("\nBitte geben Sie die Hausnummer ein: \n"); scanf ("%s", &Namen[4][j]); printf ("\nBitte geben Sie die Postleitzahl ein: \n"); scanf ("%s", &Namen[5][j]); printf ("\nBitte geben Sie den Ort ein: \n"); scanf ("%s", &Namen[6][j]); printf ("\nBitte geben Sie Ihre Telefonnummer ein: \n"); scanf ("%s", &Namen[7][j]); j--; } while (j>0); Menue(); return 0; } int Alleausgeben() { j=Anzahl; do { printf ("Vorname: %s \n",Namen[1][j]); printf ("Nachname: %s \n",Namen[2][j]); printf ("Strasse: %s \n",Namen[3][j]); printf ("Hausnummer: %s \n",Namen[4][j]); printf ("Postleitzahl: %s \n",Namen[5][j]); printf ("Ort: %s \n",Namen[6][j]); printf ("Telefonnummer: %s \n",Namen[7][j]); printf ("\n"); j--; } while (j>0); Menue(); return 0; } Name() { Namen[1][j]; Namen[2][j]; Namen[3][j]; Namen[4][j]; Namen[5][j]; Namen[6][j]; Namen[7][j]; scanf ("%s",&Name); } int Allesortieren() { return 0; } int Suchen() { printf ("Die Sachen sind sortiert"); return 0; } int Speichern () { if (SchreibDatei = fopen( "adressen.txt", "w+t")); fprintf (SchreibDatei, "%s %s %s %s %s %s %s", Namen[1][j],Namen[2][j],Namen[3][j],Namen[4][j],Namen[5][j],Namen[6][j],Namen[7][j]); fclose (SchreibDatei ); printf ("Gespeichert...\n\n"); getch(); Menue(); return 0; } int Laden () { return 0; } int main() { Menue(); } int Menue() { do { printf ("Menue: ein Menue fuer Adressverwaltung"); printf ("\n 1. Namen eingeben:"); printf ("\n 2. Namen alle ausgeben:"); printf ("\n 3. Namen allle sortiert ausgeben:"); printf ("\n 4. Namen suchen:"); printf ("\n 5. Datensatz Speichern"); printf ("\n 6. Datensatz laden."); printf ("\n\n\n Bitte waehlen Sie: "); scanf ("%d",&auswahl); switch(auswahl) { case 1: Eingeben(); break; case 2: Alleausgeben(); break; case 3: Allesortieren(); break; case 4: Suchen(); break; case 5: Speichern(); break; case 6: Laden(); break; } } while (auswahl >6); return 0; fflush(stdin); }
Nun zu meiner Frage:
Könntest du es mal bitte ausprobieren, ob das bei dir läuft? Dann haben wir noch Probleme mit dem Speichern und dem Laden, könntest du das wohl bitte für uns machen, denn nächste Woche Dienstag müssen wir das lauffähige Programm abgeben.
Was noch merkwürdig ist, ist folgendes:
1. Sobald wir etwas in dem Quellcode ändern und dann versuchen es auszuprobieren, dann kommt da so ne merkwürdige Fehlermeldung, ändern wir dann wieder etwas, dann läuft das Programm. Also müssen wir jedes Mal zwei Sachen ändern bevor wir das erneut testen wollen.
2. Das Speichern funktioniert wohl irgendwie, nur in der Datei, die er erstellt, steht nichts drin (wirst du sehen, wenn du es ausprobierst).Ich würde mich riesig freuen, wenn du uns noch mal helfen würdest und das Programm zu Ende bringst.
Vielen Dank im Voraus
MfG
Dirk
-
Dirk2904 schrieb:
normal schon allerdings sind unsere rechner in der schule formatiert worden und nun haben wir nur noch c ++ auf denen installiert, somit müssen wir das in c++ programmieren.
Der kann auch C Programme kompilieren.
Meld dich ma per ICQ. UIN steht im Profil.
-
Dirk2904 schrieb:
1. Sobald wir etwas in dem Quellcode ändern und dann versuchen es auszuprobieren, dann kommt da so ne merkwürdige Fehlermeldung, ändern wir dann wieder etwas, dann läuft das Programm. Also müssen wir jedes Mal zwei Sachen ändern bevor wir das erneut testen wollen.
was für eine fehlermeldung kommt denn?
-
Sorry dass ich jetzt erst schreibe! Normalerweise bekomm ich immer ne Mail, aber diesmal irgendwie nicht.
Fehler:
Unbehandelte Ausnahme in Test.exe: 0xC0000005: Access ViolationUnd dann will er nach dem Quellcode suchen.
Voll Merkwürdig!Könntest du es noch irgendwie schaffen das hinzubekommen, also ich mein das gesamte Programm?
Wäre voll nett!!!
@ DJ Black Eagle:
Also geaddet hab ich dich, wenn deine Nr. mit 113...... anfängt, musst du mich nur noch in deine Kontaktliste aufnehmen.
-
Dirk2904 schrieb:
Unbehandelte Ausnahme in Test.exe: 0xC0000005: Access Violation
Hört sich fast danach an, dass du irgendwo ein Array hast, das meinetwegen 5 Einträge zulässt, und greifst auf das 6. zu. Geh dein Programm mal mit dem Debugger Schritt für Schritt durch, damit du merkst, wo dieses Array ist.
Dirk2904 schrieb:
Könntest du es noch irgendwie schaffen das hinzubekommen, also ich mein das gesamte Programm?
Ich will dir wirklich nicht schaden und dich einfach hängen lassen, aber ich hab dir doch schon gesagt, dass ich dir nicht das Programm einfach so schreibe. Für spezielle Fragen steht dir das Forum zur Verfügung. Den Rest musst du selbst machen, deshalb hast ja vermutlich auch du diese Aufgabe bekommen!
-
okay, ich schaff das schon,:D
nur eine frage hab ich momentan!
ich hab schon wieder etwas am code geändert, hier der gesamte code:#include <stdio.h> #include <math.h> #include <conio.h> int auswahl; int Anzahl,j,z1; char Namen[7][100][100]; FILE *LeseDatei, *SchreibDatei; int Menue() { do { printf ("Menue: ein Menue fuer Adressverwaltung"); printf ("\n 1. Namen eingeben:"); printf ("\n 2. Namen alle ausgeben:"); printf ("\n 3. Namen allle sortiert ausgeben:"); printf ("\n 4. Namen suchen:"); printf ("\n 5. Datensatz Speichern"); printf ("\n 6. Datensatz laden."); printf ("\n 7. Programm (b)eenden"); printf ("\n\n\n Bitte waehlen Sie: "); scanf ("%d",&auswahl); } while (auswahl >6); switch(auswahl) { case 1: Eingeben(); break; case 2: Alleausgeben(); break; case 3: Allesortieren(); break; case 4: Suchen(); break; case 5: Speichern(); break; case 6: Laden(); break; case 7: Beenden(); break; } return 0; } int Eingeben() { printf ("\n\nBitte geben Sie die Anzahl der Namen ein: \n"); scanf ("%d", &Anzahl); j=Anzahl; do { printf ("\nBitte geben Sie den Vornamen ein: \n"); scanf ("%s", Namen[1][j]); printf ("\nGeben Sie den Nachnamen ein: \n"); scanf ("%s", Namen[2][j]); printf ("\nBitte geben Sie die Strasse ein: \n"); scanf ("%s", Namen[3][j]); printf ("\nBitte geben Sie die Hausnummer ein: \n"); scanf ("%s", Namen[4][j]); printf ("\nBitte geben Sie die Postleitzahl ein: \n"); scanf ("%s", Namen[5][j]); printf ("\nBitte geben Sie den Ort ein: \n"); scanf ("%s", Namen[6][j]); printf ("\nBitte geben Sie Ihre Telefonnummer ein: \n"); scanf ("%s", Namen[7][j]); j--; } while (j>0); Menue(); return 0; } int Alleausgeben() { j=Anzahl; do { printf ("Vorname: %s \n",Namen[1][j]); printf ("Nachname: %s \n",Namen[2][j]); printf ("Strasse: %s \n",Namen[3][j]); printf ("Hausnummer: %s \n",Namen[4][j]); printf ("Postleitzahl: %s \n",Namen[5][j]); printf ("Ort: %s \n",Namen[6][j]); printf ("Telefonnummer: %s \n",Namen[7][j]); printf ("\n"); j--; } while (j>0); Menue(); return 0; } int Allesortieren() { qsort(Namen[7][100][100]); printf ("Die Sachen sind sortiert"); return 0; } int Suchen() { printf ("Die Sachen sind sortiert"); return 0; } int Speichern () { do { (SchreibDatei = fopen( "adressen.txt", "w+t")); fprintf( SchreibDatei, "%s %s %s %s %s %s %s\n", Namen[1][j], Namen[2][j], Namen[3][j], Namen[4][j], Namen[5][j], Namen[6][j], Namen[7][j] ); fclose( SchreibDatei ); j++; } while (j<=Anzahl); printf ("Gespeichert...\n\n\n"); getch(); Menue(); return 0; } int Laden () { do { (LeseDatei = fopen( "adressen.txt", "r+t")); fscanf( LeseDatei, "%s %s %s %s %s %s %s \n", Namen[1][j], Namen[2][j], Namen[3][j], Namen[4][j], Namen[5][j], Namen[6][j], Namen[7][j] ); fclose( LeseDatei ); j++; } while (j<Anzahl); printf ("Geladen..."); getch(); printf ("\n Gehe zurueck zum Hauptmenue \n"); getch(); Menue(); return 0; } int Beenden() { Menue(); return 0; } int main() { Menue(); return 0; }
nun zur frage:
der speichert das wohl in eine datei, allerdings speichert er nur einen eintarg, will man mehr eingeben, dann speichert er nur den zuerst eingegebenen namen.
da müsstest du mir noch mal helfen, sodass er wenigsten 10 namen speichert oder alle!
-
#include <iostream> #include <vector> #include <cstdlib> class Eintrag { private: std::string VorName; std::string NachName; std::string Strasse; int Hausnummer; int PLZ; std::string ORT; long Telefon; public: std::string getVorName() { return VorName; } void setVorName(std::string value) { VorName = value; } std::string getNachName() { return NachName; } void setNachName(std::string value) { NachName = value; } std::string getStrasse() { return Strasse; } void setStrasse(std::string value) { Strasse = value; } int getHausnummer() { return Hausnummer; } void setHausnummer(int value) { Hausnummer = value; } int getPLZ() { return PLZ; } void setPLZ(int value) { PLZ = value; } std::string getORT() { return ORT; } void setORT(std::string value) { ORT = value; } long getTelefon() { return Telefon; } void setTelefon(long value) { Telefon = value; } void Eingeben() { std::cout << std::endl << "\nBitte geben Sie den Vornamen ein: " << std::endl;; std::cin >> VorName; std::cout << "Geben Sie den Nachnamen ein: " << std::endl; std::cin >> NachName; std::cout << "Bitte geben Sie die Strasse ein: " << std::endl; std::cin >> Strasse; std::cout << "Bitte geben Sie die Hausnummer ein: " << std::endl; std::cin >> Hausnummer; std::cout << "Bitte geben Sie die Postleitzahl ein: " << std::endl; std::cin >> PLZ; std::cout << "Bitte geben Sie den Ort ein: " << std::endl; std::cin >> ORT; std::cout << "Bitte geben Sie Ihre Telefonnummer ein: " << std::endl; std::cin >> Telefon; } void Ausgeben() { std::cout << std::endl << "Vorname: " << VorName << std::endl << "Nachname: " << NachName << std::endl << "Strasse: " << Strasse << std::endl << "Hausnummer: " << Hausnummer << std::endl << "PLZ: " << PLZ << std::endl << "Ort: " << ORT << std::endl << "Telefonnummer: " << Telefon << std::endl; } }; class Adressliste { private: std::vector<Eintrag> Adressliste; public: std::vector<Eintrag> getAdressliste() { return Adressliste; } void setAdressliste(std::vector<Eintrag> adr) { Adressliste = adr; } void Eingeben() { Eintrag e; e.Eingeben(); Adressliste.push_back(e); } void AllesAusgeben() { for(int i = 0;i < Adressliste.size();i++) { Adressliste[i].Ausgeben(); } } }; int main() { Adressliste adress; adress.Eingeben(); adress.Eingeben(); adress.AllesAusgeben(); std::system("Pause"); } /* int Allesortieren() { return 0; } int Suchen() { printf ("Die Sachen sind sortiert"); return 0; } */
So würd ichs machen.
-
Dirk2904 schrieb:
nun zur frage:
der speichert das wohl in eine datei, allerdings speichert er nur einen eintrag, will man mehr eingeben, dann speichert er nur den zuerst eingegebenen namen.Probier mal, das fclose(...) erst nach der while-schleife zu setzen.
-
wenn ich das fclose (..) nach der while - schleife setzte dann funktioniert das auch nicht!
hast du noch nen anderen ratschlag?
-
sicher, dass du die arrays richtig ansprichst? wie gesagt, ich hab da mein problem mit den mehrdimensionalen.
-
Mal abgesehen davon, das man dafür normalerweise in C++ ne streamklasse verwendet.
fopen,fscanf, printf ... ist alles C.
Was macht folgendes?SchreibDatei = fopen( "adressen.txt", "w+t")
Jedesmal wird eine neue adressen.txt gespeichert. Die alte adressen.txt wird überschrieben.
also aus "w+t" ein "a+" machen.
-
wird bei "a+" nicht einfach nur angehängt und ein zusätzlicher lesezugriff gestattet? wozu ein lesezugriff? ist es nicht schlauer, ein "w" zu schreiben, damit immer eine neue datei angelegt wird?
-
Ich will dich jetzt nicht verwirren und wenn du das was ich schreibe nicht verstehst dann ist es auch egal, aber an deiner Stelle würde ich für die Aufgabe eine doppelt verkettete Liste nehmen.
Ist imho das leichteste (wenn man es kann) und eleganteste.
-
Praktikant schrieb:
wird bei "a+" nicht einfach nur angehängt und ein zusätzlicher lesezugriff gestattet? wozu ein lesezugriff? ist es nicht schlauer, ein "w" zu schreiben, damit immer eine neue datei angelegt wird?
Mal ne Überlegung:
Daten suchen
Bisher wollt ihr das so machen, das ihr alle Adressen in den Speicher schaufelt, und dann im Speicher das Array durchsucht.
Wozu sich den Speicher vollmüllen ?
Warum nicht einfach nur die Datei durchsuchen.Daten speichern
Bisher löscht ihr die alte Adress Datei und damit alle bisher gespeicherten Adressen und erzeugt eine neue, und schreibt dann alles was im Array steht in die Datei.
Warum die alten Adressen löschen ?
Einfach mit "append" (fopen("Adress.txt","a" bzw "a+")) neue Daten "hinten" anhängen und die alten Daten unangetastet lassen.