Diskuze: Chyba v kóde... ako ju opraviť(začiatočník)

C++ C a C++ Chyba v kóde... ako ju opraviť(začiatočník)

Avatar
ra3sk
Člen
Avatar
ra3sk:

Zdravím, napísal som tento kód

float suma;
int 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 (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;
}

A keď zadám 5.56 tak dostanem 5.55...ak by ste mi vysvetlili ako to upraviť a prečo bol by som veľmi rád. Predom ďakujem. Som iba začiatočník.

 
Odpovědět 5.11.2015 7:35
Avatar
Luboš Běhounek (Satik):

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á.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 5.11.2015 7:41
:)
Avatar
ra3sk
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
ra3sk:

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?

 
Nahoru Odpovědět 5.11.2015 19:56
Avatar
ra3sk
Člen
Avatar
Odpovídá na ra3sk
ra3sk:

Ok... netreba. Nedošlo mi, že stačí iba napísať %.f

:D
 
Nahoru Odpovědět 5.11.2015 20:42
Avatar
Odpovídá na ra3sk
Libor Šimo (libcosenior):

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;
}
Nahoru Odpovědět 6.11.2015 8:40
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na ra3sk
Libor Šimo (libcosenior):

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);
Nahoru Odpovědět 6.11.2015 8:48
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
ra3sk
Člen
Avatar
ra3sk:

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;
}
 
Nahoru Odpovědět 6.11.2015 14:32
Avatar
ra3sk
Člen
Avatar
 
Nahoru Odpovědět 6.11.2015 14:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.