Škôlka jazyka C

Fórum o programovaní v jazyku C založené 3. januára 2012

Aktuálny čas je 19 Nov 2019, 11:06

Všetky časy sú v GMT + 1 hodina




Vytvoriť novú tému Odpovedať na tému  [ Príspevkov: 5 ] 
Autor Správa
PoslaťNapísal: 09 Feb 2015, 15:06 
Offline
Škôlkár
Škôlkár

Registrovaný: 09 Feb 2015, 14:47
Príspevky: 6
Udelené body: 1 udelenie bodov
Získané body: 0 udelenie bodov
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í?


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 09 Feb 2015, 18:40 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
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;
}

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 09 Feb 2015, 20:21 
Offline
Škôlkár
Škôlkár

Registrovaný: 09 Feb 2015, 14:47
Príspevky: 6
Udelené body: 1 udelenie bodov
Získané body: 0 udelenie bodov
Ď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);
}


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 10 Feb 2015, 08:03 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
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;
}

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
PoslaťNapísal: 11 Feb 2015, 15:04 
Offline
Škôlkár
Škôlkár

Registrovaný: 09 Feb 2015, 14:47
Príspevky: 6
Udelené body: 1 udelenie bodov
Získané body: 0 udelenie bodov
Ďakujem veľmi pekne. pomohol si mi :)


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
Zobraziť príspevky z predchádzajúceho:  Zoradiť podľa  
Vytvoriť novú tému Odpovedať na tému  [ Príspevkov: 5 ] 

Všetky časy sú v GMT + 1 hodina


Kto je on-line

Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 7 hostia


Rýchla úprava:
Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre
Nemôžete zasielať súbory v tomto fóre

Hľadať:
Skočiť na:  
cron
Powered by phpBB® Forum Software © phpBB Group

Hosted by FreeSpace SK