NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Aktivity
Avatar
ra3sk
Člen
Avatar
ra3sk:5.11.2015 7:35

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:5.11.2015 7:41

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
5.11.2015 7:41
https://www.facebook.com/peasantsandcastles/
Avatar
ra3sk
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
ra3sk:5.11.2015 19:56

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:5.11.2015 20:42

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):6.11.2015 8:40

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):6.11.2015 8:48

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:6.11.2015 14:32

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
Odpovídá na ra3sk
ra3sk:6.11.2015 14:32

A funguje to

 
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.