Škôlka jazyka C
http://skolka-jazyka-c.freespace.sk/

Pomoc s dátovým typom double v C
http://skolka-jazyka-c.freespace.sk/viewtopic.php?f=22&t=686
Stránka 1 z 1

Autor:  Ro_So [ 09 Feb 2015, 15:06 ]
Predmet príspevku:  Pomoc s dátovým typom double v C

Dobrý deň,
skúšam si robiť nejaké tie primitívne úlohy a trochu nechápem premenným, konkrétne double.
Pri jednoduchom programe, ktorého úlohou je zo zadaného desatinného čísla určiť jeho celú časť.
Nič zložité, teda je nutné pretypovať. Kód ktorý mám vyzerá nasledovne:
Kód:
int main(int argc, char** argv) {
   
    float cislo;
   
    printf("Zadajte cislo:");
    scanf("%f", &cislo);
    printf("Cela cast cisla: %f je: %d\n",cislo, (int)cislo);

    return (EXIT_SUCCESS);
}



Pri tomto spôsobe program funguje pekne. Ak však zmením dátový typ premennej "cislo" na double, pri funkcii printf mi vypíše 0.0000. Prečo to tak robí?

Autor:  libcosenior [ 09 Feb 2015, 18:40 ]
Predmet príspevku:  Re: Pomoc s dátovým typom double v C

Vždy, keď si nie som istý, nájdem si riešenie cez google:
http://stackoverflow.com/questions/2105 ... ith-just-f

Because C will promote floats to doubles for functions that take variable arguments. Pointers aren't promoted to anything, so you should be using %lf, %lg, %le or %la (C99) to read in doubles.
Google preklad:
Vzhľadom k tomu, C bude podporovať pláva zdvojnásobuje funkcií, ktoré sa variabilné argumenty. Ukazovatele nie sú podporované k ničomu, takže by ste mali používať %lf, %lg ,%le alebo %la (C99), čítať vo štvorhre.

Použitie:
Kód:
#include <stdio.h>

int main(int argc, char** argv) {

    double cislo;

    printf("Zadajte cislo:");
    scanf("%lf", &cislo);
    printf("Cela cast cisla: %lf je: %d\n",cislo, (int)cislo);
    printf("Zadajte cislo:");
    scanf("%lg", &cislo);
    printf("Cela cast cisla: %lg je: %d\n",cislo, (int)cislo);
    printf("Zadajte cislo:");
    scanf("%le", &cislo);
    printf("Cela cast cisla: %le je: %d\n",cislo, (int)cislo);
    printf("Zadajte cislo:");
    scanf("%la", &cislo);
    printf("Cela cast cisla: %la je: %d\n",cislo, (int)cislo);

    return 0;
}

Autor:  Ro_So [ 09 Feb 2015, 20:21 ]
Predmet príspevku:  Re: Pomoc s dátovým typom double v C

Ďakujem veľmi pekne :)
Chcem sa spýtať, či je možné prepísať tento kód pomocou ternárneho operátore (niečio)?(vyraz_1):výraz-2). Resp. malo by to ísť, kedze v zadani úlohy boli podmienky aby sa to robilo pomocou neho. Ja som to urobil pomocou if(u). Ak by to niekto vedel, stačí len časť kódu nemusia tam byť všetky možnosti :) . Akosi ma nevie osvietiť.
Ďakujem.
PS: príklad slúži na zaokruhlenie cisla pomocou zvolenej presnosti desatinných miest.

Kód:
int main(int argc, char** argv) {
   
    float cislo;
    float presnost;

    printf("Zadaj cislo:");
    scanf("%f",&cislo);
    printf("Zadaj presnost z rozsahu (1 az 6) desatinnych miest:");
    scanf("%f", &presnost);
   
    if (presnost == 1)
        printf("Vysledok je %.1f",cislo); 
    else if (presnost == 2)
        printf ("Vysledok je %.2f",cislo);   
    else if (presnost == 3)
        printf("Vysledok je %.3f",cislo);
    else if (presnost == 4)
        printf("Vysledok je %.4f",cislo);
    else if (presnost ==5)
        printf("Vysledok je %.5f",cislo);
    else if (presnost == 6)
        printf("Vysledok je %f",cislo);
       
    return (EXIT_SUCCESS);
}

Autor:  libcosenior [ 10 Feb 2015, 08:03 ]
Predmet príspevku:  Re: Pomoc s dátovým typom double v C

Terárny operátor pracuje ako podmienené príkazy if else.
Jednoduchý terárny operátor takto:
Kód:
#include <stdio.h>

int main(void)
{
    int a = 2589, b = -1258;

    if (a > b)
        printf("Hodnota %d je vycsia\n", a);
    else
        printf("Hodnota %d je vycsia\n", b);

    a > b ? printf("Hodnota %d je vycsia\n", a) : printf("Hodnota %d je vycsia\n", b);

    // prehladnejsie by bolo
    int pom;

    pom = a > b ? a : b;
    printf("Hodnota %d je vycsia\n", pom);

    // mozno trochu menej prehladne, ale jednoduche a funkcne
    printf("Hodnota %d je vycsia\n", a > b ? a : b); // na vypocet pouzity terarny operator

    return 0;
}

Keď sa na to pozrieš, vidíš, že otáznik plní funkciu príkazu if (aj keď je za výrazom) a dvojbotka príkazu else.

Ako sám vidíš, je veľa spôsobov zápisu toho istého a vlastne compilátor to preloží úplne rovnako v každom prípade. Teda záleží len na tebe, ako to napíšeš. Hlavné je to, aby si tomu rozumel aj po rokoch, teda je dobré zložitejší kód poriadne okomentovať.

Zložený terárny operátor takto:
Kód:
#include <stdio.h>

int main(void)
{
    int a = -25, b = -1258, c = -12, pom;

    if (a > b && a > c) // a je vacsie ako b a zaroven a je vacsie ako c
        pom = a;
    else if (b > a && b > c)
        pom = b;
    else
        pom  = c;
    printf("Najvacsie cislo je %d\n", pom);

    a > b && a > c ? pom = a : b > a && b > c ? pom = b : c;
    printf("Najvacsie cislo je %d\n", pom);

    // spravnejsi zapis
    pom = a > b && a > c ? a : b > a && b > c ? b : c;
    printf("Najvacsie cislo je %d\n", pom);

    // pre prehladnost je vhodne pouzivat zatvorky
    pom = (a > b && a > c) ? a : (b > a && b > c) ? b : c;
    printf("Najvacsie cislo je %d\n", pom);

    return 0;
}


Tvoj príklad by sa dal zapísať za pomoci terárneho operátora takto:
(AJ keď na takéto podmienky sa zvyčajne používa switch)
Kód:
#include <stdio.h>

int main(void)
{
    float cislo;
    int presnost;

    printf("Zadaj cislo:");
    scanf("%f",&cislo);
    printf("Zadaj presnost z rozsahu (1 az 6) desatinnych miest:");
    scanf("%d", &presnost);

    /*if*/ (presnost == 1) ?
        printf("Vysledok je %.1f\n",cislo) :
    /*else if*/ (presnost == 2) ?
        printf ("Vysledok je %.2f\n",cislo) :
    /*else if*/ (presnost == 3) ?
        printf("Vysledok je %.3f\n",cislo) :
    /*else if*/ (presnost == 4) ?
        printf("Vysledok je %.4f\n",cislo) :
    /*else if*/ (presnost ==5) ?
        printf("Vysledok je %.5f\n",cislo) :
    /*else if*/ (presnost == 6) ?
        printf("Vysledok je %f\n",cislo) : printf("Mino rozsah!\n");

    return 0;
}


Lepšie takto:
Kód:
#include <stdio.h>

int main(void)
{
    float cislo;
    int presnost;

    printf("Zadaj cislo:");
    scanf("%f",&cislo);
    printf("Zadaj presnost z rozsahu (1 az 6) desatinnych miest:");
    scanf("%d", &presnost);

    presnost == 1 ? printf("Vysledok je %.1f\n",cislo) :
    presnost == 2 ? printf ("Vysledok je %.2f\n",cislo) :
    presnost == 3 ? printf("Vysledok je %.3f\n",cislo) :
    presnost == 4 ? printf("Vysledok je %.4f\n",cislo) :
    presnost == 5 ? printf("Vysledok je %.5f\n",cislo) :
    presnost == 6 ? printf("Vysledok je %f\n",cislo) : printf("Mino rozsah!\n");

    return 0;
}


Na záver ukážka prepínača switch:
Kód:
#include <stdio.h>

int main(void)
{
    float cislo;
    int presnost;

    printf("Zadaj cislo:");
    scanf("%f",&cislo);
    printf("Zadaj presnost z rozsahu (1 az 6) desatinnych miest:");
    scanf("%d", &presnost);

    switch (presnost) {
        case 1:
            printf("Vysledok je %.1f\n",cislo);
            break;
        case 2:
            printf ("Vysledok je %.2f\n",cislo);
            break;
        case 3:
            printf("Vysledok je %.3f\n",cislo);
            break;
        case 4:
            printf("Vysledok je %.4f\n",cislo);
            break;
        case 5:
            printf("Vysledok je %.5f\n",cislo);
            break;
        case 6:
            printf("Vysledok je %f\n",cislo);
            break;
        default:
            printf("Mino rozsah!\n");
    }

    return 0;
}

Autor:  Ro_So [ 11 Feb 2015, 15:04 ]
Predmet príspevku:  Re: Pomoc s dátovým typom double v C

Ďakujem veľmi pekne. pomohol si mi :)

Stránka 1 z 1 Všetky časy sú v GMT + 1 hodina
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/