lapi_k Geschrieben 8. Januar 2009 Autor Geschrieben 8. Januar 2009 Beide sind ziemlich weit von der Aufgabenstellung entfernt, das zweite allerdings weiter. na toll du machst mir ja mut ... ich bin grad dabei das programm zu überarbeiten Zitieren
lapi_k Geschrieben 8. Januar 2009 Autor Geschrieben 8. Januar 2009 # include <stdio.h> # include <malloc.h> //*Speicherverwaltung # include <stdlib.h> # include <string.h> # include <math.h> struct nutzer //* Definition eines Listenelements { char vorname [40]; char name [40]; //* Datenteil char passwort [20]; char kontonummer [10]; struct nutzer *next, *prev; //* Zeiger auf das benachbartes Listenelement }; struct neuer_nutzer { char telefonnummer[15]; char email[30]; int plz[6]; char stadt[30]; }; void main () { int datei_nutzer; FILE *zeiger_datei_nutzer; 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; //* auch wenn das Ende der Daten erreicht ist, wird ein neues aktuell->kontonummer; //* Element angelegt = leere Werte aktuell->name; 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); } das is das jetzige programm ... es treten keine fehler auf ... allerdings macht es auch nichts .. aber hab ja auch noch nich viel zum machen ... könnt ihr mir weiterhelfen ob der erste teil so geht oder ich was ändern muss Zitieren
Klotzkopp Geschrieben 8. Januar 2009 Geschrieben 8. Januar 2009 Laut Aufgabenstellung sollst du die Benutzerdaten aus einer Datei laden, nicht von der Konsole einlesen. Zitieren
lapi_k Geschrieben 8. Januar 2009 Autor Geschrieben 8. Januar 2009 das heißt jetzt welchen teil muss ich jetzt rauslassen ... wie gesagt ich kenn mich mit den listen nicht aus ... hab das nur so aus büchern und dem internet erarbeitet Zitieren
unbenannt Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 Kurz zurück zur Aufgabenstellung: - Login mittels Name, Passwort und Kontonummer - Laden der gespeicherten Daten aus einer Datei in eine verkettete Liste und anschließender Ableich, ob Login vorhanden Wenn ich nun aber Dein Programm korrekt verstehe, macht es folgendes: Solange Eingabe des Benutzernamens != NULL, lese Passwort und Kontonummer ein und speichere diese in eine verkettete Liste (Frage an dieser Stelle zu "scanf ("%s", &aktuell->passwort);" : Adressoperator bei scanf und String überhaupt korrekt?) Schreibe "Name:", "Passwort:" und "Kontonummer:" auf die Konsole. Du übergibst übrigens Argumente an printf, ohne diese überhaupt zu nutzen. Ungeachtet dessen, dass ich nicht weiss, was in der letzten Schleife while (datei_nutzer == 0); bewirken soll, möchtest Du mit Deinem Programm derzeit zumindest im Ansatz das Gegenteil der Aufgabenstellung machen. Du kannst mehrere Logins über die Tastatur einlesen, aber gefragt ist nur nach einem Login. Mehrere Nutzer sollen nur aus der Datei gelesen werden. Diese werden auch nur in der verketteten Liste gespeichert, nicht die beim Login eingegebenen Daten. Die Daten kannst Du höchstens seperat speichern. Zum Abschluss noch eine kleine persönliche Bitte: versuche bitte das CODE-Tag zu nutzen. Dann klappt es auch mit Zeilen einrücken und der Code wird dreimal besser zu lesen sein Zitieren
Klotzkopp Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 wie gesagt ich kenn mich mit den listen nicht aus ... hab das nur so aus büchern und dem internet erarbeitet So etwas wird doch üblicherweise in Vorlesungen und/oder Übungen behandelt. Kann es sein, dass du einfach einen signifikanten Teil des Unterrichts verpasst hast? Zitieren
TDM Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 Alles in die Main packen, macht die Sache nicht gerade übersichtlich... Nur mal so als Beispiel: UserList.h typedef struct SUser { SUser() { prev = NULL; next = NULL; } char name [40]; //* Datenteil SUser *prev; SUser *next; } Nutzer; void addUserAtEnd(SUser *list, SUser *item) { SUser *tail = list; while (tail -> next != NULL) tail = tail -> next; tail -> next = item; item -> prev = tail; } UserList.cpp #include <stdio.h> #include <string.h> #include "UserList.h" int main(int argc, char* argv[]) { Nutzer user1; strcpy(user1.name, "Benutzer1"); Nutzer user2; strcpy(user2.name, "Benutzer2"); addUserAtEnd(&user1, &user2); Nutzer *buffer = &user1; for (int i = 1; buffer != NULL; i++) { printf("%d:\t%s\n", i, buffer->name); buffer = buffer -> next; } getchar(); return 0; } Die Instanziierung kann man natürlich auch einfach mit malloc ersetzen (ich mags ehrlich gesagt nicht) und das funktioniert soweit, dass ich in der Liste beliebig viele Benutzer hinzufügen kann. Aus der Datei laden und Benutzer abspeichern wirst du ja sicher selbst hinkriegen... Zitieren
unbenannt Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 UserList.cpp Um potentiellen Mis(s/t)verständnissen (speziell meinerseits) vorzubeugen: Bist Du versehentlich mit Deinen Gedanken in C++ reingerutscht? Auf mich wirkt schon die erste Zeile der Definition des Structs SUser reichlich befremdlich. Mag aber nicht viel bedeuten, da ich noch nicht so lange mit C arbeite. Zitieren
TDM Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 Um potentiellen Mis(s/t)verständnissen (speziell meinerseits) vorzubeugen: Bist Du versehentlich mit Deinen Gedanken in C++ reingerutscht? Nein, da ich hier nur Visual Studio hab (und das komischerweise immer Cpp Dateien erzeugt) ist das halt eine cpp, dürfte aber nicht weiter stören, da der Code reines C ist. (Falls der Konstruktor des structs nicht im Standard ist, kann man das auch in eine Funktion [in der man wiederrum malloc benutzt] auslagern...) Zitieren
Klotzkopp Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 Nein, da ich hier nur Visual Studio hab (und das komischerweise immer Cpp Dateien erzeugt) ist das halt eine cpp,Du kannst auch .c-Dateien erstellen, die werden dann auch als C behandelt. dürfte aber nicht weiter stören, da der Code reines C ist.Naja, Methoden im Allgemeinen und Konstruktoren im Besonderen gibt's in C nicht. Zitieren
TDM Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 Du kannst auch .c-Dateien erstellen, die werden dann auch als C behandelt. Da ich nur C++-Projekte anlegen kann, kann ich die Dateien zwar umbenennen, aber diese werden trotzdem als C++ kompiliert. Ist ja auch egal. Naja, Methoden im Allgemeinen und Konstruktoren im Besonderen gibt's in C nicht. Konstruktoren bei Strukturen gibt es nicht?! Ich dächte ich hätte letztens sowas in einem Linux-Kernel irgendwo gesehen... Naja egal, dann halt anders... Header: #include <stdlib.h> typedef struct SUser { char name [40]; //* Datenteil SUser *prev; SUser *next; } Nutzer; SUser* createNewUser(const char *name) { SUser* ret = (SUser*) malloc(sizeof(SUser)); strcpy(ret -> name, name); ret -> prev = NULL; ret -> next = NULL; return ret; } SUser* getTail(SUser *list) { SUser *tail = list; while (tail -> next != NULL) tail = tail -> next; return tail; } SUser* getHead(SUser *list) { SUser *head = list; while (head -> prev != NULL) head = head -> prev; return head; } void deleteList(SUser *list) { SUser *buffer = getHead(list); while (buffer != NULL) { buffer = buffer -> next; if (buffer == NULL) return; free(buffer -> prev); buffer -> prev = NULL; } } void addUserAtEnd(SUser *list, SUser *item) { SUser *tail = getTail(list); tail -> next = item; item -> prev = tail; } Main: int main(int argc, char* argv[]) { Nutzer *user1 = createNewUser("Benutzer1"); Nutzer *user2 = createNewUser("Benutzer2"); Nutzer *user3 = createNewUser("Benutzer3"); addUserAtEnd(user1, user2); addUserAtEnd(user1, user3); Nutzer *buffer = user1; for (int i = 1; buffer != NULL; i++) { printf("%d:\t%s\n", i, buffer->name); buffer = buffer -> next; } deleteList(user1); getchar(); return 0; } Zitieren
TDM Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 hmm, ok bei nur einem Element in der Liste gabs einen Fehler... void deleteList(SUser *list) { SUser *head = getHead(list); SUser *buffer = head; while (buffer != NULL) { buffer = buffer -> next; if (buffer == NULL) break; free(buffer -> prev); buffer -> prev = NULL; } free(head); head = NULL; list = NULL; } Zitieren
robotto7831a Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 Nämlich welchen? Bist Du schon mal im Debugmodus jede Zeile durchgegangen? Frank Zitieren
Guybrush Threepwood Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 Da ich nur C++-Projekte anlegen kann, kann ich die Dateien zwar umbenennen, aber diese werden trotzdem als C++ kompiliert. Nein, wie Klotzkopp gesagt hat werden .c Datein als C übersetzt und .cpp als C++ Zitieren
TDM Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 Nämlich welchen? Dass bei einem Element, das Element nicht be-free-t wird. Wurde jetzt aber nochmal geändert, da es jetzt mit dem C-Compiler klappt. Bist Du schon mal im Debugmodus jede Zeile durchgegangen? Nein, da das ja nur eine Hilfestellung für den Threaderöffner sein soll, werde ich da nicht jede Kleinigkeit ausbessern/anschauen. Nein, wie Klotzkopp gesagt hat werden .c Datein als C übersetzt und .cpp als C++ Wieder was gelernt - als c übersetzt, geht: Header #include <stdlib.h> typedef struct SUser { char name [40]; //* Datenteil void *prev; void *next; } SUser, *PUser; PUser createNewUser(const char *name) { PUser ret = malloc(sizeof(SUser)); strcpy(ret -> name, name); ret -> prev = NULL; ret -> next = NULL; return ret; } PUser getTail(PUser list) { PUser tail = list; while (tail -> next != NULL) tail = tail -> next; return tail; } PUser getHead(PUser list) { PUser head = list; while (head -> prev != NULL) head = head -> prev; return head; } void deleteList(PUser list) { PUser head = getHead(list); PUser buffer = head; int checkOnly = (buffer->next == NULL); while (buffer != NULL) { buffer = buffer -> next; if (buffer == NULL) break; free(buffer -> prev); buffer -> prev = NULL; } if (checkOnly) free(head); head = NULL; list = NULL; } void addUserAtEnd(PUser list, PUser item) { PUser tail = getTail(list); tail -> next = item; item -> prev = tail; } Main (diesmal .c) int main(int argc, char* argv[]) { PUser user1 = createNewUser("Benutzer1"); PUser user2 = createNewUser("Benutzer2"); PUser user3 = createNewUser("Benutzer3"); PUser buffer = user1; int i = 1; addUserAtEnd(user1, user2); addUserAtEnd(user1, user3); while (buffer != NULL) { printf("%d:\t%s\n", i, buffer->name); buffer = buffer -> next; i++; } deleteList(user1); getchar(); return 0; } Jetzt weiß ich wieder, warum ich C nicht mag, da muss man alle Variablen in einer Funktion als erstes deklarieren... Zitieren
Guybrush Threepwood Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 Jetzt weiß ich wieder, warum ich C nicht mag, da muss man alle Variablen in einer Funktion als erstes deklarieren... jep, aber "Quasi C" als cpp übersetzt ist absolut genial Zitieren
lapi_k Geschrieben 9. Januar 2009 Autor Geschrieben 9. Januar 2009 na ihr habt ja fleißig wissen ausgetauscht ... allerdings weiß ich jetzt immer noch nich weiter Zitieren
Klotzkopp Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 na ihr habt ja fleißig wissen ausgetauscht ... allerdings weiß ich jetzt immer noch nich weiter Du hast ja auch die Fragen nicht beantwortet. Zitieren
lapi_k Geschrieben 9. Januar 2009 Autor Geschrieben 9. Januar 2009 ja du meinst wahrscheinlich deine frage ob ich bei den vorlesungen und übungen nicht war ... auch wenn man bei vl und übungen ist muss man nicht alles verstehn ... sonst würd ich ja nich nach hilfe fragen Zitieren
Klotzkopp Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 Ich meinte vor allem die Frage von robotto7831a. Mit "es gab einen Fehler" kann nämlich niemand etwas anfangen. Zitieren
lapi_k Geschrieben 9. Januar 2009 Autor Geschrieben 9. Januar 2009 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 das war meine letzte antwort gestern .. seitdem hab ich nichts mehr geschrieben ... ich versteh das problem jetzt nicht ... ich will doch einfach nur wissen was ich besser machen kann Zitieren
unbenannt Geschrieben 9. Januar 2009 Geschrieben 9. Januar 2009 ich will doch einfach nur wissen was ich besser machen kann Naja, Du schreibst hier lediglich "geht nicht", "macht nichts" etc. Tut mir leid, aber irgendwie vermisse ich da ein wenig Eigeninitiative. Zuerst einmal solltest Du Dir die Aufgabenstellung noch einmal genau ansehen und dann überlegen, was überhaupt gefordert ist. Kleiner Tipp: es ist nicht gefordert, zig Logins von der Konsole zu lesen und diese in eine Liste zu schreiben. Manchmal schadet es z.B. nicht, seine Gedanken - bzw. den theoretischen Lösungsweg - erst einmal auf dem Papier zu skizzieren. Zitieren
Klotzkopp Geschrieben 10. Januar 2009 Geschrieben 10. Januar 2009 das war meine letzte antwort gestern .. seitdem hab ich nichts mehr geschrieben ... Tut mir leid, das hab ich verwechselt, die schlechte Fehlerbeschreibung kam nicht von dir, und robotto7831as Frage war auch nicht an dich gerichtet. ich will doch einfach nur wissen was ich besser machen kann Dein Programm macht etwas anderes, als in der Aufgabenstellung verlangt ist, das haben dir nun schon mehrere gesagt. Es ist nicht so, dass das mit ein paar kleinen Änderungen läuft. Dir fehlt da ein paar Grundlagen, mit deinem erkennbaren Wissen kannst du diese Aufgabe nicht lösen. Versuch, den versäumten Stoff nachzuarbeiten. Das Forum kann und soll keinen Unterricht ersetzen. Wir können hier konkrete Detailfragen lösen, aber bei solchen Lücken bringt das nicht viel. Schau dir den Thread an, wir sind schon auf Seite 4 und kaum weitergekommen. Es bringt nichts, wenn du von irgendwoher Code zusammenkopierst und versuchst, das ans Laufen zu bringen. Du musst verstehen, wie das funktioniert, sonst stehst du bei der nächsten Aufgabe vor demselben Problem. Zitieren
AndiE Geschrieben 10. Januar 2009 Geschrieben 10. Januar 2009 Hallo, ich kann mir nicht vorstellen, daß jemand, der aus der Schule raus ist, keine Ahnung von Listen hat. Im Klassenbuch stehen die Schüler mit ihren Daten drin, das ist eine "Namens"-LISTE. Die heißt auch noch so. Daneben trifft jeder im Leben Unmengen geschriebener Listen, wie beim Pizza-Bäcker, im Restaurant usw. Also das Argument nehme ich niemandem ab. 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.