Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 5. diel - Typový systém druhýkrát - Dátové typy v C# .NET

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
Pavel Exner
Člen
Avatar
Odpovedá na Jan Mareš
Pavel Exner:21.6.2017 16:52

to {0} nema souvislost s vlastnosti Length, ale s metodou Format(). Nula je tam proto, ze pole jsou v c# cislovany od nuly. Jednicku tam treba pouzijes, pokud napises:
Console.Write­Line("Délka vašeho jména {0} je: {1}",jmeno, jmeno.Length);

Avatar
Jiří Richter:16.8.2017 20:34

To jsou čísla. :-)

Avatar
havlat82
Člen
Avatar
havlat82:26.8.2017 14:08

Ahoj narazil jsem na něco, co mě docela zaujalo a rád bych věděl proč to tak je.
Mám tenhle kus kódu:

sbyte sb = -127;
byte b = 255;
b = (byte)sb;

čekal jsem, že b bude mít přetypování hodnotu 127 nebo 128, ale opakovaně mi vychazí 129.
ví někdo proč?

Avatar
pocitac770
Tvůrce
Avatar
Odpovedá na havlat82
pocitac770:26.8.2017 16:26

Stačí si uvědomit, jak jsou zapisovány čísla v binární soustavě. Pokud máme unsigned typy, pak je to jednoduché, 1 = 2 na (pozice) (myšleno jako index, píšu na mobilu). Byte je 8 bitů, proto si můžeme představit např 128 jako 10000000 (2 na 8.). U signed typů se používá jeden index, který označuje znaménko, přesněji ten první zleva. A protože zahrunujeme nulu jenom jednou (u kladných čísel, dle dohody), pak máme 2 sady čísel (0-127) a (-128 - -1). Zápis každého čísla v jedné sadě odpovídá tomu na stejné pozici v druhé sadě, jediný rozdíl v zápisu je 1 nebo 0 na první pozici. Proto máš -127, neboli 10000001. Kdyz si to převedeš jako klasické binární číslo do decimální soustavy (převedeš na unsigned typ), tak ti vyjde 2 na 8. * 2 na 0. = 128 + 1 = 129. Jednoduché, jen si stačí uvědomit ty krajové hodnoty, a jak jsou ty "sady" uspořádány :)

Avatar
havlat82
Člen
Avatar
Avatar
havlat82
Člen
Avatar
havlat82:5.9.2017 2:35

Ahoj, sorry že zase otravuju asi ptákovinou..

double mez = 1/3;
double zrychleni = 0;
bool podminka = zrychleni == mez;

cyklus
// změna hodnoty proměnné zrychlení
if (podminka) //příkaz
konec cyklu

jedna třetina je číslo s neukončenym rozvojem. pokud u typů double i float dochází díky uložení k nepřesnosti.
je vůbec možný porovnávat takový čísla? pokud by se měli rovnat .

zatim sem to vždycky řešil..

double mez = 1/3;
double zrychleni = 0;
double malinko = 0.00001;
// rovnost sem určil jako kteroukoli hodnotu,
// která je menší než rozdíl porovnávaných čísel
bool podminka = (zrychleni - mez) < malinko;

cyklus
// změna hodnoty proměnné zrychlení
if (podminka) //příkaz
konec cyklu

ale třeba to dělám celou dobu zbytečně..

Avatar
David Oczka
Tvůrce
Avatar
Odpovedá na havlat82
David Oczka:5.9.2017 12:53

Pokud nebudeš mít výpočet proměnné zrychlení ve stejné přesnosti jako je přesnost proměnné mez (tedy plná přesnost typu double), tak se nikdy rovnat nebudou (prakticky mi to přijde nemožné). Urči si nějakou přesnost, třeba na těch 5 desetinných míst a před porovnáním obě hodnoty proměnných zaokrouhli na daný počet míst. Ovšem ani tohle nemusí sedět, záleží na tom, co počítáš a jaká je přesnost daného výpočtu...

Jinak je tvé řešení v podstatě to samé, co jsem popsal výše, akorát provedeno jiným způsobem. Kontroluješ zdali se výsledek blíží k mezi zleva. Zaokrouhlování kontroluje odchylku z obou stran. Ale to, jestli je potřeba kontrolovat odchylku z obou stran opět záleží na tvém výpočtu.

Pak doufám, že tu podmínku vyhodnocuješ i uvnitř cyklu... Protože jestli ji vyhodnocuješ jen na začátku a kontroluješ pořád stejnou hodnotu, tak to rozhodně fungovat nebude.

Kdyby nebylo jasno, mám na mysli toto:

cyklus
// změna hodnoty proměnné zrychlení
if ((zrychleni - mez) < malinko)
        //příkaz
konec cyklu

Snad to pomůže...

Avatar
Karel Chaloupský:17.9.2017 14:25

a

Editované
Avatar
Karel Chaloupský:17.9.2017 14:30

Stejně tak tohle:

Console.WriteLine("napište vaše jméno:");
string jmeno = Console.ReadLine();
Console.WriteLine("Délka vašeho jména je:{0}"; jmeno.Length);
Console.ReadKey();

Můžes zapsat jednodušeji takhle :

Console.WriteLine("napište vaše jméno:");
string jmeno = Console.ReadLine();
Console.WriteLine($"Délka vašeho jména je:{jmeno.Length}");
Console.ReadKey();
Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 159.