C newbie
pokusam sa ucit jazyk C, ale nakolko spadam do starsej vekovej kategorie, nechce mi to ist do hlavy tak lahko. Nesnazim sa programovat profesionalne, len zo zaujimavosti. Urobil som si jednoduchy program, ale nejako mi nefunguje tak, ako by som si predstavoval.
Chcem nacitat znak z klavesnice a urobit cyklus. Znak musi byt jedno z pismen a alebo b alebo c. Problem je v tom, ze aj napriek tomu, ze mi znak spravne precita, ale neopusti mi cyklus, ak je to jedno z pismen a,b, c. Cast programu:
int main()
{
int c;
...
do {
c=getchar();
while (getchar()!='\n')
;
if ((c!='a') || (c!='A') || (c!='B') || (c!='b') || (c!='c') || (c!='C')) {
printf("Zadajte jednu z moznosti\n");
}
}
while ((c!='a') || (c!='A') || (c!='B') || (c!='b') || (c!='c') || (c!='C'));
}
}
Program funguje, kym sa nedostane do tohto cyklu. Ak je zadane jedno z pismen a, b, c, stale pise Zadajte jednu z moznosti, aj ked by nemalo a stale to opakuje.
Prepacte, urcite to je banalna vec, ale neviem si s tym rady.
Velmi pekne dakujem.
Pre pridávanie komentárov sa musíte prihlásiť.
2) bud som slepy, alebo neviem co, ale ja vidim len 3x { a 4x } ;)
mas tam iba logicku chybku, inak je to dobre.
v tych podmienkach nema byt logicky OR (||), ale AND (&&), takze spravne by mala minimalne ta podmienka za while vyzerat takto:
((c != 'a') && (c != 'A') && (c != 'B') && (c != 'b') && (c != 'c') && (c != 'C'));
Len nejako neviem pochopit, preco by tam malo byt and (teda a).
Ak pride ku vyhodnocovaniu podmienky c != 'a' a bude nepravdiva, tak uz dalsiu podmienku nebude vyhodnocovat, kedze ide za nou and, ale cely vyraz vyhodnoti ako neporavdivy, nie?(aj keby isiel za nou c != 'A' a bola by to pravda)
Pri or vyhodnocuje kazdu a ak je aspon jedna pravdiva, tak cely vyraz bude pravda, nie? (asi nie teda)
Ale kedze to ako ste napisali funguje spravne, tak pravdepodobne nerozmyslam spravne. Viete mi to vysvetlit, lebo mi to nejako nezapada. Uz som starsi, tak mi to nejde tak do hlavy.
Dakujem.
problem je, ze ten vyraz u while bude potom vzdy pravda. dokonca aj ked zadate spravny znak z klavesnice, tak sice jeden z tych vyrazov bude nepravda, lebo napr. zadate c='A'
, tak (c != 'A') bude nepravda, ale vsetky ostatne budu pravdive. oni sa pravdepodobne vyhodnocovat nebudu, staci ak bude pravdivy ten prvy, ako ste napisali. a prave tu je ten pes zakopany, ze ak u toho vyrazu while dostanete vzdy pravda, tak nikdy neopustite tu nekonecnu slucku (lebo while sa opakuje, pokial je vyraz pravdivy).
ak tam bude ten and, tak staci ak jeden vyraz bude nepravda ( a to bude prave vtedy, ked zadate spravny znak) a potom bude nepravda cely vyraz. a toto sposobi prerusenie cyklu while.
ps: ospravedlnujem sa za to tykanie v mojom prvom prispevku:) sme sice na internete, ale aj tak to bolo neslusne.
Dakujem vam. Ste mi to objasnili. Ja som to bral ako z matematiky/bezne a to bola asi chyba. Musim sa nad tym este zamysliet. U programovania je to kusok inac, nez som cakal. Skusim si prispeok precitat par krat a poriadne sa zamysliet.
Este raz dakujem.
Nie :-) U programovania je to presne tak isto, logicky, ako v matematike. Treba sa len nad tym zamysliet, lebo v zivote prakticky clovek nepouziva tolko AND a OR vo vetach. Pocitac je presny, tak clovek lahko spravi logicku chybu.
Vyraz c.1: "Ak c nie je (1 alebo 2 alebo 3 alebo 4)"
Vyraz c.2: "Ak c nie je 1, alebo c nie je 2, alebo c nie je 3, alebo c nie je 4"
Vyraz c.1 nie je ekvivalentny s vyrazom c.2! Vyraz c.1 sa pouziva v hovorovej reci a zahrna v sebe tzv. aritmeticku logiku. Vyraz c.2 su 4 elementarne logicke vyroky spojene medzi sebou logickym OR.