NOVINKA: Staň se datovým analytikem od 0 Kč a získej jistotu práce, lepší plat a nové kariérní možnosti. Více informací:

Diskuze – Lekce 5 - Typový systém podruhé - Datové typy v C# .NET

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Pavel Exner
Člen
Avatar
Odpovídá 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);

 
Odpovědět
21.6.2017 16:52
Avatar
Jiří Richter:16.8.2017 20:34

To jsou čísla. :-)

 
Odpovědět
16.8.2017 20:34
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č?

 
Odpovědět
26.8.2017 14:08
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá 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 :)

 
Odpovědět
26.8.2017 16:26
Avatar
havlat82
Člen
Avatar
Odpovídá na pocitac770
havlat82:26.8.2017 16:50

děkuju

 
Odpovědět
26.8.2017 16:50
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ě..

 
Odpovědět
5.9.2017 2:35
Avatar
David Oczka
Tvůrce
Avatar
Odpovídá 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...

 
Odpovědět
5.9.2017 12:53
Avatar
havlat82
Člen
Avatar
 
Odpovědět
8.9.2017 8:21
Avatar
Karel Chaloupský:17.9.2017 14:25

a

Editováno 17.9.2017 14:26
 
Odpovědět
17.9.2017 14:25
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();
 
Odpovědět
17.9.2017 14:30
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 10 zpráv z 159.