Zum Inhalt springen

Problem mit Variablen und Konstanten


FordPrefect

Empfohlene Beiträge

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...