Forum: PC-Programmierung Fortlaufende Nummerierung in C


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Nicole (Gast)


Lesenswert?

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!

von Oliver S. (oliverso)


Lesenswert?

Dann zeig doch mal, was du schon hast.

Oliver

von Nicole (Gast)


Lesenswert?

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

von Teo (Gast)


Lesenswert?

Das riecht doch gerade zu nach einem stinknormalen Array

von Nicole (Gast)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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

von Nicole (Gast)


Lesenswert?

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.

von Steve (Gast)


Lesenswert?

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

von Nick M. (Gast)


Lesenswert?

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.

von Andreas B. (myratz)


Lesenswert?

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

von Nick M. (Gast)


Lesenswert?

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.

von A. S. (achs)


Lesenswert?

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

...

von Nicole (Gast)


Lesenswert?

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.

von Nick M. (Gast)


Lesenswert?

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.

von Nicole (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Nick M. (Gast)


Lesenswert?

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

von Nick M. (Gast)


Lesenswert?

Nicole schrieb:
> Ich hatte vorhin mal diese Lösung, die zufällig funktioniert.

Das nennt sich "ballistische Programmierung".
Hat sich nicht durchgesetzt!

von A. S. (achs)


Lesenswert?

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.

von Robert K. (Firma: Zombieland) (rko)


Angehängte Dateien:

Lesenswert?

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

von Niccaey Ä. (niccaey)


Lesenswert?

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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.