Zum Inhalt springen

verkettete Liste bei c programmierung für Kontoführungsprogramm


Empfohlene Beiträge

Geschrieben

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);

}

Geschrieben

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?

Geschrieben

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

Geschrieben

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

Geschrieben
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 nutzer
Ist es ja auch nicht. Du hast den Member kontonnummer genannt.

Man muss da schon ein wenig sorgfältiger rangehen.

Geschrieben

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

Geschrieben
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?
Geschrieben

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 ...

Geschrieben

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);

}

Geschrieben
allerdings noch die selben probleme
Kö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.

Geschrieben

* 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 ;)

Geschrieben
in einer kontonr. können doch aber nullen vorkommen
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.

wie lese ich eine zeichenkette ... hab grad nachgeschaut und nichts gefunden
Mit %s.
Geschrieben

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

Geschrieben

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

Geschrieben
nun meine frage welches besser ist vom programmierstil und welches der aufgabenstellung besser entspricht
Beide 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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...