Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80

Проверка на наличие числового значения во входном потоке

14.04.2015, 23:16. Показов 7349. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе времени суток. Задача: вводится трехзначное число (int), нужно разделить его цифры и вывести их в столбик. Пример: число 321. Выводится
3
2
1
Вопрос: как сделать проверку на то, что это именно число int? например если вводить букву - у меня идет бесконечный цикл меню. Ну или если вводить дробное число. Привожу код с меню и нужной функцией, помогите пожалуйста с функцией проверки.
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
int main()
{
    setlocale(0, "RUS");
    int n,menu=-1;
    cout << "Лабораторная работа №2\n";
    while (menu != 0)
    {
        cout << "Меню\n- Число вводится как строка, посчитать произведение цифр = 1\n- Число вводится как число, вывести его цифры в столбик = 2\n- Посчитать факториал числа = 3\n- Выйти = 0\n";
        cin >> menu;
        switch (menu)
        {
        case 1:
            strtoint();
            break;
        case 2:
            chislovstolb();
            break;
        case 3:
            cout << "Введите число для факториала\n";
            cin >> n;
            n = proverkafact(n);
            cout << n << "!= " << fact(n) << "\n";
            break;
        case 0:
            break;
        }
    }
    system("Pause");
    return 0;
}
 
int chislovstolb()
{
    cout << "Введите трехзначное число\n";
    int k,l,ch1,ch2,ch3;
    cin >> k;
    ch1 = k % 10,  l = k / 10, ch2 = l % 10, ch3 = l / 10;
    cout << ch3 << "\n" << ch2 << "\n" << ch1 << "\n";
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.04.2015, 23:16
Ответы с готовыми решениями:

Проверка наличия данных во входном потоке stdin
Каким образом под gcc определить сам факт наличия данных для ввода, не осуществляя самого ввода?

Проверка числового значения на float
Собственно вопрос задан в заголовке. Есть необходимость проверить значение, попадает ли оно в пределы 1,175494351 E – 38 -...

Проверка на наличие значения из txt
Добрый день. Есть txt файл со значениями формата: 1 2 3 4 5 и есть переменная Можно ли каким нибудь образом проверить...

11
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
14.04.2015, 23:18
C++
1
2
cin >> k;
if (cin.fail()) // не int
0
91 / 3 / 2
Регистрация: 14.04.2015
Сообщений: 10
14.04.2015, 23:31
Если использовать для вода стринг как то так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                      string b;
                   vod:
                     cout << "Число ";
            cin >> b; 
                     for (int i = 0; b < b.size(); ++i){
            int gg = b.size();
            int yy = i%gg;
            int zz = b[yy];
            char t = char(zz);
            if (t >= '0'&& t <= '9')    {
                       cout << b[0]<< "\n" << b[1] << "\n" << b[2] << "\n";
                                 return 0;
                                 else{
                    cout <<endl<<"error.\n"
                        goto vod;
0
14.04.2015, 23:44

Не по теме:

Цитата Сообщение от Ниль Посмотреть сообщение
как то так.
:facepalm:

0
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
15.04.2015, 01:05  [ТС]
Немного не понял по поводу cin.fail()
пишу
C++
1
2
3
int k;
while (cin.fail())
    cin >> k;
- выдает ошибку. По поводу стринг не подходит - переменная должна быть обязательно Int

Добавлено через 5 минут
C помощью этого кода решил проблему с вводом букв - проверка работает. Но остается вопрос с вводом дробного числа. Если вводить например 1.4 - ошибку не выдает, оно заново выдает меню, и лишь потом пишет "Введите х"
Код:
C++
1
2
3
4
5
6
7
8
do {
 
        cout << "Введите х" << endl;
        cin.clear();
        cin.sync();
        cin >> k;
 
    } while (cin.fail());
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
15.04.2015, 02:56
Лучший ответ Сообщение было отмечено Avgust как решение

Решение

C++
1
2
3
4
5
6
7
8
// в строке ввода только цифры, перед которыми могут быть + или -.
int a;
while (!(cin >> a) || (cin.peek() != '\n'))
{
    cin.clear();
    while (cin.get() != '\n');
    cout << "Error!" << endl;
}
1
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175
15.04.2015, 15:50
Библиотека <type_traits> доступна лишь с стандарта с++11, её функция is_same<тип_данных, ваш_тип_данных>
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <type_traits> // ! c++11
 
using namespace std;
 
template<typename T>
bool is_int(T)
{
    return is_same<int, T>::value;
}
 
int main()
{
    unsigned a = 5;
    int b = 4;
    char c = '3';
    double m = 3.14;
    cout << is_int(a) << endl; // false
    cout << is_int(b) << endl; // true
    cout << is_int(c) << endl; // false
    cout << is_int(m) << endl; // false
    return 0;
}
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
15.04.2015, 16:05
Цитата Сообщение от kol Посмотреть сообщение
Библиотека <type_traits> доступна лишь с стандарта с++11, её функция is_same<тип_данных, ваш_тип_данных>
И как это прикрутить к проверке правильности ввода?
Цитата Сообщение от Avgust Посмотреть сообщение
как сделать проверку на то, что это именно число int? например если вводить букву - у меня идет бесконечный цикл меню. Ну или если вводить дробное число.
0
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175
15.04.2015, 17:10
lss, Просто перед этим с помощью мной написанной функции is_int проверяешь число ли это. Если было введено не число, ты опять вызываешь.
Насчет библиотеки просто пишешь #include <type_traits>. Если пользуешься qt, то в фаиле .pro надо добавить ещё CONFIG += c++11
Можно что то вроде такого:
C++
1
2
3
4
5
6
7
8
while(true)
{
//...
cin >> k;
if(is_int(k)) break; // k - число, ели будет введено не число цикл будет продолжатся пока не будет введено число.
//...
}
/...
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
15.04.2015, 17:57
Цитата Сообщение от kol Посмотреть сообщение
Просто перед этим с помощью мной написанной функции is_int проверяешь число ли это. Если было введено не число, ты опять вызываешь.
Смотри, вот такой код:
C++
1
2
3
4
5
6
7
    int k;
    while (true)
    {
         cin >> k;
         if (is_int(k)) 
            break;
    }
Если ввести первой букву, а не цифру, то поток сломается и в k вообще ничего не попадёт (будет там мусор лежать), и смысла, в дальнейшей проверке на int, уже нет, потому что чтение не случилось.

Добавлено через 17 минут
Цитата Сообщение от kol Посмотреть сообщение
Просто перед этим с помощью мной написанной функции is_int проверяешь число ли это.
И, вообще, это проверка типа переменной, а не введённого значения, поэтому, если int k, то is_int(k) всегда вернёт true, вне зависимости от ввода.
Миниатюры
Проверка на наличие числового значения во входном потоке  
1
3 / 3 / 3
Регистрация: 03.11.2014
Сообщений: 80
15.04.2015, 19:33  [ТС]
Спасибо большое, получилось!
C++
1
2
3
4
5
6
7
8
// в строке ввода только цифры, перед которыми могут быть + или -.
int a;
while (!(cin >> a) || (cin.peek() != '\n'))
{
    cin.clear();
    while (cin.get() != '\n');
    cout << "Error!" << endl;
}
Вот это получилось если что)
0
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175
15.04.2015, 23:54
lss, Да, совершенно верно. Я без проверки на cin запостил функцию. Моя функция это проверка на тип, что ты совершенно верно указал. Есть разумеется способ проверить, путем записи введенного в строку(тип стринг) дальше проверить это строку на наличие пробелов и прочих символов, если таковые отсутствуют сконвертировать в тип интеджер. Все это конечно хорошо, но твой метод и короче, и красивее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.04.2015, 23:54
Помогаю со студенческими работами здесь

Проверка ячеек на наличие значения
Всем привет. Написал код, который должен выполнять следующее: Если в ячейке 1 число больше 0 и в ячейке 2 число больше 0, то нужно...

Проверка на наличие значения в строке
Помогите решить проблему. Заключается в том что в таблице post есть строка под название &quot;ids&quot; вней находятся числа через...

Проверка на наличие значения в поле
Собственно, хочу проверить, есть ли значение в поле и, если нету - выполнить запрос, иначе(если значение уже есть) - отправить назад,...

Сколько символов во входном потоке
Если сделать scanf(&quot;%c&quot;,&amp;ch) и ввести &quot;123&quot;, то в ch окажется '1'. Как проверить остались ли какие-либо символы во входном потоке? Это...

Теория о входном и выходном потоке
Помогите пожалуйста найти теорию о входном и выходном потоке.


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru