Dlaczego pętla jest nieskonczona, nawet jesli wprowadze char kończący warunek?

2018-11-29 19:45
pentle
0

Nie wiem dlaczego moja pętla jest nieskonczona nawet jesli wprowadze char kończący warunek. Pomoże ktoś pls?

#include <iostream>
#include <fstream>
#include <windows.h>
#include <conio.h>
using namespace std;
char wybor;
string dane;
int main()
{
        do
        {
            cout << "Wprowadz dane: ";
            getline(cin, dane);
            cout << "IF YOU WANT SAVE TO FILE PRESS  ( y )  to save to file, or  ( n )  to exit to menu.";
            wybor=getch();
            switch (wybor)
                {
                case 'y':
                    {
                    ofstream plik;
                    plik.open("Dane.txt",ios::out|ios::app);
                    plik << dane <<endl<<endl;
                    cout << "Zapisano dane"<<endl;
                    plik.close();
                    system("PAUSE");
                    }
                break;
                }
        }
        while (wybor!='y'||'n');

    return 0;
}
edytowany 1x, ostatnio: furious programming, 2018-11-29 19:57

Pozostało 580 znaków

2018-11-29 19:54
4

While oznacza - rób dopóki warunek jest spełniony, czyli kończy gdy warunek nie jest spełniony.
Zatem

while (wybor!='y'||'n');

zamień na

while (wybor != 'y' && wybor != 'n');

Pozostało 580 znaków

2018-11-29 19:57
pentle
0

Dzięki piękne działa, ale zastanawia się dlaczego operator or tutaj nie mogł byc użyty

edytowany 1x, ostatnio: furious programming, 2018-11-29 19:57

Pozostało 580 znaków

2018-11-29 19:58
1

Może być użyty, ale w ten sposób:

while (wybor == 'y' || wybor == 'n');

edytowany 1x, ostatnio: furious programming, 2018-11-29 19:59
while (! (wybor == 'y' || wybor == 'n')) - szarotka 2018-11-29 20:22

Pozostało 580 znaków

2018-11-29 20:03
pentle
0

Hmm ten tez wkleilem u siebie ale dziala w nieskonczonosc...

Edit: w przypadku nacisnięcia 'y' lub 'n', natomiast we wszystkich innych wypadkach konczy pracę. Troche to dziwne, zostanę przy &&

edytowany 2x, ostatnio: furious programming, 2018-11-29 20:26

Pozostało 580 znaków

2018-11-29 20:26
2

A no tak, jeszcze trzeba zanegować całość, jak @szarotka wskazała:

while(!(wybor == 'y' || wybor == 'n'))

Cholerka, forma mi spada… :/


Hej, może taki tytuł byłby bardziej trafny?:): "Jak prawidłowo zakończyć pętle do..while warunkiem z dwoma argumentami" - Spark_of_hope 2018-11-29 22:01

Pozostało 580 znaków

2018-12-02 10:37
0
pentle napisał(a):

Nie wiem dlaczego moja pętla jest nieskonczona nawet jesli wprowadze char kończący warunek. Pomoże ktoś pls?

// ciach
        while (wybor!='y'||'n');
// ciach

Ojej. :)

Przecież 'y'||'n' to jest w C++ true (alternatywa dwóch wartości prawdziwych bo niezerowych), wiec Twój warunek można inaczej zapisać:

        while (wybor!=true);

No a true ma wartość liczbową 1, więc inaczej:

        while (wybor!=1);

No a chyba nigdy nie wciskasz klawisza o kodzie 1, nie? Więc warunek zawsze jest spełniony i pętla jest nieskończona...

Pozostało 580 znaków

2018-12-02 14:12
2

To nie jest alternatywa 'y' lub 'n'. tylko alternatywa 'wybór != 'y' lub 'n', też jest zawsze prawdziwe (bo zawsze prawdziwe jest 'n'), ale to jednak nie to samo…

Źródło: https://en.cppreference.com/w/cpp/language/operator_precedence

A, rzeczywiście, źle postawiłem nawiasy... :) - koszalek-opalek 2018-12-02 15:12

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0