Diskuze: Opakování
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 28 zpráv z 28.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, pročti si lekci cykly: http://www.itnetwork.cz/index.php?…
Pročetl jsem to znovu ale myslím že s toho tutorialu nedokážu pochopit jak to udělat. V kalkulačce je while cysklus ale s proměnnou kterou musíte potvrdit "Přejete si zadat další příklad? [ano/ne]". Potřebuji to udělat bez toho. A nevím jak na to.
Cyklus se provádí dokud je platná podmínka. Pokud chceš infinity použij while (true). Z cyklu pak můžeš vyskočit pomocí break;
Moc nerozumím, čemu nerozumíš, tutoriál vše jasně vysvětluješ. Pokud chceš něco opakovat, vlož to do cyklu. Pokud ti nevyhovuje podmínka v kalkulačce, dej si tam jinou podmínku. Četl jsi předešlé tutoriály? Samozřejmě na sebe navazují.
Tohle bych tu vůbec nevytahoval, ještě to někdo bude používat. While true je spíše vtip.
Proč? Někdy se to hodí. Když něco testuješ třeba máš vlákno a chceš něco pořád opakovat po určitých intervalech. Thread.Sleep(1000);
Používá se více než for (;;). Možná kvůli definici, že for má být cyklus s předem daným počtem opakováním.
http://stackoverflow.com/…nfinite-loop
Ikdyž není vhodné toto používat v programech nebo ukázkových kódech určitě si to najde využití pro testovací účeli, práci s vlákny a nevím kde ještě.
Neviděl bych jako problém to použít.
Nekonečné cykly nejsou dobrou vizitkou programátora. Svědčí o tom, že uvažuje příliš imperativně s nízkou úrovní abstrakce.
Nikdy jsem nekonečný cyklus nepoužil. Ani jsem jej nepotřeboval. Jak jsem již zmínil, ve výsledném programu či ukázkovém kódě se tohoto vyvarovat.
Chápu, že jsem to nevhodně sdělil a vyznělo to, že lze touto cestou jít. To ne. Jen si stojím za názorem, že pokud chci něco rychle otestovat toto použít pro svůj účel mohu.
Uvedu příklad. Chci na vlákně spustit v určitém intervalu nějakou metodu a dívat se na její výstup. Prioritní pro mě je odladit metodu a pak až se věnovat jejímu použití.
Tak si vytvořím vlákno, na něm si dám cyklus a v něm budu volat metodu
a Thread.Pause(x);
A nemusím hledat a nastavovat timer.
Psát dobře bys měl vždy, i když testuješ, i když píšeš jen utilitku na jedno použití, i když píšeš pro sebe nebo pro zaměstnavatele. Nikdy nevíš, kdy to tam zapomeneš.
Při vývoji metodou TDD je v testech povoleno vše, tedy i nečisté praktiky.
Ovšem správně napsaný kód nebývá delší, než "nečistý". Je dobré dodržovat stále stejnou kulturu programování, i když na ní v daném případě moc nezáleží. Je to spíš otázkou duševní hygieny než nějakého dogmatu.
Ale já bych chtěl, aby se to hned po zadání proměnné dotaz zase přesunulo zpátky na dotaz. Nevím jakou podmínku tak mám dát.
To je pravda. Ovšem nechápu, proč na tolika fórech přímo o C# jsou uváděny ukázky s nekonečnými cykly. Osobně jsem je nikdy neměl potřebu použít ani pro testovací účely. Ovšem myslel jsem, že to není problém. Teď již chápu, že ta tuna balastu na internetu z programátorů dělá prasata.
V tom případě.
while (odpoved != "")
Dokud uživatel nezadá prázdný řetězec.
Zamysli se nad tím, jak chceš ten cyklus ukončit. Nulou, novým řádkem, Ctrl-D,... To budeš testovat ve funkci, která čte vstup a kterou vložíš do podmínky while. Najednou to bude vypadat hezky: Dokud mám vstupní data, provádím cyklus.
while ((string dotaz = getDotaz()) != "konec")
{
odpovez(dotaz);
}
Tohle mám dat místo if? Omlouvám se ale ty cykly mi nějak nesedly.
Myslím, že by jsi měl začít s tím C# pěkně popořadě. Číst a zkoušet
V podstatě ano. A nezapomeň si k tomu dopsat metodu getDotaz(). Pokud bych zůstal u prvního příkladu, tak by to mohlo vypadat třeba takto:
while((dotaz=Console.ReadLine())!=""){
if (dotaz=="otazka")
...
}
Budeš psát Elizu?
Mně cykly také moc nesedí. Zejména počítané se často používají i tam, kde být nemají.
Dnešní programovací jazyky obsahují dostatek syntaktického cukru na to, aby se cykly nepoužívaly skoro vůbec.
Když o tom tak přemýšlím, pokud píši aplikaci úhledně a dodržuji
oop standardy, nemám potřebu je použít. Ostatně ani nepamatuji, kdy jsem
nějaký naposledy použil. Jak říkáš, syntaktického cukru je již opravdu
dostatek. Když chci například něco provést při určité události,
využiji event. Událost se klidně může opakovat.
Pokud chci například naplnit pole také nemusím použít cyklus. Vytvořím
kolekci položek a tu pak předám jako celek.
Vlastně bych řekl, že když program obsahuje více cyklů, že to není moc
ok, nemluvě o vnořených cyklech.
Typuji, že většinou jsou používány pro neznalost jazyka. Kdo jej zná, použije optimalizovanou metodu.
Odvyknutí od cyklů má ještě jeden docela pádný důvod. Když před 10 lety bylo obvyklé, že procesor měl jen jedno jádro, tak to bylo vcelku jedno. Dokonce cykly byly efektivnější, než jiné konstrukce. Dnes, kdy i mobilní zařízení mívá vícejádrové procesory, se situace dost mění.
Počítaný cyklus se totiž nedá paralelizovat - není možné vnitřek cyklu spustit na více jádrech současně, protože jednotlivá vlákna jsou svázána řídící proměnnou. Nemohou tedy běžet nezávisle na sobě. Proto všechny moderní jazyky nabízí alternativy ve formě map/filter/reduce, které tímto neduhem netrpí. Zatím se to v aplikacích sice moc nevyužívá k výpočtu ve více vláknech, ale s vývojem HW směrem k multijádrovým procesorům je jen otázkou času, kdy využití výkonu všech dostupných jader jedním procesem bude nutností. A to je možné pouze bez počítaných cyklů.
V C# cykly poměrně vyřadil LINQ, což je integrovaný SQL jazyk přímo do syntaxe. Můžu tedy volat ten samý dotaz a je mi úplně jedno, jestli je kolekce pole nebo XML soubor. Přijde mi to dost šikovné, stále to optimalizovávají a má to taky paralelní běh.
Cykly však IMHO své postavení v programování neztratí, stále je mnoho případu, kdy je jednodušší a přehlednější je použít. Určitě bych je nevnímal jako něco špatného.
Cykly se používají na procházení polem. Jenže ne každé pole je polem podle definice. Velmi často jsou to seznamy, na kterých by se neměly používat cykly, ale funkce pro práci se seznamy.
Takže místo obvyklého
for i in 0..size(pole)-1
if(pole[i]%2==1)
print pole[i]
raději
print reduce(filter(pole,licha))," ")
Nehledejte v tom syntaxi konkrétního jazyka.
Zobrazeno 28 zpráv z 28.