NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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í.

Diskuze – Lekce 8 - Ošetření uživatelských vstupů 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
gcx11
Tvůrce
Avatar
Odpovídá na Martin Kostelka
gcx11:3.6.2017 16:18

Píšou se stále složitější a větší programy, proto se i paradigmata programování vyvíjejí, aby se dal dobře takový větší program udržovat.

Na takto jednoduchou kalkulačku se dá použít goto, ale pokud tam přidáš další funkcionalitu, tak se v tom po chvilce nevyznáš, protože budeš zkoumat, proč se někde skončilo o dalších 200 řádek jinam a co tam program vlastně dělá.

Proto se později začaly používat funkce, které mají něco provést, ale Tebe už pak nemusí zajímat, co to dělá vnitřně, pokud to nemá nějaký nečekaný vedlejší efekt. Například funkce, co načte číslo:

float getNumber(String prompt, String errorMessage){
        float number;
        Console.WriteLine(prompt);
        while (!float.TryParse(Console.ReadLine(), out number))
                Console.WriteLine(errorMessage);
        return number;
}

Použití:

float a = getNumber("Zadejte první číslo:", "Neplatné číslo, zadejte prosím znovu:");
float b = getNumber("Zadejte druhé číslo:", "Neplatné číslo, zadejte prosím znovu:")

Čímž zredukuješ kód, který tam je dvakrát. Tím pádem, pokud je v tom načítání čísel chyba, tak jí stačí opravit jenom na jednom místě v programu.

A jakmile ani samotné funkce nestačily, tak se vyvinulo objektově orientované programování, které sdružuje stejná data do objektů. Například informace o člověku (jméno, příjmení, věk) a pak se s tím mnohem lépe pracuje, ale k tomu se dostaneš časem.

class Person{
      string firstName;
      string lastName;
      int age;
}

Goto bys měl maximálně použít, když potřebuješ ihned vyskočit z nějakého hodně zanořeného cyklu anebo když potřebuješ přeskočit ve switchi z jednoho case do dalšího. Lepší je použít while cyklus, stejně se to přeloží do goto, ale program bude přehlědnější.

 
Odpovědět
3.6.2017 16:18
Avatar
Odpovídá na gcx11
Martin Kostelka:5.6.2017 9:09

Mno já mám goto právě s if a dostane se to na goto pouze pokud podmínka neplatí. a u zadání čísel mám while ale u příkladu nahoře se podívej když máš početní operaci (+,-,*,/) tak po stisknutí špatné klávesnie se musí zadat nový příklad jak by to s tím float teda vypadalo jedině narvat to do else o tento sekci kódu my jde dal jsem to zatím s tím goto. stačí jestli bys mi poslal pouze stím else a dál abych to pochopil asi jsem trochu tupý ale ze školy jsem nějakej ten pátek tak jsem se odvikl něco učit :-)
switch (volba)
{
case '1':
vysledek = a + b;
break;
case '2':
vysledek = a - b;
break;
case '3':
vysledek = a * b;
break;
case '4':
vysledek = a / b;
break;
default:
neplatnaVolba = false;
break;
}
if (neplatnaVolba)
Console.Write­Line("Výsledek: {0}", vysledek);
else
goto zadání;

Editováno 5.6.2017 9:10
 
Odpovědět
5.6.2017 9:09
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Martin Kostelka
gcx11:5.6.2017 11:42
bool platnaVolba = false;
float vysledek = 0;
while (!platnaVolba){
        Console.WriteLine("Zvolte si operaci:");
        Console.WriteLine("1 - sčítání");
        Console.WriteLine("2 - odčítání");
        Console.WriteLine("3 - násobení");
        Console.WriteLine("4 - dělení");
        char volba = Console.ReadKey().KeyChar;
        Console.WriteLine();
        platnaVolba = true;
        switch (volba)
        {
                case '1':
                        vysledek = a + b;
                        break;
                case '2':
                        vysledek = a - b;
                        break;
                case '3':
                        vysledek = a * b;
                        break;
                case '4':
                        vysledek = a / b;
                        break;
                default:
                        platnaVolba = false;
                        break;
        }
}
 
Odpovědět
5.6.2017 11:42
Avatar
Odpovídá na gcx11
Martin Kostelka:5.6.2017 15:40

mno jo ale tvoje řešení neřeší, že když zmačknem špatné číslo pro zadání výpočetní operace aby to nabýdlo opět početní operaci,v tvém kódu nabýdne to "přeje te si zadat další příklad?" pokud dáš "a" musíš zadat opět čísla možná jsme si jen špatně porozumněli nešlo by se nějako spojit třeba na TS nebo tak (skype nemám) něco v online režimu stačí i nějakej chat

 
Odpovědět
5.6.2017 15:40
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Martin Kostelka
gcx11:7.6.2017 14:23

Musíš si upravit i zbytek, aby to pak fungovalo, když už teď máš jistotu, že budeš mít dobře volbu operace.

Console.WriteLine("Vítejte v kalkulačce");
            bool pokracovat = true;
            while (pokracovat)
            {
                // načtení čísel
                Console.WriteLine("Zadejte první číslo:");
                float a;
                while (!float.TryParse(Console.ReadLine(), out a))
                    Console.WriteLine("Neplatné číslo, zadejte prosím znovu:");
                Console.WriteLine("Zadejte druhé číslo:");
                float b;
                while (!float.TryParse(Console.ReadLine(), out b))
                    Console.WriteLine("Neplatné číslo, zadejte prosím znovu:");
                // volba operace a výpočet
                Console.WriteLine();
                bool platnaVolba = false;
                float vysledek = 0;
                while (!platnaVolba)
                {
                    Console.WriteLine("Zvolte si operaci:");
                    Console.WriteLine("1 - sčítání");
                    Console.WriteLine("2 - odčítání");
                    Console.WriteLine("3 - násobení");
                    Console.WriteLine("4 - dělení");
                    char volba = Console.ReadKey().KeyChar;
                    Console.WriteLine();
                    platnaVolba = true;
                    switch (volba)
                    {
                        case '1':
                            vysledek = a + b;
                            break;
                        case '2':
                            vysledek = a - b;
                            break;
                        case '3':
                            vysledek = a * b;
                            break;
                        case '4':
                            vysledek = a / b;
                            break;
                        default:
                            platnaVolba = false;
                            Console.WriteLine("Neplatná volba");
                            break;
                    }
                }
                Console.WriteLine("Výsledek: {0}", vysledek);
                // dotaz na pokračování
                platnaVolba = false;
                Console.WriteLine("Přejete si zadat další příklad? [a/n]");
                while (!platnaVolba)
                {
                    switch (Console.ReadKey().KeyChar.ToString().ToLower())
                    {
                        case "a":
                            pokracovat = true;
                            platnaVolba = true;
                            break;
                        case "n":
                            pokracovat = false;
                            platnaVolba = true;
                            break;
                        default:
                            Console.WriteLine("Neplatná volba, zadejte prosím a/n");
                            break;
                    }
                }
                Console.WriteLine();
            }
 
Odpovědět
7.6.2017 14:23
Avatar
Martin Kostelka:19.6.2017 11:00

ježiši už vím proč mi ta cikle předtím nefungovala nemněl jsem tam } ve volbě oprerace na konci jsem tam mněl 1 a musej tam bejt dvě takže jsem to zkoušel předtím dobře jen jsem zapomněl složenou závorku taková prkotina a dokáže pozlobit XD jinak omlouvám se mněl jsem hodně práce dítě na cestě tak jsme předělávali chodbu tak jsem nemněl čas :-)

 
Odpovědět
19.6.2017 11:00
Avatar
havlat82
Člen
Avatar
havlat82:27.8.2017 12:41

Ahoj, kdysi dávno sem programoval v turbo pascalu a tam byli procedury a funkce. funkce vraceli hodnotu a procedury byli jako metody bez návratové hodnoty. parametr procedur mohl mít modifikátor var. procedura pak do parametru ukládala hodnotu. A byla to možnost jak získat víc hodnot najednou, protože stejně jako metody v C# vraceli pouze jednu hodnotu. Chová se modifikátor out jako obdoba modifikátoru var v turbo pascalu? A dá se tak získat z metody víc hodnot najednou?

string zapisCisla = "51";
int cislo = 0;
bool povedloSe = int.TryParse(zapisCisla, out cislo);
 
Odpovědět
27.8.2017 12:41
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na havlat82
David Hartinger:27.8.2017 12:44

Z toho jak to popisuješ tak asi no. Nicméně to není moc dobrá praktika, když chceš, aby ti metoda vrátila více hodnot, tak by měla vrátit objekt. Vše je ukázáno dále v seriálu. Předávání přes parametry po jedné hodnotě je dlouhé a nepřehledné.

Odpovědět
27.8.2017 12:44
New kid back on the block with a R.I.P
Avatar
havlat82
Člen
Avatar
Odpovídá na David Hartinger
havlat82:27.8.2017 12:48

nebyla to podle mě dobrá technika a ni v dobách turbo pascalu. funkce sem bral jako element, kterej mi dá hodnotu a proceduru jako příkaz. obcházení čehokoliv je dycky na pizzu. ptal sem se, protože mě to zaujalo. seriál teď čtu už asi po ixtý. se nudim :D

 
Odpovědět
27.8.2017 12:48
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na havlat82
David Hartinger:27.8.2017 12:49

Tak přejdi na OOP seriál, tam je toto popsané :)

Odpovědět
27.8.2017 12:49
New kid back on the block with a R.I.P
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 149.