Liebe Alle! Ich möchte eine Rezeptdatenbank mit Inhaltsverzeichnis erstellen. Für das Inhaltsverzeichnis hätte ich gern eine fortlaufende Nummerierung. Die Umsetzung hätte ich mir so vorgestellt: struct index { int idxnmbr; char idxname; }; Ergebnis sollte so aussehen: 1 *idxname1 2 *idxname2 3 *idxname3 usw. Ich schaffe aber die fortlaufende Nummerierung nicht. Ich wollte es mit einer while-Schleife versuchen. Also "solange du idxnamen findest, solange zähle". Aber es endete in einer Endlosschleife. Über Tipps, Tricks und Denkanstöße freue ich mich. Danke!
Hier meine letzte Änderung. Hier war die Überlegung "for-schleife". #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 30 #define MAX_LEN 1000 #define REZEPTANZAHL 100 struct index { int idxnmbr; char idxname[MAX]; } inhaltsverzeichnis[100]; int main(void) { FILE *fp = fopen("database.txt", "a+"); int nmbr[] = 0; nmbr++; printf("Bitte geben Sie hier den Namen des Rezepts ein: "); fgets(inhaltsverzeichnis->idxname, MAX, stdin); fprintf(fp, "%s", inhaltsverzeichnis->idxname); for(int i = 0; i <= idxname; i++); return 0; }
Die Überlegung Array hatte ich auch schon, aber selbst da, weiß ich nicht wie ich es umsetzen soll. Ich gehe davon aus, dass die Lösung vermutlich sehr simple ist. Aber ich komm einfach nicht drauf. Ich weiß einfach nicht, wie ich das umsetzen soll.
Teo schrieb: > Das riecht doch gerade zu nach einem stinknormalen Array !³ und nach einer Hausaufgabe. Sowas haben wir damals in der Oberstufe im Informatik-Kurs gebastelt. Mit dynamischen Listen (und binären Bäumen).
STK500-Besitzer schrieb: > Teo schrieb: >> Das riecht doch gerade zu nach einem stinknormalen Array !³ > > und nach einer Hausaufgabe. > Sowas haben wir damals in der Oberstufe im Informatik-Kurs gebastelt. > Mit dynamischen Listen (und binären Bäumen). Wenn du sowas schon mal gemacht hast, könntest du ja so nett sein und meine Frage beantworten. Wie du ja siehst, ist eine struct ja schon vorhanden. Wie hier ein binärer Baum weiterhelfen könnte, weiß ich nicht. Ich freue mich über die Erklärung.
Hallo Nicole, hier hat sich der Fehlerteufel eingeschlichen: 1) Die For-Schleife zählt gegenüber den idxname und nicht idxnmbr 2) Die For-Schleife macht eigentlich gar nichts 3) Als festes Abbruchkriterium für die For-Schleife wäre hier REZEPTANZAHL besser Anhand dieser Tipps kannst du erstmal dein Programm optimieren und wieder reinstellen. Dann schauen wir weiter was nicht geht. Schöne Grüße Steve
Steve hat schon Tips gegeben. Was ist und soll nmbr. Das ist ein offenes array? Ein pointer? Oder ein int? Jedenfalls ohne Funktion. Das wiederum macht mir klar, dass du die Fehlermeldungen nicht liest.
Hallo Nicole, verstehe ich richtig, dass du 100 Eingaben von der Tastatur einlesen und dann nummeriert in eine Datei rausschreiben willst? Wenn ja kannst du dir das Array sparen. Du mußt das Lesen in einer For-Schleife machen und nach jeder Eingabe speicherst du den Datensatz ab, also etwa so: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 30 #define MAX_LEN 1000 #define REZEPTANZAHL 100 struct index { int idxnmbr; char idxname[MAX]; } inhaltsverzeichnis; int main(void) { FILE *fp = fopen("database.txt", "a+"); int nmbr; for (nmbr = 1; nmbr <= REZEPTANZAHL; nmbr++ ) { inhaltsverzeichnis.idxnmbr = nmbr; printf("Bitte geben Sie hier den Namen des Rezepts ein: "); fgets(inhaltsverzeichnis.idxname, MAX, stdin); fprintf(fp, "%3d %s\n", inhaltsverzeichnis.idxnmbr, inhaltsverzeichnis.idxname); } fclose(fp); return 0; } Sollte das nicht das sein, was du wolltest, bitte beschreibe die Aufgabe doch etwas genauer Andreas
Nicole schrieb: > #define MAX_LEN 1000 > #define REZEPTANZAHL 100 Wird nicht verwendet -> Mangel an strukturierten Vorgehen. Nicole schrieb: > fprintf(fp, "%s", inhaltsverzeichnis->idxname); Index für inhaltsverzeichnis fehlt. Nicole schrieb: > for(int i = 0; i <= idxname; i++); idxname ist ein string. Wie willst du den inkrementieren? Wenn morgen Abgabe ist, wird das heute nichts mehr.
Bei der Aufgabe und dem Code stellt sich m.E die Frage, was Du davon verstehst, bzw. was der letzte Code war, der überhaupt irgendwas gemacht hat was es sollte. Ich fürchte das war hello world, und dann solltest Du von da weitermachen: Hello world 3 Mal ausgeben Das ganze mit Zahl Eine Liste verschiedener Texte erstellen und darüber itterieren Die list aus einem File lesen und ausgeben Das File erweitern im Programm ...
Zuerst mal vielen Dank für die vielen Reaktionen. Andreas B. schrieb: > verstehe ich richtig, dass du 100 Eingaben von der Tastatur einlesen und > dann nummeriert in eine Datei rausschreiben willst? Genau, also ich möchte zb. Suppe eingeben und in einer txt.-Datei kommt die Ausgabe: 1 Suppe Die Anzahl 100 habe ich gewählt, weil ich gehofft habe, damit leichter arbeiten zu können. Aber tatsächlich hat mich das auch nicht weiter gebracht. Nick M. schrieb: > Index für inhaltsverzeichnis fehlt. Ich dachte das wär's: struct index { int idxnmbr; char idxname[MAX]; } inhaltsverzeichnis[100]; ? Also struct, dann alle Variablen, die ich haben möchte und am Ende benenne ich es. Wobei diese struct auch nur funktioniert, solange [100] am Ende steht, lösche ich es kommen Fehlermeldungen. Nick M. schrieb: > Nicole schrieb: >> for(int i = 0; i <= idxname; i++); > > idxname ist ein string. Wie willst du den inkrementieren? Für mich war halt die Überlegung wie setze ich das gesprochene "solange du im idxname einen Wert hast, zählst und fügst die gezählten Werte bei idxnmbr hinzu" um. A. S. schrieb: > Bei der Aufgabe und dem Code stellt sich m.E die Frage, was Du davon > verstehst, bzw. was der letzte Code war, der überhaupt irgendwas gemacht > hat was es sollte. Tatsächlich habe ich keine Ahnung mehr was ich mache. Ich hätte nicht gedacht, dass es (zumindest für mich) so schwierig ist, ein durchnummeriertes Inhaltsverzeichnis zu erstellen. Ich habe das Gefühl, dass mir zum einen irgendein grundlegendes Wissen fehlt, damit ich hier adäquat weiterkomme und zum anderen noch dazu ausgesprochen kompliziert denke.
Nicole schrieb: > Nick M. schrieb: >> Index für inhaltsverzeichnis fehlt. > > Ich dachte das wär's: > struct index { > int idxnmbr; > char idxname[MAX]; > } inhaltsverzeichnis[100]; ? > Also struct, dann alle Variablen, die ich haben möchte und am Ende > benenne ich es. Lies doch ganz genau was ich geschrieben habe. Nicole schrieb: > Wobei diese struct auch nur funktioniert, solange [100] > am Ende steht, lösche ich es kommen Fehlermeldungen. Ja, dann geh denen mal nach. Es kommen sowieso schon Fehlermeldungen (oder Warnings). Glaubst du die kommen aus Versehen? Du hast ein array, dann behandle es auch so. Wenn es keines sein soll, dann schreib auch keines hin. Nicole schrieb: > Nick M. schrieb: >> Nicole schrieb: >>> for(int i = 0; i <= idxname; i++); >> >> idxname ist ein string. Wie willst du den inkrementieren? > Für mich war halt die Überlegung wie setze ich Überlegung? So nach Gefühl? Deine Überlegungen interessieren den Compiler nicht. Der steht auf Anweisungen. Und zwar präzise. Und die ist Unsinn.
Ich hatte vorhin mal diese Lösung, die zufällig funktioniert. Aber halt auch nur, wenn ich die Eingabe dazwischen nicht unterbreche. Sobald ich unterbreche und dann von vorne beginne, beginnt auch die Zählung von vorne. Gerade habe ich mich an dem Tipp von Steve versucht, dass die Schleife eben bis 100 durchgezählt.
Fürchterlich! Überleg dir das: > inhaltsverzeichnis[i].idxnmbr++; > fgets(inhaltsverzeichnis->idxname, MAX, stdin); Das widerspricht sich! Warum ist das ein Array: > inhaltsverzeichnis[100]; Wenn du immer nur auf den index 0 schreibst. Oder völlig ignorierst dass es ein Array ist. Wozu ist der Parameter 0, wenn du ihn nicht benutzt? > input_idx(0); Was soll das bewirken? Du hast im Statement davor schon den allerersten Eintrag versehentlich überschrieben. Jetzt ist es zu spät! > fseek(fp, 0L, SEEK_END); Was braucht jedes fopen um den Mist auf die Platte zu bringen? FILE *fp = fopen("database.txt", "a+");
Nicole schrieb: > Ich hatte vorhin mal diese Lösung, die zufällig funktioniert. Das nennt sich "ballistische Programmierung". Hat sich nicht durchgesetzt!
Nicole schrieb: > Tatsächlich habe ich keine Ahnung mehr was ich mache. Ich hätte nicht > gedacht, dass es (zumindest für mich) so schwierig ist, ein > durchnummeriertes Inhaltsverzeichnis zu erstellen. > Ich habe das Gefühl, dass mir zum einen irgendein grundlegendes Wissen > fehlt, damit ich hier adäquat weiterkomme und zum anderen noch dazu > ausgesprochen kompliziert denke. Dann reduziere notfalls bis aufs Hello World und erweitere es Zeile für Zeile, jeweils mit Ausgabe. Oder lass Dir das Programm von einem Mitschüler schreiben und danach Zeile für Zeile erklären. Solange Du aber eine for-Schleife nicht beherrscht oder den Unterschied zwischen char, char[] und char*, solange überfordern Dich FILE, Vergleich und Suchen.
> Über Tipps, Tricks und Denkanstöße freue ich mich. > Danke! das Programm gibt es bereits und wurde vor ein paar Wochen von 'Experte' vorgestellt nachdem ein anderer Poster danach gefragt hatte aber wohl nicht damit klar kam - ich habe es jetzt mal um eine fortlaufende Nummerierung erweitert. Den Rest kann man ja nach eigenen Kriterien umschreiben bzw. ändern und um weitere Funktionen ergänzen. Vorsicht mit 'init' - dann wird die gesamte Datenbank gelöscht, das müßte man noch mal etwas ändern. Wie ich schon sagte ein sehr schönes Programm von 'Experte' :-) Viel Spaß beim anpassen.
Robert K. schrieb: >> Über Tipps, Tricks und Denkanstöße freue ich mich. >> Danke! > das Programm gibt es bereits und wurde vor ein paar Wochen von 'Experte' > vorgestellt nachdem ein anderer Poster danach gefragt hatte aber wohl > nicht damit klar kam - ich habe es jetzt mal um eine fortlaufende > Nummerierung erweitert. > Den Rest kann man ja nach eigenen Kriterien umschreiben bzw. ändern und > um weitere Funktionen ergänzen. Vorsicht mit 'init' - dann wird die > gesamte Datenbank gelöscht, das müßte man noch mal etwas ändern. > Wie ich schon sagte ein sehr schönes Programm von 'Experte' :-) > Viel Spaß beim anpassen. Danke sehr!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.