Algoritm CS50 greedy (Programare, C, Cs50)

Xavier Tan a intrebat.

Tocmai am început programarea C cu cs50.

Am încercat să fac setul de probleme despre algoritmul greedy, dar se pare că nu pot găsi bug-ul. Codul meu este mai jos.

#include <cs50.h>
#include <stdio.h>
#include <math.h>


int main (void)
{

int count = 0;

printf("how much is the change?: ");

float change = get_float();

while(change < 0)
{
   printf("change is to be more than 0");
   change = get_float();
 }

int amount = lroundf(change*100);

while(amount > 0)
{
  if ((amount-25) >= 25)
  {
      amount  =  amount - 25;
      count++;
  }

  else if ((amount-10) >= 10)
  {
      amount =  amount - 10;
      count++;
  }

  else if ((amount-5) >= 5)
  {
      amount = amount -5;
      count++;
  }

  else if((amount-1) >= 1)
  {
      amount = amount -1;
      count ++;
      break;
  }

  else
  {
   printf("you have no change 
");   
  }
  }
  printf("your number of coins is %i
", count);

  }

Când introduc restul meu ca 1, mi se dau înapoi 8 monede. Nu reușesc să găsesc unde este bug-ul. Mă poate ajuta cineva?

Comentarii

  • Ai verificat CS50? –  > Por Sourav Ghosh.
  • >= 25 –> >= 0 și așa mai departe. sau pur și simplu (amount-25) >= 25 –> amount >= 25 –  > Por BLUEPIXY.
1 răspunsuri
Tiago Alves

În primul rând, ați putea încerca să rulați programul dvs. cu valori pentru change care returnează răspunsuri simple, cum ar fi 1 monedă, folosind, de exemplu, change = 0.25. Dacă asta funcționează, atunci ar trebui să începeți să încercați cu câteva monede, repetând un tip, așa cum ați făcut cu 1.00sau alăturând câteva tipuri, cum ar fi 0.06 . Și după aceea, încercați numere mari și valori cu o imprecizie flotantă mai mare, cum ar fi 4.10. Urmând acest lucru ar trebui să vă conducă la răspunsuri.

Dacă, după ce ați încercat toate acestea, tot nu puteți găsi problema, atunci iată răspunsul: problema este la if/else if expresii. Atunci când încercați să numărați sferturile, de exemplu, expresia (amount-25) >= 25 nu funcționează în mod corespunzător. Încercați să scoateți o monedă de 25 cenți în timp ce amount este mai mare sau egală cu 25, dar codul dvs. face asta doar până când ajunge la mai puțin de 50. Dezvoltarea expresiei dvs. vă poate ajuta să vedeți acest lucru: (amount-25) >= 25 -> (amount-25) + 25 >= 25 + 25 -> amount >= 50.

O altă problemă pe care o puteți găsi este cu acel break afirmație. S-ar putea să iasă din buclă mai devreme decât se aștepta. Dacă încercați să rulați numere precum 0.04 și 0.03 veți vedea că numărătoarea se blochează la 1. După eliminarea primului bănuț, codul iese din buclă lăsând amount încă mai mare decât 0. breaks face mai greu de văzut când codul iese din buclă și de aceea mulți programatori recomandă evitarea ei ori de câte ori este posibil.

Comentarii

  • vă mulțumesc mult pentru răspunsurile detaliate, m-a ajutat foarte mult. –  > Por Xavier Tan.

Tags:,