Problem bei Aufgabe mit Datenstrukturen



  • Hallo zusammen. Ich bin auf der Suche nach ein bisschen Hilfe bei dieser Aufgabe:

    Aufgabenstellung
    Sie sollen ein Programm schreiben, das einen Auszug aus dem Speiseplan der Mensa der FH
    Düsseldorf in geeigneten Datenstrukturen speichert und darin eine Suche durchführt.
    Alle Daten, die Sie für die Bearbeitung der Aufgabe benötigen, finden Sie auf dieser

    Webseite:
    http://www.studentenwerk-duesseldorf.de/Essen/Mensen_Duesseldorf.html
    Für jede Kalenderwoche veröffentlicht das Studentenwerk Düsseldorf eine "Wochenkarte - Mensa Georg-Glock-Straße, Düsseldorf" als PDF-Datei.
    Die Zeichenerklärung steht in einem separaten Dokument:
    http://www.studentenwerk-duesseldorf.de/doc/Essen/Zeichenerklaerung.pdf

    Definieren Sie eine Datenstruktur, die geeignet ist, den Speiseplan eines Wochentags vollständig abzubilden.
    Für die einzelnen Gerichte sollen Sie die vorgegebene Struktur Mensa_Essen benutzen. Der Speiseplan eines Wochentages soll zusätzlich das Datum in ISO-Normdarstellung enthalten. Der Datentyp für das Datum ist ebenfalls vorgegeben und heißt ISO8601_JJJJMMTT . Außerdem muss ihre Struktur die Angabe des Wochentags enthalten, und zwar als Integer-Zahl (Montag=1, Dienstag=2, ...).

    In Ihrem Programm sollen die Speisepläne für 4 aufeinander folgende Mensa-Betriebstage hinterlegt werden. Dazu müssen Sie ein Datenfeld bestehend aus 4 Elementen Ihres Datentyps für "Struktur für einen Wochentag" anlegen. Dieses Datenfeld muss in Ihrem Programm mit den echten Daten aus der "Wochenkarte - Mensa Georg-Glock-Straße, Düsseldorf" initialisiert werden.
    Die 4 Mensa-Tage, die Sie auf diese Weise in Ihrem Programm hinterlegen sollen, müssen genau die 4 Tage sein, die mit Ihrem Präsenztermin 4 beginnen.
    Folgende Datentypen sind vorgegeben:

    /*ISO-Normdatum aus 3 Zahlen: Jahr, Monat, Tag*/
    typedef int ISO8601_JJJJMMTT[3];
    
    /* Struktur für ein Mensa-Gericht */
    typedef struct {
    char bezeichnung[100]; /* Bezeichnung des Gerichts */
    /* Max. eine Angabe (Buchstabe) für Spezialkost:
    'R', 'S', 'A', 'F', 'V' oder keine Angabe(' ') */
    char spezialkost;
    /* Max. 3 Angaben (Zahlen) für Zusatzstoffe. 0 bedeutet keine Angabe */
    int zusatzstoffe[3];
    int centpreisStud; /* Studierendenpreis in Euro-Cent */
    int centpreisBed; /* Bedienstetenpreis in Euro-Cent */
    char zusatz[20]; /* Sonst. Angaben, z.B. "Grill" oder "Wok" */
    } Mensa_Essen;
    

    Hinweise:
    • Die Struktur Mensa_Essen kann nur einen Kennbuchstaben für Spezialkost darstellen.
    Falls ein Gericht im Speiseplan mehr als einen Kennbuchstaben hat, dann sollen Sie
    nur den ersten Kennbuchstaben übernehmen.
    • Die Bezeichnung des Gerichts dürfen Sie abkürzen. Bei Abkürzungen muss das
    Gericht aber erkennbar bleiben und 25 Zeichen dürfen nicht unterschritten werden.

    Die Aufgabe Ihres Programms ist es, eine Suchanfrage zu den gespeicherten Speiseplänen zu bearbeiten.

    Die Suchaufgabe für die Bearbeiter mit ungerader Matrikelnummer lautet:
    Fordern Sie den Programmbenutzer zur Eingabe einer Angabe (Buchstabe) für Spezialkost und zur Eingabe eines maximalen Studierenden-Preises auf. Das Programm soll alle Gerichte ausgeben, die den eingegebenen Kennbuchstaben besitzen und nicht teurer sind.

    Die Suchaufgabe für die Bearbeiter mit gerader Matrikelnummer (inkl. xxxxx0) lautet:
    Fordern Sie den Programmbenutzer zur Eingabe eines Wochentags (1 ... 5) und zur Eingabe eines Zusatzstoffs (ganze Zahl) auf. Das Programm soll alle Gerichte ausgeben, die den angegebenen Zusatzstoff nicht enthalten und an dem angegebenen Wochentag auf dem Speiseplan stehen.

    Bei der "Ausgabe eines Gerichts" soll mindestens die Bezeichnung des Gerichts (der vollständige Text der Bezeichnung aus der Datenstruktur) und das Datum des zugehörigen Mensa-Tags als Programmausgabe erzeugt werden. Das Datum muss in der Form TT.MM.JJJJ erscheinen.

    Ich sage vorweg, dass ich das Theme Datenstrukturen so gar nicht verstanden habe. Ich habe bisher dies hier nach ein paar Stunden des Grübelns und Suchens zusammenbekommen:

    #include <stdio.h> 
    
    /*ISO-Normdatum aus 3 Zahlen: Jahr, Monat, Tag*/
    typedef int ISO8601_JJJJMMTT[3];
    
    /* Struktur für ein Mensa-Gericht */
    typedef struct{
      char bezeichnung[100]; /* Bezeichnung des Gerichts */
    
      char spezialkost; /* Max. eine Angabe (Buchstabe) für Spezialkost:
    		'R', 'S', 'A', 'F', 'V' oder keine Angabe(' ') */
    
      int zusatzstoffe[3];/* Max. 3 Angaben (Zahlen) für Zusatzstoffe. 
     			0 bedeutet keine Angabe */
      int centpreisStud; /* Studierendenpreis in Euro-Cent */
      int centpreisBed; /* Bedienstetenpreis in Euro-Cent */
      char zusatz[20]; /* Sonst. Angaben, z.B. "Grill" oder "Wok" */
    } Mensa_Essen;
    
    int main()
    {
      int i;
      /* Das Datenfeld studlst soll die Personendaten von bis zu 4
    Studierenden enthalten.
    Alle Einträge werden mit Default-Werten initialisiert. */
      Mensa_Essen mlst[4] = {{"XY",'?',0,0,0,"?"},{"XY",'?',0,0,0,"?"},
      {"XY",'?',0,0,0,"?"},{"XY",'?',0,0,0,"?"}};
    
      mlst[0].bezeichnung = "Gefluegelfrikadelle Rahmsauce";
      mlst[0].spezialkost = '';
      mlst[0].zusatzstoffe = 20;
      mlst[0].centpreisStud = 100;
      mlst[0].centpreisBed = 280;
      mlst[0].zusatz = "";
    
      mlst[1].bezeichnung = "Gefluegelfrikadelle Rahmsauce";
      mlst[1].spezialkost = '';
      mlst[1].zusatzstoffe = 20;
      mlst[1].centpreisStud = 100;
      mlst[1].centpreisBed = 280;
      mlst[1].zusatz = "";
    
      mlst[2].bezeichnung = "Gefluegelfrikadelle Rahmsauce";
      mlst[2].spezialkost = '';
      mlst[2].zusatzstoffe = 20;
      mlst[2].centpreisStud = 100;
      mlst[2].centpreisBed = 280;
      mlst[2].zusatz = "";
    
      mlst[3].bezeichnung = "Gefluegelfrikadelle Rahmsauce";
      mlst[3].spezialkost = '';
      mlst[3].zusatzstoffe = 20;
      mlst[3].centpreisStud = 100;
      mlst[3].centpreisBed = 280;
      mlst[3].zusatz = "";
    
      for(i=0; i<4 ; i++)
        printf("_______________\n %s\n %c\n %i\n %i\n %i\n %s\n",
        mlst[i].bezeichnung,mlst[i].spezialkost,mlst[i].zusatzstoffe,mlst[i].centpreisStud,
        mlst[i].centpreisBed, mlst[i].zusatz);        
    
      return;
    }
    

    Ich habe bewusst die gleichen Angaben genommen, um einfach überhaupt da was stehen zu haben. Doch funktioniert da gar nichts. Ich bekomme zig Meldungen bezüglich "initialization makes integer from pointer withouta cast" oder "incompatible types when assigning to type 'char[100]' from type 'char *'" 😕
    Ich möchte es gerade erst mal hinbekommen, dass ich die Gerichte mit allen Angaben für einen Tag mit Datum und Wert für den Tag darstellen kann. Denn ich weiß auch nicht, wie ich den Wert von

    /*ISO-Normdatum aus 3 Zahlen: Jahr, Monat, Tag*/
    typedef int ISO8601_JJJJMMTT[3];
    

    mit in die Struktur einbinden kann.

    Auch schon mal zum Verständniss. Muss ich für 4 tage jeweils vier separate Datenfelder erstellen sprich Mensea_Essen mlst1[4] und dann mlst2[4], oder geht das auch mit einem?

    Ich würde mich über ein bisschen Hilfe freuen.



  • bezeichnung ist ein Array.
    Arrays kann man nicht mit = Werte zuweisen (ausser bei der Definition)
    Dazu musst du die Funktion strcpy nehmen

    ISO8601_JJJJMMTT ist ein neuer Typ. Den kannst du ganz einfach benutzen.

    ...
      char zusatz[20];
      ISO8601_JJJJMMTT datum;
    }
    

    Bedenke aber, dass datum ein int-Array ist. (Wegen der [3] beim typedef)



  • quelltext.c: In function 'main':

    quelltext.c:28:3: warning: initialization makes integer from pointer without
    a cast [enabled by default]
    cast [enabled by default]

    quelltext.c:28:3: warning: (near initialization for 'mlst[0].centpreisStud')
    [enabled by default]
    ud') [enabled by default]

    quelltext.c:28:3: warning: initialization makes integer from pointer without
    a cast [enabled by default]
    cast [enabled by default]

    quelltext.c:28:3: warning: (near initialization for 'mlst[1].centpreisStud')
    [enabled by default]
    ud') [enabled by default]

    quelltext.c:29:3: warning: initialization makes integer from pointer without
    a cast [enabled by default]
    cast [enabled by default]

    quelltext.c:29:3: warning: (near initialization for 'mlst[2].centpreisStud')
    [enabled by default]
    ud') [enabled by default]

    quelltext.c:29:3: warning: initialization makes integer from pointer without
    a cast [enabled by default]
    cast [enabled by default]

    quelltext.c:29:3: warning: (near initialization for 'mlst[3].centpreisStud')
    [enabled by default]
    ud') [enabled by default]

    quelltext.c:31:3: warning: incompatible implicit declaration of built-in function
    'strcpy' [enabled by default]
    cpy' [enabled by default]

    quelltext.c:32:25: error: empty character constant

    quelltext.c:33:24: error: incompatible types when assigning to type 'int[3]'
    from type 'int'
    'int[3]' from type 'int'

    quelltext.c:37:16: error: incompatible types when assigning to type 'ISO8601_JJJJMM
    TT' from type 'int'
    JJJJMMTT' from type 'int'

    quelltext.c:40:25: error: empty character constant

    quelltext.c:41:24: error: incompatible types when assigning to type 'int[3]'
    from type 'int'
    'int[3]' from type 'int'

    quelltext.c:44:26: error: incompatible types when assigning to type 'char[20]'
    from type 'char *'
    r[20]' from type 'char *'

    quelltext.c:44:3: error: too few arguments to function 'strcpy'

    quelltext.c:45:16: error: incompatible types when assigning to type 'ISO8601_JJJJMM
    TT' from type 'int'
    JJJJMMTT' from type 'int'

    quelltext.c:48:25: error: empty character constant

    quelltext.c:49:24: error: incompatible types when assigning to type 'int[3]'
    from type 'int'
    'int[3]' from type 'int'

    quelltext.c:53:16: error: incompatible types when assigning to type 'ISO8601_JJJJMM
    TT' from type 'int'
    JJJJMMTT' from type 'int'

    quelltext.c:56:25: error: empty character constant

    quelltext.c:57:24: error: incompatible types when assigning to type 'int[3]'
    from type 'int'
    'int[3]' from type 'int'

    quelltext.c:61:16: error: incompatible types when assigning to type 'ISO8601_JJJJMM
    TT' from type 'int'
    JJJJMMTT' from type 'int'

    quelltext.c:66:5: warning: format '%i' expects argument of type 'int', but argument
    4 has type 'int *' [-Wformat]
    s type 'int *' [-Wformat]

    #include <stdio.h> 
    
    /*ISO-Normdatum aus 3 Zahlen: Jahr, Monat, Tag*/
    typedef int ISO8601_JJJJMMTT[3];
    
    /* Struktur für ein Mensa-Gericht */
    typedef struct{
      char bezeichnung[100]; /* Bezeichnung des Gerichts */
    
      char spezialkost; /* Max. eine Angabe (Buchstabe) für Spezialkost:
    		'R', 'S', 'A', 'F', 'V' oder keine Angabe(' ') */
    
      int zusatzstoffe[3];/* Max. 3 Angaben (Zahlen) für Zusatzstoffe. 
     			0 bedeutet keine Angabe */
      int centpreisStud; /* Studierendenpreis in Euro-Cent */
      int centpreisBed; /* Bedienstetenpreis in Euro-Cent */
      char zusatz[20]; /* Sonst. Angaben, z.B. "Grill" oder "Wok" */
      ISO8601_JJJJMMTT datum;
    } Mensa_Essen;
    
    int main()
    {
      int i;
      /* Das Datenfeld studlst soll die Personendaten von bis zu 4
    Studierenden enthalten.
    Alle Einträge werden mit Default-Werten initialisiert. */
      Mensa_Essen mlst[4] = {{"XY",'?',0,0,0,"?",0},{"XY",'?',0,0,0,"?",0},
      {"XY",'?',0,0,0,"?",0},{"XY",'?',0,0,0,"?",0}};
    
      strcpy( mlst[0].bezeichnung, "Gefluegelfrikadelle Rahmsauce"); 
      mlst[0].spezialkost = '';
      mlst[0].zusatzstoffe = 20;
      mlst[0].centpreisStud = 100;
      mlst[0].centpreisBed = 280;
      strcpy( mlst[0].zusatz, "");
      mlst[0].datum= 10, 10, 2010; 
    
      strcpy( mlst[1].bezeichnung, "Gefluegelfrikadelle Rahmsauce"); 
      mlst[1].spezialkost = '';
      mlst[1].zusatzstoffe = 20;
      mlst[1].centpreisStud = 100;
      mlst[1].centpreisBed = 280;
      strcpy( mlst[1].zusatz = "");
      mlst[1].datum= 10, 10, 2010; 
    
      strcpy( mlst[2].bezeichnung, "Gefluegelfrikadelle Rahmsauce"); 
      mlst[2].spezialkost = '';
      mlst[2].zusatzstoffe = 20;
      mlst[2].centpreisStud = 100;
      mlst[2].centpreisBed = 280;
      strcpy( mlst[2].zusatz, "");
      mlst[2].datum= 10, 10, 2010; 
    
      strcpy( mlst[3].bezeichnung, "Gefluegelfrikadelle Rahmsauce"); 
      mlst[3].spezialkost = '';
      mlst[3].zusatzstoffe = 20;
      mlst[3].centpreisStud = 100;
      mlst[3].centpreisBed = 280;
      strcpy( mlst[3].zusatz, "");
      mlst[3].datum= 10, 10, 2010; 
    
      for(i=0; i<4 ; i++)
        printf("_______________\n %s\n %c\n %i\n %i\n %i\n %s\n",
        mlst[i].bezeichnung,mlst[i].spezialkost,mlst[i].zusatzstoffe,mlst[i].centpreisStud,
        mlst[i].centpreisBed, mlst[i].zusatz);        
    
      return;
    }
    

    Ok, ich habe hier mal meinen etwas abgewandelten Quelltext mit den Fehlermeldungen. Ich habe es soweit auch mit der strcpy-Funktion probiert. DirkB hatte ja schon vermerkt, dass das Datum ja ein int-Array ist. Aber ich weiß nicht, mit welcher Funktion man auf int-Arrays "zeigt".



  • zusatzstoffe ist auch ein Array*. Diesmal (Zeile 28) machst du das zwar bei einer Definition, aber das musst du dann nochmal klammern (mit {} )
    Soll das überhaupt ein Array sein?

    Wahrscheinlich nicht, sonst wäre Zeile 33 sinnfrei. Und Zeile 66 auch.

    Diesmal ist es aber ein int-Array. Da kommst du mit strcpy nicht weiter.
    Da musst du schon jedes Element einzeln zuweisen.

    ...datum[0] = 2014;  // bei den ... setzt du selber das richtige ein
    ...datum[1] = 1;  // es heisst JJJJMMTT
    ...datum[2] = 6;  // darum wuerde ich mit dem Jahr anfangen
    

    Ach und '' ist kein Zeichen. Das mag der Compiler auch nicht. Zwischen den '' sollte als was stehen (ein Zeichen)



  • Doch das soll ein Array sein, da bis zu 3 Angaben für die Zusatzstoffe angegeben werden sollen. Also z.B. 10,20,21 Als Angabe



  • Dann musst du die Zuweisung ändern. Und bei der Ausgabe in Zeile 66 auch.
    Sieht dann so aus wie beim datum.

    Mensa_Essen mlst[4]; = { { "Gyros", 'S', {0,0,0}, 100, 280, "Pfanne", {2014,1,6} },
                             { "Döner", 'R', {0,0,0}, 100, 280, "Pfanne", {2014,1,7} }, 
                             { "Döner", 'G', {0,0,0}, 100, 280, "Pfanne", {2014,1,8} }, 
                             { "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, "Pfanne", {2014,1,9} }
                           };
    


  • Also ich habe das jetzt soweit geändert:

    #include <stdio.h>
    
    /*ISO-Normdatum aus 3 Zahlen: Jahr, Monat, Tag*/
    typedef int ISO8601_JJJJMMTT[3];
    
    /* Struktur für ein Mensa-Gericht */
    typedef struct{
      char bezeichnung[100]; /* Bezeichnung des Gerichts */
    
      char spezialkost; /* Max. eine Angabe (Buchstabe) für Spezialkost:
            'R', 'S', 'A', 'F', 'V' oder keine Angabe(' ') */
    
      int zusatzstoffe[3];/* Max. 3 Angaben (Zahlen) für Zusatzstoffe.
                0 bedeutet keine Angabe */
      int centpreisStud; /* Studierendenpreis in Euro-Cent */
      int centpreisBed; /* Bedienstetenpreis in Euro-Cent */
      char zusatz[20]; /* Sonst. Angaben, z.B. "Grill" oder "Wok" */
      ISO8601_JJJJMMTT datum;
    } Mensa_Essen;
    
    int main()
    {
      int i;
      int datum[3];
    
      Mensa_Essen mlst[4] = { { "Gyros", 'S', {0,0,0}, 100, 280, "Pfanne", {2014,1,6} },
                     { "Döner", 'R', {0,0,0}, 100, 280, "Pfanne", {2014,1,7} },
                     { "Döner", 'G', {0,0,0}, 100, 280, "Pfanne", {2014,1,8} },
                     { "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, "Pfanne", {2014,1,9} }
                      };
    
      for(i=0; i<4 ; i++)
        printf("_______________\n %s (%c, %i, %i, %i)\n %i\n %i\n %s\n %i.%i.%i\n",
        mlst[i].bezeichnung,mlst[i].spezialkost,mlst[i].zusatzstoffe[0],
        mlst[i].zusatzstoffe[1], mlst[i].zusatzstoffe[2],mlst[i].centpreisStud,
        mlst[i].centpreisBed, mlst[i].zusatz, datum[0], datum[1], datum[2]);        
    
      return;
    }
    

    Dies ist meine derzeitge Ausgabe:

    _______________
    Gyros
    (S 0, 0, 0)
    100
    280
    Pfanne
    15773923. 0.4195952
    _______________
    Döner
    (R 0, 0, 0)
    100
    280
    Pfanne
    15773923. 0.4195952
    _______________
    Döner
    (G 0, 0, 0)
    100
    280
    Pfanne
    15773923. 0.4195952
    _______________
    Tofugeschnetzeltes
    (V 0, 0, 0)
    100
    280
    Pfanne
    15773923. 0.4195952

    Ich habe das

    int datum[3];
    

    da noch eingefügt, da mir sonst angegeben wurde, dass das "datum" nicht deklariert sei und da zum ersten mal in der Funktion genutzt wird. Müsste ich das sonst in der Struktur deklarieren, denn so zeigt er mir ja nicht den eigentlichen Wert an.

    Schon mal eine andere Frage. Hinterher soll ja eine Suchfunktion möglich sein. Müsste ich dann, um etwas in den 4 Tagen suchen zu können, für jeden Tag ein Datenfeld erstellen oder alle in einem?



  • Ok, wie ich gerade in der Aufgabenstellung lese, soll ein Datenfeld mit 4 Elementen, sprich den jeweiligen Tagen erstellt werden.

    Definieren Sie eine Datenstruktur, die geeignet ist, den Speiseplan eines Wochentags vollständig abzubilden. Für die einzelnen Gerichte sollen Sie die vorgegebene Struktur Mensa_Essen benutzen. Der Speiseplan eines Wochentages soll zusätzlich das Datum in ISO-Normdarstellung enthalten. Der Datentyp für das Datum ist ebenfalls vorgegeben und heißt ISO8601_JJJJMMTT . Außerdem muss ihre Struktur die Angabe des Wochentags enthalten, und zwar als Integer-Zahl (Montag=1, Dienstag=2, ...).
    In Ihrem Programm sollen die Speisepläne für 4 aufeinander folgende Mensa-Betriebstage hinterlegt werden. Dazu müssen Sie ein Datenfeld bestehend aus 4 Elementen Ihres Datentyps für "Struktur für einen Wochentag" anlegen.

    Ich bin gerade ein bisschen am verzweifeln. Heißt das jetzt, dass ich eine extra typedef struct erstellen muss, die 4 mal die Struktur Mensa_Essen beinhaltet?



  • datum ist ein Element von Mensa_Essen mlst.
    So wie zusatzstoffe auch.

    Also Zeile 25 wieder löschen und bei der Ausgabezeile das datum korrigieren.

    pepe90 schrieb:

    Müsste ich dann, um etwas in den 4 Tagen suchen zu können, für jeden Tag ein Datenfeld erstellen oder alle in einem?

    Wie bezeichnest du denn das, was du gerade hast (Mensa_Essen mlst)?
    Ist das für jeden Tag ein Datenfeld oder alle in einem?



  • Also mlst ist jetzt nur ein Datenfeld für ein Tag. Also wir müssen eine Struktur für die 4 tage erstellen.
    Ich habe das mal hier so umgestellt:

    #include <stdio.h> 
    
    /*ISO-Normdatum aus 3 Zahlen: Jahr, Monat, Tag*/ 
    typedef int ISO8601_JJJJMMTT[3]; 
    
    /* Struktur für ein Mensa-Gericht */ 
    typedef struct{ 
      char bezeichnung[100]; /* Bezeichnung des Gerichts */ 
    
      char spezialkost; /* Max. eine Angabe (Buchstabe) für Spezialkost: 
            'R', 'S', 'A', 'F', 'V' oder keine Angabe(' ') */ 
    
      int zusatzstoffe[3];/* Max. 3 Angaben (Zahlen) für Zusatzstoffe. 
                0 bedeutet keine Angabe */ 
      int centpreisStud; /* Studierendenpreis in Euro-Cent */ 
      int centpreisBed; /* Bedienstetenpreis in Euro-Cent */ 
      char zusatz[20]; /* Sonst. Angaben, z.B. "Grill" oder "Wok" */  
    } Mensa_Essen; 
    
    typedef struct{
      int tag;
      ISO8601_JJJJMMTT datum;
      Mensa_Essen[4];
      } wochentag;
    
    int main() 
    {
      wochentag day [4] = { {2,{2014,01,01},
      			{ "Gyros", 'S', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Döner", 'R', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Döner", 'G', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}
                         {3, {2014,01,01},
      			{ "Gyros", 'S', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Döner", 'R', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Döner", 'G', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}
                         {4, {2014,01,01},
      			{ "Gyros", 'S', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Döner", 'R', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Döner", 'G', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}
                         {5, {2014,01,01},
      			{ "Gyros", 'S', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Döner", 'R', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Döner", 'G', {0,0,0}, 100, 280, ' ' }, 
                     	{ "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}
        };
        int i,j, wochentag, zusatz;
    
        for(i=1; i<4; i++)
        {
          for()
          { 
            scanf(%i,%i, wochentag, zusatz);
          }
            }
    
      return 0;
    }
    

    Also ich habe das soweit mal probiert und bisher diese Fehlermeldungen erhalten. Klar, die Fehlermeldung bezüglich der for-Schleife ist verständlich. Aber wieso bei dem Datenfeld. Zur Erklärung, die erste Zahl, also die 2,3,4 und 5 soll den Wochentag darstellen, wie es in der Aufgabenstellung gefordert ist.

    quelltext.c:27:14: error: expected identifier or '(' before '[' token
    quelltext.c:28:3: warning: no semicolon at end of struct or union [enabled by default]
    quelltext.c: In function 'main':
    quelltext.c:34:6: error: extra brace group at end of initializer
    quelltext.c:34:6: error: (near initialization for 'day[0]')
    quelltext.c:34:6: error: extra brace group at end of initializer
    quelltext.c:34:6: error: (near initialization for 'day[0]')
    quelltext.c:34:6: warning: excess elements in struct initializer [enabled by default]
    quelltext.c:34:6: warning: (near initialization for 'day[0]') [enabled by default]
    quelltext.c:35:19: error: extra brace group at end of initializer
    quelltext.c:35:19: error: (near initialization for 'day[0]')
    quelltext.c:35:19: error: extra brace group at end of initializer
    quelltext.c:35:19: error: (near initialization for 'day[0]')
    quelltext.c:35:19: warning: excess elements in struct initializer [enabled by default]
    quelltext.c:35:19: warning: (near initialization for 'day[0]') [enabled by default]
    quelltext.c:36:19: error: extra brace group at end of initializer
    quelltext.c:36:19: error: (near initialization for 'day[0]')
    quelltext.c:36:19: error: extra brace group at end of initializer
    quelltext.c:36:19: error: (near initialization for 'day[0]')
    quelltext.c:36:19: warning: excess elements in struct initializer [enabled by default]
    quelltext.c:36:19: warning: (near initialization for 'day[0]') [enabled by default]
    quelltext.c:37:19: error: extra brace group at end of initializer
    quelltext.c:37:19: error: (near initialization for 'day[0]')
    quelltext.c:37:19: error: extra brace group at end of initializer
    quelltext.c:37:19: error: (near initialization for 'day[0]')
    quelltext.c:37:19: warning: excess elements in struct initializer [enabled by default]
    quelltext.c:37:19: warning: (near initialization for 'day[0]') [enabled by default]
    quelltext.c:38:22: error: expected '}' before '{' token
    quelltext.c:59:11: error: expected expression before ')' token
    quelltext.c:59:11: error: expected expression before ')' token
    quelltext.c:61:9: error: expected expression before '}' token

    Dann auch das nächste Problem. Kann ich diese Sache einfach mit Scanf abrufen? Kann man die Suchbedingung mit if-Anweisungen machen?

    Die Suchaufgabe für die Bearbeiter mit gerader Matrikelnummer (inkl. xxxxx0) lautet: 
    Fordern Sie den Programmbenutzer zur Eingabe eines Wochentags (1 ... 5) und zur Eingabe 
    eines Zusatzstoffs (ganze Zahl) auf. Das Programm soll alle Gerichte ausgeben, die den 
    angegebenen Zusatzstoff nicht enthalten und an dem angegebenen Wochentag auf dem 
    Speiseplan stehen.
    


  • pepe90 schrieb:

    typedef struct{
      int tag;
      ISO8601_JJJJMMTT datum;
      Mensa_Essen[4];  //<- Hier fehlt entweder der Typ oder der Feldname
      } wochentag;
    
    scanf(%i,%i, wochentag, zusatz);
    

    WTF?



  • Noch was anderes. Wie kann man denn die Werte einer Struktur ausgeben, die in einer anderen Struktur ist? Ich kann ja nicht die Bezeichnung der Hauptstruktur bei mir ja day auf die einzelnen Variablen aus Mensa_Essen nehmen.



  • Ich muss ja irgendwo die Werte eingeben, die ich suchen muss. Deswegen der scnaf-Befehl. Diese Werte muss ich ja dann mit den Werten aus dem Datenfeld vergleichen und bei den Gerichten, wo das der Fall ist, sollen diese ausgegeben werden.



  • Bashar schrieb:

    pepe90 schrieb:

    typedef struct{
      int tag;
      ISO8601_JJJJMMTT datum;
      Mensa_Essen[4];  //<- Hier fehlt entweder der Typ oder der Feldname
      } wochentag;
    

    Was meinst du mit Typ oder Name? Das ist ja die erste Struktur, die ich in die 2 einfüge.



  • pepe90 schrieb:

    Was meinst du mit Typ oder Name? Das ist ja die erste Struktur, die ich in die 2 einfüge.

    Die Elemente der Struktur werden durch normale Deklarationen innerhalb des struct { .... }-Körpers festgelegt. Ganz normale Deklarationen, sowas wie

    int zahl;
    

    Also ein Typ und ein Variablenname (bzw. Feldname, das sind ja nicht wirklich Variablen). So wie du das ja auch bei den anderen Feldern gemacht hast:

    typedef struct{
      char bezeichnung[100];  // JA!
      char spezialkost;       // Richtig!
      int zusatzstoffe[3];    // Auch!
      int centpreisStud;      // Toll!
      int centpreisBed;       // Juhu!
      char zusatz[20];        // Wunderbar!
    } Mensa_Essen;
    
    typedef struct{
      int tag;                // Immer noch richtig!
      ISO8601_JJJJMMTT datum; // Ich bin im Himmel!
      Mensa_Essen[4];         // Hallo? Jemand da? Was jetzt?
      } wochentag;
    

    Da du einen Typ Mensa_Essen hast, fehlt anscheinend der Feldname. Wie stellst du dir denn den Zugriff später vor?

    wochentag t;
    printf("Bezeichnung: %s\n", t.???[0].bezeichnung);
                                  ^^^ <- was steht hier?
    

    Das ist der Name, der da fehlt. Jetzt OK?



  • Ja, danke, das hat mir schon mal ein bisschen weiter geholfen. Ich habe das jetzt auch soweit geändert:

    #include <stdio.h>
    
    typedef int ISO8601_JJJJMMTT[3];
    /* Struktur für ein Mensa-Gericht */
    
    typedef struct{
      char bezeichnung[100]; /* Bezeichnung des Gerichts */
      char spezialkost; /* Max. eine Angabe (Buchstabe) für Spezialkost:
    'R', 'S', 'A', 'F', 'V' oder keine Angabe(' ') */
      int zusatzstoffe[3];/* Max. 3 Angaben (Zahlen) für Zusatzstoffe.
    0 bedeutet keine Angabe */
      int centpreisStud; /* Studierendenpreis in Euro-Cent */
      int centpreisBed; /* Bedienstetenpreis in Euro-Cent */
      char zusatz[20]; /* Sonst. Angaben, z.B. "Grill" oder "Wok" */
    } Mensa_Essen;
    
    typedef struct{
      int tag;
      ISO8601_JJJJMMTT datum[4];
      Mensa_Essen essen[4];
    } wochentag;
    
    int main()
    {
      wochentag day;
      		day[4] = {
        		       //Dienstag	
        		       {2,{2014,01,01},
      		 	{ "Gyros", 'S', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'R', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'G', {0,0,0}, 100, 280, ' ' },
                            { "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}
    
                           //Mittwoch
                           {3, {2014,01,02},
                            { "Gyros", 'S', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'R', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'G', {0,0,0}, 100, 280, ' ' },
                            { "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}
    
                           //Donnerstag
                           {4, {2014,01,03},
                            { "Gyros", 'S', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'R', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'G', {0,0,0}, 100, 280, ' ' },
                            { "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}
    
                           //Freitag
                           {5, {2014,01,04},
                            { "Gyros", 'S', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'R', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'G', {0,0,0}, 100, 280, ' ' },
                            { "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}
    
                          };
    
      int i,j, wochentag, zusatz;
      scanf("%i,%i", &wochentag, &zusatz);
      for(i=1; i<4; i++)
      {
        if(wochentag==day[i].tag && (zusatz==day.essen[i].zusatzstoffe[0] || zusatz==day.essen[i].zusatzstoffe[1] ||
                              zusatz== day.essen[i].zusatzstoffe[2]))
          printf("_______________\n %s (%c, %i, %i, %i)\n %i\n %i\n %s\n %i.%i.%i\n",
                 day.essen[i].bezeichnung,day.essen[i].spezialkost,day.essen[i].zusatzstoffe[0],
                 day.essen[i].zusatzstoffe[1], day.essen[i].zusatzstoffe[2],day.essen[i].centpreisStud,
                 day.essen[i].centpreisBed,day.essen[i].zusatz, day[i].datum[0], day[i].datum[1],
                 day[i].datum[2]);
      }
    return 0;
    }
    

    Doch hat das Programm jetzt Probleme mit der Struktur day, also die die ich selber erstellt habe. So wie ich es jetzt da stehen habe, hatte ich bisher die geringste Fehleranzahl. Ich hatte auch schon versucht einfach direkt

    wochentag day[4] = {...};
    

    zu benutzen, doch dann hatte der wieder mehr Fehler mit extra brace group at end of initializer und request for member 'essen' in something not a structure or union.

    Das hier sind die Fehlermeldungen zum obigen Code:

    quelltext.c: In function 'main':
    quelltext.c:26:8: error: subscripted value is neither array nor pointer nor vector
    quelltext.c:26:12: error: expected expression before '{' token
    quelltext.c:61:22: error: subscripted value is neither array nor pointer nor vector
    quelltext.c:66:64: error: subscripted value is neither array nor pointer nor vector
    quelltext.c:66:81: error: subscripted value is neither array nor pointer nor vector
    quelltext.c:67:17: error: subscripted value is neither array nor pointer nor vector



  • pepe90 schrieb:

    wochentag day;  // hier legst du eine Variable mit dem Namen day vom Typ wochentag an.
                      // Durch das ; ist die Anweisung damit abgeschlossen.
    
    // hier kommt jetzt die nächste Anweisung
            day[4] = { // Und hier versuchst du der Variable als Array etwas zu zuweisen.
    

    1. day ist kein Array
    2. Kann man Arrays nur bei der Definiton etwas mit dem Gleichheitszeichen zuweisen.

    ~Du musst das day; weglassen.~



  • So, nach ein bisschen rumgewurschtel bin ich jetzt schon mal ein bisschen weitergekommen. Jetzt habe ich nur noch ein paar Probleme mit der Ausgabe und der Abfrage, denn das kann so wohl noch nciht ganz funktionieren.

    #include <stdio.h>
    typedef int ISO8601_JJJJMMTT[3];
    /* Struktur für ein Mensa-Gericht */
    
    typedef struct{
      char bezeichnung[100]; /* Bezeichnung des Gerichts */
      char spezialkost; /* Max. eine Angabe (Buchstabe) für Spezialkost:
    'R', 'S', 'A', 'F', 'V' oder keine Angabe(' ') */
      int zusatzstoffe[3];/* Max. 3 Angaben (Zahlen) für Zusatzstoffe.
    0 bedeutet keine Angabe */
      int centpreisStud; /* Studierendenpreis in Euro-Cent */
      int centpreisBed; /* Bedienstetenpreis in Euro-Cent */
      char zusatz[20]; /* Sonst. Angaben, z.B. "Grill" oder "Wok" */
    } Mensa_Essen;
    
    typedef struct{
      int tag;
      ISO8601_JJJJMMTT datum[4];
      Mensa_Essen essen[4];
    } wochentag;
    int main()
    {
      wochentag day[]={{2,{2014,01,01},
      			{{ "Gyros", 'S', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'R', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'G', {0,0,0}, 100, 280, ' ' },
                            { "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}},
                            {3, {2014,01,02},
                            {{ "Gyros", 'S', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'R', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'G', {0,0,0}, 100, 280, ' ' },
                            { "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}},
                            {4, {2014,01,03},
                            {{ "Gyros", 'S', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'R', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'G', {0,0,0}, 100, 280, ' ' },
                            { "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}},
                            {5, {2014,01,04},
                            {{ "Gyros", 'S', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'R', {0,0,0}, 100, 280, ' ' },
                            { "Döner", 'G', {0,0,0}, 100, 280, ' ' },
                            { "Tofugeschnetzeltes", 'V', {0,0,0}, 100, 280, ' ' }}}
                          };
    
      int i,j, wochentag, zusatz;
      scanf("%i,%i", &wochentag, &zusatz);
      for(i=0; i<4; i++)
      {
        if(wochentag==day[i].tag && (zusatz==day.essen[i].zusatzstoffe[0] ||
    				zusatz==day.essen[i].zusatzstoffe[1] ||
                              	zusatz== day.essen[i].zusatzstoffe[2]))
          printf("_______________\n %i\t %i.%i.%i\n %s (%c, %i, %i, %i)\n %i\n %i\n %s\n ",
                 day[i].tag, day[i].datum[0], day[i].datum[1], day[i].datum[2],
                 day.essen[i].bezeichnung, day.essen[i].spezialkost,
                 day.essen[i].zusatzstoffe[0], day.essen[i].zusatzstoffe[1],
                 day.essen[i].zusatzstoffe[2],day.essen[i].centpreisStud,
                 day.essen[i].centpreisBed,day.essen[i].zusatz);
      }
    return 0;
    }
    

    Ich verstehe nicht, warum hier etwas mit der Variable essen nicht stimmen soll.

    quelltext.c: In function 'main':
    quelltext.c:56:45: error: request for member 'essen' in something not a structure
    or union
    not a structure or union
    quelltext.c:57:16: error: request for member 'essen' in something not a structure
    or union
    not a structure or union
    quelltext.c:58:40: error: request for member 'essen' in something not a structure
    or union
    not a structure or union
    quelltext.c:61:17: error: request for member 'essen' in something not a structure
    or union
    not a structure or union
    quelltext.c:61:43: error: request for member 'essen' in something not a structure
    or union
    not a structure or union
    quelltext.c:62:17: error: request for member 'essen' in something not a structure
    or union
    not a structure or union
    quelltext.c:62:47: error: request for member 'essen' in something not a structure
    or union
    not a structure or union
    quelltext.c:63:17: error: request for member 'essen' in something not a structure
    or union
    not a structure or union
    quelltext.c:63:46: error: request for member 'essen' in something not a structure
    or union
    not a structure or union
    quelltext.c:64:17: error: request for member 'essen' in something not a structure
    or union
    not a structure or union
    quelltext.c:64:43: error: request for member 'essen' in something not a structure
    or union
    not a structure or union



  • day ist ein Array.

    if(wochentag==day[i].tag    &&    (zusatz==day.essen[i].zusatzstoffe[0] ||
                 Hier ^ nimmst du day als Array.  ^ Was ist hier?
    


  • Ja, aber da ist dann trotzdem das Problem, dass wenn ich nur i als Indeze nehme, dass ich nicht alles Zusatzstoffe von einem Gericht überprüfe, sondern immer eins von jedem Gericht und beim nächten die 2. Stelle.

    Und dann habe ich noch das Problem, dass die Struktur essen nicht erkennt.


Anmelden zum Antworten