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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.