[C] Programmier Hilfe

06/23/2011 11:41 Æciid#1
Code:
#include<stdio.h>


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

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;
}


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;
}


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;
}


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);

		if(einwurf == 0) {
			break;
		}

		if(pruefeGeldstueck(einwurf))  {
			gezahlt += einwurf;
		}else {
			printf("\nIhr Geldstueck ist ungueltig.");
		}
		
	} while(gezahlt < zuZahlen);

	return gezahlt;
}

int pruefeGeldstueck(float muenze) {	


	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);
			

	}
}


So , das Programm funktioniert soweit bis man den Betrag komplett bezahlt , danach schließt es sich ich weiß nicht ob er den letzten teil noch bearbeitet da das Fenster wie gesagt sofort zu geht. Mit system ("PAUSE"); erziele ich auch keine erfolge! Ich bitte um einen denk anstoß !
06/23/2011 11:53 Ronox#2
Das system ist aber genau das richtige, habe das ganze jetzt kopiert und eingefügt und getestet siehe hier:
Du must natürlich noch #include <iostream> hinzufügen und system("PAUSE"); vor dem return 0 in deiner Main Funktion setzen.
06/23/2011 12:08 Æciid#3
Quote:
Originally Posted by Ronox View Post
Das system ist aber genau das richtige, habe das ganze jetzt kopiert und eingefügt und getestet siehe hier:
Du must natürlich noch #include <iostream> hinzufügen und system("PAUSE"); vor dem return 0 in deiner Main Funktion setzen.

hm lag dann denke mal am #include .. ist im Buch etwas komplizierter dagestellt -.-


eine weitere frage die ich nicht ganz selbst gelöst bekomme ist das mit dem bezahlen bei mir funzt nur:

00.50
01.00
02.00

obwohl im buch
5
10
20
50
100
200
500

aufgelistet sind mit dem hinweiß * 100 da cent beträge nur wenn ich bei 5 bsp weiße 500 eingebe passiert nichts 00.500 wären dann weider 00.50 und 500.00 im Prinzip 500€
06/23/2011 12:27 black0utCpp#4
mach mal anstatt float bezahlen ()<-> double bezahlen () das ist besser!
06/24/2011 18:05 Bot_interesierter#5
Konsolenprogramme geben die Konsole wieder frei nachdem sie ausgeführt wurden, das ist absichtlich so damit du sie ohne Userinteraktion einfach in Stapelverarbeitungsdateien benützten kannst, außerdem bedient man Konsolenprogramme für gewöhnlich von der Konsole aus, unter Windows wäre das cmd.exe.
Wenn du dennoch das Beenden des Programms hinauszögern möchtest bis der Nutzer eine Taste drückt, dann solltest du lieber auf die getchar Funktion zurückgreifen.
Übrigens solltest du bei Funktionen in C die keine Argumente entgegennehmen ein void zwischen die Klammern schreiben, also "int eingabeMenge(void);" sowohl bei der Deklaration als auch bei der Definition, denn eine leere Argumenten Liste in C heißt dass die Funktion eine beliebige Anzahl an Argumenten entgegen nimmt, mit Funktionen der C-Runtime kann man diese Argumente dann in der Funktion behandeln.

@Ronox
iostream ist kein C Header, du kannst ihn also nicht verwenden wenn du wirklich in C programmierst und was hat system("PAUSE"); bitte mit iostream am Hut?

@blackOutCpp
Weshalb soll denn double generell besser sein als float?
In seinem Fall sollte die Genauigkeit von Float absolut ausreichend sein.
06/24/2011 20:27 black0utCpp#6
Man sollte bei Berechnungen immer double benutzen.Auf diesem Niveau ist es vllt egal
aber später kann sich das rächen und die 32 bit mehr oder weniger ...
06/24/2011 20:49 Bot_interesierter#7
Quote:
Originally Posted by black0utCpp View Post
Man sollte bei Berechnungen immer double benutzen.Auf diesem Niveau ist es vllt egal
aber später kann sich das rächen und die 32 bit mehr oder weniger ...
Oder im Klartext, du wolltest auch mal was sagen...
Wenn du nichts Sinnvolles zu einem Thema beitragen kannst, dann lass es einfach sein.
Hättest du geschrieben, "für komplexere Berechnungen mit Fließkommazahlen solltest du dann aber double verwenden und wenn es noch genauer sein muss einen Typ aus einer Mathematiklib.", dann wäre dein Beitrag nützlich gewesen, aber so ist es schlicht Nonsense.
06/25/2011 00:19 xNopex#8
Quote:
Use float only, iff:
* you know what you do
* you have the knowledge to fight that beast
* you are willing to fight that beast
* you have a very, very, very good reason to use float
* you have at least 4 times thought the whole thing through and
still come to the conclusion that float would be a good idea in
this specific case.
[Only registered and activated users can see links. Click Here To Register...]