Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

11

17.11.2007, 13:10

Zitat von »"T-VIRUS"«

Hallo,
Ansich wird es immer funktionieren, da die kleinste Münze immer 0.10€ ist.


Nein wird es nicht!

Gib als Startwert 4.00€ ein.
dann bleibt dir am Ende ein Betrag von .099999999999999978€ übrig,
und dann hängt dein Programm, fertig!

mach einfach sowas

C-/C++-Quelltext

1
2
        if(dRueckgabe < 0.10)
          dRueckgabe = 0;

und dein Programm wird sich nicht mehr aufhängen.

Dass es eigentlich noch nicht dass berechnet was du brauchst, ist ne andere Geschichte!

mfg Philipp

12

17.11.2007, 13:13

Wenn Du mit Divisionen und Restwerten arbeitest kannst Du Dir die Schleife komplett sparen (die wird sowieso nie das machen was du willst).

Du solltest allerdings die Werte als Integer speichern:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
int iRueckgabe = dRueckgabe * 100;

iMuenzen[0] = iRueckgabe/200;
iRueckgabe = iRueckgabe%200;

iMuenzen[1] = iRueckgabe/100;
iRueckgabe = iRueckgabe%100;

iMuenzen[2] = dRueckgabe/50;
iRueckgabe = iRueckgabe%50;

...


Schlimmstenfalls kann am Ende ein Restbetrag übrig bleiben (wenn die verfügbaren Münzen schlecht gewählt sind).

13

17.11.2007, 13:36

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
double to_pay(4.0);
std::vector<std::pair<double, unsigned int>> data;
data.push_back(std::make_pair(0.10, 0));
data.push_back(std::make_pair(0.75, 0));

// sort aufrufen 


for (std::size_t i(0); i < data.size(); ++i)
{
    data[i].second = static_cast<unsigned int>(to_pay / data[i].first);
    to_pay -= static_cast<double>(data[i].second) * data[i].first;
}
Dann hast du nachher im Vector stehen wie viele Münzen man wovon Zahlen muss.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

14

17.11.2007, 13:43

Bei Geldbeträgen niemals mit float oder double rechnen!
Dafür sind sie nicht gedacht, weil zu ungenau. Einfach mit int rechnen und als Einheit Cent nehmen.

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

15

17.11.2007, 14:00

Hallo,
okay ich Funktion an sich klappt soweit ;)
Sie ist zwar etwas unschön entwickelt aber funktioniert.

Hier der Code

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
void rueckgabe(float fRueckgabe)
{
    int iRueckgabe = fRueckgabe * 100;
    int iMuenzen[5] = { 0, 0, 0, 0, 0 };

    while(iRueckgabe > 0)
    {
        printf("%i \n", iRueckgabe);

        if(iRueckgabe >= 200)
        {
            while(iRueckgabe > 0 && iRueckgabe % 200 == 0)
            {
                iRueckgabe -= 200;
                iMuenzen[0] += 1;
            }
        }
        if(iRueckgabe >= 100)
        {
            while(iRueckgabe > 0 && iRueckgabe % 100 == 0)
            {
                iRueckgabe -= 100;
                iMuenzen[1] += 1;
            }
        }

        if(iRueckgabe >= 50)
        {
            while(iRueckgabe > 0 && iRueckgabe % 50 == 0)
            {
                iRueckgabe -= 50;
                iMuenzen[2] += 1;
            }
        }

        if(iRueckgabe >= 20)
        {
            while(iRueckgabe > 0 && iRueckgabe % 20 == 0)
            {
                iRueckgabe -= 20;
                iMuenzen[3] += 1;
            }
        }

        if(iRueckgabe >= 10)
        {
            while(iRueckgabe > 0 && iRueckgabe % 10 == 0)
            {
                iRueckgabe -= 10;
                iMuenzen[4] += 1;
            }
        }

        if(iRueckgabe < 10)
        {
            iRueckgabe = 0;
        }

        getch();
    }

    printf("Rueckgabe:    %i x 2.00 Euro \n", iMuenzen[0]);
    printf("    %i x 1.00 Euro \n", iMuenzen[1]);
    printf("    %i x 0.50 Euro \n", iMuenzen[2]);
    printf("    %i x 0.20 Euro \n", iMuenzen[3]);
    printf("    %i x 0.10 Euro \n", iMuenzen[4]);

    return;
}


Ich habs mal mit den Werten 0.40 und 4 getestet.
Er gibt wie geplant die korrekten Beträge aus.

Nur muss bei der Übergabe schon irgendwie ein Fehler entstehen.

Hier mal der Fehlercode

C-/C++-Quelltext

1
2
3
4
5
if(preis < 0)
{
    printf("Rueckgabe: %3.2f \n", rueck); //Hier ist es noch GENAU

    rueckgabe(rueck); // Nachdem ersten aufruf und der Ausgabe in der while schleife ist der Wert von rueck um 0.01 dekramentiert

}


Ich weiß nicht wie der einfach die Zahl wegradiert.

EDIT
Okay ich weiß jetzt wo der Fehler liegt!

Er liegt genau hier:

C-/C++-Quelltext

1
int iRueckgabe = fRueckgabe * 100;


Vor de Umrechnung hat fRueckgabe noch den Übergeben Wert.
Aber bei der Multiplikation mit 100 verliert er leider den Wert 0.01

Leider weiß ich nicht warum und auch nicht wie ich dies lösen kann.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

17.11.2007, 14:09

Kannste nochn bissl zusammenfassen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void rueckgabe(float fRueckgabe)
{
    const int lut[] = { 200, 100, 50, 20, 10 };
    int iRueckgabe = fRueckgabe * 100;
    int iMuenzen[5] = { 0, 0, 0, 0, 0 };

    while(iRueckgabe > 0)
    {
        printf("%i \n", iRueckgabe);

        for ( int i = 0; i < 5; ++i )
        {
            if ( iRueckgabe >= lut[ i ] )
            {
                while ( iRueckgabe > 0 && iRueckgabe % lut[ i ] == 0 )
                {
                    iRueckgabe -= lut[ i ];
                    iMuenzen[ i ]++;
                }
            }
        }

        if(iRueckgabe < 10)
        {
            iRueckgabe = 0;
        }

        getch();
    }

    printf("Rueckgabe:    %i x 2.00 Euro \n", iMuenzen[0]);
    printf("    %i x 1.00 Euro \n", iMuenzen[1]);
    printf("    %i x 0.50 Euro \n", iMuenzen[2]);
    printf("    %i x 0.20 Euro \n", iMuenzen[3]);
    printf("    %i x 0.10 Euro \n", iMuenzen[4]);
} 


Aber sicher das dein Code so funktioniert? :)
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

17

17.11.2007, 14:34

Zitat von »"T-VIRUS"«


Er liegt genau hier:

C-/C++-Quelltext

1
int iRueckgabe = fRueckgabe * 100;


Vor de Umrechnung hat fRueckgabe noch den Übergeben Wert.
Aber bei der Multiplikation mit 100 verliert er leider den Wert 0.01

Leider weiß ich nicht warum und auch nicht wie ich dies lösen kann.

MFG T-Virus

Mogelpower hilft (auch genannt runden)

C-/C++-Quelltext

1
int iRueckgabe = static_cast<int>(fRueckgabe * 100.0f + 0.5f);

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

18

17.11.2007, 15:03

Hallo,
danke jetzt ist es übersichtlicher und auch einfacher ;)

@grek40
Es sollte möglichst in C sein und nicht in C++.
In C ist es (int)fRueckgabe * 100.0f + 0.5f

Sollte aber klappen.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

19

17.11.2007, 15:21

Ganz ehrlich, ich finde Mahe hat einen Preis verdient. Mahe's Lösung besticht mit Einfachheit, Übersichtlichkeit und man versteht auch ohne Kenntnisse von std::, Klassen usw. sofort was Sache ist :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

20

17.11.2007, 15:39

Hallo Nox,
hab ihn mal getestet.
Klappen würde er.

Okay hab einen kleinen Fix eingebaut, nun klappt alles.

Ich mache nach

C-/C++-Quelltext

1
int iRueckgabe = fRueckgabe + 100;


einfach ein

C-/C++-Quelltext

1
iRueckgabe++;


Dann funktioniert alles prima.

Fragt nicht warum es nicht geht, aber ich werde mal meinen C(++) Lehrer fragen ;)

Ich nutze im Moment mahes Lösung.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Werbeanzeige