Hallo zusammen! Ich versuche gerade einen Kassenautomaten zu programmieren, der die Zahl der Scheine, Münzen und Cent Stücke ausgeben soll, sowie den jeweiligen Restbetrag. Dazu sollen die Zwischenwerte in Arrays gespeichert werden und es soll struct verwendet werden. Die Funktion an sich funktioniert ohne das struct und das Zwischenspeichern, nur mit den jeweiligen Bedingungen leider nicht und ich finde meinen Fehler nicht. Denn die Ausgabe der Zahlenwerte erfolgt nicht, es erscheint immer nur "nan" und ich weiß nicht warum. Ich würde mich freuen, wenn ihr mal über das Programm schaut und mir weiterhelfen könnt. Mein Programm sieht wie folgt aus: #include <stdio.h> #include <stdlib.h> #include <math.h> struct Geld{ float Geldeinheiten[20]; float anzahl[20]; float Restsumme; }; struct Geld Summe(float a, float b) { struct Geld Geldeinheiten; float n; int i; float scheine[7]={500,200,100,50,20,10,5}; float muenzen[2]={2,1,}; float cent[6]={0.50,0.20,0.10,0.05,0.02,0.01}; int arrays[7]={}; int arraym[8]={}; int arrayc[6]={}; for(i=0;i<7;i++) { printf(" %3.2f x: %3.2f\n",n/scheine[i],scheine[i]); n=fmodf(n,scheine[i]); printf("%3.2f ",n); arrays[i]=n/scheine[i]; //Geldeinheiten.anzahl[i]=n%scheine[i]; } for(i=0;i<8;i++) { printf(" %3.2f x: %3.2f\n",n/muenzen[i],muenzen[i]); n=fmodf(n,muenzen[i]); printf("%3.2f ",n); arraym[i]=n/muenzen[i]; } for (i=0;i<6;i++) { printf(" %3.2f x: %3.2f\n",n/cent[i], cent[i]); n=fmodf(n,cent[i]); printf("%3.2f ",n); arrayc[i]=n/cent[i]; } printf("\n"); return Geldeinheiten; } int main() { struct Geld Geldeinheiten; float n; struct Geld y; float scheine[7]={500,200,100,50,20,10,5}; float muenzen[2]={2,1,}; float cent[8]={0.50,0.20,0.10,0.05,0.02,0.01}; int arrays[7]={}; int arraym[8]={}; int arrayc[6]={}; printf("Eingabe des zu zahlenden Betrags"); scanf("%f",&n); y= Summe(scheine[7],muenzen[8]); printf(" ",y); Geldeinheiten.anzahl[20]=arrays[7],arraym[8],arrayc[6]; printf(" ",Geldeinheiten.anzahl[20]); return 0; } Vielen Dank! LG TerrysPC
Der Compiler gibt zur Ausgabezeile sicher eine Warnung aus. Wenn nicht, erhöhe den Warnlevel. Bei Geldbeträgen rechne in Cent. Da gibt es keine Rundungsfehler. float ist da extrem ungeeignet. Den Bezeichner n nimmt man gewöhnlich für Ganzzahlen. Bei printf("%3.2f ",n); steht die 3 nicht für den Vorkommaanteil sondern für die Gesamtzahl der Zeichen (mit Komma) Bei y= Summe(scheine[7],muenzen[8]); übergibst du die Elemente mit dem Index 7 bzw 8. Die existieren jedoch gar nicht. Zudem benutzt du diese Werte (a undb) in Summe auch gar nicht. Das n aus main kommt auch nirgends mehr vor.
Ein Problem (wohl die Ursache der NaNs) ist:
1 | ...
|
2 | float muenzen[2]={2,1,}; |
3 | ...
|
4 | for(i=0;i<8;i++) |
5 | {
|
6 | printf(" %3.2f x: %3.2f\n",n/muenzen[i],muenzen[i]); |
7 | n=fmodf(n,muenzen[i]); |
8 | printf("%3.2f ",n); |
9 | arraym[i]=n/muenzen[i]; |
10 | }
|
11 | ...
|
Die 8 ist zu groß, du greifst auf Speicher außerhalb des Arrays zu. Außerdem scheint mir die Reihenfolge des fmodf und der Division verkehrt. Weiter: Arithmetik mit nicht-ganzzahligen Fließkommazahlen ist nicht trivial (0.1 z.B. ist nicht exakt darstellbar) und du handelst dir überall Rundungsfehler ein. Einfacher wird es mit Ganzzahltypen, dann in Cent statt Euro.
TerrysPC schrieb: > Geldeinheiten.anzahl[20]=arrays[7],arraym[8],arrayc[6]; Arrays kann man nicht zuweisen. Der Kommaoperator wirkt anderes als du vermutest. Du gibst hier auch nicht ganze Arrays an, sondern einzelne Elemente die auch gar nicht existieren.
1 | #include <stdio.h> |
2 | |
3 | int give_euros(int amount, int unit) |
4 | {
|
5 | int nr_of_euros = amount / (unit * 100); |
6 | if(nr_of_euros > 0) { |
7 | printf("%5dx %3d euro\n", nr_of_euros, unit); |
8 | }
|
9 | return nr_of_euros * unit * 100; |
10 | }
|
11 | |
12 | int give_cents(int amount, int unit) |
13 | {
|
14 | int nr_of_cents = amount / unit; |
15 | if(nr_of_cents > 0) { |
16 | printf("%5dx %3d cent\n", nr_of_cents, unit); |
17 | }
|
18 | return nr_of_cents * unit; |
19 | }
|
20 | |
21 | int main() |
22 | {
|
23 | float amount; |
24 | printf("amount (in Eur): "); |
25 | scanf_s("%f", &amount); |
26 | |
27 | int amount_in_cent = (int)(amount * 100); |
28 | |
29 | static int euros[] = {500, 200, 100, 50, 20, 10, 5, 2, 1}; |
30 | for (int i = 0; i < 9; i++) { |
31 | amount_in_cent -= give_euros(amount_in_cent, euros[i]); |
32 | }
|
33 | |
34 | static int cents[] = {50, 20, 10, 5, 2, 1}; |
35 | for (int i = 0; i < 6; i++) { |
36 | amount_in_cent -= give_cents(amount_in_cent, cents[i]); |
37 | }
|
38 | |
39 | return 0; |
40 | }
|
Hausies erledigt...
:
Bearbeitet durch User
TerrysPC schrieb: > float Geldeinheiten[20]; > float anzahl[20]; Dirk B. schrieb: > Bei Geldbeträgen rechne in Cent. Da gibt es keine Rundungsfehler. > float ist da extrem ungeeignet. absolut, ich wüsste auch nicht warum Anzahl der Geldeinheiten kleiner 1 werden soll warum dort float gebraucht wird. Können deine Geldeinheiten Anzahl Nachkomma haben? 1/2er oder 0,5 20€ Scheine? TerrysPC schrieb: > der die Zahl > der Scheine, Münzen und Cent Stücke halbe Münzen, halbe Scheine? Da würde ich die Münzprüfer aber tauschen wenn die Geld kaputt machen :)
TerrysPC schrieb: > Ich versuche gerade einen Kassenautomaten zu programmieren Hausaufgabe, eh ? Wie kommst du darauf, daß diese okalen Variablen
1 | struct Geld Summe(float a, float b) |
2 | {
|
3 | struct Geld Geldeinheiten; |
4 | float n; |
5 | int i; |
6 | float scheine[7]={500,200,100,50,20,10,5}; |
7 | float muenzen[2]={2,1,}; |
8 | float cent[6]={0.50,0.20,0.10,0.05,0.02,0.01}; |
9 | int arrays[7]={}; |
10 | int arraym[8]={}; |
11 | int arrayc[6]={}; |
mystischerweise dieselben Werte enthalten werden wie diese:
1 | int main() |
2 | {
|
3 | struct Geld Geldeinheiten; |
4 | float n; |
5 | struct Geld y; |
6 | float scheine[7]={500,200,100,50,20,10,5}; |
7 | float muenzen[2]={2,1,}; |
8 | float cent[8]={0.50,0.20,0.10,0.05,0.02,0.01}; |
9 | int arrays[7]={}; |
10 | int arraym[8]={}; |
11 | int arrayc[6]={}; |
Bloss wegen derselben Namen ? In der passenden Vorlesung nicht da gewesen ? nan heisst NotANumber und in deine Fall: uninitialisiert, also noch nie einen Wert bekommen. Die Unterteilung in Scheine, Münzen und cent ist ebenso unsinnig wie Geld als float zu betrachten. Rechne in cent, und alle auf einen Rutsch:
1 | int value[]={50000,20000,10000,5000,2000,1000,500,200,100,50,20,10,5,2,1}; |
2 | void main(int argc,char *argv[]) |
3 | {
|
4 | int pieces[15]; |
5 | int amount=atof(argv[1])*100; // Betrag in Euro |
6 | for(int n=0;amount>0;) |
7 | {
|
8 | if(amount>=value[n]) |
9 | {
|
10 | amount-=value[n]; |
11 | pieces[n]++; |
12 | }
|
13 | else
|
14 | {
|
15 | n++; |
16 | }
|
17 | }
|
18 | for(int n=0;n<sizeof(value)/sizeof(value[0]);n++) |
19 | {
|
20 | printf("%d Stück %.02f\n",pieces[n],value[n]/100.0); |
21 | }
|
22 | }
|
MaWin schrieb: > Rechne in cent, und alle auf einen Rutsch: pieces sollte man noch initialisieren. und man könnte für die Ausgabe für die Werte auch noch ein Namensarray definieren und benutzen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.