Diskuze: Chyba v kóde... ako ju opraviť(začiatočník)
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Ty centy ještě zaokrouhli a problém zmizí.
Ta nepřesnost vzniká při převodu čísla do dvojkové soustavy (float
dokonce jako mocnina dvojky), ve které si PC čísla ukládá.
Určite je to to správne riešenie, lenže som hodne nový. Učím sa to iba v škole a toto sme dostali za úlohu. Ak by si bol taký dobrý napísal by si mi ako by som mal upraviť ten kód?
Neviem čo si spravil, ale myslím, že sa mýliš.
Luboš ti písal o zaokrúhľovaní.
Tvoj príklad by mohol vyzerať nejak takto:
#include <stdio.h>
#include <math.h> // pre funkcie floor() - zaokrúhlenie nadol, ceil() - zaokrúhlenie nahor
int main(int argc, char *argv[])
{
float suma, pom;
int centy;
int cele;
printf("Zadaj sumu a ja ti ju napisem a zaroven aj vysklonujem:\n");
scanf("%f", &suma);
pom = (suma - floor(suma)) * 100; // vypocet centov je typ float
printf("\nTestovaci vypis mnozstva centov pred zaokruhlenim: %f\n", pom); // nie je to cele cislo
if (pom > floor(pom) && pom < (floor(pom) + 0.5)) // podmienka na zaokruhlenie nadol
pom = floor(pom); // zaokruhlenie nadol
else
pom = ceil(pom); // zaokruhlenie nahor
printf("\nTestovaci vypis mnozstva centov po zaokruhleni: %f\n\n", pom); // uz je to spravne
centy = (int)pom;
switch ((int)suma) {
case 1:
printf("%d euro", (int)suma);
break;
case 2 ... 4:
printf("%d eura", (int)suma);
break;
default:
printf("%d eur", (int)suma);
break;
}
switch (centy) {
case 1:
printf(" a %d cent\n", centy);
break;
case 2 ... 4:
printf(" a %d centy\n", centy);
break;
default:
printf(" a %d centov\n", centy);
break;
}
return 0;
}
Zaokrúhľovanie nahor a nadol som ti ukázal pre ilustráciu.
Najlepšie bude použiť funkciu round(), tá zaokrúhľuje matematicky, teda
> 0.5 nadol a > 0.5 nahor.
Použitie:
pom = (suma - floor(suma)) * 100; // vypocet centov je typ float
centy = (int)round(pom);
Aha... zaokruhľovanie je trocha ďalej ako moje doterajšie znalosti ale pri printf som dal iba %.f a kód je teraz takto:
#include <stdio.h>
int main(int argc, const char * argv[]) {
float suma;
float centy;
int cele;
printf("Zadaj sumu a ja ti ju napisem a zaroven aj vysklonujem:\n");
scanf("%f",&suma);
cele=(int)suma;
centy= (suma-cele)*100;
switch ((int)suma) {
case 1:
printf("%d euro",(int)suma);
break;
case 2 ... 4:
printf("%d eura",(int)suma);
break;
default:
printf("%d eur",(int)suma);
break;
}
switch ((int)centy) {
case 1:
printf(" a %.f cent\n",centy);
break;
case 2 ... 4:
printf(" a %.f centy\n",centy);
break;
default:
printf(" a %.f centov\n",centy);
break;
}
return 0;
}
Zobrazeno 8 zpráv z 8.