Suche
Suche Menü

Lösung Teil 2

Ein Lösungsvorschlag zur Übung mit Funktionen Teil 2.

/* Getraenke Automat Version 0.5 */

#include<stdio.h>

// --- Funktions-Prototypen ---------------------------
int auswahlGetraenkeSorte();
int eingabeMenge();
float ermittlePreis(int sorte);
float bezahlen(float zuZahlen);
int pruefeGeldstueck(float muenze);
void ausgabeGetraenke(int sorte, int menge);

// --- Hauptprogramm ----------------------------------
int main() {
	printf("Getraenke Automat v0.5\n\n");

	int sorte, menge;
	float preis, zuZahlen, gezahlt;
	
	sorte = auswahlGetraenkeSorte();
	preis = ermittlePreis(sorte);
	menge = eingabeMenge();
	zuZahlen = preis * menge;
	gezahlt = bezahlen(zuZahlen);
	
	if(gezahlt >= zuZahlen) {
		ausgabeGetraenke(sorte, menge);
		printf("\n\nVielen Dank, bitte entnehmen sie ihre Getraenke.\n");
	}else {
		printf("\n\nBezahlvorgang abgebrochen.\n");
		printf("Ausgabe von %.2f Euro.\n", gezahlt);
	}
	
	return 0;
}

// --- Funktionen -------------------------------------
int auswahlGetraenkeSorte() {
	int sorte;
	printf("Waehlen sie ihr Getraenk aus:\n");
	printf("1) Wasser (0,50 Euro)\n");
	printf("2) Limonade (1,00 Euro)\n");
	printf("3) Bier (2,00 Euro)\n\n");
	printf("Geben sie 1, 2 oder 3 ein: ");
	scanf("%d", &sorte);
	return sorte;
}

int eingabeMenge() {
	int menge=1;
	printf("\nGeben sie die gewuenschte Menge ein: ");
	scanf("%d", &menge);
	return menge;
}

/*	ermittelt den Preis zu einer Sorte
	Parameter:	sorte, Nummer der Sorte
	Return-Value:	Preis
*/
float ermittlePreis(int sorte) {
	float preis=0;
	switch(sorte) {
		case 1: preis = 0.5; break;
		case 2: preis = 1.0; break;
		case 3: preis = 2.0; break;
	}
	return preis;
}

/*	Startet Bezahlvorgang
	Parameter:  	zuZahlen, zu zahlender Betrag
	Return-Value:	gezahlter Betrag
*/
float bezahlen(float zuZahlen) {
	printf("\n--- Bezahlvorgang ---\n");
	printf("\nBezahlvorgang abbrechen mit 0\n");
	float einwurf, gezahlt=0;
	do {
		printf("\nEs fehlen noch %.2f Euro.", zuZahlen-gezahlt);
		printf("\nBitte werfen sie ein Geldstueck ein: ");
		scanf("%f", &einwurf);

		// Abbruch pruefen
		if(einwurf == 0) {
			break;
		}
		
		// eingeworfenen Betrag anrechnen
		if(pruefeGeldstueck(einwurf))  {
			gezahlt += einwurf;
		}else {
			printf("\nIhr Geldstueck ist ungueltig.");
		}
		
	} while(gezahlt < zuZahlen);

	return gezahlt;
}

/*	prueft Geldstueck auf Gueltigkeit
	Parameter:  	muenze, entpricht eingeworfenem Geldstueck
	Return-Value:	1, gueltige Muenze
			0, falsche Muenze
*/
int pruefeGeldstueck(float muenze) {	
	// Muenzwert in ganze Zahl umrechnen, also in Cent.
	// Da die case Anweisung nicht mit floats arbeiten kann.
	int cent = muenze * 100;
	switch(cent) {
		case 5:		return 1;
		case 10:	return 1;
		case 20:	return 1;
		case 50:	return 1;
		case 100:	return 1;
		case 200:	return 1;
		default:	return 0;
	}
}

void ausgabeGetraenke(int sorte, int menge) {
	printf("\n--- Getraenkeausgabe ---\n");
	int i;
	for(i=0; i < menge; i++)  {
		printf("\nFlasche %d von %d der Sorte %d wurde ausgegeben.",
			i+1, menge, sorte);
	}
}