Proszę o pomoc z zadania z wydawaniem reszty

0

Mam problem. Muszę zmienić linijki kodu od int main() tak, aby program wyświetlał takie cos:
Podaj liczbę do reszty: 7.40
5
2
0.20
0.20

mam kod, ale on jedynie pokazuje wynik tak zmienie w linijce WydajReszte(7.40). Jak to zmienić?

kod:

 
using namespace std;
 
const int N = 9;
const float NOMINALY[N] = { 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01 };
 
void WydajReszte(double reszta)
{
    int i = 0;
    while (reszta > 0 && i < N)
    {
        if (reszta >= NOMINALY[i])
        {
        cout << NOMINALY[i] << endl;
        reszta = reszta - NOMINALY[i];
        }
        else i++;
    }
}
 
 
int main()
{
    WydajReszte(7.30);
    return 0;
}
0

Utwórz sobie zmienną typu double i przy użyciu cin przyjmij od użytkownika jej wartość, a potem wywołaj WydajReszte z nią.

0

czyli dać takie coś?

   cout<<" Podaj reszte liczby: "; 
   cin>>x1; //i po tym mam dac ten WydajReszte tyko tez z cin?
3

https://godbolt.org/z/73nbGGG3M
Disclaimer ten kod ma bug-a dobrze ukrytego :).

0

O matko, całkiem co innego myślałem. Bardzo Ci dziękuje MarekR22 za pomoc 😉

0

Mały konkurs dla innych kto widzi bug-a? (dla newbie raczej nieosiągalne).
Już mam wejście, które daje złą odpowiedź, ale jest pewnie da się też znaleźć takie wejście, które doprowadzi do UB.

1

W tej chwili funkcja WydajReszte "rozbija" przekazywaną kwotę/liczbę na składowe nominałów (nie zawsze poprawnie). Więc albo jej nazwa jest zła albo w zadaniu chodzi o coś innego.

Pomyśl o zamianie typu float na int w nominałach.

const int NOMINALY[N] = { 500, 200, 100, 50, 20, 10, 5, 2, 1 };

i operowaniu na groszach.

0

Dziękuje wam bardzo. Mam jeszcze problem z tym kodem. Treść taka: Napisz algorytm, który liczbę mniejszą niż 256 (jeżeli podamy np. 257 to ma wyświetlić, że podana liczba jest za wysoka) i zapisze
jako sumę potęg liczby 2. Wykorzystaj tablicę o wartościach
128, 64, 32, 16, 8, 4, 2, 1.

W tym kodzie wszystko działa, ale no nie do końca. Co tutaj muszę pozmieniać?

 
int main() {
  std::cout << "Podaj licznę mniejszą od 256" << std::endl;
  int n;
 
  std::cin >> n;
 
  int tab[] = {128, 64, 32, 16, 8, 4, 2, 1};
  if( n > 256 )
   std::cout << "Wylosowana liczba jest większa od Twojej typowanej." << std::endl;
       std::cout << "Podaj liczbe jeszcze raz: " << std::endl;
   std::cin >> n;
   std::cout << n << " to w postaci potegi dwojki suma liczb: ";
 
  int i = 0;
 
  while (n > 0) {
 
      if (n >= tab[i]) {
 
          n -= tab[i];
 
          std::cout << tab[i] << " ";
 
          i++;
 
      } else {
 
          i++;
 
      }
 
  }
 
  return 0;
 
}
0

Rozważ inne podejście:

void WydajReszte(double value)
{
    static const int bilons[] = { 500, 200, 100, 50, 20, 10, 5, 2, 1 }; // w groszach
    int v=round(value*100);
    for(int i=0;i<sizeof(bilons)/sizeof(*bilons);++i)
    {
        int bilon=bilons[i],count=v/bilon;
        v-=count*bilon;
        if(count) cout<<count<<" * "<<setprecision(2)<<bilon/100.0<<endl;
        //while(count--) cout<<setprecision(2)<<bilon/100.0<<endl;
    }
}
0

Brakuje Ci klamerek przy warunku n>256

1 użytkowników online, w tym zalogowanych: 0, gości: 1