Forum: PC-Programmierung Arduino-Function merkwürdig


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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 ...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.