Arduino-Function merkwürdig

OP (Firma: Q3) #7315111
Lesenswert?

Die folgende Funktion soll die Anzahl der zurückzugebenden Münzen in einem Münzwechsler auf Basis MK4 ausrechnen. Übergeben wird der Betrag in Cent, zurückgegeben wird ein String, der durch Punkte getrennt die Anzahl der 2€ und 1€ und 50ct-Münzen enthält. Vorbedingung: Der Betrag muss durch 50ct teilbar sein. Problem: Die Funktion liefert nur bis 950ct brauchbare Ergebnisse, ab 1050 kommt "error". Aber warum? Danke für Tips.

1
String mk4_sumout(int sum)
2
{
3
  String ret = "error";
4
  int mod = sum % 50;
5

6
  if(mod == 0)
7
  {
8
    int c2 = 0;
9
    int c1 = 0;
10
    int c5 = 0;
11
    while(sum>0)
12
    {
13
      bool fnd = false;
14
      if(!fnd && sum>=200){sum -=200;c2++; fnd=true;}
15
      if(!fnd && sum>=100){sum -=100;c1++; fnd=true;}
16
      if(!fnd && sum>=50){sum  -=50; c5++;  fnd=true;}
17
    }
18
    ret = String(c2)+"."+String(c1)+"."+String(c5);
19
  }
20
  return ret+"."+String(mod);
21
}

Vielleicht bin ich auh nur ein wenig überarbeitet ... :-(

Beitrag #7315120 wurde von einem Moderator gelöscht.
#7315132
Lesenswert?

Frank E. schrieb:

Problem: Die Funktion liefert nur bis 950ct brauchbare Ergebnisse, ab 1050 kommt "error".

Und bei 1000?

error kann ja nur kommen, wenn diese Bedingung nicht gilt:

int mod = sum % 50; if(mod == 0)

Ich sehe keinen Grund, warum das bei 1050 passieren sollte. Bist du denn sicher, dass deine Eingabe korrekt funktioniert? Vielleicht nimmst du nur 3 Zeichen entgegen, und es steht nur 105 drin statt 1050 oder so.

Gast #7315158
Lesenswert?

Also das hier funktioniert wohl so wie es soll:

Zumindest hier: https://www.onlinegdb.com/online_c++_compiler#

1
#include <iostream>
2
#include <string>
3

4
using namespace std;
5

6
string mk4_sumout(int sum){
7

8
  string ret = "error";
9
  int mod = sum % 50;
10
  if(mod == 0)
11

12
  {
13

14
    int c2 = 0;
15
    int c1 = 0;
16
    int c5 = 0;
17
    
18
    while(sum>0)
19
    {
20
      bool fnd = false;
21
      if(!fnd && sum>=200){sum -=200;c2++; fnd=true;}
22
      if(!fnd && sum>=100){sum -=100;c1++; fnd=true;}
23
      if(!fnd && sum>=50){sum  -=50; c5++;  fnd=true;}
24
    }
25
    ret = to_string(c2)+"."+to_string(c1)+"."+to_string(c5);
26
  }
27

28
  return ret+"."+to_string(mod);
29

30
}
31

32
int main()
33
{
34
    cout<<mk4_sumout(1050);
35
    return 0;
36
}
OP (Firma: Q3) #7316235
Lesenswert?

Rolf M. schrieb:

Ich sehe keinen Grund, warum das bei 1050 passieren sollte. Bist du denn sicher, dass deine Eingabe korrekt funktioniert? Vielleicht nimmst du nur 3 Zeichen entgegen, und es steht nur 105 drin statt 1050 oder so.

DANKE! Genau das war die Ursache: Der übergebene Wert stammt aus einem URL-Parameter eines GET-Statements. Und genau hier wurde wohl durch eine ungeschickte String-Operation die Null hinten abgeschnitten. DANKE!

OP (Firma: Q3) #7316241
Lesenswert?

Geldwexler schrieb:

Das tät mich ja anpesten wenn das Ding fast nur 2er ausspuckt, und max. einen 1er und einen halben. Das sollte schon von der Verfügbarkeit abhängen und allgemein ein bissel gemischt sein.

Ja, daran wird gearbeitet.

Weniger deshalb, weil es irgend jemanden "anpisst", sondern um die Vorräte an Münzen möglichst gleichmäßig zu nutzen. Der erste Schritt ist der, bei Rückgabebeträgen unter 5 Euro auf die 2er zu verzichten. Ähnlich könnte man es mit den 1ern halten, wenn die Rückgabesumme z.B. kleiner 2.50 Euro ist ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren