Форум программистов, компьютерный форум CyberForum.ru

Проверка ввода - число ли это, и целое ли - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.71
WildSpirit
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 8
14.11.2012, 23:19     Проверка ввода - число ли это, и целое ли #1
Как правильно сделать проверку ввода так, чтобы вводимое проверялось на то, число ли это, и целое ли, и если да, записывалось в переменную без повторного ввода?

Делал так:
C++
1
2
3
4
5
6
...
int n;
...
if (!(cin>>n)) cout << "Invalid input";
else cin>>n;
...
Но так ошибка выводится, только если то, что вводится, не число, к тому же приходится вводить 2 раза.
А чтобы проверить, целое ли число, через if ( n % 1 == 0), нужно же, чтобы переменная была не int. То есть использовать еще дополнительную переменную. Можно ли это все сделать как-нибудь попроще?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2012, 23:19     Проверка ввода - число ли это, и целое ли
Посмотрите здесь:

Дано целое число. Вывести его строку-описание вида «отрицательное чет-ное число», «нулевое число», «положительное нечетное число» и т. д. C++
Написать программу, реализует следующую игровую ситуацию: компьютер задает случайное целое число в интерали от 1 до 10, а мне нужно это число угадать C++
Дано целое число N (> 0). Найти сумму N2 + (N + 1)2+ (N + 2)2+ … + (2*N)2 (целое число) C++
C++ как соединить b и с в число, если а это число, б это десятки перевернутого числа, с это единицы перевернутого числа вот в это строчке c=a+b,c;
C++ Составить функцию, которая, получив целое число определяет, уменьшается ли оно в целое число раз
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
selo4404
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 11
15.11.2012, 03:33     Проверка ввода - число ли это, и целое ли #2
вот писал проверку на 0 для умножения Может смекнешь как к себе вставить, думаю, что принцип то 1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "stdafx.h"
#include "iostream"
#include "math.h"
#include "conio.h"
#include "time.h"
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Rus");
    double a, c=1, n;
    int i=1;
    cout<<"Умножение."<<endl<<endl;
    cout<<"Введите количество множителей"<<endl;
    cout<<"Количество = ";
    cin>>n;
    cout<<endl;
    for (i; i<n+1; i++)
    {
        cout<<"Введите "<<i<<" множитель"<<endl;
        cout<<"Множитель равен ";
        cin>>a;
        cout<<endl;
        c=c*a;
    if (c==0)
        {
            break;
        }
        cout<<"После "<<i<<" множителя мы имеем результат: "<<c<<endl;
    }
    if (c!=0)
    {
    cout<<endl<<endl<<"Ответ: "<<c<<endl<<endl<<"Для выхода из программы нажмите 'Enter'";
    }
    if (c==0)
        {
            cout<<"Вы ввели 0. При умножении на результат всегда будет 0"<<endl<<endl<<"Для выхода из программы нажмите 'Enter'";
        }
    
    _getch();
    return 0;
}
Pavell
14 / 14 / 0
Регистрация: 13.11.2012
Сообщений: 28
15.11.2012, 07:47     Проверка ввода - число ли это, и целое ли #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <cctype>
 
char c;
int n; 
std::cin>>c;
 
if (isdigital(c)) {
     n=c;
     if ( n % 1 == 0)
          std::cout<<"You input "<<n<<" - integer digit";
   } else 
          std::cout<<"Invalid input";
return 0;
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
15.11.2012, 08:04     Проверка ввода - число ли это, и целое ли #4
Цитата Сообщение от WildSpirit Посмотреть сообщение
Но так ошибка выводится, только если то, что вводится, не число, к тому же приходится вводить 2 раза.
а что ты хотел, если вводишь целочисленное
Цитата Сообщение от WildSpirit Посмотреть сообщение
int n;
вводи строку и анализируй её число или нет? целое или дробное?
Цитата Сообщение от WildSpirit Посмотреть сообщение
n % 1
расскажи мне тайный смысл этой записи остаток от деления на 1 всегда равен числу
в программировании для целочисленных (int , char)это правило будет соблюдаться
для плавающих (float double) оператор % не определен

Добавлено через 2 минуты
Цитата Сообщение от selo4404 Посмотреть сообщение
double a, c=1, n;
Цитата Сообщение от selo4404 Посмотреть сообщение
cout<<"Умножение."<<endl<<endl;
* * cout<<"Введите количество множителей"<<endl;
* * cout<<"Количество = ";
* * cin>>n;
а что количество может быть не целым???

Добавлено через 6 минут
Цитата Сообщение от Pavell Посмотреть сообщение
isdigital(n)
что за функция???
isdigit знаю эту нет
Pavell
14 / 14 / 0
Регистрация: 13.11.2012
Сообщений: 28
15.11.2012, 08:15     Проверка ввода - число ли это, и целое ли #5
Цитата Сообщение от ValeryS Посмотреть сообщение
что за функция???
isdigit знаю эту нет


на самом деле мое решение действительно только для чисел 0-9, ну и вот это:
C++
1
if ( n % 1 == 0)
конечно лишнее
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
15.11.2012, 08:19     Проверка ввода - число ли это, и целое ли #6
Цитата Сообщение от ValeryS Посмотреть сообщение
расскажи мне тайный смысл этой записи остаток от деления на 1 всегда равен числу
пардон не заметил описка
требуется читать так
остаток от деления на 1 всегда равен нулю
Pavell
14 / 14 / 0
Регистрация: 13.11.2012
Сообщений: 28
15.11.2012, 09:01     Проверка ввода - число ли это, и целое ли #7
Не самое элегантное решение, но.... работать вроде должно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <cctype>
#include <cmath>
 
int n; 
char c;
bool isInt(false);
int counter(0);
int tmp[1000];
 
std::cin.get(c);
while (c!=' ') {                //пробел завершение ввода
        if (isdigit(c)) {
              tmp[counter]=c;
              counter++;
              isInt=true;
        } else {
              std::cout<<"Invalid input";
              isInt=false;
        }
        std::cin.get(c);       
}
 
if (isInt) {
        for (int i=counter; i>=0; i--)
        n+=pow (tmp[counter-i], 10*(counter-i+1));
        std::cout<<"You input "<<n<<" - integer digit";
}
 
return 0;
selo4404
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 11
15.11.2012, 12:09     Проверка ввода - число ли это, и целое ли #8
Цитата Сообщение от ValeryS Посмотреть сообщение
а что количество может быть не целым???
Проверка идет в цикле, и проверяю не N, а "c" а тут ответ уже может быть не целым
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  for (i; i<n+1; i++)
    {
        cout<<"Введите "<<i<<" множитель"<<endl;
        cout<<"Множитель равен ";
        cin>>a;
        cout<<endl;
        c=c*a;
    if (c==0)
        {
            break;
        }
        cout<<"После "<<i<<" множителя мы имеем результат: "<<c<<endl;
    }
    if (c!=0)
    {
    cout<<endl<<endl<<"Ответ: "<<c<<endl<<endl<<"Для выхода из программы нажмите 'Enter'";
    }
    if (c==0)
        {
            cout<<"Вы ввели 0. При умножении на результат всегда будет 0"<<endl<<endl<<"Для выхода из программы нажмите 'Enter'";
        }
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
15.11.2012, 12:29     Проверка ввода - число ли это, и целое ли #9
Цитата Сообщение от selo4404 Посмотреть сообщение
Проверка идет в цикле,
а причем здесь проверка и количество множителей
Цитата Сообщение от selo4404 Посмотреть сообщение
double a, c=1, n;
n у тебя количество множителей которое объявлено как double
и при вводе
Цитата Сообщение от selo4404 Посмотреть сообщение
cin>>n;
пользователь имеет полное право ввести 2.5
ты можешь представить себе 2 с половиной множителя,я нет

Цитата Сообщение от selo4404 Посмотреть сообщение
if (c==0)
и вот это сравнение неправильное
почитай как сравниваются плавающие типы(вещественные числа)
-=ЮрА=-
Заблокирован
Автор FAQ
15.11.2012, 17:32     Проверка ввода - число ли это, и целое ли #10
WildSpirit, для защищённого ввода лучше всего подходят шаблоны, попробуй вот этот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
 
template <class T>
bool SafeInput(const char * msg, T &val)
{
    bool bInput = true;
    cout<<msg;
    if(!(cin>>val) || cin.get() != '\n')
        bInput = false;
    if(!bInput)
    {
        cin.clear();//Ñáðîñ ГґГ«Г*ГЈГ* îøèáêè
        cin.sync(); //ГЋГ·ГЁГІГ±ГЄГ* ГЎГіГґГҐГ°Г*
    }
    return bInput;
}
 
int main()
{
    int iParam;
    double dParam;
 
    while(true)
    {
        if(!SafeInput("Enter integer : ", iParam))
            cout<<"Bad input"<<endl;
        else
            cout<<"Your input : "<<iParam<<endl;
 
        if(!SafeInput("Enter double   : ", dParam))
            cout<<"Bad input"<<endl;
        else
            cout<<"Your input : "<<dParam<<endl;
    }
    return 0;
}
Миниатюры
Проверка ввода - число ли это, и целое ли  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2012, 00:43     Проверка ввода - число ли это, и целое ли
Еще ссылки по теме:

Создать программу, которая позволяет ввести целое число n и вывести это число в виде произведения простых чисел C++
C++ проверка на целое число
C++ Если целое число М делится на целое число N, то на экран выводится частное от деления, в противном случае выводится сообщение

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
WildSpirit
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 8
19.11.2012, 00:43  [ТС]     Проверка ввода - число ли это, и целое ли #11
-=ЮрА=-, спасибо за ответ.
А вот если с переменными далее необходимо выполнить действия, а ввод оказался неправильным, как реализовать повторную проверку ввода?

Добавлено через 12 минут
А, все, сам разобрался.
Yandex
Объявления
19.11.2012, 00:43     Проверка ввода - число ли это, и целое ли
Ответ Создать тему
Опции темы

Текущее время: 02:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru