Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Problem mit Variablen und Konstanten

Empfohlene Antworten

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;

}

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.

Warum sollte die Variabel nicht global sein?

Das mit dem Parameter versteh' ich nicht, muss ich noch nachlesen.

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

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?

jap mit den werten aus der main z.b.

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]

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.

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.