Diskuze – Lekce 6 - Podmínky (větvení) v C# .NET
ZpětUpozorň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ů.


petrph:1.2.2014 11:46
Santa Maria Velacružská, ještě to není ono.:(
Nemůžeš napsat ani if (boll = true).Tedy za prvé dosud jsi používala
proměnnou s názvem ano-tak u ní zůstaň. Nevím jestli sis udělala jinou
proměnnou boll typu bool (tedy text bool boll ?) ale jestli používáš obě,
tak to neodladíš (co máš v tom switch ..default-proměnnou ano nebo
boll?)Tak tu stejnou všude, i v podmínce.
ZA druhé, nemůžeš napsat ani if (ano = true) poněvadž operátor =
neprovádí porovnání (test podmínky), ale přiřazení. Čili, ty jsi mu
napsala příkaz přířazení true do proměnné. A co s tím udělal if se ani
neptej:( Asi už ti stejně dole v panelu překladu křičí warning... Takže
správně je if (ano==true)-tedy dvě rovnítka za sebou jako operátor
porovnání. Nebo tedy zkráceně u proměnné typu bool můžeš napsat if
(ano) - tím se myslí true.
Ale vydrž to se naučíš, víš že první programátor na světě byla
holka?
http://www.zapnimozek.cz/…ogramatorka/
Solarian:1.2.2014 12:25
Dík za ten článek, ten fakt potěšil
Já už na to přišla, že je to nesmysl (to if(bool = ano))Je to podtržené
zelenou vlnovkou, ale vypisovalo se to.
Teď jsem pro změnu napsala
bool ano = ((volba == 1) && (volba == 2) && (volba == 3) && (volba == 4));
ano = true;
To mám před switch, a pod ním
if (ano)
Console.WriteLine("Výsledek je {0}", vysledek);
Jenže ono to funguje jen když dám správnou volbu. Když dám špatnou,
tak to napíše Neplatná volba a pod to ještě Výsledek je 0. A žádný
warning u toho není.
Tak nevím, asi to přestanu řešit, protože if a else if mi připadá fakt
jednodušší.
Jan Vargovský:1.2.2014 13:05
No ještě trošku doplňim pár věcí. Ten kód by mohl vypadat aspoň takhle
bool spravne = 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: spravne = false;
break;
}
if (spravne)
Console.WriteLine("Výsledek je {0}", vysledek);
else
Console.WriteLine("Neplatná volba");
Teď se vyjádřím k těm blbostem co jsi psala ty
U tohoto příkladu je zbytečné dělat buď a nebo. Ten program to dokáže bez toho. Navíc by to šlo celé zkrátit hned na začátku, že by ses ptala, jestli ten switch to má vůbec udělat. (bylo by tam if(ano) switch(...){...} )
bool ano = ((volba == 1) && (volba == 2) && (volba == 3) && (volba == 4));
bool ne = ((volba == 0) || (volba >= 5));
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: Console.WriteLine("Neplatná volba");
break;
}
if (ano)
Console.WriteLine("Výsledek je {0}", vysledek);
else if (ne)
Console.WriteLine("Neplatná volba");
Proměnná typu bool a boolean je úplně to samé. Jen to má jinačí název (v C# existují tzv. aliasy k některým typům (hodnotové jako: string, bool, int apod.)
Ta druhá část kódu je dobrá. Ale podívej se na první 2 řádky. Ty té
proměnné ano přiřadíš nějakou hodnotu a potom jí stejně nastavíš
true. Takže program tam testuje tu volbu jestli je ekvivalentní k 1 a
zároveň k 2 a zároveň k 3 a zároveň k 4 - jak může mít nějaký int
najednou 4 hodnoty ? použil
bych tam alespoň logické OR (||) a pak ten druhý řádek můžeš smazat.
bool ano = ((volba == 1) && (volba == 2) && (volba == 3) && (volba == 4));
ano = true;
if (ano)
Console.WriteLine("Výsledek je {0}", vysledek);
.
Jenže ono to funguje jen když dám správnou volbu. Když dám špatnou, tak to napíše Neplatná volba a pod to ještě Výsledek je 0. A žádný warning u toho není.
Nevím jak vypadá ten kód, ale když se podívám na ten poslední, tak vypisuješ neplatná volba 2x (jednou už v tom switchi a pak pomocí else větve), už když máš 2x vypisování té samé věci v programu - něco je špatně.
petrph:1.2.2014 13:19
Ach jo,z toho co teď popisuješ jako špatnej výsledek, se dá vyčíst že
sis do kódu vrátila ty stejný chyby jako ji je měla na začátku. Kdyžtak
vyčkej já ti pošlu za chvíli jak to má být jako soukromou zprávu, ať si
i jiní popřemýšlejí a nedáváme sem hotové řešení příkladu.
Ale radši to nezkoušej s pomocí if to by možná dopadlo stejně špatně -
ten operátor && dělá něco jinýho než si myslíš...
Solarian:1.2.2014 13:30
Tak teď už to snad chápu.
Nastavím bool spravne na true a pak dám do default: spravne = false. A tím
ten program bere vše kromě case jako špatně. Já se to snažila udělat
obráceně(nastavit to, co má být true.
Dík za trpělivé vysvětlování
Lukáš Nový:8.2.2014 21:41
Ahoj sdraco, mám pár nejasností, poraď mi pls (moje otázka k danému bodu je většinou text v komentáři) :
1.
if (30 < 4) /* při tomto použití píše že console je nedostupný */
Console.WriteLine("Pravda");
Console.WriteLine("Program zde pokračuje dál");
Vím že napsat že 30 je menší než 4 je kravina, ale zkusil sem to a zajímalo by mně pro zrovna console je nedostupný?
2.
if (30 > 4)
Console.WriteLine("Pravda");
Console.WriteLine("Program zde pokračuje dál"); /* jaktože tady nemusí být příkazy ve slož. závorkách když jich je více než jeden? mě to funguje bez nich */
Console.ReadLine();
3.
Console.WriteLine("zadej nějaké číslo pro výpočet odmocniny");
int b = int.Parse(Console.ReadLine());
if (b > 0)
Console.WriteLine("zadal jste číslo větší než 0, takže lze odmocnit");
double odm = Math.Sqrt(b);
Console.WriteLine("Odmocnina z čísla " + b + " se rovná: " + odm);
//při použití slož. závorek a zadání mínusového čísla se nestane nic
// při nepoužití slož. závorek a zadání mínusového čísla se vypíše: Odmocnina z čísla (např.) -3 Není číslo
Jaktože to vypíše text který jsem nezadal: (Není číslo)?
4. Píšou se za příkaz else v případě více příkazů složené závorky?
5. V případě řešení vylepšené kalkulačky za pomoci podmínky if, z toho textu pořádně nerozumím proč musí mít
float vysledek;
přiřazenou hodnotu 0, zkusíš mi to vysvětlit jinak?
6. Zkoušel jsem do slož. závorek switche přidat
default :
Console.WriteLine("Zadal jste neplatnou volbu");
Ale vyhazuje to chybu: Control cannot fall through from one case label ('default:') to another (z chyby nedokážu porozumět jak to má být správně).
DÍKY za trpělivost na odpovídání mých šesti dotazů.
Jan Vargovský:8.2.2014 21:58
1. VS by tě mělo spíše upozornit (podbarvit zeleně),
že ten kód se nikdy neprovede, je to jako kdybys napsal rovnou if(false).
2. 4.
1 if (30 > 4)
2 Console.WriteLine("Pravda");
3 Console.WriteLine("Program zde pokračuje dál");
4 Console.ReadLine();
Ten kód vypadá zformátovaný nějak takhle. Když by ta podmínka byla true, tak se udělá 2,3,4. Zatím co, kdyby byla ta podmínka false, tak se ti provede jen 3,4 a ta 2 patří k té podmínce.
Vždycky, když máš nějakou podmínku, cyklus nebo cokoliv co má
vnitřní blok, tak když chceš více příkazů, musíš je dát do složené
závorky, když chceš jen 1, nemusíš tam ty složené závorky psát.
3. To je to samé, ten problém, že když nepíšeš složené
závorky, tak ta podmínka patří jen k tomu prvnímu řádku
if (b > 0)
Console.WriteLine("zadal jste číslo větší než 0, takže lze odmocnit");
double odm = Math.Sqrt(b);
Console.WriteLine("Odmocnina z čísla " + b + " se rovná: " + odm);
Pak hned poznáš co kde patří. Raději všude piš složené závorky,
časem tě bude štvát, že ten kód je občas dlouhý a složené závorky ho
zbytečně zvětšují o víc jak 50%.
5. občas ti kompilátor zahlásí, že se snažíš pracovat s
proměnnou, která není inicializována. V případě hodnotových typů
(int,char, ...) to ani tak nevadí, ale když budeš pracovat s třídami, tak
ty mají defaultní hodnotu null.
6. Chybí ti tam default. Když nenapíšeš break; tak ti to
propadává o větev dolů (další case, který je hned pod tím) ale tam
Lukáš Nový:9.2.2014 22:18
Díky za odpovědi, ještě mi k tomu bodu 3. napiš kde se vzal ten text "Není číslo" ? při zadání mínusového čísla se tento text vypíše. Já sem ho tam nikde nezadával. Kde se vzal?
Zobrazeno 10 zpráv z 172.