heybumbo Ответов: 4

У меня возникли проблемы с операторами в C++


Я пытаюсь сделать часы, и у меня возникли проблемы...
#include <iostream>

using namespace std;
int main()
{
    int h, m, s, err, a;
    err=a=0;
    cout<<"Welcome to the clock maker"<<endl;
    while (err<1)
    {
        cout<<"Type the hour: ";
        cin>>h;
        cout<<endl;
        cout<<"Type the minutes: ";
        cin>>m;
        cout<<endl;
        cout<<"Type the seconds: ";
        cin>>s;
        cout<<endl;
        if(((h>0)||(h<24))&&((m>0)||(m<60))&&((s>0)||(s<60)))
            {
            err++;
        }
    }

    return 0;
}


Что я уже пробовал:

Я пытался поместить его в парантезы, но последняя часть не работает

Patrice T

"попал в беду" - это не описание проблемы !
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.

Richard MacCutchan

Вы должны проверять каждое значение по мере его ввода. Нет никакого смысла получать значения минут и секунд, если час находится вне диапазона.

KarstenK

вы должны проверить каждый вход отдельно и написать ошибку при сбое. Это помогает в более сложном коде. ;-)

4 Ответов

Рейтинг:
27

OriginalGriff

Или и и действуют по-разному:

a || b is a OR b
a && b is a AND b

a или b означает "если одно или оба этих выражения являются true в результате получается true; если оба false в результате получается false".
а и в означают "если оба этих выражения являются true в результате получается true; если один из них или оба являются false в результате получается false".

Итак, это:
(h>0)||(h<24)
будет true для всех значений h : все положительные числа, кроме нуля, проходят первый тест, поэтому результат таков: true для всех положительных чисел все отрицательные числа и ноль меньше 24, поэтому ноль и все отрицательные числа проходят второй тест, и это дает true также.
Так и будет true является ли любое из условий истинным, результат всей фразы всегда true.

То же самое относится и к вашим минутным и секундным тестам, поэтому результат всего теста также всегда true потому что именно так и работает.

Остановитесь и подумайте о том, что именно вы пытаетесь сделать, и решите, что вы будете тестировать в реальном мире. Когда вы отсортируете это в голове йору, вам будет легко преобразовать его в код.


Рейтинг:
2

Patrice T

Цитата:
Я пытаюсь сделать часы, и у меня возникли проблемы...

Я вижу, тебе нужно научиться думать компьютерной логикой.

Оператор и верно, когда все части истинны.
Оператор или истинно, когда хотя бы 1 часть истинна.
Время как час, минута и секунда в порядке, когда все части в порядке.
Время как час, минута и секунда неверно, когда по крайней мере 1 часть неверна.

Вы хотите знать, является ли ввод ошибкой, поэтому:
if ((hour is wrong)||(minute is wrong)||(second is wrong))
    err++;

Теперь час неверен, когда находится вне диапазона, диапазон составляет от 0 до 23.
Так что час ошибается, когда час < 0 или час > 23.
if (((h<0)||(h>23))||(minute is wrong)||(second is wrong))
    err++;

и так далее...

Операторы - Учебники По C++ [^]


Рейтинг:
2

Richard MacCutchan

Лучше всего проверять каждый ввод по мере его ввода, чтобы не запрашивать минуты и секунды, если час недействителен, или секунды, если значение минут недействительно. Это также помогает поместить сообщение, чтобы сообщить пользователю, что последний ввод был недействительным. Что-то вроде следующего:

int hours, minutes, seconds;
bool valid = true;
do
{
    if (!valid)
    {
        cout << "Invalid entry, please try again" << endl;
    }
    cout << "Enter the hours: ";
    cin >> hours;
    if (hours < 0 || hours > 23)
    {
        valid = false;
    }
    else
    {
        cout << "Enter the minutes: ";
        cin >> minutes;
        if (minutes < 0 || minutes > 59)
        {
            valid = false;
        }
        else
        {
            cout << "Enter the seconds: ";
            cin >> seconds;
            if (seconds < 0 || seconds > 59)
            {
                valid = false;
            }
            else
            {
                valid = true;
            }
        }
    }
} while (!valid);

cout << "The time is: " << setw(2) << hours << ":" << minutes << ":" << seconds << endl;


Рейтинг:
1

Rick York

Я думаю, что ваша переменная неправильно названа. Вы проверяете все допустимые записи, а не ошибки. Значение true из этого выражения означает, что все данные являются действительными.

Что касается выражения, то все ORs (||) должны быть ANDs (&&).

Это может стать :

bool valid = false;
while ( ! valid )
{
    cout<<"Enter the hour    : ";
    cin>>h;
    cout<<endl;
    cout<<"Enter the minutes : ";
    cin>>m;
    cout<<endl;
    cout<<"Enter the seconds : ";
    cin>>s;
    cout<<endl;
    if( ( h >= 0 ) && ( h < 24 ) && ( m >= 0 ) && ( m < 60 ) && ( s >= 0 ) && ( s < 60 ) )
    {
        valid = true;
    }
}
Я думаю, что нулевые проверки должны быть больше или равны, потому что ноль-это допустимое значение.

Другим и лучшим вариантом было бы сделать функцию для принятия значений. Вот как это может выглядеть :
bool PromptForInput( const char * prompt, int & value, int minval, int maxval )
{
    cout << prompt;
    cin >> value;
    cout << endln;
    if( ( value >= minval ) && ( value <= maxval ) )
        return true;

    // at this point value is invalid.
    // you could print an error message and re-prompt here or just return false.

    return false;
}

int main()
{
    int h, m, s;
    if( ! PromptForInput( "Enter hours   : ", h, 0, 23 ) )
        return -1;
    if( ! PromptForInput( "Enter minutes : ", m, 0, 59 ) )
        return -1;
    if( ! PromptForInput( "Enter seconds : ", s, 0, 59 ) )
        return -1;
    return 0;
}
Обработка ошибок была опущена из этих образцов, потому что я не знаю, что вы хотите с ними делать. Мне гораздо легче справляться с ошибками, когда я создаю функции из повторяющихся разделов кода.


Greg Utas

5