Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C++ pętla while operator lub/i

Tojmak987123 12 Lip 2017 18:16 738 6
  • #1 12 Lip 2017 18:16
    Tojmak987123
    Poziom 3  

    Witam,

    mam pytanie odnoszące się do sprawdzania pętli while(), dla stringów.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Może mi ktoś wytłumaczyć dlaczego program wychodzi z pętli while dopiero po zastosowaniu operatorów && ? Jak dla mnie powinno tam być || (lub), ponieważ chcę by zmienna była słowem - "tak", "Tak", LUB "TAK", a nie by była wszystkimi tymi słowami na raz.

    Pozdrawiam,
    Tojmak

    0 6
  • Pomocny post
    #2 12 Lip 2017 18:37
    czareqpl
    Poziom 28  

    Wydaje mi się, że sam sobie odpowiedziałeś na pytanie. Dla ścisłości proponuję każdy z tych warunków umieścić w osobnym nawiasie.

    Zasadniczo w warunku pętli pytasz: Czy zmienna jest różna od "tak" ORAZ czy jest różna od "Tak" ORAZ czy jest różna od "TAK"

    Jeżeli wpisałeś "Tak" to został spełniony jeden warunek, pozostałe nie. Ponieważ operator && jest iloczynem logicznym to wynik wynosi 0*1*0=0

    Moim zdaniem także powinien być zastosowany operator sumy logicznej ||

    0
  • Pomocny post
    #3 12 Lip 2017 19:21
    drobok
    Poziom 28  

    Zauważ że wpisując tak zostają spełnione 2 warunki (tam jest != a nie ==) !
    while działa na true, więc jeśli nie masz żadnego z twoich tak to masz 1&1&1==1
    A gdy coś się zgodzi masz 1&0&1==0 więc wychodzisz z pętli.

    0
  • Pomocny post
    #4 13 Lip 2017 07:34
    eryk0393
    Poziom 4  

    Nie powinno się podawać gotowych rozwiązań ale

    Code:
    while ((zmienna != "tak") || (zmienna != "Tak") || (zmienna != "TAK"))


    Tak mnie uczono i działało ;)

    0
  • Pomocny post
    #5 13 Lip 2017 09:12
    kinggustav
    Poziom 20  

    A nie prościej zrobić na zmiennej UpperCase i sprawdzić bez komplikowania sobie kodu? Wydajnościowo też prawie to samo.

    0
  • Pomocny post
    #6 13 Lip 2017 16:22
    JacekCz
    Poziom 36  

    eryk0393 napisał:
    Nie powinno się podawać gotowych rozwiązań ale

    Code:
    while ((zmienna != "tak") || (zmienna != "Tak") || (zmienna != "TAK"))


    Tak mnie uczono i działało ;)


    zależnie od sposobu zadeklarowania zmiennej "zmienna" może to działac czasami lub nie działać wcale. Skompiluje się, ale nie wykona poprawnie.


    kinggustav napisał:
    A nie prościej zrobić na zmiennej UpperCase i sprawdzić bez komplikowania sobie kodu? Wydajnościowo też prawie to samo.


    Nie jest to standardowa funkcja, a kolega milczy co do platformy. Co więcej, zależnie od 1. źle zrozumiany zamiennik uppercase może dać błędne wyniki.
    Generalnie konwersja to jednolitej wielkości liter i potem porównanie jest dobrym pomyłem, uwaga o optymalizacji też jest niezła, Ja bym skonwertował raz po pobraniu. Głównym kosztem jest tłuczenie RAM w wielu konstruktorach i destruktorach, a nie CPU


    Za lepiej oddający intencję autora bym sugerował inny zapis (uwzględniając w/w - w na chwilkę zapominając o zamianie liter - mam na myśli że kod jest PRZEDE WSZYSTKIM dla programisty a potem dla maszyny)

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 14 Lip 2017 13:56
    Tojmak987123
    Poziom 3  

    Dzięki wszystkim za odpowiedzi, jakoś głupi byłem i do mnie nie dochodziło to, wszystko już stało się jasne ;).

    0