FordPrefect Geschrieben 14. August 2009 Teilen Geschrieben 14. August 2009 Hallo Leute. Ich bin noch recht neu in C und stoße jetzt auf ein Problem. Im folgenden Programm soll nach der Auswahl die Variable preis den Wert unterschiedlicher Konstanten (je nach Wahl) enthalten. Allerdings wird kein Wert übermittelt und ich kann den Fehler einfach nicht finden. #include <stdio.h> // Geld typedef struct { char name[15]; // Name des Geldstücks int wert; // Wert int menge; // Anzahl } geld; // Kaffeerezepte typedef struct { char name[15]; // Name int becher; // Becher int milch; // Milch in ml int kaffee; // Kaffee in gr int kakao; // Kakaopulver in gr } kaffeerezept; // Bestand typedef struct { char name[15]; int anzahl; } bestand; int geldeingabe () { //Kaffeearray kaffeerezept rezept[4]={ {"Kaffee",1,0,250,0}, {"Cappucino",1,125,125,0}, {"Esspresso",1,0,100,0}, {"Kakao",1,250,0,25}, }; // GeldArray geld kapital[5]={ {"Zehn Cent",10,0}, // Array Speicher 0 {"Zwanzig Cent",20,0}, // Array Speicher 1 {"Fünfzig Cent",50,0}, {"Ein Euro",100,0}, {"Zwei Euro",200,0} // Array Speicher 4 }; FILE * kapital_datei; // Vorhandenes Geld FILE * wechsel_datei; // Vorhandenes Wechselgeld FILE * kasse_datei; // Einnahmen FILE * bestand_datei; // Kaffebestand int i; // Zählvariable; int geldeingabe; // Für die Geldstückauswahl int geldeingezahlt = 0; // Eingezahltes Geld int wechselgeld = 0; int preis; printf("Werfen sie bitte %d Cent ein.\n", preis); kapital_datei=fopen("kapital.dat","r"); for(i=0;i<5;i++) fscanf(kapital_datei, "%d", &kapital[i].menge); fclose(kapital_datei); printf("1 für 10 Cent. Sie haben %d 10 Centmünzen\n", kapital[0].menge); printf("2 für 20 Cent. Sie haben %d 20 Centmünzen\n", kapital[1].menge); printf("3 für 50 Cent. Sie haben %d 10 Centmünzen\n", kapital[2].menge); printf("4 für 1 Euro. Sie haben %d 1 Euromünzen\n", kapital[3].menge); printf("5 für 2 Euro. Sie haben %d 2 Euromünzen\n", kapital[4].menge); do { scanf("%d", &geldeingabe); switch (geldeingabe) { case 1: geldeingezahlt = geldeingezahlt + 10; break; case 2: geldeingezahlt = geldeingezahlt + 20; break; case 3: geldeingezahlt = geldeingezahlt + 50; break; case 4: geldeingezahlt = geldeingezahlt + 100; break; case 5: geldeingezahlt = geldeingezahlt + 200; break; default: printf("Falsche Zahl angegeben!\n"); } if (geldeingezahlt > preis) { printf("Sie haben %d Cent eingegeben und bekommen %d zurück.\n", geldeingezahlt, (geldeingezahlt -preis)); wechselgeld = geldeingezahlt - preis; } else { printf("Sie haben %d Cent eingegeben. \n Es fehlen noch %d Cent\n", geldeingezahlt, (preis - geldeingezahlt)); } } while (geldeingezahlt < preis); printf("%d", wechselgeld); } int main () { FILE * kapital_datei; // Vorhandenes Geld FILE * wechsel_datei; // Vorhandenes Wechselgeld FILE * kasse_datei; // Einnahmen FILE * bestand_datei; // Kaffebestand // Bestandarry bestand bestand_array[4]={ {"Becher",0}, {"Kaffepulver",0}, {"Milch",0}, {"Kakaopulver",0}, }; int i; // Zählvariable; int kwahl; int preis; const int KAFFEEPREIS = 60; const int CAPPUCINOPREIS = 90; printf ("Willkommen bei Starbucks\n"); //hrhr, irre komisch ... printf ("Wählen Sie ein Getränk. Geben Sie ein:\n"); printf ("\n 1 für Kaffee\n 2 für Cappucino\n 3 für Esspresso\n 4 für Kakao\n\n"); // Bestand laden bestand_datei=fopen("bestand.dat", "r"); for(i=0;i<4;i++) fscanf(bestand_datei, "%d", &bestand_array[i].anzahl); fclose(bestand_datei); scanf("%d", &kwahl); switch(kwahl) { case 1: printf("Sie haben Kaffee gewählt.\n"); // Materialcheck Kaffe preis = KAFFEEPREIS; if (bestand_array[0].anzahl < 1) { printf("Leider keine Becher vorhanden!\n"); } else if (bestand_array[2].anzahl < 250) { printf("Zutaten nicht ausreichend vorhanden!\n"); } geldeingabe(); break; case 2: printf("Sie haben Cappucino gewählt.\n"); // Materialcheck Cappucino preis = CAPPUCINOPREIS; if (bestand_array[0].anzahl < 1) { printf("Leider keine Becher vorhanden!\n"); } else if ((bestand_array[2].anzahl < 125) || bestand_array[1].anzahl < 125) { printf("Zutaten nicht ausreichend vorhanden!\n"); } geldeingabe(); break; } return 0; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 15. August 2009 Teilen Geschrieben 15. August 2009 Es gibt in dem Code zwei Variablen mit dem Namen preis. Eine in der Funktion main und eine in der Funktion geldeingabe. Diese beiden Variablen haben nichts miteinander zu tun, sie sind komplett unabhängig. Der gleiche Name bewirkt nicht, dass da irgendwelche Werte übertragen werden. Darum musst du dich schon selbst kümmern, z.B. indem du der Funktion geldeingabe einen Parameter verpasst. Die Lösung sollte übrigens nicht sein, die Variable preis global zu machen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FordPrefect Geschrieben 15. August 2009 Autor Teilen Geschrieben 15. August 2009 Warum sollte die Variabel nicht global sein? Das mit dem Parameter versteh' ich nicht, muss ich noch nachlesen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
chooter696 Geschrieben 15. August 2009 Teilen Geschrieben 15. August 2009 weil globale variablen ein zeichen von schlechtem programmier stil ist. In deinem Beispiel Einfach übergeben. Und am ende hast du die klammer zu vergessen von deiner main. Desweiteren kannst du das return 0 am ende weglassen. An deinem Bsp würde ikch dir noch ein system("pause"); empfehlen. Da bin ich mir aber ncith sicher da ich unter c++ arbeite. dein code geldeingabe(); mit übergabe der wertes Preis geldeingabe(preis); dies musst du überall dort machen wo du diese methode aufrufst. Da du 2 mal in der main in deine methode geldeingang reinspringst muss auch in der 2. der wert übergeben werden. int geldeingabe (int preis) case 1: printf("Sie haben Kaffee gewählt.\n"); // Materialcheck Kaffe preis = KAFFEEPREIS; if (bestand_array[0].anzahl < 1) { printf("Leider keine Becher vorhanden!\n"); [COLOR="Red"]abbruch einfügen[/COLOR] } else if (bestand_array[2].anzahl < 250) { printf("Zutaten nicht ausreichend vorhanden\n"); [COLOR="Red"]abbruch einfügen[/COLOR] } am ende wäre dann noch eine ausgabe wie "Getränk kommt bitte warten ..." sehr schön Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FordPrefect Geschrieben 16. August 2009 Autor Teilen Geschrieben 16. August 2009 Ah, wenn ich geldeingabe(preis) { ... } nehme und preis als integer in main() deklariere funktioniert's. Danke. Also sage ich damit quasi geldeingabe() das es die Variable preis aus main() übernehmen soll? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
chooter696 Geschrieben 16. August 2009 Teilen Geschrieben 16. August 2009 jap mit den werten aus der main z.b. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FordPrefect Geschrieben 16. August 2009 Autor Teilen Geschrieben 16. August 2009 Gut, dank eurer Hilfe konnte ich das Problem lösen, danke! Jetzt tut sich ein zweites auf. Ich habe es so programmiert, dass wenn zu viel Geld eingegeben wurde, Geld aus wechsel in kapital geht. Funktioniert auch ganz prima, aber nur, wenn man mit den Münzen aus wechsel auch das Restgeld "zusammenbauen" kann. Als Beispiel: Der Kaffee kostet 60 Cent, es wird 1 Euro (also 100 Cent) eingeworfen. Wenn jetzt 4 * 10 Cent, 2 * 20 Cent oder 2 * 10 Cent und 1 * 20 Cent in wechsel vorhanden sind klappt die ausgabe wunderbar. Wenn jedoch nur 1 * 50 Cent drin ist bleibt die Schleife stehen. Kann mir jemand einen Tipp geben, wie ich vorher abfragen kann, ob genug Wechselgeld vorhanden ist? Ich hab das schon mit Schleifen probiert, aber es nicht richtig hinbekommen. for(i=0;i<4;i++) { for(r=1;r<4;r++) { if ((wechsel.menge * wechsel.wert) - wechselgeld >= 0 || (wechsel[r].menge * wechsel[r].wert) - wechselgeld >= 0 || wechselgeld / (wechsel.menge * wechsel.wert) + (wechsel[r].menge * wechsel[r].wert) <= 1) { so hab ich die schleife gebaut Anbei mal der ganze Code #include <stdio.h> // Geld typedef struct { char name[15]; // Name des Geldstücks int wert; // Wert int menge; // Anzahl } geld; // Kaffeerezepte typedef struct { char name[15]; // Name int becher; // Becher int milch; // Milch in ml int kaffee; // Kaffee in gr int kakao; // Kakaopulver in gr } kaffeerezept; // Bestand typedef struct { char name[15]; int anzahl; } bestand; geldeingabe (preis) { //Kaffeearray kaffeerezept rezept[4]={ {"Kaffee",1,0,250,0}, {"Cappucino",1,125,125,0}, {"Esspresso",1,0,100,0}, {"Kakao",1,250,0,25}, }; // KapitalArray (Geld des Benutzers) geld kapital[5]={ {"Zehn Cent",10,0}, // Array Speicher 0 {"Zwanzig Cent",20,0}, // Array Speicher 1 {"Fünfzig Cent",50,0}, {"Ein Euro",100,0}, {"Zwei Euro",200,0} // Array Speicher 4 }; // Geld, welches eingeworfen wurde aber noch nicht in die Kasse übergegangen ist geld automat[5]={ {"Zehn Cent",10,0}, // Array Speicher 0 {"Zwanzig Cent",20,0}, // Array Speicher 1 {"Fünfzig Cent",50,0}, {"Ein Euro",100,0}, {"Zwei Euro",200,0} // Array Speicher 4 }; // Kasse (Einnahmen) geld kasse[5]={ {"Zehn Cent",10,0}, // Array Speicher 0 {"Zwanzig Cent",20,0}, // Array Speicher 1 {"Fünfzig Cent",50,0}, {"Ein Euro",100,0}, {"Zwei Euro",200,0} // Array Speicher 4 }; // Kasse (Einnahmen) geld wechsel[5]={ {"Zehn Cent",10,0}, // Array Speicher 0 {"Zwanzig Cent",20,0}, // Array Speicher 1 {"Fünfzig Cent",50,0}, {"Ein Euro",100,0}, {"Zwei Euro",200,0} // Array Speicher 4 }; FILE * kapital_datei; // Vorhandenes Geld FILE * wechsel_datei; // Vorhandenes Wechselgeld FILE * kasse_datei; // Einnahmen FILE * automat_datei; // Einnahmen FILE * bestand_datei; // Kaffebestand int i; // Zählvariable; int geldeingabe; // Für die Geldstückauswahl int geldeingezahlt = 0; // Eingezahltes Geld int wechselgeld = 0; int geldwertinsg; int geldwertinsg_temp; kapital_datei=fopen("kapital.dat","r"); for(i=0;i<5;i++) { fscanf(kapital_datei, "%d", &kapital[i].menge); } fclose(kapital_datei); for(i=0;i<5;i++) // Prüfe ob Geld üerhaupt reicht { geldwertinsg_temp =kapital[i].menge * kapital[i].wert; geldwertinsg = geldwertinsg + geldwertinsg_temp; } if (geldwertinsg < 60) { printf("Sie haben nicht genug Geld!"); } else { printf("Werfen sie bitte %d Cent ein.\n", preis); printf("1 für 10 Cent. Sie haben %d 10 Centmünzen\n", kapital[0].menge); printf("2 für 20 Cent. Sie haben %d 20 Centmünzen\n", kapital[1].menge); printf("3 für 50 Cent. Sie haben %d 10 Centmünzen\n", kapital[2].menge); printf("4 für 1 Euro. Sie haben %d 1 Euromünzen\n", kapital[3].menge); printf("5 für 2 Euro. Sie haben %d 2 Euromünzen\n", kapital[4].menge); /* printf("6 um die Geldeingabe abzubrechen und ein anderes Getränk zu wählen\n"); Funktioniert noch nicht */ do { scanf("%d", &geldeingabe); kasse_datei=fopen("kasse.dat", "r"); // Kasse wird kontrolliert for(i=0;i<5;i++) fscanf(kasse_datei, "%d", &kasse[i].menge); fclose(kasse_datei); kapital_datei=fopen("kapital.dat", "r"); // Kapital wird kontrolliert for(i=0;i<5;i++) fscanf(kapital_datei, "%d", &kapital[i].menge); fclose(kapital_datei); switch (geldeingabe) // Geld wird aus dem Kapital entnommen und in den Automaten gegeben { case 1: if (kapital[0].menge <= 0) printf("Keine 10 Centmünzen vorhanden!"); else { geldeingezahlt = geldeingezahlt + 10; automat[0].menge = automat[0].menge + 1; kapital[0].menge = kapital[0].menge -1; } break; case 2: if (kapital[1].menge <= 0) printf("Keine 20 Centmünzen vorhanden!"); else { geldeingezahlt = geldeingezahlt + 20; automat[1].menge = automat[1].menge + 1; kapital[1].menge = kapital[1].menge -1; } break; case 3: if (kapital[2].menge <= 0) printf("Keine 50 Centmünzen vorhanden!"); else { geldeingezahlt = geldeingezahlt + 50; automat[2].menge = automat[2].menge + 1; kapital[2].menge = kapital[2].menge -1; } break; case 4: if (kapital[3].menge <= 0) printf("Keine 1 Euromünzen vorhanden!"); else { geldeingezahlt = geldeingezahlt + 100; automat[3].menge = automat[3].menge + 1; kapital[3].menge = kapital[3].menge -1; } break; case 5: if (kapital[4].menge <= 0) printf("Keine 2 Euromünzen vorhanden!"); else { geldeingezahlt = geldeingezahlt + 200; automat[4].menge = automat[4].menge + 1; kapital[4].menge = kapital[4].menge -1; } break; /* case 6: printf("Sie haben die Geldeingabe abgebrochen."); default: printf("Falsche Zahl angegeben!\n"); läiuft noch nicht */ } kapital_datei=fopen("kapital.dat", "w+b"); // Kapital wird aktuallisiert for(i=0;i<5;i++) fprintf(kapital_datei, "%d\n", kapital[i].menge); fclose(kapital_datei); if (geldeingezahlt > preis) { printf("Sie haben %d Cent eingegeben und bekommen %d zurück.\n", geldeingezahlt, (geldeingezahlt -preis)); wechselgeld = geldeingezahlt - preis; wechsel_datei=fopen("wechsel.dat", "r"); // Wechselgeld wird kontrolliert for(i=0;i<5;i++) fscanf(kasse_datei, "%d", &wechsel[i].menge); fclose(wechsel_datei); while(wechselgeld != 0) { for(i=0;i<5;i++) { if (wechsel[i].menge == 0) {} else { if (wechsel[i].wert > wechselgeld) {} else { wechselgeld = wechselgeld - wechsel[i].wert; wechsel[i].menge = wechsel[i].menge -1; kapital[i].menge = kapital[i].menge +1; } } // 1. else } // for } // while kapital_datei=fopen("kapital.dat", "w+b"); // Geld in kapital gespeichert for(i=0;i<5;i++) fprintf(kapital_datei, "%d\n", kapital[i].menge); fclose(kapital_datei); wechsel_datei=fopen("wechsel.dat", "w+b"); // Geld in Kasse gespeichert for(i=0;i<5;i++) fprintf(wechsel_datei, "%d\n", wechsel[i].menge); fclose(wechsel_datei); } else { if ((preis - geldeingezahlt) != 0) { printf("Sie haben %d Cent eingegeben. \n Es fehlen noch %d Cent\n", geldeingezahlt, (preis - geldeingezahlt)); } else { printf("Sie haben %d Cent eingegeben. Ihr Getränk kommt ...\n\n" ,geldeingezahlt); } } } // erstes do while (geldeingezahlt < preis); for(i=0;i<4;i++) { kasse[i].menge = kasse[i].menge + automat[i].menge; // Geld wird aus dem Automaten in die Kasse gegeben } kasse_datei=fopen("kasse.dat", "w+b"); // Geld in Kasse gespeichert for(i=0;i<5;i++) fprintf(kasse_datei, "%d\n", kasse[i].menge); fclose(kasse_datei); } // else, wenn genug geld da ist } main() { FILE * kapital_datei; // Vorhandenes Geld FILE * wechsel_datei; // Vorhandenes Wechselgeld FILE * kasse_datei; // Einnahmen FILE * bestand_datei; // Kaffebestand // Bestandarry bestand bestand_array[4]={ {"Becher",0}, {"Kaffepulver",0}, {"Milch",0}, {"Kakaopulver",0}, }; int i; // Zählvariable; int kwahl; int preis; const int KAFFEEPREIS = 60; const int CAPPUCINOPREIS = 90; // do { printf ("Willkommen bei Starbucks\n"); //hrhr, irre komisch ... printf ("Wählen Sie ein Getränk. Geben Sie ein:\n"); printf ("\n 1 für Kaffee\n 2 für Cappucino\n 3 für Esspresso\n 4 für Kakao\n\n"); // Bestand laden bestand_datei=fopen("bestand.dat", "r"); for(i=0;i<4;i++) fscanf(bestand_datei, "%d", &bestand_array[i].anzahl); fclose(bestand_datei); scanf("%d", &kwahl); switch(kwahl) { case 1: printf("Sie haben Kaffee gewählt.\n"); // Materialcheck Kaffe preis = KAFFEEPREIS; if (bestand_array[0].anzahl < 1) { printf("Leider keine Becher vorhanden!\n"); } else if (bestand_array[2].anzahl < 250) { printf("Zutaten nicht ausreichend vorhanden!\n"); } else { geldeingabe(preis); bestand_array[0].anzahl = bestand_array[0].anzahl -1; // Bestand der Zutaten verringern bestand_array[2].anzahl = bestand_array[2].anzahl -250; bestand_datei=fopen("bestand.dat", "w+b"); // neuen Bestand speichern for(i=0;i<4;i++) fprintf(bestand_datei, "%d\n", bestand_array[i].anzahl); fclose(bestand_datei); } break; case 2: printf("Sie haben Cappucino gewählt.\n"); // Materialcheck Cappucino preis = CAPPUCINOPREIS; if (bestand_array[0].anzahl < 1) { printf("Leider keine Becher vorhanden!\n"); } else if ((bestand_array[2].anzahl < 125) || bestand_array[1].anzahl < 125) { printf("Zutaten nicht ausreichend vorhanden!\n"); } geldeingabe(preis); break; } // } // while ( 1 ); lässt das ganze immer wieder ablaufen return 0; } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
chooter696 Geschrieben 16. August 2009 Teilen Geschrieben 16. August 2009 hilfreich wäre noch eine kleine beschreibung deiner "bestand.dat" hab jetzt net so viel bock richtig durch zu gucken welche zeile für was steht. Am besten mit den mindestwerten noch dahinter. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. August 2009 Teilen Geschrieben 16. August 2009 Kann mir jemand einen Tipp geben, wie ich vorher abfragen kann, ob genug Wechselgeld vorhanden ist?Mit einer einfachen if-Anweisung wirst du das nicht abfragen können. Du musst im Prinzip die Geldrückgabe durchspielen und prüfen, ob es aufgeht. Wenn deine innere Schleife für das Wechselgeld einmal komplett durchgelaufen ist, und immer noch Wechselgeld übrig ist, dann hast du nicht genug. Die äußere Schleife ist unnötig. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.