[C] Problem Wechselgeld berechnen in C

Maik_97

Mitglied
Guten Abend,

ich habe ein Problem bei einem selbst erstellten Geldautomaten, dabei beim Geld wechseln.

Wenn ich 5.89 Euro einwerfe und einen Kaffee bekommen möchte der 1.70 Euro kostet bekomme ich Rest 4,19 Euro.

Das Problem: Der Geldautomat gibt 2mal 200 Cent aus.. korrekt
Außerdem 1mal 10 Cent , 1mal 5 Cent, 1 mal 2 Cent und 1mal 1Cent ... er müsste entweder 2mal 1 Cent ausgeben aber besser er gibt 2mal 2Cent aus.

C:
int geldwechseln() {

    if(gel=!0) {

    int wechselgeld[] = {1000, 500, 200, 100, 50, 20, 10, 5, 2, 1};

        int i =0;
        int b;

    while(i<=9) {
    
        b = rueck/wechselgeld[i];

            if (b>=0) {
            printf("Sie bekommen %i, mal %i, Cent\n", b, wechselgeld[i]);
            rueck=rueck-b*wechselgeld[i];    
            i++;

            }
    }

return 0;
}
}

Ich vermute mein Fehler liegt bei b.. da ich mir das auf einem zettel alles nochmal aufgeschrieben habe und bei Rest 4.19 Euro hat b den Wert 2,095... da nimmt das Programm b=2 an. Bei Rest 4 hat b den Wert glatt 2.. aber da nimmt das Programm b=1 an warum ist das so?

Würde mich über eine schnelle Rückmeldung freuen.
Gruß Maik
 
Zuletzt bearbeitet von einem Moderator:

Jw456

Top Contributor
b = rueck/wechselgeld;

Java:
b = rueck/wechselgeld[i];

ok ich habe gemerkt das Forum verschluckt die Klammern
 

httpdigest

Top Contributor
Ich kann dein Problem mit dem von dir gezeigten Code nicht nachvollziehen/reproduzieren.
Wenn wir deinen Code mal erstmal kompilierbar machen und ein wenig aufräumen (was die Funktionalität des Programms nicht ändert) und daraus ein MVCE daraus bauen:
C:
#include <stdio.h>
static void wechselgeldAusgeben(int rueck) {
    static const int muenzen[] = { 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 };
    int i = 0;
    int b;
    while (i < sizeof(muenzen)/sizeof(int)) {
        b = rueck / muenzen[i];
        if (b >= 0) {
            printf("Sie bekommen %i x %i Cent\n", b, muenzen[i]);
            rueck = rueck - b * muenzen[i];
            i++;
        }
    }
}
int main(int argc, char** argv) {
    wechselgeldAusgeben(419);
    return 0;
}
Dann ist die Ausgabe:
Code:
Sie bekommen 0 x 1000 Cent
Sie bekommen 0 x 500 Cent
Sie bekommen 2 x 200 Cent
Sie bekommen 0 x 100 Cent
Sie bekommen 0 x 50 Cent
Sie bekommen 0 x 20 Cent
Sie bekommen 1 x 10 Cent
Sie bekommen 1 x 5 Cent
Sie bekommen 2 x 2 Cent
Sie bekommen 0 x 1 Cent
Also: Alles gut. Es werden doch 2 mal 2 Cent ausgegeben.
 

httpdigest

Top Contributor
btw. das hier:
C:
if(gel=!0) {
ist totaler Unsinn, bzw. garantiert nicht das, was gemeint war.
Du prüfst damit, ob der Wert der Zuweisung von !0 an die Variable `gel` ungleich 0 ist.
Da es in C leider kein boolean Typ gibt, sondern alles quasi int ist, geht auch !0 und ergibt 1. Der Wert eines Zuweisungsausdrucks, also hier gel=1, ist selbst auch immer der Wert, der zugewiesen wurde, also 1. Und somit ist die Bedingung von if (1) auch immer erfüllt.
 

Maik_97

Mitglied
Ich kann dein Problem mit dem von dir gezeigten Code nicht nachvollziehen/reproduzieren.
Wenn wir deinen Code mal erstmal kompilierbar machen und ein wenig aufräumen (was die Funktionalität des Programms nicht ändert) und daraus ein MVCE daraus bauen:
C:
#include <stdio.h>
static void wechselgeldAusgeben(int rueck) {
    static const int muenzen[] = { 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 };
    int i = 0;
    int b;
    while (i < sizeof(muenzen)/sizeof(int)) {
        b = rueck / muenzen[i];
        if (b >= 0) {
            printf("Sie bekommen %i x %i Cent\n", b, muenzen[i]);
            rueck = rueck - b * muenzen[i];
            i++;
        }
    }
}
int main(int argc, char** argv) {
    wechselgeldAusgeben(419);
    return 0;
}
Dann ist die Ausgabe:
Code:
Sie bekommen 0 x 1000 Cent
Sie bekommen 0 x 500 Cent
Sie bekommen 2 x 200 Cent
Sie bekommen 0 x 100 Cent
Sie bekommen 0 x 50 Cent
Sie bekommen 0 x 20 Cent
Sie bekommen 1 x 10 Cent
Sie bekommen 1 x 5 Cent
Sie bekommen 2 x 2 Cent
Sie bekommen 0 x 1 Cent
Also: Alles gut. Es werden doch 2 mal 2 Cent ausgegeben.

In Zeile 6 bei ihrem bearbeiteten Programm verstehe ich nicht was sie in der while Schleife geändert haben. Ist das identisch mit meinem Programm?
Bei meinem Programm wird leider nicht 2 mal 2 Cent und 0 mal 1 Cent ausgegeben.
Was haben Sie geändert das es funktioniert hat?

Viele Grüße
 

httpdigest

Top Contributor
Was hast du geändert, dass es funktioniert hat?
Effektiv gar nichts.
Okay, nehmen wir mal deinen ursprünglichen Programmausschnitt und verpacken das in eine kompilierbare/ausführbare Datei:
C:
#include <stdio.h>
static void wechselgeldAusgeben(int rueck) {
    int wechselgeld[] = { 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 };
    int i = 0;
    int b;
    while (i <= 9) {
        b = rueck / wechselgeld[i];
        if (b >= 0) {
            printf("Sie bekommen %i, mal %i, Cent\n", b, wechselgeld[i]);
            rueck = rueck - b * wechselgeld[i];
            i++;
        }
    }
}
int main(int argc, char** argv) {
    wechselgeldAusgeben(419);
    return 0;
}
Ausgabe ist immer noch dieselbe:
Code:
Sie bekommen 0, mal 1000, Cent
Sie bekommen 0, mal 500, Cent
Sie bekommen 2, mal 200, Cent
Sie bekommen 0, mal 100, Cent
Sie bekommen 0, mal 50, Cent
Sie bekommen 0, mal 20, Cent
Sie bekommen 1, mal 10, Cent
Sie bekommen 1, mal 5, Cent
Sie bekommen 2, mal 2, Cent
Sie bekommen 0, mal 1, Cent

Poste doch dein Programm mal als wirklich kompilierbare und ausführbare Datei.
 

Maik_97

Mitglied
Kann ich machen aber das Problem ist das eine text bestand-Datei noch dazugeführt ist die Bestandsdaten einliest.

In der bestands-text Datei sind 14 zahlen die eingelesen werden und durch die jeweiligen Kaffee Rezepte werden die Bestands-Daten geändert.

Ich weiß das hier noch ein paar mehr Fehler drin sind aber erstmal muss ich den Fehler finden beim Geldwechseln bevor ich mit meinem Programm weiter arbeiten kann.

#include <stdio.h>


#define MILCH 0
#define KAFFEE 1
#define KAKAO 2
#define BECHER 3
#define CENT1 4
#define CENT2 5
#define CENT5 6
#define CENT10 7
#define CENT20 8
#define CENT50 9
#define EURO1 10
#define EURO2 11
#define EURO5 12
#define EURO10 13

#define MAX_REZEPTE 4
#define MAX_KOSTEN 4
#define MAX_GELD 10



typedef struct {
char name[20];
int wasser; // ml
int milch; // ml
int kaffee; // gr
int kakao; // gr
}rezept;

typedef struct {
char sorte[20];
int cent; //$
}tabelle;

typedef struct {
char name[20];
int muenzwert;
int menge;
}geld;


int t;
int halt=0;
int i; // Ausgewähltes Getränk
int ende=0;
int f;
int stp=0;
int w;

int bestand[14]; // Bestand an Milch, Kaffee und Kakao, Bechern und Geld

int was;
float gel;
int zurueck;
int rueck;
int cen;

void bestandLesen();
void bestandSchreiben();
int geldwechseln();

rezept rezepte[MAX_REZEPTE]={
{"Kaffee",200,0,6,0},
{"Capuccino",100,40,10,0},
{"Espresso",80,0,9,0},
{"Kakao",0,200,0,10}
};

tabelle stueckpreis[MAX_KOSTEN] = {
{"Kaffee", 170},
{"Capuccino", 300},
{"Espresso", 200},
{"Kakao", 150}
};

geld kapital[MAX_GELD] = {
{"Ein Cent", 1, 0},
{"Zwei Cent", 2, 0},
{"Fünf Cent", 5, 0},
{"Zehn Cent", 10, 0},
{"Zwanzig Cent", 20, 0},
{"Fünfzig Cent", 50, 0},
{"Ein Euro", 100, 0},
{"Zwei Euro", 200, 0},
{"Fünf Euroschein", 500, 0},
{"Zehn Euroschein",1000, 0},
};



int main() {

for(t=0;t<MAX_KOSTEN;t++){
printf("Ein %s kostet: %d Cent\n", stueckpreis[t].sorte, stueckpreis[t].cent);
}

bestandLesen();
bestandSchreiben();

for(i=0;i<MAX_REZEPTE;i++) {
printf("\nEin %s besteht aus:\n%dml Wasser, %dml Milch, %dgr Kaffee und %dgr Kakao\n\n",
rezepte.name, rezepte.wasser, rezepte.milch,
rezepte.kaffee, rezepte.kakao);
}

do { // Einen Cappucino anrühren:
printf("\nWas solls sein? 0 Kaffe 1 Capu 2 Espresso 3 Kakao 4 ENDE");
fflush(stdin);
scanf("%i",&was); // rezepte[1] ist Capuccino

if(was==4) {
ende=1;
}
else if ((was==0) && (bestand[KAFFEE]>=rezepte[was].kaffee)) {
printf("Bestand ausreichend\n");
ende=0;

printf("Bitte Geld einwerfen\n");
scanf("%f", &gel);

cen=(gel*100);
rueck=(cen-stueckpreis[was].cent);

if(cen>=stueckpreis[was].cent) {
printf("Ausreichend Geld eingeworfen...\n");


//Prüfen ob Geldwechseln möglich ist...


geldwechseln();

printf("Du bekommst einen %s\n",rezepte[was].name); // Das wäre jetzt nicht nötig
bestand[MILCH]=bestand[MILCH]-rezepte[was].milch;
bestand[KAFFEE]=bestand[KAFFEE]-rezepte[was].kaffee;
bestand[KAKAO]=bestand[KAKAO]-rezepte[was].kakao;
bestand[BECHER]=bestand[BECHER]-1;
bestand[CENT1];
bestand[CENT2];

printf("\nRohstoffbestand nach dem Anruehren:\n");
printf("Milch %i ml Kaffee %i gr Kakao %i gr Cent %i\n",bestand[MILCH],bestand[KAFFEE],bestand[KAKAO],bestand[CENT1]);
printf("Noch %i Becher da\n",bestand[BECHER]);
printf("%i\n",bestand[CENT2]);
printf("\nBitte Getraenkt entnehmen");
}

else if (gel<stueckpreis[was].cent) {
printf("Nicht genug Geld eingeworfen!");
printf("Ihr eingeworfenes Geld: %f Euro", gel);
}

}
else if ((was==0) && (bestand[KAFFEE]<rezepte[was].kaffee)) {
printf("Bestand nicht ausreichend, Automat muss aufgefuellt werden");
ende==1;
}
else if ((was==1) && (bestand[MILCH]>=rezepte[was].milch) && (bestand[KAFFEE]>=rezepte[was].kaffee)) {
printf("Bestand ausreichend");
ende=0;

printf("Du bekommst einen %s\n",rezepte[was].name); // Das wäre jetzt nicht nötig
bestand[MILCH]=bestand[MILCH]-rezepte[was].milch;
bestand[KAFFEE]=bestand[KAFFEE]-rezepte[was].kaffee;
bestand[KAKAO]=bestand[KAKAO]-rezepte[was].kakao;
bestand[BECHER]=bestand[BECHER]-1;

printf("Rohstoffbestand nach dem Anruehren\n");
printf("Milch %i ml Kaffee %i gr Kakao %i gr Cent %i\n",bestand[MILCH],bestand[KAFFEE],bestand[KAKAO],bestand[4]);
printf("Noch %i Becher da\n",bestand[BECHER]);
printf("\nBitte Getraenkt entnehmen");
}

else if ((was==1) && (bestand[MILCH]<rezepte[was].milch) && (bestand[KAFFEE]<rezepte[was].kaffee)) {
printf("Bestand nicht ausreichend, Automat muss aufgefuellt werden");
ende==1;
}
else if ((was==2) && (bestand[KAFFEE]>=rezepte[was].kaffee)) {
printf("Bestand ausreichend");
ende=0;
printf("Du bekommst einen %s\n",rezepte[was].name); // Das wäre jetzt nicht nötig
bestand[MILCH]=bestand[MILCH]-rezepte[was].milch;
bestand[KAFFEE]=bestand[KAFFEE]-rezepte[was].kaffee;
bestand[KAKAO]=bestand[KAKAO]-rezepte[was].kakao;
bestand[BECHER]=bestand[BECHER]-1;

printf("Rohstoffbestand nach dem Anruehren\n");
printf("Milch %i ml Kaffee %i gr Kakao %i gr\n",bestand[MILCH],bestand[KAFFEE],bestand[KAKAO]);
printf("Noch %i Becher da\n",bestand[BECHER]);
printf("\nBitte Getraenkt entnehmen");
}
else if ((was==2) && (bestand[KAFFEE]<rezepte[was].kaffee)) {
printf("Bestand nicht ausreichend, Automat muss aufgefuellt werden");
ende==1;
}
else if ((was==3) && (bestand[KAKAO]>=rezepte[was].kakao) && (bestand[MILCH]>=rezepte[was].milch)) {
printf("Bestand ausreichend");
ende=0;
printf("Du bekommst einen %s\n",rezepte[was].name); // Das wäre jetzt nicht nötig
bestand[MILCH]=bestand[MILCH]-rezepte[was].milch;
bestand[KAFFEE]=bestand[KAFFEE]-rezepte[was].kaffee;
bestand[KAKAO]=bestand[KAKAO]-rezepte[was].kakao;
bestand[BECHER]=bestand[BECHER]-1;

printf("Rohstoffbestand nach dem Anruehren\n");
printf("Milch %i ml Kaffee %i gr Kakao %i gr\n",bestand[MILCH],bestand[KAFFEE],bestand[KAKAO]);
printf("Noch %i Becher da\n",bestand[BECHER]);
printf("\nBitte Getraenkt entnehmen");
}
else if ((was==3) && (bestand[KAKAO]<rezepte[was].kakao) && (bestand[MILCH]<rezepte[was].milch)) {
printf("Bestand nicht ausreichend, Automat muss aufgefuellt werden");
ende==1;
}

} while(ende==0);

printf("Vielen Dank und beehren Sie uns bald wieder.\n");

}

void bestandLesen() {
FILE *in;
in=fopen("bestand.dat","r");
fscanf(in,"%i",&bestand[MILCH]);
fscanf(in,"%i",&bestand[KAFFEE]);
fscanf(in,"%i",&bestand[KAKAO]);
fscanf(in,"%i",&bestand[BECHER]);
fscanf(in,"%i",&bestand[CENT1]);
fscanf(in,"%i",&bestand[CENT2]);
fscanf(in,"%i",&bestand[CENT5]);
fscanf(in,"%i",&bestand[CENT10]);
fscanf(in,"%i",&bestand[CENT20]);
fscanf(in,"%i",&bestand[CENT50]);
fscanf(in,"%i",&bestand[EURO1]);
fscanf(in,"%i",&bestand[EURO2]);
fscanf(in,"%i",&bestand[EURO5]);
fscanf(in,"%i",&bestand[EURO10]);

/*MAX_BETRAG=(kapital[0]+kapital[123456789])*/

printf("\nBestand an Rohstoffen:\n");
printf("Milch %i ml\nKaffee %i gr\nKakao %i gr\n%i 1Centstuecke\n%i 2Centstuecke\n%i 5Centstuecke\n%i 10Centstuecke\n%i 20Centstuecke\n%i 50Centstuecke\n%i 1Eurostuecke\n%i 2Eurostuecke\n%i 5Euroschein\n%i 10Euroschein\n",bestand[MILCH],bestand[KAFFEE],bestand[KAKAO],bestand[CENT1],bestand[CENT2],bestand[CENT5],bestand[CENT10],bestand[CENT20],bestand[CENT50],bestand[EURO1],bestand[EURO2],bestand[EURO5],bestand[EURO10]);


fclose(in);
}

void bestandSchreiben() {
FILE *out;
out=fopen("bestand.dat","w");
fprintf(out,"%i\n",bestand[MILCH]);
fprintf(out,"%i\n",bestand[KAFFEE]);
fprintf(out,"%i\n",bestand[KAKAO]);
fprintf(out,"%i\n",bestand[BECHER]);
fprintf(out,"%i\n",bestand[CENT1]);
fprintf(out,"%i\n",bestand[CENT2]);
fprintf(out,"%i\n",bestand[CENT5]);
fprintf(out,"%i\n",bestand[CENT10]);
fprintf(out,"%i\n",bestand[CENT20]);
fprintf(out,"%i\n",bestand[CENT50]);
fprintf(out,"%i\n",bestand[EURO1]);
fprintf(out,"%i\n",bestand[EURO2]);
fprintf(out,"%i\n",bestand[EURO5]);
fprintf(out,"%i\n",bestand[EURO10]);

fclose(out);
}

int geldwechseln() {

if(gel!=0) {

int wechselgeld[] = {1000, 500, 200, 100, 50, 20, 10, 5, 2, 1};

int i = 0;
int b;

while(i<=9) {

b = rueck/wechselgeld;

if (b>=0) {
printf("Sie bekommen %i, mal %i, Cent\n", b, wechselgeld);
rueck=rueck-b*wechselgeld;
i++;

}
}

return 0;
}
}
 

httpdigest

Top Contributor
Vielleicht noch zusätzlich: Die von dir beobachtete Ausgabe von:
2mal 200 Cent aus.. korrekt
Außerdem 1mal 10 Cent , 1mal 5 Cent, 1 mal 2 Cent und 1mal 1Cent
wäre ja korrekt, wenn der auszuzahlende Betrag 418 statt 419 Cent betrüge.
Ich vermute also, dass deine Funktion nicht mit 419 als Eingabe rechnet, sondern mit 418.
Das heisst, das vermutete Fehlverhalten liegt nicht an der Funktion geldwechseln.
 

Maik_97

Mitglied
Vielleicht noch zusätzlich: Die von dir beobachtete Ausgabe von:

wäre ja korrekt, wenn der auszuzahlende Betrag 418 statt 419 Cent betrüge.
Ich vermute also, dass deine Funktion nicht mit 419 als Eingabe rechnet, sondern mit 418.
Das heisst, das vermutete Fehlverhalten liegt nicht an der Funktion geldwechseln.
ja das kann auch sein wenn ich zum Beispiel als Rest 398 Cent habe dann fehlt auch wieder 1 Cent.
 

Maik_97

Mitglied
Dann müsste der Fehler hier liegen deiner Meinung nach, weil sonst änder ich niergends rueck in meinem Programm.

scanf("%f", &gel);

cen=(gel*100);
rueck=(cen-stueckpreis[was].cent)
 
K

kneitzel

Gast
Gib doch mal cen aus. Dann siehst du ja, mit was er rechnet.

Evtl. schlägt einfach eine Ungenauigkeit zu und das gel ist halt nicht 4,19 sondern 4,18999.... Und mal 100 und Nachkomma abgeschnitten ergibt dann halt 418 und nicht 419.

Daher ggf. mit runden rechnen oder so.

Und so es tatsächlich so ist wie ich vermutet habe, dann hast du jetzt ein tolles Beispiele, wieso Beträge eben nicht einfach als flott oder double gespeichert werden sollten.
 

Maik_97

Mitglied
Guten Morgen kneitzel,

danke für den Tipp mit dem runden es liegt tatsächlich ein Rundungsfehler vor cen wird bei einer Eingabe um 1 Cent abgerundet. Gibt es einen Rundungsoperator?
 
K

kneitzel

Gast
Also erst einmal direkt zum "Runden": Da wird es bestimmt auch Methoden geben, aber du kannst da ja selbst einfach eingreifen. Du kannst ja 0.5 addieren, ehe Du es zu einem int wandelst. (cen=gel * 100 + 0.5;)

Es geht hier aber auch nicht um eine Rundung sondern um eine Ungenauigkeit bei der Speicherung von Werten:

Zahlen werden ja im Dualen System gespeichert, es gibt also nur 1er und 0er.
Im Dezimalen System ist 123,45 = 1*10^2 + 2*10^1 + 3*10^0 + 4*10^-1 + 5*10^-2
Im dualen System geht das prinzipiell genau so: Du hast von mir aus 0,101 = 0*2^0 + 1*2^-1 + 0*2^-2 + 1*10^-3

Falls dies hier noch leichte Probleme bereitet: x^-y = 1/x^y, d.h. die Nachkommastellen haben den Wert 1/2, 1/4, 1/8, ...
Nun zerleg doch einfach mal die Zahl 0,1 des Zehnersystems in das Duale System. Das wird so nicht hinhauen. Das ist also ähnlich wie im Dezimalen System das 1/3: 0,33333333
Da Du nicht unendlich viele Stellen schreiben willst/kannst, wird es Ungenau. Und schon ist 1/3 *3 nicht mehr 1 sondern 0,9999999
Die Berechnung ist exakt - das Problem kam von der Darstellung.

Du hast also gar nicht 4,19 in der Variable stehen. Du hast da einen anderen Wert wie 4,189...... - das lässt sich auch zur Not exakt darstellen, wenn man das will. Für float hatte ich mal eine Webseite, mit der man spielen konnte. Da konnte man einen Wert eingeben, also z.B. 4,19 und dann wurde angezeigt, welcher Wert dann in Wirklichkeit gespeichert wurde. Die Webseite habe ich jetzt auf Anhieb aber nicht gefunden.

Statt zu runden würde es dann jetzt sogar ausreichen, dass Du lediglich die Ungenauigkeit hinzufügst. Da reicht also auch schon deutlich weniger also z.B. 0.1 oder so. Aber es spielt keine Rolle, 0.5 von oben kann da direkt bleiben.
 

Maik_97

Mitglied
Der Fehler beim geldwechseln hat sich erledigt und jetzt funktioniert es bei der Ausgabe einwandfrei.

Nun gibt es ein neues Problem, wie speichert man von einer while Schleife bei den erzeugten 1Cent, 2 Cent ... eingelesenen Werten diese in einem Array ab? Um diese dann wieder von der Bestands.dat txt des Wechselgeldes abzuziehen.?

Ich hoffe die Frage ist einigermaßen verständlich
Gruß Maik
 
K

kneitzel

Gast
Hast Du denn schon irgendwelche Ideen oder Ansätze?

Schau Dir z.B. mal an, wie die Werte des Wechselgeldes gespeichert und zugegriffen werden.
 

Maik_97

Mitglied
Ja ich würde probieren die Werte b, also die Anzahl der Cents aus der while schleife in einem mehrdimensionalen Array zu speichern. Dabei hab ich eigentlich kein Problem beim erstellen des Arrays sondern eher wie ich die Anzahl der Cent-Beträge von b in das Array überführen kann.?

Außerdem werden die Anzahl der zurückgegebenen Centwerte nur ausgegeben und nicht gespeichert genau das ist der Punkt.

int geldwechseln() {

if(gel!=0) {

int wechselgeld[] = {1000, 500, 200, 100, 50, 20, 10, 5, 2, 1};

int i = 0;
int b;

while(i<=9) {

b = rueck/wechselgeld;

if (b>=0) {
printf("Sie bekommen %i, mal %i, Cent\n", b, wechselgeld);
rueck=rueck-b*wechselgeld;
i++;

Ausschnitt von dem Quelltext.
 
K

kneitzel

Gast
Bitte schreibe Code immer in Code Tags. Also das Symbol </> links oberhalb des Eingabefelds drücken und dann im popup die entsprechende Methode kopieren.

Und noch sehe ich keinerlei Array. b ist ein int und kein Array.

Und dann an der Stelle: Bitte verwende aussagekräftige Bezeichner! b, i, gel, ... Das ist so nicht akzeptabel in meinen Augen. Mich stört es weniger, aber Dir erschwert es das Verständnis nur noch um so mehr.

Dann nutzt Du in der Methode Variablen, die nicht in der Methode definiert wurden. Also die weder Parameter noch lokale Variable sind -> Somit hast Du vermutlich sowas wie globale Variablen. Damit hast Du einen Weg, wie Du Werte auch außerhalb der Methode weiter verwenden kannst ...

Die frage ist jetzt, ob das schon Deine Definition von "speichern" erfüllt. Wenn Du Werte in eine Datei schreiben willst, dann kannst Du das Format frei definieren und dann musst Du es nur in die Datei Schreiben bzw. wieder lesen.
 

Maik_97

Mitglied
Okay mache ich nächstes mal danke für den Tipp.

Vom Grundprinzip her müssen wir die Anzahl der Centbeträge des Wechselgeldes in der Schleife von einer Bestand Text-Datei abziehen. Ich weiß aber nicht wie man diese in einem Array abspeichern kann damit wir diese von den Centbeträgen der Bestands-Datei abziehen können. Wenn die Bestände leer sind sollen wir "Bestand auffüllen" ausgeben.

C:
bestand[MILCH]=bestand[MILCH]-rezepte[was].milch;
bestand[KAFFEE]=bestand[KAFFEE]-rezepte[was].kaffee;
bestand[KAKAO]=bestand[KAKAO]-rezepte[was].kakao;
bestand[BECHER]=bestand[BECHER]-1;
bestand[CENT1];
bestand[CENT2];

Bei den Rezepten war es kein Problem diese in den Beständen zu ändern da diese feste Werte haben.
Da wir aber beim Wechselgeld unterschiedlich hohe Centbeträge haben müssten wir diese ja irgendwie mit b und dem wechselgeld in einem Array speichern um auf die Bestands-Datei zugreifen zu können.?
 
K

kneitzel

Gast
Du hast Dich auch jetzt feste Werte.

Nur zur Verdeutlichung - das wirst Du im Code nicht brauchen:
Wenn Du das folgende Array hast:
[I][I][I][I][I]int wechselgeld[] = {1000, 500, 200, 100, 50, 20, 10, 5, 2, 1};[/I][/I][/I][/I][/I]
Dann kannst Du jetzt auch Konstanten definieren für jeden Wert. CENT1000 ist 0 - das erste Element
CENT500 ist 1 - das zweite Element

Und dann kannst Du wechselgeld[CENT1000] aufrufen.

Wenn Du den Bestand in einem ebensolchen Array hast, dann kannst Du auch den Bestand so ansprechen:
bestand[CENT1000] kannst Du abfragen oder einen Wert zuweisen.

Die wichtige Frage ist aber jetzt: Brauchst Du diese Konstanten überhaupt? Und das sieht nicht so aus.

Denn beim Wechselgeld bist Du ja eine Schleife durchgegangen. Und wenn Du nun an Position i Elemente heraus nimmst, dann kannst Du den Bestand an dieser Stelle auch anpassen.
 

Maik_97

Mitglied
Ich brauche aber nicht die Array-Elemente vom Wechselgeld die habe ich ja schon in einem array abgespeichert.

Ich brauche die Anzahl von den Centstücken die beim wechseln ausgegeben werden! Das wären ja die Werte vom int b!

Und die Centstücke von int b möchte ich gerne in einem Array abspeichern um die von der bestand.dat abzuziehen.

Also brauche ich einen Tipp zum erstellen eines Arrays mit den einzelnen Centbeträgen. Bsp Rest 415 wären dann 2x 200 Cent 1x 10 Cent und 1x 5 Cent. Die dann einzeln von der bestand.dat abgezogen werden sollen.!!
 
K

kneitzel

Gast
Ich verstehe Dein Problem derzeit schlicht nicht.

- Wie in C ein Array erstellt wird, weisst Du? Ansonsten: Google wird dies schnell und einfach erklären.
- Bezüglich des Wo: Dazu habe ich ja etwas bezüglich globaler Variablen gesagt. Damit Du so eine Variable sowohl außerhalb als auch innerhalb der Methode Zugriff hast sollte damit dann doch klar sein, oder?
- Bleibt maximal der Zugriff auf das Array. Dazu habe ich versucht, dir mit ein paar Worten zu erläutern - dazu habe ich versucht eine Brücke zu dem Code zu schlagen, den Du angeblich verstanden hast.
 

Jw456

Top Contributor
Java:
int centRuek[10];


int geldwechseln() {

    if(gel!=0) {

        int wechselgeld[] = {1000, 500, 200, 100, 50, 20, 10, 5, 2, 1};

        int i = 0;
        int b;

        while(i<=9) {

            b = rueck/wechselgeld;

            if (b>=0) {
                printf("Sie bekommen %i, mal %i, Cent\n", b, wechselgeld);
                centRuek[i] = b;

                rueck=rueck-b*wechselgeld;
                i++;

            }
        }

    return 0;
    }
}
 

Maik_97

Mitglied
Och kneitzel...

Ich lese aus der Bestands-Datei jeweils die Anzahl für Milch,kaffee,kakao,becher und dann für die einzelnen Münzen und Scheine ein. Diese bearbeitete ich dann durch das Programm und bei milch,kaffe,kakao,becher klappt es ohne Probleme weil ein fester Wert abgezogen werden kann(Sind vorgegeben durch die einzelnen Rezepte).

Bei dem Geld ist es schwerer! Da man beliebig hohe Werte eintragen kann und dadurch das Wechselgeld variabel(unterschiedlich hoch) ausfällt.
Dadurch hast du immer eine unterschiedliche Anzahl von den Münzen(Scheinen). Diese lassen wir uns ja vom Programm (unter dem Quellcode) ausgeben.

Und das eigentliche Problem ist jetzt wie man die Anzahl der einzelnen Münzen des Wechselgeldes in einem Array speichert und dann von der Bestands-Datei abzieht.

C:
void bestandLesen() {
FILE *in;
in=fopen("bestand.dat","r");
fscanf(in,"%i",&bestand[MILCH]);
fscanf(in,"%i",&bestand[KAFFEE]);
fscanf(in,"%i",&bestand[KAKAO]);
fscanf(in,"%i",&bestand[BECHER]);
fscanf(in,"%i",&bestand[CENT1]);
fscanf(in,"%i",&bestand[CENT2]);
fscanf(in,"%i",&bestand[CENT5]);
fscanf(in,"%i",&bestand[CENT10]);
fscanf(in,"%i",&bestand[CENT20]);
fscanf(in,"%i",&bestand[CENT50]);
fscanf(in,"%i",&bestand[EURO1]);
fscanf(in,"%i",&bestand[EURO2]);
fscanf(in,"%i",&bestand[EURO5]);
fscanf(in,"%i",&bestand[EURO10]);

/*MAX_BETRAG=(kapital[0]+kapital[123456789])*/

printf("\nBestand an Rohstoffen:\n");
printf("Milch %i ml\nKaffee %i gr\nKakao %i gr\n%i 1Centstuecke\n%i 2Centstuecke\n%i 5Centstuecke\n%i 10Centstuecke\n%i 20Centstuecke\n%i 50Centstuecke\n%i 1Eurostuecke\n%i 2Eurostuecke\n%i 5Euroschein\n%i 10Euroschein\n",bestand[MILCH],bestand[KAFFEE],bestand[KAKAO],bestand[CENT1],bestand[CENT2],bestand[CENT5],bestand[CENT10],bestand[CENT20],bestand[CENT50],bestand[EURO1],bestand[EURO2],bestand[EURO5],bestand[EURO10]);


fclose(in);
}

void bestandSchreiben() {
FILE *out;
out=fopen("bestand.dat","w");
fprintf(out,"%i\n",bestand[MILCH]);
fprintf(out,"%i\n",bestand[KAFFEE]);
fprintf(out,"%i\n",bestand[KAKAO]);
fprintf(out,"%i\n",bestand[BECHER]);
fprintf(out,"%i\n",bestand[CENT1]);
fprintf(out,"%i\n",bestand[CENT2]);
fprintf(out,"%i\n",bestand[CENT5]);
fprintf(out,"%i\n",bestand[CENT10]);
fprintf(out,"%i\n",bestand[CENT20]);
fprintf(out,"%i\n",bestand[CENT50]);
fprintf(out,"%i\n",bestand[EURO1]);
fprintf(out,"%i\n",bestand[EURO2]);
fprintf(out,"%i\n",bestand[EURO5]);
fprintf(out,"%i\n",bestand[EURO10]);

fclose(out);
}

So sieht die Ausgabe vom Wechselgeld aus:

Ausreichend Geld eingeworfen...
Sie bekommen 0, mal 1000, Cent
Sie bekommen 0, mal 500, Cent
Sie bekommen 0, mal 200, Cent
Sie bekommen 1, mal 100, Cent
Sie bekommen 1, mal 50, Cent
Sie bekommen 1, mal 20, Cent
Sie bekommen 0, mal 10, Cent
Sie bekommen 1, mal 5, Cent
Sie bekommen 0, mal 2, Cent
Sie bekommen 0, mal 1, Cent
Du bekommst einen Kaffee




Hier ist die Bestands-Datei:
1000 //Milch
500 //Kaffee
1000 // unsw.
870
5 // ab hier Centbeträge 1,2,5, unsw
4
5
11
11
10
10
5
10
5

Besser kann ich die Frage nicht mehr formulieren.
Schöne Grüße
 
K

kneitzel

Gast
Das centRuek[i] = b; würde ich auf jeden Fall vor das if ziehen, damit bei mehreren Aufrufen nicht alte Werte stehen bleiben.
Und dann wird auch schnell klar: das b kann ganz entfallen:
Java:
int centRuek[10];


int geldwechseln() {

    if(gel!=0) {
        int wechselgeld[] = {1000, 500, 200, 100, 50, 20, 10, 5, 2, 1};
        int i = 0;
        while(i<=9) {
            centRuek[i] = rueck/wechselgeld;
            if (centRuek[i] >= 0) {
                printf("Sie bekommen %i, mal %i, Cent\n", centRuek[i], wechselgeld);
                rueck=rueck - centRuek[i] * wechselgeld;
                i++;
            }
        }
    return 0;
    }
}

Was da jetzt noch etwas stört: wechselgeld und centRueck gehören relativ stark zusammen - die würde ich also auch zusammen halten.
Die magische Nummer 10 (bzw. 9 als 10-1) würde ich auch über eine Konstante lösen ...
 

Maik_97

Mitglied
Java:
int centRuek[10];


int geldwechseln() {

    if(gel!=0) {

        int wechselgeld[] = {1000, 500, 200, 100, 50, 20, 10, 5, 2, 1};

        int i = 0;
        int b;

        while(i<=9) {

            b = rueck/wechselgeld;

            if (b>=0) {
                printf("Sie bekommen %i, mal %i, Cent\n", b, wechselgeld);
                centRuek[i] = b;

                rueck=rueck-b*wechselgeld;
                i++;

            }
        }

    return 0;
    }
}

Moin danke für die Rückmeldung aber jetzt würdest du ja nur die Anzahl der Centwerte in einem Array abspeichern und wüsstet nicht welches Wechselgeld dazu gehört.
 

Maik_97

Mitglied
bei mir funktioniert die Datei nicht die du hochgeladen hast.

: In function `geldwechseln':
:358: error: invalid operands to binary /
:361: error: invalid operands to binary *
:367:2: warning: no newline at end of file
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Du Fürst ja deinen Bestand der Kasse bestimmt zweimal einmal als Münzen, und dann bestimmt nochmal alle Münzen addiert zu einem dezimalwert.
Du brauchst doch nur das centRuek mit einer Schleife von deinem Kapital abziehen. Dann hast Du dein neues Kapital.
Oder du machst es gleich in der Schleife.

Da solltest du auch noch prüfen ob überhaupt genug Wechselgeld im Automat ist.
Sonst stimmt deine Rechnung nicht.
 

Jw456

Top Contributor
In deinen Code scheint einiges nicht zu passen zB.
deine Ausgaben werden nicht gehen.

Java:
for(i=0;i<MAX_REZEPTE;i++) {
    printf("\nEin %s besteht aus:\n%dml Wasser, %dml Milch, %dgr Kaffee und %dgr Kakao\n\n",
    rezepte.name, rezepte.wasser, rezepte.milch,
    rezepte.kaffee, rezepte.kakao);
}
// ist falsch rezepte ist ein Array


for(i=0;i<MAX_REZEPTE;i++) {
    printf("\nEin %s besteht aus:\n%dml Wasser, %dml Milch, %dgr Kaffee und %dgr Kakao\n\n",
    rezepte[i].name, rezepte[i].wasser, rezepte[i].milch, rezepte[i].kaffee, rezepte[i].kakao);
}
 

Jw456

Top Contributor
Java:
#define MILCH 0
#define KAFFEE 1
#define KAKAO 2
#define BECHER 3
#define CENT1 4
#define CENT2 5
#define CENT5 6
#define CENT10 7
#define CENT20 8
#define CENT50 9
#define EURO1 10
#define EURO2 11
#define EURO5 12
#define EURO10 13
    
int bestand[14]; // Bestand an Milch, Kaffee und Kakao, Bechern und Geld   



int geldwechseln() {
    if(gel!=0) {
        int wechselgeld[] = {1000, 500, 200, 100, 50, 20, 10, 5, 2, 1};
        int i = 0;
        int b;

        while(i<=9) {
            b = rueck/wechselgeld;
            if (b>=0) {
                printf("Sie bekommen %i, mal %i, Cent\n", b, wechselgeld);
                bestand[14-i] = bestand[14-i]-b;
                rueck=rueck-b*wechselgeld;
                i++;
            }
        }

    return 0;
    }
}
 

Jw456

Top Contributor
Damit dein Bestand stimmt solltest du auch ermitteln welche Münzen der User eingeworfen hat. Und dem Bestand hinzufügen.
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben