PHP týden Letní akce
Pouze tento týden sleva až 80 % na kurzy PHP. Lze kombinovat s akcí Letní slevy na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!
Avatar
Tomáš Hanzelka:7. ledna 19:08

Jakožto pilný student se připravuji na základní zkoušku z C#. Ale není mi jasné jaká je ta správná programátorská odpověď v případě čísla 6, 7, 8, 9, když mi konzole hází nesmysly (viz. obrázek).
Dále by mě zajímalo, jestli moje odpověď 1) je také programátorsky správná.

Vlevo je zadání, vpravo moje konzole a moje odpovědi. :)

Zkusil jsem: Zbytek v obrázku

Chci docílit: Mít správnou odpovědět, kterou by učitel rád slyšel.
Děkuji všem za odpověď.

Editováno 7. ledna 19:09
 
Odpovědět 7. ledna 19:08
Avatar
Filip Němeček
Redaktor
Avatar
Filip Němeček:8. ledna 16:36

Ano, tvoje odpověď na otázku 1 je dobře.

Jelikož evidentně nemá Cislo implementaci ToString(), tak konzole prostě vypíše kompletní identifikátor včetně názvu programu.

  1. by mělo vypsat null. Na 9) se s tímto kódem nedostaneš, protože nebude fungovat "Vynuluj()". Což je teda dost blbě zvolený název metody, protože není jasné, jestli číslo nastaví na "0" nebo "null".

10 a 11 má být co? Jako ukázat, že v paměti jsou pouze 2 instance třídy ale 4 instance struktury?

Čistě ze zvědavosti, kde studuješ?

 
Nahoru Odpovědět 8. ledna 16:36
Avatar
Tomáš Hanzelka:8. ledna 20:14

U 6) to napíše kompletní identifikátor, ale ne 0, je to v pořádku?
U 7) to napíše kompletní identifikátor, ale ne 0, je to v pořádku?
U 8) to napíše kompletní identifikátor, ale ne Null, je to v pořádku?

  1. souhlasím

10 a 11 je podle mě od toho, abychom nakreslili, že v případě referenčního typu bude přímo v paměti napsaná adresa, kde je uložená proměnná, ale v případě struktury do adresy rovnou napsat hodnotu

Studuju na UTB. Jestli na to ještě koukneš a zodpovíš mé otázky, moc mi pomůžeš. Děkuji :)

 
Nahoru Odpovědět 8. ledna 20:14
Avatar
Filip Němeček
Redaktor
Avatar
Odpovídá na Tomáš Hanzelka
Filip Němeček:8. ledna 21:55

Aha, tak s tím null jsem se spletl.

No jelikož si to přímo zkoušíš a vidíš co to udělá, tak to v pořádku bude ;-)

 
Nahoru Odpovědět 8. ledna 21:55
Avatar
Tomáš Hanzelka:8. ledna 22:15

Děkuji. A k té 10. a 11. ještě jen.
Mohlo by to takhle být? Jestli je tam správný počet instancí a hodnoty v paměti? (viz. obrázek)
Díky za odpověď. Tohle je už moje poslední žádost o pomoct. :)

 
Nahoru Odpovědět 8. ledna 22:15
Avatar
Filip Němeček
Redaktor
Avatar
Filip Němeček:9. ledna 11:09

Tyjo upřímně jsem se do toho teď zamotal.

Po posledním projetí v tom vidím jednu instanci třídy, protože sice jsi konstruktor volal 2x, ale do proměnné "f" hned po vytvoření instance dáváš referenci na "d". Tím pádem tu nově vytvořenou instanci seřere garbage collector, protože na ní nic neodkazuje.

Každopádně bych to vyzkoušel pomocí metody ReferenceEquals(), díky které zjistíš, jestli jde o stejné instance.

Btw jestli tě to celé mate, tak si z toho nic nedělej. V C# jsem pracovně dělal pár let a netuším, jakou má praktickou hodnotu takovéto zmatené přepisování proměnných jinými instancemi...

 
Nahoru Odpovědět 9. ledna 11:09
Avatar
Tomáš Hanzelka:9. ledna 17:49

Tak vyzkoušel jsem RefernceEquals() a ukazuje to true ať zadám jakoukoliv kombinaci. Podle toho soudím, že v posledním obrázku pro Třídy by mělo být ještě c a všechny by měli ukazovat na stejnou referenci (takže vlastně tak jak je to v obrázku) a v ní by měla být hodnota null podle posledního kroku, kde jsme použili vynuluj, že ano? :)

 
Nahoru Odpovědět 9. ledna 17:49
Avatar
Filip Němeček
Redaktor
Avatar
Filip Němeček:9. ledna 19:34

To je zamotané :D

"c" je nastavené na null, takže to nereferencuje žádnou instanci.

Hele neumí VS v nových verzích zobrazovat přímo objekty programu v nějakém debug okně? To by asi dost pomohlo :-)

 
Nahoru Odpovědět 9. ledna 19:34
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Tomáš Hanzelka
Martin Petrovaj:9. ledna 20:20

Áno, tvoj posledný príspevok to opisuje správne. V prípade, že je Cislo trieda, tak všetky premenné c, d, e, f ukazujú na jednu adresu v pamäti (konkrétne na halde), na ktorej je hodnota null.

Mimochodom, pokiaľ Cislo (či už trieda, alebo štruktúra) nemá preťaženú metódu ToString, tak pri výpise budú premenné typu Cislo stále vypisovať len meno svojho typu (čiže niečo ako ConsoleApp.Cislo alebo v tvojom prípade ConsoleApp3.Pro­gram.Cislo). To sú tie tvoje "nesmysly". Moreover, pokiaľ je hodnota danej premennej null, nemalo by sa vypísať vôbec nič.
Pre výpis premennej hodnota daného objektu / štruktúry typu Cislo treba buď ToString preťažiť, alebo stále vypisovať pomocou menoPremennej­.hodnota .

Ad Filip Němeček - toto nie je o zmätenom prepisovaní premenných, ani to nie je vôbec o C#. Je to o tom, že chalan sa musí naučiť rozdiel medzi hodnotou a referenciou, medzi pamäťou na stacku a na heape atď. Bude to potrebovať takmer vo všetkých programovacích jazykoch. Pokiaľ v tom bude len tápať, tak akonáhle použije niekde priradenie, bude mať zaděláno na kopu logických chýb typu "túto premennú som prepísal, ale mimo funkcie sa jej obsah nezmenil", prípadne "tu som s tou premennou pracoval len vo vnútri funkcie, ale zmenil sa obsah aj tejto premennej mimo nej". Tvrdiť mu, že to nemá praktický zmysel ho akurát odradí od toho, aby tomu venoval pozornosť.

Pre niekoho je to možno náročnejšie na pochopenie (u nás sa to berie ešte na gympli a vidím tú pohromu first hand), ale jednoznačne to každý potrebuje zvládnuť, kým mu niekto dá čokoľvek praktické pod ruku. A modliť sa, aby predtým nemusel náhodou pracovať s jazykom, ktorý sa sám nestará o memory management :-D

Editováno 9. ledna 20:21
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 9. ledna 20:20
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Tomáš Hanzelka:9. ledna 22:23

Děkuji za rozsáhlou odpověď. Obecně jsem měl jasno, jen s těmi referenčními typy ne tak úplně, ovšem teď už to je úplně jasné.
Tak zítra a zkoušku, ještě jednou díky za pomoc.

 
Nahoru Odpovědět 9. ledna 22:23
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 11 zpráv z 11.