Forum: PC-Programmierung Arduino-Function merkwürdig


von Frank E. (Firma: Q3) (qualidat)


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 vom Autor gelöscht.
von Rolf M. (rmagnus)


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.

: Bearbeitet durch User
von Diek (Gast)


Lesenswert?

Was liefert das denn?
1
return ret+"."+String(mod);

von cppbert (Gast)


Lesenswert?

debug doch einfach durch?

nur so als Tip geht auch ohne Schleife
1
    int sum = 1050;  
2
    int c2 = sum / 200;
3
    sum = sum % 200;
4
    int c1 = sum / 100;
5
    sum = sum % 100;
6
    int c5 = sum / 50;

von donvido (Gast)


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
}

von Peter D. (peda)


Lesenswert?

1
int mod = sum % 50;
2
sum /= 50;
3
int c5 = sum & 1;
4
sum /= 2;
5
int c1 = sum & 1;
6
int c2 = sum / 2;

von Geldwexler (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

Geldwexler schrieb:
> Das tät mich ja anpesten wenn das Ding fast nur 2er ausspuckt, und max.
> einen 1er und einen halben.

Warum? Ich würde mich darüber freuen, nicht unnötig viele Münzen als 
Wechselgeld zu bekommen.

von Frank E. (Firma: Q3) (qualidat)


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!

von Frank E. (Firma: Q3) (qualidat)


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 ...

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
Noch kein Account? Hier anmelden.