Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Operatory logiczne: różnica między || a &&

Ostatnio zmodyfikowano 2015-05-27 12:29
Autor Wiadomość
damian955
Temat założony przez niniejszego użytkownika
Operatory logiczne: różnica między || a &&
» 2015-05-24 11:40:12
Witam, mam problem dotyczący operatorów logicznych. Z tego co wiem || - lub, a && - i.

Mam problem:

#include<windows.h>
#include<iostream>
using namespace std;
int main()
{
    string a="Dalej";
    do
    {
        system("cls");
        cout<<"Wpisz dalej, aby kontynuowac!"<<endl;
        cin>>a;
    }while(a!="dalej"||a!="Dalej");
}

Powyższy kod powoduje, iż pętla działa w nieskonczoność. Nie wiem co należy wpisać jako zmienną a.

a

#include<windows.h>
#include<iostream>
using namespace std;
int main()
{
    string a="Dalej";
    do
    {
        system("cls");
        cout<<"Wpisz dalej, aby kontynuowac!"<<endl;
        cin>>a;
    }while(a!="dalej"&&a!="Dalej");
}

Powyższy kod powoduje, że pętla przestaje działać po wpisaniu Dalej lub dalej.

Dlaczego operator logiczny i przejął funkcję operatora lub i co się stało z operatorem lub. Czy miał ktoś już taki problem?

Czy może mnie ktoś uświadomić co zrobiłem lub pomyślałem nie tak?
P-132692
oputyk
» 2015-05-24 11:53:44
1. Kod w
[cpp]...[/cpp]
.
2. Alternatywa ( || ) daje
true
, jeśli co najmniej jedna z wartości ma wartość
true
.
3. Koniunkcja ( && ) daje
true
, jeśli obie wartości mają wartość
true
.
Czyli:
true || false == true
false || false == false

true && true == true
false && true == false
false && false == false
P-132693
damian955
Temat założony przez niniejszego użytkownika
» 2015-05-24 12:34:01
To wiem. Jednak Program przy użyciu operatora || wariuje i zaczyna się pętla nieskonczona. A przy użyciu operatora && program zachowuje się jak bym użył operatora lub. Nadal nie wiem co myślę nie tak.

Edit: Właśnie odkryłem, że ma to coś wspólnego z typem danych string. Kiedy używam typów danych działających na liczbach to wszystko działa jak należy. Wie ktoś może dlaczego tak jest?
P-132697
wilkoo13
» 2015-05-24 20:07:38
W pierwszym kodzie warunek działa tak:
Powtórz pętlę jeśli "a" jest inne niż "Dalej" lub "dalej"
Nawet jeśli będzie to "dalej" to i tak jest to inne od "Dalej" i pętla się powtórzy ponieważ jest alternatywa
W tym przypadku nie da się warunku niespełnić ponieważ oczekujesz że wartość będzie jednocześnie "Dalej" lub "dalej" po to aby znegować

W drugim kodzie
Powtórz jeśli "a" jest inne od "dalej" i od "Dalej" jednocześnie

P-132713
damian955
Temat założony przez niniejszego użytkownika
» 2015-05-24 21:07:50
Warunek nie jest spełniony dla alternatywy i pętla zaczyna się w nieskończoność. W drugim przypadku jest to koniunkcja i nie ma szans wpisać dalej i Dalej jednocześnie w oczekiwaniu na jeden ciąg znaków a nie na dwa. Twój wywód jest nic nie wart, bo nic nie tłumaczy oprócz tego co jest zapisane w kursie. Gdybyś sprawdził kod w praniu to wyszło by, że po wpisaniu dowolnych znaków dla kodu z alternatywą nie jest możliwe uzyskanie poprawnej odp. I pętla działa non stop. Czy jest ktoś na tyle ogarnięty, aby to wyjaśnić. Narazie wiem tyle, że dla string lepiej wpisywać koniunkcję jeśli stawiany jest wybór zamiast wpisywania alternatywy. Inaczej będzie pętla nieskończona. Pytanie: Dlaczego?
P-132716
Monika90
» 2015-05-24 21:27:03
Inaczej będzie pętla nieskończona. Pytanie: Dlaczego?
Dostałeś już dwie dobre odpowiedzi.

Weź to wyrażenie
a != "dalej" || a != "Dalej"
, podstaw za a string "dalej" i korzystając z reguł, które podał oputyk, uprość to wyrażenie, by znaleźć jego wartość logiczną. Jeżeli to będzie true to pętla wykona się znowu, w przeciwnym wypadku zostanie przerwana.
P-132718
wilkoo13
» 2015-05-25 03:28:56
W pierwszym przypadku sprawdź logicznie co się stanie w różnymi danymi wejściowymi:
a!="dalej"||a!="Dalej"

"test"
Słowo "test" jest inne niż "dalej" więc pierwsza część warunku zwraca true.

"dalej"
Słowo "dalej" nie jest inne od słowa "dalej" więc pierwsza część zwraca false. Przechodzimy do drugiej części. Czy to samo słowo, czyli "dalej" jest inne od "Dalej"? Jest! Więc druga część zwraca true. Jest to alternatywa więc cały warunek zwraca true tak jak w przykładzie wyżej.

"Dalej"
Czy słowo "Dalej" jest inne od "dalej"? Jest, a sprawdzasz inność dzięki != operatorowi. Jest inne więc zwraca true.

Miałem trochę wolnego czasu i mi się nudziło.
P-132733
damian955
Temat założony przez niniejszego użytkownika
» 2015-05-27 12:03:23
Dobra już wiem, popełniałem błąd logiczny w rozumowaniu, tak jak myślałem. Nie jest możliwe utworzenie alternatywy, gdyż funkcja będzie się zapętlać ponieważ Dalej jest różne od dalej i na odwrót. Przy koniunkcji ten błąd nie występuje, bo słowo podstawione pod zmienną musi być różne na raz od dwóch podanych możliwości popełnienia błędu, a nie tylko od jednej możliwości jak w alternatywie. Jeśli macie pomysły jak utworzyć ten kod dla alternatywy i chce się wam z tym bawić, abym mógł ten kod przeanalizować i nauczyć się coś z niego to chętnie poczekam z zamknięciem tematu.
P-132844
« 1 » 2
  Strona 1 z 2 Następna strona