Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

}

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?

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

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.

alles klaro das mit der kontonr. war dann wohl nen einfacher schreibfehler ... und das mit dem struct nutzer hab ich doch oben drin

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

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?

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

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

}

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.

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

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.

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

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

Du bist nicht zufällig an der HTW Dresden und machst grad deinen Beleg Wirtschaftsinformatik 1?

Du bist nicht zufällig an der HTW Dresden und machst grad deinen Beleg Wirtschaftsinformatik 1?

ja genau ... du etwa auch?

jap bin ich ;)

und ich versau mit grad mein freien tag mit dem mist!

na wunderbar ich mir schon die ganzen anderen tage ;) .. komm aber nich weiter

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.