lock&_lock Ответов: 4

Понимание цикла while и разница в "! "и "ложь" в C++


Я пытаюсь понять цикл while и разницу, когда я ставлю "!" и "false" в качестве условия, потому что каким-то образом они дали мне другой результат.

Я пишу эту очень простую программу для суммирования массива чисел, и я хочу проверить, является ли мой ввод целочисленным или нет.

Блок-схема :
    1. Спросите пользователя, сколько чисел нужно суммировать
    2. Получить ввод пользователя (проверить, если это целое число или нет)
    3. (цикл) попросите пользователя ввести каждое значение числа
    4. сумма их


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

Это мой код, я использую `isdigit`, чтобы проверить, является ли вход целым числом, и проверить его с помощью while (isdigit(array_size==false))

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

int array_size;
int sum = 0;

int main(){
    cout << "How many numbers ? " << endl;
    cin >> array_size;

    while (isdigit(array_size==false)){
        cout << "Input is not a number " << endl;
        break;
    } 
        int sum_array[array_size];
        for (int n=0; n < array_size; n++){
            cout << "Number " << n+1 << " is : ";
            cin >> sum_array[n];
            sum+=sum_array[n];
        }
        cout << "Sum of numbers are : " << sum << endl;
    return 0;
}

Вот результат, когда я попытался ввести целое и нецелое число :
lock@lock ./a.out     
How many numbers ? 3
Number 1 is : 1
Number 2 is : 2
Number 3 is : 3
Sum of numbers are : 6

lock@lock ./a.out 
How many numbers ? a
Sum of numbers are : 0

Смотрите, что во втором случае, когда я ставлю нецелочисленное число, моя строка
cout << "Input is not a number " << endl;
не исполняется.

Теперь, если бы я изменил свое состояние с помощью while (!isdigit(array_size)) вот вам и результат :
lock@lock ./a.out 
How many numbers ? 3
Input is not a number 
Number 1 is : 1
Number 2 is : 2
Number 3 is : 3
Sum of numbers are : 6

lock@lock ./a.out 
How many numbers ? a
Input is not a number 
Sum of numbers are : 0

Видимо линия
cout << "Input is not a number " << endl;
будет выполняться независимо от того, какие входные данные (даже если это целое число). Чего мне здесь не хватало ? Чем же "!" отличается от "ложного".

KarstenK

код сбивает с толку. Вам нужно улучшить проверку и поток кода на ошибку.

4 Ответов

Рейтинг:
2

CPallini

Аргумент isdigit должен быть символом, но вы передаете его a int переменная.
Предполагая, что ваш код действительно должен иметь дело с числами (то есть целыми числами), а не с цифрами, вы можете переписать свою программу таким образом (обратите внимание, что вам не нужен массив):

#include <iostream>
#include <limits>

using std::cout;
using std::cin;
using std::endl;


int main()
{
  int size;
  int sum = 0;

  cout << "How many numbers ? " << endl;

  for (;;)
  {
    cin >> size;
    if ( cin ) break;
    cin.clear();
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    cout << "Input is not a number " << endl;
  }

  for (int n = 0; n < size; ++n)
  {
    int i;
    cout << "Number " << (n+1) << " is : ";
    cin >> i;
    sum += i ;
  }
  cout << "Sum of numbers is : " << sum << endl;
}


lock&amp;_lock

- Привет, спасибо. К сожалению, мне поручено использовать массив. Кроме того, @Stefan_Lang обратился к этому вопросу аргументации для "isdigit" в разделе комментариев решения 3, вот его/ее ответ :

На самом деле тип аргумента isdigit-int. Видишь ли https://www.cplusplus.com/reference/cctype/isdigit/

Ваш код будет работать (измените его на char), потому что char автоматически повышается до int. Но объявление array_size как int является правильным.

Рейтинг:
2

Shao Voon Wong

isdigit() принимает символ ASCII, хотя тип параметра-целое число. Просто измените тип array_size от int к char должен работать.

char array_size;
...
cin >> array_size;
...
while (isdigit(array_size)==false){...

или
char array_size;
...
cin >> array_size;
...
while (!isdigit(array_size)){...

должен работать.


Stefan_Lang

На самом деле тип аргумента isdigit-int. Видишь ли https://www.cplusplus.com/reference/cctype/isdigit/

Ваш код будет работать, потому что char автоматически повышается до int. Но объявление array_size как int является правильным.

CPallini

Да, аргумент isdigit является int, однако функция возвращает ненулевое значение, если аргумент находится в диапазоне 0x30-0x39 (то есть '0'..'9'). Это не полезно, чтобы проверить, если Кин действительно получили целочисленное значение.

Рейтинг:
1

k5054

У тебя есть:

isdigit(array_size==false)


Так и должно быть
isdigit(array_size) == false


Обратите внимание на расположение скобок.


lock&amp;_lock

Спасибо, я попробовал ваш совет, но строка "cout << "Input-это не число" << endl;" все равно печатается, даже если я ставлю целое число в качестве входных данных

Рейтинг:
1

Patrice T

Я подозреваю, что вы хотите заменить это

while (isdigit(array_size==false)){

с этим
while (isdigit(array_size)==false){

Но логика петли выглядит довольно запутанной. Может быть, это не та петля, которую вы хотите.


lock&amp;_lock

Это похоже на Soution 1. Я попробовал это сделать, но строка "cout << "Input-это не число" << endl;" все равно печатается, даже если я ставлю целое число в качестве входных данных

Patrice T

Да, Решение 1 было опубликовано за 1 минуту до моего.