Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Lukáš Mašek:18.10.2021 13:28

Ahoj, dělám svůj první program v C. jedná se o provedení aritmetického průměru přečtením celočíselných hodnot. Na výstupu mi to ale zaokrouhluje. Nevím jestli musím provést nějakou podmínku, aby mi to vyhodilo bez zaokrouhlení. Za jakoukoliv pomoc díky.

Zkusil jsem: Proměnné celočíselných hoodnot jsem uložil jako "int" a program je čte jako %d. Průměr jsem dal jako float a program ho vypíše jako %f, ale desetinná čísla nevypíše.

Chci docílit: !na vstupu musí být celočíselne hodnoty! na výstupu bez zaokrouhlení

Editováno 18.10.2021 13:29
 
Odpovědět
18.10.2021 13:28
Avatar
Petan
Člen
Avatar
Odpovídá na Lukáš Mašek
Petan:18.10.2021 14:11

Mas pouzito celociselne deleni vysledek bude int,pokud chces aby byl vysledek float tak c = (a + b) / 2.0;
A pro vypis misto %d pouzij %.01f vypise na jedno des. misto.

 
Nahoru Odpovědět
18.10.2021 14:11
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Mašek
DarkCoder:19.10.2021 9:18

V C se výsledný typ ve výrazu řídí určitými pravidly. Existují dva typy typových konverzí - implicitní a explicitní.

Implicitní konverzí se rozumí, že ke konverzi dochází na straně překladače. Explicitní konverze je zase záležitost programátora.

Implicitní konverze se řídí těmito třemi pravidly - podpora celých čísel, podpora typu, konverze typu při přiřazení.

Ve stručnosti:

podpora celých čísel - typy char a short se při vyhodnocování výrazu rozšiřují na typ int.
podpora typu - všechny typy ve výrazu jsou povýšeny na největší typ
konverze typu při přiřazení - pokud se typ pravé strany v přiřazovacím příkazu liší od typu na levé straně, je typ pravé strany převeden na typ na levé straně.

Máme-li např. následující výraz

c = (a + b) / 2.0 kde c je typu float a, b jsou typu int. Pak výraz v závorce je typu int protože oba operandy jsou typu int. Výsledný výraz na pravé straně je typu double, protože konstanta 2.0 je typu double. Nakonec je celý výraz na pravé straně převeden na float neboť výraz na levé straně je typu float.

Proto pokud bychom měli výraz c = (a + b) / 2, tak typ na pravé straně (je typu int) neobsahuje informace o desetiných hodnotách a tedy ani samotný převod na float se tyto hodnoty nezobrazí. Pravá část bude celé číslo, ke kterému budou pouze přidány nuly na desetinných místech po převodu na float. Což není přesný výsledek výrazu.

Explicitní konverzi řídí programátor. Jedná se o tzv. přetypování, kde typ ve výrazu je dočasně převeden na požadovaný typ.
Syntaxe přetypování je: (typ) proměnná Např. (float)pocet

Zde je ukázka pokročilejšího příkladu na zjištění průměru ze zadaného počtu čísel. Ukazuje způsob použití přetypování.

// Prumer z N cisel

#include <stdio.h>

int main(void) {

        unsigned int pocet;
        int cislo, soucet = 0;

        printf("Zadej pocet cisel: ");
        scanf("%u", &pocet);

        for (unsigned int i = 0; i < pocet; i++) {
                printf("Zadej %u. cislo: ", i + 1);
                scanf("%d", &cislo);
                soucet += cislo;
        }

        printf("Prumer ze zadanych cisel je: %.3f\n", soucet / (float)pocet);

        return 0;
}

Program očekáváná zadání počtu a hodnot čísel, z niž se bude určovat průměr. Nakonec vypíše hodnotu průměru zaokrouhlenou na tři desetinná čísla.

Nahoru Odpovědět
19.10.2021 9:18
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
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 3 zpráv z 3.