Logicke OR – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Logicke OR – C / C++ – Fórum – Programujte.comLogicke OR – C / C++ – Fórum – Programujte.com

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Pergoly a střechy Brno

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Keyzio0
Newbie
25. 1. 2021   #1
-
0
-

Prosim Vas. Mam v souboru cteni.txt znaky "123456q".

Kdyz se snazim spusit kod bez toho kodu v komentari, tak je to dobre, ale kdyz tam ten kus kodu pridam, tak mi to tiskne do nekonecna ctverecky.

Nevim proc, q by to melo zachytit  a ukoncit cyklus bez ohledu co je za ||

#include <stdio.h>

int main() {
    FILE *fr;
    int c;

    if ((fr = fopen("cteni.txt", "rt")) == NULL) {
        fprintf(stderr, "Soubor cteni.txt se nepodarilo otevrit");
        return 1;
    }
    do {
        c = getc(fr);
        putc(c, stdout);
       }while ((c != 'q') /*|| (c != EOF)*/);
       
    if (fclose(fr) == EOF){
        printf("Soubor se nepodarilo zavrit");
        return 1;
    }
    return 0;
}
Nahlásit jako SPAM
IP: 2a00:1028:96c3:199e:9cba:e470:321f:2b74...–
gna
~ Anonymní uživatel
1387 příspěvků
26. 1. 2021   #2
-
0
-

Když c není 'q', tak je splněno (c != 'q') a cyklus pokračuje.

Když c je 'q', tak je splněno (c != EOF) a cyklus pokračuje.

Místo || (or) použij && (and).

Nahlásit jako SPAM
IP: 213.211.51.–
Keyzio0
Newbie
26. 1. 2021   #3
-
0
-

Aha ja nejspis nerozumim te symbolicke konstante EOF.

Kdyz mam v souboru "123q", tak je to:

'1' '2' '3' 'q' 'EOF'

EOF tusim byva -1

Jak to ze kdyz vlazim do c znak 'q', tak bude zaroven platit EOF u podminky

((c != 'q') && (c != EOF))

vsak by museli byt v c dva znaky zaroven ?

Klidne mi poslete rozsahlejsi literaturu, neni treba to dlouhoze psat jestli je to na dyl.

Nahlásit jako SPAM
IP: 2a00:1028:96c3:199e:9cba:e470:321f:2b74...–
26. 1. 2021   #4
-
0
-

Nemusí tam být dva znaky. Testuješ znak na dvě hodnoty. Každá z těch dílčích podmínek vrátí true když znak není roven znaku na pravé straně. Celá podmínka s && pak vrátí true když znak není ani 'q' ani EOF. Dalo by seto obrátit jako "když znak je cokoliv jiného než 'q' a EOF vrať true. Ta podmínka by se dala napsat i pomocí OR takto ( !( ( c == 'q') || (c == EOF) ) ).

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Keyzio0
Newbie
26. 1. 2021   #5
-
0
-

:D ja porad nechapu jak se muzes testovat znak na dve hodnoty....vim ze ma znak 'znak' a oridinalni cislo.

a pokud mi spravne funguje podminka

((c != 'q') && (c != EOF))

pak ta podminka tvrdi, ze znak c obcahuje 'q' a zaroven taky EOF. Jak ale v c muze byt EOF, kdyz uz je tam jiny znak. Asi na tim moc premyslim

Nahlásit jako SPAM
IP: 2a00:1028:96c3:199e:9cba:e470:321f:2b74...–
Řešení
26. 1. 2021   #6
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

Kdy (c != 'q') vrací true? Jen když znak není 'q'. Pro ostatní znaky vrací false.
Kdy (c != EOF) vrací true? Jen když znak není EOF. Pro ostatní znaky vrací false.

A kdy ((c != 'q') && (c != EOF)) vrací true? Je to v případě, že obě výše uvedené podmínky současně vrací true, tedy když znak není 'q' a není EOF.

Nejdříve se vyhodnotí výrazy v závorce jako false / true, pak se s jejich hodnotou provede log. součin, jeho výsledek je true jen v případě, že oba výrazy v závorkách měli hodnotu true.
hu
 

Nahlásit jako SPAM
IP: 195.178.67.–
Keyzio0
Newbie
26. 1. 2021   #7
-
0
-

Rozumim.

Nevim proc, ale porad jsem premyslel jak by mohlo platit ze c bude q i EOF, abych dostal FALSE && FALSE.

A nepremyslel jsem nad tim ze staci, aby byl jen jeden z vyrazu FALSE pro celkovy vysledek FALSE

Moc dekuji za pevne nervy. Pomohlo mi to.

Nahlásit jako SPAM
IP: 2a00:1028:96c3:199e:9cba:e470:321f:2b74...–
26. 1. 2021   #8
-
0
-

Logický AND vrátí false pokud alespoň jeden výraz má hodnotu false.
Logický OR vrátí true pokud alespoň jeden výraz má hodnotu true.

Na tom staví jedna vlastnost C/C++: v okamžiku, kdy je známá výsledná hodnota, vyhodnocování se ukončí. Např. ve tvém případě pokud znak bude 'q" pak (c != 'q') vrátí false a vyhodnocování se ukončí s výsledkem false, protože hodnota druhého výrazu již na výsledek nemá vliv.

Češtinářská poznámka: platí shoda přísudku s podmětem a tak jsem měl napsat, že výrazy měly.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:11c4:ab0:676:53cf...–
KIIV
~ Moderátor
+43
God of flame
31. 1. 2021   #9
-
0
-
Nahlásit jako SPAM
IP: 37.48.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Podobná vlákna

Logické výrazy — založil xeonikx

Výsledek logické funkce — založil Mike

Parser pro logické výrazy — založil durmitor

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032021 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý