NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Kontrukce if ( vyraz1 && vyraz 2 )

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jan Moravec
Člen
Avatar
Jan Moravec:10.5.2017 14:16

Ahoj lidi, potrebuju vyresit co nejjednoduseji toto :

if ( vyraz1 && vyraz 2 ) { vyraz 3;}
Potrebuji aby kdyz vyraz 1 nebo 2 vykazuje nulovou hodnotu aby se nezucastnil podminky .....

Diky moc za hlp
dave

 
Odpovědět
10.5.2017 14:16
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na Jan Moravec
pocitac770:10.5.2017 14:23
if((v1 == null && v2) || (v1 && v2 == null) || (v1 && v2))

Prostě si poskládáš podmínky, které jsi dal dohromady, jako všechny přípustné možnosti
(Tedy pokud má C++ takovýto zápis zjišťování nullu, jinak si tam doplň to, co vy používáte v tom vašem superrychlém jazyku :D )

 
Nahoru Odpovědět
10.5.2017 14:23
Avatar
Odpovídá na pocitac770
Erik Šťastný:10.5.2017 14:28

Psal nulovou ne nullovou :P Ale na podmínkách to nic nemění :)

Editováno 10.5.2017 14:28
 
Nahoru Odpovědět
10.5.2017 14:28
Avatar
termostat
Člen
Avatar
termostat:10.5.2017 19:31

Pokud myslí nulovou a ne nullovou, tak bych řekl, že nejjednodušší řešení je toto:

if ( vyraz1 || vyraz2 ) { vyraz3; }
 
Nahoru Odpovědět
10.5.2017 19:31
Avatar
Odpovídá na termostat
Neaktivní uživatel:10.5.2017 20:08

Tohle určitě ne. Vždyť to je to samé co napsal on, jen jsi dal jiný- špatný operátor.
Správně je třeba

if ( vyraz != 0 && vyraz2 != 0 && vyraz3 )

Eventuálně klidně bez ifu, ale to je trošku prasárna.
A teď popis:
Je li vyraz1 0, nepokračuje se testováním.
Je li vyraz1 nenula a vyraz2 nula, nepokračuje se testováním.
Jeli vyraz1 i vyraz2 nenula otestuje - vyhodnotí se vyraz3.

Nahoru Odpovědět
10.5.2017 20:08
Neaktivní uživatelský účet
Avatar
termostat
Člen
Avatar
Odpovídá na Neaktivní uživatel
termostat:10.5.2017 20:43

Já se domnívám, že to splňuje zadání.

if ( vyraz1 || vyraz2 ) { vyraz3; }

Je li vyraz1 = 0, nezúčastní se podmínky a je vyhodnocen jen vyraz2
Je li vyraz2 = 0, nezúčastní se podmínky a je vyhodnocen jen vyraz1
Je li vyraz1 = 0 a vyraz2 = 0, podmínka není splněna
Je li vyraz1 nebo vyraz2 nenula, podmínka je splněna

 
Nahoru Odpovědět
10.5.2017 20:43
Avatar
Odpovídá na termostat
Neaktivní uživatel:11.5.2017 1:50

Počkat počkat. To asi mluvíme oba o něčem jiném. Já to pochopil tak, že nechce aby se případně vyraz3 zúčastnil vyhodnocování, například proto, že je to funkce, která má nějaký vedlejší efekt. Ale ty nemáš přece pravdu ani tak. Nevím jistě co znamená zúčastnit se podmínky v tvém podání, ale já to beru jako vyhodnocení, aka evaluation of expression a Jak by hned první example mohl platit? Pokud je vyraz1 roven nule, zúčastní se vyhodnocení podmínky. Protože není pravda, že se vyhodnotí pouze výraz2, vyhodnotí se nejdřív jednička ta vyjde fase a pak se jde na dvojku. V druhém případě. Pokud je vyraz2 nula, tak se to třeba ani nezjistí, protože stačí aby vyraz1 byl true a dvojka už se neřeší. Myslím, že máš popletené pořadí vyhodnocování operandů.
Tím jsem chtěl objasnit jak to vnímám já, přiznávám, že mi asi uniká význam slov zúčastnit se podmínky.
Tahle fráze nemá logické vysvětlení, takže asi poprosím autora dotazu, případně tebe abyste vyjasnili, co je to zúčastnit se.

Nahoru Odpovědět
11.5.2017 1:50
Neaktivní uživatelský účet
Avatar
termostat
Člen
Avatar
termostat:11.5.2017 6:53

Proč tam pleteš vyhodnocení, zadání znělo nezúčastnit se podmínky. A jak jinak bys chtěl zjistit že vyraz1 nebo vyraz2 je 0 bez vyhodnocení ?
Já jsem to pochopil tak, že "aby se nezucastnil podminky" znamená, aby na něj nebyl brán ohled, a v tom případě moje řešení přesně odpovídá zadání "co nejjednoduseji". Přiznávám, že nevím, co zadavatel ve skutečnosti přesně chtěl, ale odpovídám na to, jak to podal.

 
Nahoru Odpovědět
11.5.2017 6:53
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Jan Moravec
ostrozan:11.5.2017 7:07

asi bys měl bý víc konkrétní, protože tady to evidentně chápe každý jinak
někteří tu pracují s výrazem jako s proměnnou
ale podle mně výraz

a > b
b  - 5
c != 15
atd...

vrací true/false - i když ano, false je fyzicky "0" , ale podle mně se ptáš spíš na to, jak vyloučit z testování proměnnou s hodnotou nula
takže bys radši měl uvést konkrétní příklad a případně smysl toho všeho, protože takto se to jeví jako nesmysl

 
Nahoru Odpovědět
11.5.2017 7:07
Avatar
Jan Moravec
Člen
Avatar
Odpovídá na ostrozan
Jan Moravec:11.5.2017 7:19

Tak to ma vypadat pokud x a y se nerovnaji nule : if( x > 10 && y > 10 ) {z == 20;}
A takto kdyz se rovna treba x nule : if( y > 10 ) {z == 20;}

Jde me o to zpracovavat na jednom miste co nejvice podminek bez zbytecneho vetveni .... pokud se to tedy nejak da vubec napsat .........

 
Nahoru Odpovědět
11.5.2017 7:19
Avatar
Jan Moravec
Člen
Avatar
Jan Moravec:11.5.2017 7:22

No samozrejmne ze reseni pres || ( nebo ) mne prirozene napadlo ale takto to resit nechci protoze to bude priliz dlouhe a "amaterske" :)
s c++ nezacinam ...

 
Nahoru Odpovědět
11.5.2017 7:22
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Jan Moravec
ostrozan:11.5.2017 7:49

Předpokládám, že ses upsal a místo z == 20; má být z = 20;

Ale to, jestli proměnná má hodnotu "nula" musíš někde zjistit, je jedno kde a

if( x > 10)
funguje zároveň jako
if( x  != 0)

tak kde je problém?

 
Nahoru Odpovědět
11.5.2017 7:49
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Jan Moravec
ostrozan:11.5.2017 8:08

anebo takhle ?

z = 20 pokud:

x > 10, nebo x ==0
a zároveň
y > 10, nebo y ==0

if((x == 0 || x > 10) && (y == 0 || y > 10)z=20;
 
Nahoru Odpovědět
11.5.2017 8:08
Avatar
Jan Moravec
Člen
Avatar
Jan Moravec:11.5.2017 8:40

jo upsal .....

 
Nahoru Odpovědět
11.5.2017 8:40
Avatar
Odpovídá na termostat
Neaktivní uživatel:11.5.2017 11:27

Vyhodnocení tu zohlednuju z prostého důvodu, vyraz2 mohla být funkce, která dělá něco s vnějším světěm, má side effect.

Je li vyraz1 = 0, nezúčastní se podmínky a je vyhodnocen jen vyraz2

Je li vyraz2 = 0, nezúčastní se podmínky a je vyhodnocen jen vyraz1

Druhá část první věty je špatně. Vyhodnocen není jen vyraz2 ale i vyraz1.
Druhá věta je logicky špatně.

Právě kvůli tomu, že expression může být i zavolání funkce.
Jsem to pochopil jsem tak, že zúčastnit se podmínky, by bylo právě nechat se zavolat, což třeba vždycky nechceš.

Autor dotazu chce něco jako

Pokud je splněn vyraz1 a zároveň vyraz2 nebo pokud je vyraz 1 roven nule a vyraz2 je splněn nebo pokud je splněn vyraz1 a zároveň vyraz2 je nula pak vyhodnotí jako splněno. Jsem na mobilu nechce se mi to psát do ifu.

Nahoru Odpovědět
11.5.2017 11:27
Neaktivní uživatelský účet
Avatar
Odpovídá na ostrozan
Neaktivní uživatel:11.5.2017 11:35

Hele co se stane s tvojí podminkou, když x je nula a y je nula.

Nejsem si teď úplně jistý, ale myslel jsem, tento by se mělo vyhodnotit jako falše podle dotazu, ale ty dáš true.

Editováno 11.5.2017 11:36
Nahoru Odpovědět
11.5.2017 11:35
Neaktivní uživatelský účet
Avatar
Odpovídá na Jan Moravec
Neaktivní uživatel:11.5.2017 11:47
if ( (vyraz1 && vyraz2 ) || ( vyraz1 == 0 && vyraz2 ) || ( vyraz1 && vyraz2 == 0 ) )

Jak ale vidíš, je to příliš dlouhé. Netuším jakou máš metriku amatéřiny, ale jestli máš za sebou základy mat logiky, uvidíš v tom popsány všechny možné kombinace, které chceme. Dovolil bych si vlastní názor, když chceš takhle dlouhý a komplexní test, vyplatí se ho napsat zřetelně, tedy bez takových těch hacku a triků, kdokoliv kdo to bude po tobě číst, ti bude vděčný.

Nahoru Odpovědět
11.5.2017 11:47
Neaktivní uživatelský účet
Avatar
termostat
Člen
Avatar
Odpovídá na Neaktivní uživatel
termostat:11.5.2017 14:01

Máš pravdu, já to zase napsal terminologicky špatně, myslel jsem to takto:
Je li vyraz1 = 0, nezúčastní se podmínky a podmínky se zúčastní jen vyraz2
Je li vyraz2 = 0, nezúčastní se podmínky a podmínky se zúčastní jen vyraz1
V té odpovědi jsem neuvažoval vyhodnocení tak jak ho myslíš ty.
Myslím že tazatel se u tohoto vlákna hodně nasměje :)

 
Nahoru Odpovědět
11.5.2017 14:01
Avatar
Jan Moravec
Člen
Avatar
Odpovídá na Neaktivní uživatel
Jan Moravec:11.5.2017 14:43

Ano to je sice pravda ale u desitky ruznych kombinaci z toho vznikne docela dost velky hnuj :)

 
Nahoru Odpovědět
11.5.2017 14:43
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
ostrozan:11.5.2017 14:52

Ano, když x i y budou mít hodnotu nula - podmínka bude vyhodnocena jako true - autor nikde nespecifikuje, co se má stát, když nastane tento stav - jinak ten můj příspěvek byla otázka, jestli to tak myslel .

Pokud by se v tom případě nemělo nic dít, nezbývá, než ten stav otestovat další pomínkou

if(!(x == 0  && y == 0 ))
{
if((x == 0 || x > 10) && (y == 0 || y > 10))z=20;
}
 
Nahoru Odpovědět
11.5.2017 14:52
Avatar
Odpovídá na Jan Moravec
Neaktivní uživatel:11.5.2017 15:02

Skoro bych řekl, že pokud mluvíme o desítkách podmínek v jediném ifu, máš někde chybu v návrhu. Nezkusíš se podělit o důvod, proč něco takového chceš?

Nahoru Odpovědět
11.5.2017 15:02
Neaktivní uživatelský účet
Avatar
Odpovídá na ostrozan
Neaktivní uživatel:11.5.2017 15:05

Já jsem právě měl pocit, že jeho první příspěvek říká přesně to, že musí být splněna aspoň jedna podmínka za předpokladu, že ta druhá je nula. Ale tohle vlákno dost zmatený. Hlavně kvůli používání neexistujících termínů. Nemyslel jsem to vůči tobě jako insult :-)

Nahoru Odpovědět
11.5.2017 15:05
Neaktivní uživatelský účet
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 22 zpráv z 22.