Загрузка...

Проблема с проверкой введенного пользователем числа на целочисленность

Тема в разделе C/C++ создана пользователем fvker 8 окт 2024. 256 просмотров

Загрузка...
  1. fvker
    fvker Автор темы 8 окт 2024 на цепи грудная клетка, и мой дивный мир обрушен
    Программа заполняет массив случайными числами, N - количество элементов массива, затем меняет местами каждую пару элементов. Необходимо проверить N на несколько параметров, проблема с проверкой введенного пользователем числа на целочисленность, тоесть проверка на тот случай, если пользователь введет с клавиатуры не целое число, например 2.2. Я в курсе, что long - целочисленное, но программа должна учитывать все вводы пользователя.

    C
    #include <iostream> 

    #include <stdlib.h>

    #include <ctime>

    #include <typeinfo>



    using namespace std;

    int main()

    {

    setlocale(LC_ALL, "Rus"); // для корректного вывода русского языка

    long N; // количество элементов массива

    float* pt; // используется для доступа к элементам массива A по адресу, а не по индексу

    srand(time(NULL));



    cout << "введите четное количество символов ";



    cin >> N; // ввод числа



    if (typeid(N) != typeid(int))

    {

    cout << "Количество элементов массива должно быть целым числом." << endl;

    return 1;

    }





    if (N == 0)

    {

    cout << "количество элементов массива не может быть равно нулю \n ";

    return 1;



    }

    else if (N < 0)

    {

    cout << "количество элементов массива не может быть отрацательным \n ";

    return 1;



    }



    else if (N % 2 != 0)

    {

    cout << "количество элементов массива должно быть четным \n ";

    return 1;



    }



    float* A = new float[N]; // оператор new для динамического выделения памяти под массив элементов типа float





    cout << "первоначальный массив \n";



    for (int i = 0; i < N; i++)

    {



    A[i] = (float)rand() / RAND_MAX; // заполнение массива случайными числами

    cout << *(A + i) << endl; // вывод массива

    }



    pt = A; // присваивает указателю pt адрес начала массива A



    for (int i = 0; i < N; i += 2) // цикл с шагом 2, для того, чтобы поменять местами каждую пару в массиве

    {

    float perv = *(pt + i); // временная переменная, в которую сохраняется значение первого элемента массива из пары

    *(pt + i) = *(pt + i + 1); // первому элементу из двойки присваевается следующий элемент(меняет местами)

    *(pt + i + 1) = perv; // присваиваем втрому элементу из двойки значение первого

    }

    cout << "массив с условием \n";



    for (int i = 0; i < N; i++)

    {

    cout << *(pt + i) << endl; // вывод массива с условием

    }
     
  2. ПожилаяШляпа
    Считывай посимвольно, если ввели не цифру - посылай нахуй
    Также не забудь, что первый символ может быть минусом
     
    1. Посмотреть предыдущие комментарии (1)
    2. ПожилаяШляпа
      Shiva, да я по диагонали читал, я думал ему просто проверить надо
    3. ПожилаяШляпа
      Shiva, тогда хз, можно в try catch обернуть и ловить исключения
    4. Shiva
      ПожилаяШляпа, вообще можно же ограничения от Минуса до + запихнуть а если памяти на флот не хватит просто еще добавить чтоб был больше охват, ну я только так это вижу
  3. Shiva
    Так тебе надо чтобы было еще число с плавающей точкой, там же можно сделать чтобы они и так и так считало
     
    1. fvker Автор темы
      Shiva, а чё значит они и так и так считало
    2. fvker Автор темы
      и еще не понимаю зачем мне число с плавающей точкой, типо числа 2.0?
    3. Shiva
      fvker, ну да, а как ты хотел, он тогда не так считать будет
  4. Yandex
    Yandex 8 окт 2024 :obcool: 8357 15 дек 2019
    C
    #include <iostream>

    #include <cstdlib>

    #include <ctime>

    #include <limits>

    using namespace std;

    int main() {

    setlocale(LC_ALL, "Rus");

    long N;

    srand(static_cast<unsigned>(time(nullptr)));

    cout << "введите четное количество символов: ";

    while (true) {

    cin >> N;

    if (cin.fail()) {

    cin.clear(); // очищаем состояние ошибочного флага

    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // очищаем поток

    cout << "Введите целое число: ";

    } else if (N <= 0) {

    cout << "Количество элементов массива должно быть положительным и не равно нулю. Попробуйте еще раз: ";

    } else if (N % 2 != 0) {

    cout << "Количество элементов массива должно быть четным. Попробуйте еще раз: ";

    } else {

    break;

    }

    }

    float* A = new float[N];

    cout << "первоначальный массив:\n";

    for (int i = 0; i < N; i++) {

    A[i] = static_cast<float>(rand()) / RAND_MAX;

    cout << A[i] << endl;

    }

    for (int i = 0; i < N; i += 2) {

    swap(A[i], A[i + 1]);

    }

    cout << "массив с условием:\n";

    for (int i = 0; i < N; i++) {

    cout << A[i] << endl;

    }

    delete[] A;

    return 0;

    }
     
    1. Yandex
      Yandex, 1. Использование cin.fail() для проверки, корректно ли было считано целое число. Если нет, то очищаем флаг ошибки cin.clear() и игнорируем оставшиеся символы в потоке ввода с помощью cin.ignore().
      2. Провел дополнительные проверки, чтобы убедиться, что число положительное, не равно нулю, и четное, прежде чем выйти из цикла.
      3. Теперь программа просит пользователя повторить ввод, пока не получит корректное чётное целое число.
Top