Problem bei Aufgabe mit Datenstrukturen
-
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.
-
Du bist da etwas mit deinen Indizes durcheinander.
Du hast 4 Tage [i] und jeder Tag hat 4 Essen. Das kann nicht auch i sein. Sagen wir mal e
Darum brauchst du zwei verschachtelte Schleifen.Und dann kommst du an die zusatzstoffe:
day[i].essen[e].zusatzstoffe[2]
-
int i,j, wochentag, zusatz; scanf("%i,%i", &wochentag, &zusatz); for(i=0; i<4; i++) { if(day[i].tag==wochentag) for(j=0; j<3; j++) { if(zusatz==day[i].essen[j].zusatzstoffe[0] || zusatz==day[i].essen[j].zusatzstoffe[1] || zusatz== day[i].essen[j].zusatzstoffe[2])
Aber wenn ich das so abfragen würde, würde ich immer noch nicht, auf die richtigen Werte, bzw alle Werte zugreifen.
Müsste ich dafür nicht zwei If-Abfragen erstellen? Eine um den tag zu erkennen und eine um die Zusatzstoffe eines Gerichtes zu vergleichen, oder?Hier zeigt mir der Compiler wiederrum auch noch an, dass hier der falsche Typ verwendet wird:
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[i].essen[j].bezeichnung, day[i].essen[j].spezialkost, day[i].essen[j].zusatzstoffe[0], day[i].essen[j].zusatzstoffe[1], day[i].essen[j].zusatzstoffe[2],day[i].essen[j].centpreisStud, day[i].essen[j].centpreisBed,day[i].essen[j].zusatz);
quelltext.c: In function 'main':
quelltext.c:6:14: warning: format '%i' expects argument of type 'int', but
argument 3 has type 'int *' [-Wformat]
s type 'int *' [-Wformat]
quelltext.c:6:14: warning: format '%i' expects argument of type 'int', but
argument 4 has type 'int *' [-Wformat]
s type 'int *' [-Wformat]
quelltext.c:6:14: warning: format '%i' expects argument of type 'int', but
argument 5 has type 'int *' [-Wformat]
s type 'int *' [-Wformat]
-
typedef int ISO8601_JJJJMMTT[3]; //das ist schon ein Array typedef struct{ int tag; ISO8601_JJJJMMTT datum[4]; // und hier machst du nochmal ein Array daraus ...
dann hast du eien Array von eienm Array. Also musst du da auch zweimal die Klammern nehmen.
day[i].datum[x][1]
Welchen Wert das x haben muss, ob das sinnvoll ist und ob du dieses Array brauchst, musst du wissen.
-
So, das ikst jetzt mein lertzte Version von meinem Programm. Es bestehen keine Fehlermeldungen, aber es wird auch nichts ausgegeben.
Das Programm soll nun folgendes erfüllen:
Es soll der Tag eingegeben werden und ein Zusatzstoff, der nicht in dem Gericht vorkommen soll, deswegen die != . Ich kann den Tag vergleichen, da gibt mir das Programm dann auch die Gerichte für den Richtigen Tag aus, aber der vergleicht die Zusatzstoffe nicht#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; Mensa_Essen essen[4]; } wochentag; int main() { wochentag day[]={{2,{2014,01,14}, {{"Geflügelfrikadelle in Rahmsauce", '0', {3,11,12}, 100, 280, ' '}, {"Falafel, ägyptisch in Kräuterquark-Dip", 'F', {12,0,0}, 120, 270, ' '}, {"Grünkohleintopf mit Weizenbrötchen", 'V', {2,3,11}, 110, 240, ' '}, {"Rinderhüftsteak Cafè de paris mit Kroketten", 'S', {4,11,12}, 545, 685, ' '}}}, {3, {2014,01,15}, {{"Rheinischer Sauerbraten in Rosinensauce",'R',{11,18,0}, 100, 280, ' ' }, {"Gebratener Reis mit Linsen und Gemüse", 'V', {1,11,12}, 120, 270, ' ' }, {"Serbischer Bohneneintopf mit Weizenbrötchen", 'V', {2,3,11,}, 110, 240, ' '}, {"Kotelett Sauce diabolo Rosmarinkartoffeln", 'S', {2,11,0},345, 485, ' ' }}}, {4, {2014,01,16}, {{"Paprikaschote Hackfleischfüllung Tomaten-Basilikum-Sauce", 'S', {3,6,11}, 100, 280, ' ' }, {"Käsespätzle,überbacken", 'F', {1,3,11}, 120, 270, ' ' }, {"Pfälzer Kartoffeleintopf Weizenbrötchen", 'F', {2,3,11}, 110, 240, ' ' }, {"Putenbruststeak Pfefferrahmsauce Kroketten",' ', {3,11,12}, 375, 515, ' ' }}}, {5, {2014,01,17}, {{"Seelachsfilet in Sesamkruste Dillrahmsauce", ' ', {3,11,12}, 120, 310, ' ' }, {"Kartoffel Cordon bleu mit Frischkäse-Kräuter-Füllung Paprikarahmsauce",'F', {6,11,12}, 120, 270, ' ' }, {"Graupeneintopf Weizenbrötchen ", 'V', {2,3,11}, 110, 240, ' ' }, {" ", ' ', {0,0,0}, 0, 0, ' ' }}} }; int i,j, wochentag, zusatz; scanf("%i,%i", &wochentag, &zusatz); for(i=0; i<4; i++) { if(day[i].tag==wochentag) for(j=0; j<4; j++) { if(zusatz!=day[i].essen[j].zusatzstoffe[0] || zusatz!=day[i].essen[j].zusatzstoffe[1] || zusatz!= day[i].essen[j].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[i].essen[j].bezeichnung, day[i].essen[j].spezialkost, day[i].essen[j].zusatzstoffe[0], day[i].essen[j].zusatzstoffe[1], day[i].essen[j].zusatzstoffe[2],day[i].essen[j].centpreisStud, day[i].essen[j].centpreisBed,day[i].essen[j].zusatz); } } return 0; }
Habe den Vergleich auch mal so aufgestellt, aber das ergab nur das gleiche Ergebnis.
int i,j, wochentag, zusatz; scanf("%i,%i", &wochentag, &zusatz); for(i=0; i<4; i++) { for(j=0; j<4; j++) { if(day[i].tag==wochentag && (zusatz!=day[i].essen[j].zusatzstoffe[0] || zusatz!=day[i].essen[j].zusatzstoffe[1] || zusatz!= day[i].essen[j].zusatzstoffe[2]))
-
Lass dir doch mal nach der Eingabe von wochentag und zusatz diese wieder ausgeben.
Und schau dir die Definition von denen noch mal an (welcher Typ). Passt das zu dem Formatspecifier und zu deiner Eingabe?
-
Okay, da finde ich den Fehler, denn für
int zusatz
nimmt er einen anderen Wert an, als der den ich eingebe, obwohl das eine normale int-Variable ist.
ok, ich habe zusatz umbenannt zu zusatz2, da ich gesehen habe, dass ich zusatz ja schon in der Mensa-Struktur habe.
Komischerweise wird mir für den 2. Eingabewert auch etwas ausgegeben, wenn ich nur einen Wert eingebe.
-
pepe90 schrieb:
ok, ich habe zusatz umbenannt zu zusatz2, da ich gesehen habe, dass ich zusatz ja schon in der Mensa-Struktur habe.
Die können denselben Namen haben. Das eine ist ja eine eigene Variable, das andere ein Member einer struct.
Schau dir nochmal den Typ von zusatz in der struct an. Welcher ist das und welchen Inhalt hast du dem zugewiesen?
Und welche Eingabe hast du für zusatz2 gemacht?Oder meinst du etwas zusatzstoffe aus der struct?
-
DirkB schrieb:
Oder meinst du etwas zusatzstoffe aus der struct?
genau die meine ich. Und die ist ja auch eine int. Lustigerweise bekomme ich egal ob ich etwas eingebe oder nicht für zusatz2 32767 ausgegeben. Also, wenn ich die direkt nach der Eingabe ausgebe.
-
pepe90 schrieb:
genau die meine ich.
Ok. Mein Fehler.
pepe90 schrieb:
Lustigerweise bekomme ich egal ob ich etwas eingebe oder nicht für zusatz2 32767 ausgegeben. Also, wenn ich die direkt nach der Eingabe ausgebe.
Machst du die Eingabe auch mit Komma zwischen den Werten?
-
Hatte ich nicht gemacht. Hab es ausprobiert und das war der Fehler dafür. Aber der Vergleich von zusatz2 und zusatzstoffe[] klappt nicht, obwohl es syntaktisch richtig sein sollte. Meinem Verständniss nach.
-
OMG. Ich habs. Der Vergleich ist insofern falsch, als das ist die Vergleiche nicht mit oder sondern mit und vergleichen muss. Denn der eingegebene Stoff soll ja an allen 3 Stellen nicht vorhanden sein.
DirkB und Bashar ich bin euch sehr dankbar.
-
guten tag leute!
ich habe eine ähnliche aufgabe aufbekommen. und ich hab da ein paar kleine probleme.
und zwar beim datenfeld. beir der initialisation siehts bei mir folgend aus:
_
**int main (void) {Mensa_Essen Mein_Mensa_Tag =
{0,"Döner",'R',{2,9,12,19},1,100, 280, 290},
{1,"Salat",'F',{3,19,20,21,15},1,120,250,250},
{2,"Weizenbrötchen",'V',{20,22},1,110, 340, 340},
{3,"Bratwurst",'S',{1,2,3,12,19},1,300, 300, 300},
{4,"Eintopf",'0',{0,0,0},0,75,90,90};**_
es kommt die eine fehlermeldung-
error: expected identifier or '(' before '{' tokenich komm wegen dieser einfach nicht weiter. kann mir hemand helfen?
-
Du willst wohl ein array.