lapi_k Geschrieben 6. Januar 2009 Geschrieben 6. Januar 2009 halli hallo ich habe folgendes problem muss für die uni ein kontoführungsprogramm schreiben .. im 1. schritt muss ich eine verkettete liste erstellen in der der name, passwort und kontonnummer drin sein soll ... diese werden bei der eingabe auf richtigkeit überprüft und sind in einer txt datei gespeichert hab schon folgenden ansatz geschrieben aber irgendwie funktioniert es noch nicht: # include <stdio.h> # include <malloc.h> //*Speicherverwaltung # include <stdlib.h> # include <string.h> # include <math.h> struct nutzer //* Definition eines Listenelements { char name [40]; //* Datenteil char passwort [10]; int kontonnummer [20]; struct nutzer *next; //* Zeiger auf das nächste Listenelement }; void main () { struct nutzer *start=NULL, *aktuell=NULL; //* Zeiger auf Listenstart und Zeiger auf das Element //* mit dem aktuell gearbeitet wird start = (struct nutzer *) malloc (sizeof(nutzer)); //* Anlegen v. neuenm Listenelement //* soviel Speicher wie nutzer braucht aktuell = start; //* Bearbeiten d. Liste am Anfang, aktuell auf start setzen while (gets(aktuell->name) != NULL) //* solange noch Daten in der Eingabe vorhanden sind, name wird eingelesen { scanf ("%c", &aktuell->passwort); //* Passwort wird eingelesen scanf ("%d", &aktuell->kontonummer); //* Kontonummer wird eingelesen getchar(); //* Enter von scanf abfangen aktuell->next = (struct nutzer *) //* neues Listenelement reservieren, Komponente next darauf zeigen lassen malloc(sizeof(nutzer)); aktuell = aktuell->next; //* noch leeres Element wird das aktuelle } aktuell->passwort = 0; //* auch wenn das Ende der Daten erreicht ist, wird ein neues aktuell->kontonummer =0; //* Element angelegt = leere Werte aktuell->name[0]0 '\0'; aktuell->next = NULL; printf ("-----------------Kontoführungsprogramm-----------------\n"); do { printf ("Name:\n", aktuell->name); printf ("Passwort:\n", aktuell->passwort); printf ("Kontonummer:\n", aktuell->kontonummer); fflush(stdin); zeiger_datei_nutzer = fopen(datei_nutzer,"r"); } while (datei_nutzer == 0); } Zitieren
robotto7831a Geschrieben 6. Januar 2009 Geschrieben 6. Januar 2009 Und was ist deine Frage? Frank Zitieren
lapi_k Geschrieben 6. Januar 2009 Autor Geschrieben 6. Januar 2009 meine aufgabenstellung ist diese: admin, bankangestellte, kunde müssen sich einloggen. name passwort und kto.nummer sind zu erfragen. bekannte benutzer sind in der datei nutzer.txt gespeichert und werden in das system geladen, in einer verketteten liste und mit dem login verglichen ... so das hab ich versucht zu realisieren allerdings kenn ich mich nicht mit listen aus ... nun geht das nich was ich funktioniert haben und meine frage is warum? Zitieren
robotto7831a Geschrieben 6. Januar 2009 Geschrieben 6. Januar 2009 Irgendwie ist die Programmreihenfolge etwas verwirrend. Lagere die Schritte doch mal in einzelne Funktionen ala Datei_lesen, Datei_speichern, Datensatz_von_Benutzer_erfragen usw. aus und/ oder mache doch erstmal einen Programmablaufplan. Frank Zitieren
Klotzkopp Geschrieben 6. Januar 2009 Geschrieben 6. Januar 2009 Es wäre schon von Vorteil, eine etwas genauere Fehlerbeschreibung als "geht nicht" abzuliefern. Zitieren
lapi_k Geschrieben 6. Januar 2009 Autor Geschrieben 6. Januar 2009 na es kommen bei mir 11 fehlermeldungen: z.b. nutzer nicht deklarierter bezeichner; kontonummer kein element von nutzer ich weiß auch nich ob ich das alles an anfang machen soll mit der verketteten liste und dann die abfrage Zitieren
Klotzkopp Geschrieben 6. Januar 2009 Geschrieben 6. Januar 2009 na es kommen bei mir 11 fehlermeldungen: z.b. nutzer nicht deklarierter bezeichner;Ist er ja auch nicht. Du musst schon struct nutzer schreiben, oder einen typedef verwenden. kontonummer kein element von nutzerIst es ja auch nicht. Du hast den Member kontonnummer genannt. Man muss da schon ein wenig sorgfältiger rangehen. Zitieren
lapi_k Geschrieben 6. Januar 2009 Autor Geschrieben 6. Januar 2009 alles klaro das mit der kontonr. war dann wohl nen einfacher schreibfehler ... und das mit dem struct nutzer hab ich doch oben drin Zitieren
Klotzkopp Geschrieben 6. Januar 2009 Geschrieben 6. Januar 2009 start = (struct nutzer *) malloc (sizeof(nutzer)); Es ist übrigens auch keine gute Idee, den Rückgabewert von malloc zu casten. Es ist unnötig und kann Fehler verdecken. Zitieren
lapi_k Geschrieben 6. Januar 2009 Autor Geschrieben 6. Januar 2009 struct nutzer //* Definition eines Listenelements { char name [40]; //* Datenteil char passwort [10]; int kontonnummer [20]; struct nutzer *next; //* Zeiger auf das nächste Listenelement }; damit müsste ich nutzer doch deklariert haben oder nicht? dann hab ich noch ne frage und zwar zeigt er noch error ('=': linker operand muss ein l-wert sein) an bei den zeilen aktuell->passwort=0; aktuell->kontonummer=0; sorry schon mal wegen meinen blöden fragen hab echt nich viel ahnung von c Zitieren
Klotzkopp Geschrieben 6. Januar 2009 Geschrieben 6. Januar 2009 damit müsste ich nutzer doch deklariert haben oder nicht?Doch. Du musst aber immer struct nutzer schreiben. Oder eben einen typedef benutzen. dann hab ich noch ne frage und zwar zeigt er noch error ('=': linker operand muss ein l-wert sein) an bei den zeilen aktuell->passwort=0; aktuell->kontonummer=0;passwort und kontonummer sind Arrays. Arrays kann man nichts zuweisen. Warum ist die Kontonummer überhaupt ein int-Array? Zitieren
lapi_k Geschrieben 6. Januar 2009 Autor Geschrieben 6. Januar 2009 also muss ich im gesamten quelltext struct nutzer benutzen zu den arrays ... der int typ hab ich gewählt weil das nur zahlen sind .. also wie gesagt hab echt kein plan von listen ... Zitieren
lapi_k Geschrieben 6. Januar 2009 Autor Geschrieben 6. Januar 2009 so sieht das ganze jetzt aus ... hab das jetzt doppelt verkettet .. allerdings noch die selben probleme # include <stdio.h> # include <malloc.h> # include <stdlib.h> # include <string.h> # include <math.h> struct nutzer { char name [40]; char passwort [10]; int kontonummer [20]; struct nutzer* next, *prev; }; void main () { struct nutzer *aktuell=NULL; aktuell = (struct nutzer *) malloc (sizeof(nutzer)); aktuell-> prev=NULL; while (gets(aktuell->name) != NULL) { scanf ("%c", &aktuell->passwort); scanf ("%d", &aktuell->kontonummer); getchar(); aktuell->next = (struct nutzer *) malloc(sizeof(nutzer)); aktuell->next->prev = aktuell; aktuell = aktuell->next; } aktuell->passwort = 0; aktuell->kontonummer =0; aktuell->name[0]0 '\0'; aktuell->next = NULL; printf ("-----------------Kontoführungsprogramm-----------------\n"); do { printf ("Name:\n", aktuell->name); printf ("Passwort:\n", aktuell->passwort); printf ("Kontonummer:\n", aktuell->kontonummer); fflush(stdin); zeiger_datei_nutzer = fopen(datei_nutzer,"r"); } while (datei_nutzer == 0); } Zitieren
Klotzkopp Geschrieben 6. Januar 2009 Geschrieben 6. Januar 2009 allerdings noch die selben problemeKönnte daran liegen, dass du die Ratschläge nicht umsetzt. Es steht immer noch an zwei Stellen nutzer ohne struct. Für eine Kontonummer brauchst du kein int-Array. Wenn der Wertebereich eines int ausreicht und führende Nullen nicht auftauchen können, nimm einen einzelnen int, sonst ein char-Array. Den start-Zeiger rauszuwerfen, war keine gute Idee, weil du jetzt nicht mehr weißt, wo deine Liste anfängt. Eine doppelte Verkettung brauchst du nur, wenn du rückwärts durch die Liste laufen musst. Mit dem Formatspezifizierer %c liest scanf nur ein einzelnes Zeichen ein, keine Zeichenkette. Warum versuchst du überhaupt, nach dem Einlesen alle Member von aktuell auf Null zu setzen? datei_nutzer und zeiger_datei_nutzer sind nicht deklariert. Zitieren
lapi_k Geschrieben 6. Januar 2009 Autor Geschrieben 6. Januar 2009 * Es steht immer noch an zwei Stellen nutzer ohne struct. -erledigt * Für eine Kontonummer brauchst du kein int-Array. Wenn der Wertebereich eines int ausreicht und führende Nullen nicht auftauchen können, nimm einen einzelnen int, sonst ein char-Array. - in einer kontonr. können doch aber nullen vorkommen * Den start-Zeiger rauszuwerfen, war keine gute Idee, weil du jetzt nicht mehr weißt, wo deine Liste anfängt.erledigt * Eine doppelte Verkettung brauchst du nur, wenn du rückwärts durch die Liste laufen musst.darauf gibt es zusatzpunkte, außerdem hilft es beim suchen * Mit dem Formatspezifizierer %c liest scanf nur ein einzelnes Zeichen ein, keine Zeichenkette.wie lese ich eine zeichenkette ... hab grad nachgeschaut und nichts gefunden * Warum versuchst du überhaupt, nach dem Einlesen alle Member von aktuell auf Null zu setzen?weiß ich nich * datei_nutzer und zeiger_datei_nutzer sind nicht deklariert.wird noch erledigt Zitieren
Klotzkopp Geschrieben 7. Januar 2009 Geschrieben 7. Januar 2009 in einer kontonr. können doch aber nullen vorkommenSolange sie nicht vorne stehen können, macht das nichts. Die Frage ist also, ob eine Kontonummer wie 012345678 erlaubt ist. Und bedenke, dass du in einem 32-Bit-int nur 9 Ziffern sicher unterbringen kannst. wie lese ich eine zeichenkette ... hab grad nachgeschaut und nichts gefundenMit %s. Zitieren
lapi_k Geschrieben 7. Januar 2009 Autor Geschrieben 7. Januar 2009 Solange sie nicht vorne stehen können, macht das nichts. Die Frage ist also, ob eine Kontonummer wie 012345678 erlaubt ist. Und bedenke, dass du in einem 32-Bit-int nur 9 Ziffern sicher unterbringen kannst. naja ich kann das ja mit reinbringen... also nehme ich das ganze in char... wie decke ich 10 ziffern ab diese muss ich nämlich auch noch beschränken (als die kto.nr. auf 10 stellen Zitieren
TDM Geschrieben 8. Januar 2009 Geschrieben 8. Januar 2009 wie decke ich 10 ziffern ab diese muss ich nämlich auch noch beschränken (als die kto.nr. auf 10 stellen C Referenz -strlen Funktion- btw: isdigit() - Standard C String & Character - C Programming Reference - eLook.org Zitieren
lapi_k Geschrieben 8. Januar 2009 Autor Geschrieben 8. Januar 2009 C Referenz -strlen Funktion- btw: isdigit() - Standard C String & Character - C Programming Reference - eLook.org das werd ich noch ändern Zitieren
lapi_k Geschrieben 8. Januar 2009 Autor Geschrieben 8. Januar 2009 So nun mal meine frage hab inzwischen 2 programme ... hatte erst das erste was wir die ganze zeit besprochen haben und jetzt noch ein zweites das hab ich mir aus einem buch ausgearbeitet... nun meine frage welches besser ist vom programmierstil und welches der aufgabenstellung besser entspricht aufgabenstellung: - benutzer muss sich einloggen (Name, Passwort, Kontonr.) - bekannte benutzer in einer txt datei gespeichert, werden in das system geladen und in einer doppelt verketteten liste mit dem login verglichen - wenn kunde existiert soll passwort übereinstimmen - 3 Versuche zur Eingabe von Passwort ansonsten beendet sich das system - wenn kunde nicht existiert kann er sich anlegen, dazu wird neue seite aufgerufen, wo er adresse,tel.nr, fax, email eingeben kann das is mal der erste teil der aufgabenstellung nun meine 1. Variante des programms: # include <stdio.h> # include <malloc.h> //*Speicherverwaltung # include <stdlib.h> # include <string.h> # include <math.h> struct nutzer //* Definition eines Listenelements { char name [40]; //* Datenteil char passwort [10]; char kontonummer [10]; struct nutzer *next, *prev; //* Zeiger auf das benachbartes Listenelement }; void main () { int datei_nutzer; FILE *zeiger_datei_nutzer=NULL; struct nutzer *start=NULL, *aktuell=NULL; //* Zeiger auf das Element mit dem aktuell gearbeitet wird aktuell = (struct nutzer *) malloc (sizeof(struct nutzer)); //* Anlegen v. neuenm Listenelement //* soviel Speicher wie nutzer braucht aktuell-> prev=NULL; //* erstes Element hat kein Vorgänger - Zeiger ins Leere while (gets(aktuell->name) != NULL) //* solange noch Daten in der Eingabe vorhanden sind, name wird eingelesen { scanf ("%s", &aktuell->passwort); //* Passwort wird eingelesen scanf ("%d", &aktuell->kontonummer); //* Kontonummer wird eingelesen getchar(); //* Enter von scanf abfangen aktuell->next = (struct nutzer *) //* neues Listenelement reservieren, Komponente next darauf zeigen lassen malloc(sizeof(struct nutzer)); aktuell->next->prev = aktuell; //* um den "Rückweg" zu sichern wird Vorgängerzeiger des nächsten Elements auf das aktuelle aktuell = aktuell->next; //* das nächste, noch leere Element wird das aktuelle, ab hier wird also das neue Element durch aktuell referenziert } aktuell->passwort = 0; //* auch wenn das Ende der Daten erreicht ist, wird ein neues aktuell->kontonummer =0; //* Element angelegt = leere Werte aktuell->name[0]0 '\0'; aktuell->next = NULL; printf ("-----------------Kontoführungsprogramm-----------------\n"); do { printf ("Name:\n", aktuell->name); printf ("Passwort:\n", aktuell->passwort); printf ("Kontonummer:\n", aktuell->kontonummer); fflush(stdin); zeiger_datei_nutzer = fopen(datei_nutzer,"r"); } while (datei_nutzer == 0); } 2.Variante (welche ich fast übersichtlicher finde) # include <stdio.h> # include <malloc.h> //*Speicherverwaltung # include <stdlib.h> # include <string.h> # include <math.h> struct nutzer //* Definition eines Listenelements { char name [40]; //* Datenteil char passwort [10]; char kontonummer [10]; int start; struct nutzer *next, *last; //* Zeiger auf das benachbartes Listenelement }; main () { register struct nutzer *nz; int c; nz =(struct nutzer *)malloc(sizeof(struct nutzer)); nz->name=40; nz->passwort=10; nz->kontonummer=10; nz->last = nz->next = NULL; for(; { printf("Sind Sie bereits Kunde? (J/N):\n"); if((c=getchar()) == EOF) exit(0); if (c=='J'){ printf("Geben Sie ihren Namen ein:\n",start->name); printf("Geben Sie ihr Passwort ein:\n",start->passwort); printf("Geben Sie ihre Kontonummer ein:\n",start->kontonummer); if(c==0) printf ("Fehler!!! Entweder war Ihre Eingabe falsch oder Sie sind noch nicht als Kunde registriert\n"); } else if (c=='N'){ printf("------------Neuanmeldung-------------\n"); printf("Geben Sie Ihre Adresse ein:\n"); printf("Geben Sie Ihre Telefonnummer ein:\n"); printf("Geben Sie Ihre Faxnummer ein:\n"); printf("Geben Sie Ihre E-mail Adresse ein:\n"); if(c==0) printf ("Fehler bei der Eingabe! Bitte versuchen Sie es erneut!\n"); } } } ich danke schon mal im voraus den leuten die mir bis jetzt geholfen haben, hab nicht so viel ahnung von c ... grade von listen ... also sagt mir mal welches effektiver ist und was ich noch bearbeiten muss.. vielen lieben dank:uli Zitieren
Daffi Geschrieben 8. Januar 2009 Geschrieben 8. Januar 2009 Du bist nicht zufällig an der HTW Dresden und machst grad deinen Beleg Wirtschaftsinformatik 1? Zitieren
lapi_k Geschrieben 8. Januar 2009 Autor Geschrieben 8. Januar 2009 Du bist nicht zufällig an der HTW Dresden und machst grad deinen Beleg Wirtschaftsinformatik 1? ja genau ... du etwa auch? Zitieren
Daffi Geschrieben 8. Januar 2009 Geschrieben 8. Januar 2009 jap bin ich und ich versau mit grad mein freien tag mit dem mist! Zitieren
lapi_k Geschrieben 8. Januar 2009 Autor Geschrieben 8. Januar 2009 na wunderbar ich mir schon die ganzen anderen tage .. komm aber nich weiter Zitieren
Klotzkopp Geschrieben 8. Januar 2009 Geschrieben 8. Januar 2009 nun meine frage welches besser ist vom programmierstil und welches der aufgabenstellung besser entsprichtBeide sind ziemlich weit von der Aufgabenstellung entfernt, das zweite allerdings weiter. Außerdem sind im zweiten erheblich mehr Fehler bei weniger Funktionalität. Über den Stil können wir reden, wenn das läuft. Und bitte bleibt beim Thema, die private Unterhaltung könnt ihr bitte per PN weiterführen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.