C newbie

Sekcia: Programovanie 28.07.2008 | 15:20
Jano   Návštevník
Dobry den,
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.
    • Re: C newbie 28.07.2008 | 16:18
      Avatar Tomi Windows XP Pro/Ubuntu  Používateľ
      1) nabuduce kod http://pastebin.com/ ;)
      2) bud som slepy, alebo neviem co, ale ja vidim len 3x { a 4x } ;)
      Nobody is perfect. I am Nobody.
    • Re: C newbie 28.07.2008 | 22:53
      Avatar m4jkl   Používateľ
      ahoj

      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'));

      • Re: C newbie 28.07.2008 | 23:21
        Jano   Návštevník
        Dakujem za odpoved. Teraz program pracuje spravne.

        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.
        • Re: C newbie 29.07.2008 | 00:43
          Avatar m4jkl   Používateľ
          k tomu OR, spravne ste to napisali "Pri or vyhodnocuje kazdu a ak je aspon jedna pravdiva, tak cely vyraz bude pravda, nie?"
          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.
          • Re: C newbie 29.07.2008 | 01:07
            Jano   Návštevník
            To tykanie mi nevadi, pravdu povediac som si ani nevsimol.

            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.
            • Re: C newbie 29.07.2008 | 03:36
              lelol   Návštevník
              Zdravím, nie všetky operátory sa vyhodnocujú ako v matematike zľava -> doprava, niektoré aj naopak, priorita_operatorov
            • Re: C newbie 29.07.2008 | 10:15
              Avatar jv openSuSE 11  Používateľ
              "Ja som to bral ako z matematiky/bezne a to bola asi chyba. U programovania je to kusok inac..."
              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.
              • Re: C newbie 29.07.2008 | 10:36
                Avatar jv openSuSE 11  Používateľ
                A este skusim, co vas zrejme pomylilo:
                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.