Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Johnlion
62 / 2 / 0
Регистрация: 11.05.2011
Сообщений: 666
#1

Как написать проверку на "циферность" - C++

30.04.2012, 00:13. Просмотров 417. Ответов 9
Метки нет (Все метки)

Хочу сделать такое:

C++
1
2
3
4
if (Переменная - не цифра)
{
      cout << "Введите переменную еще раз";
}
Знаю, есть функция isdigit(), но тут проблема - эта функция проверяет числа до 256, а это не годится, мне нужно больше
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2012, 00:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как написать проверку на "циферность" (C++):

Написать проверку на соответствие ввода целочисленному типу ("защита от дураков") - C++
Когда вводят букву программа зацикливается int get_move(int i){ std::cout&lt;&lt;&quot;Welcome to tic-tac-toe!\n\n&quot;; std::cout&lt;&lt;&quot;\nMove...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Написать функцию поиска человека по полю "фамилия" в массиве структур "Note" ("Персональная информация") - C++
Вывести из структуры информацию о человеке, чья фамилия введена с клавиатуры #include &lt;iostream&gt; #include &lt;locale&gt; #include...

Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: "Рабочий день","Суббота" или "Воскресенье" - C++
Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: &quot;Рабочий день&quot;,&quot;Суббота&quot; или...

Написать программу которaя запрашиваeт у пользователя номер дня недели, затем выводит одно из сообщений "рабочий день", "суббота", "воскресенье" - C++
Добрый день необходимо написать несколько программ, кто может помогите. одна тема - одна задача!

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

9
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
30.04.2012, 00:17 #2
Цитата Сообщение от Johnlion Посмотреть сообщение
Знаю, есть функция isdigit(), но тут проблема - эта функция проверяет числа до 256, а это не годится, мне нужно больше
так в char и влазит 256, куда больше то?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
using namespace std;
 
int main()
{
    int n;
    if (cin >> n)
    {
        cout << "n is digit";
    }
    return 0;
}
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
30.04.2012, 01:03 #3
Вот как пример, там на Си, но думаю идея должна быть понятна.
0
Johnlion
62 / 2 / 0
Регистрация: 11.05.2011
Сообщений: 666
30.04.2012, 01:51  [ТС] #4
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вот как пример, там на Си, но думаю идея должна быть понятна.
Да там много чего написано. Что именно мне нужно по моему условию?
0
-=ЮрА=-
Заблокирован
Автор FAQ
30.04.2012, 02:20 #5
Цитата Сообщение от Johnlion Посмотреть сообщение
Хочу сделать такое:
if (Переменная - не цифра)
{
* * * cout << "Введите переменную еще раз";
}
Знаю, есть функция isdigit(), но тут проблема - эта функция проверяет числа до 256, а это не годится, мне нужно больше
Делается всё приблизительно так
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
#include <iostream>
using namespace std;
 
int main()
{
    int val;
    bool bInput = true;
    while(bInput)
    {
        cout<<"Enter didgit : ";
        if(!(cin>>val) || cin.get() != '\n')
        {
            //Чистим поток
            cin.clear();
            cin.sync();//Убираем данные из буфера
            cout<<"Please repeate input\n";
        }
        else
            bInput = false;
    }
    cout<<"Your input : "<<val<<endl;
    system("pause");
    return 0;
}
1
Миниатюры
Как написать проверку на "циферность"  
-=ЮрА=-
Заблокирован
Автор FAQ
30.04.2012, 02:26 #6
Теперь немного об этом
Цитата Сообщение от panicwassano Посмотреть сообщение
if (cin >> n)
- нет данного условия не достаточно. На вопрос почему отвечу - введите к примеру 12e и сами поймёте. Кроме проверки ввода нужна ещё проверка, что введеная строка больше не содержит символов

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.get() != '\n'
- это условие значит что в строке кроме \n появляющегося после нажатия Enter уже ничего не осталось. Теперь далее, когда осуществили неверный ввод наш cin имеет флаг ошибки - его надо сбросить
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.clear();
, а также нужно очистить буфер консоли от возможно оставшегося после неокрректного ввода содержимого
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.sync();//Убираем данные из буфера
. Если проделаем эти все манипуляции сможем получить прообраз защищённого ввода. Подобную проблемму уже рассматривал здесь http://www.cyberforum.ru/blogs/34326/blog279.html
1
Johnlion
62 / 2 / 0
Регистрация: 11.05.2011
Сообщений: 666
30.04.2012, 02:44  [ТС] #7
-=ЮрА=-, а без cin.clear(); и cin.sync(); что-нибудь измениться? Можно без этого обойтись?
0
-=ЮрА=-
Заблокирован
Автор FAQ
30.04.2012, 03:12 #8
Цитата Сообщение от Johnlion Посмотреть сообщение
-=ЮрА=-, а без cin.clear(); и cin.sync(); что-нибудь измениться? Можно без этого обойтись?
- нет во первых если в потоке возникла ошибка, нужно сбросить её флаг
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.clear();
второе если не очистишь буфер, можешь столкнуться с тем что куски строки от предыдущего ввода будут давайть о себе знать, лишними сообщениями что ввод некорректный.
А чем тебя пугают данные методы?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.clear();
* * * * * * cin.sync();//Убираем данные из буфера
Добавлено через 4 минуты

Не по теме:

Johnlion, в конце концов можешь закоментировать эти строки

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.clear();
* * * * * * cin.sync();//Убираем данные из буфера
и произвести ввод 111Some string и посмотри что из этого получится

0
Johnlion
62 / 2 / 0
Регистрация: 11.05.2011
Сообщений: 666
30.04.2012, 03:53  [ТС] #9
Юра, cin.clear() чистить поток, а cin.sync() чистит буфер? Если да, то в чем разница между буфером и потоком?
0
-=ЮрА=-
Заблокирован
Автор FAQ
30.04.2012, 05:05 #10
Цитата Сообщение от Johnlion Посмотреть сообщение
то в чем разница между буфером и потоком?
- у потока есть буфер, это его составная часть. Т.е. если не сбросить флаг ошибки в потоке не важно есть что либо в буфере либо нет поток уже будет рабоать некорректно либо скорее всего вообще не будет работать. Если же мы сбросили флаг ошибки, то поток "считает что то что сидело в буфере" это наш новый ввод и добросовестно начинает с того места на котором вылетел(т.е. фактически сбросив флаг ошибки и не почистив буфер можем снова испортить поток и т.д и т.д., пока данные в буфере сами собой не кончаться)

Для потока
Если да,
, если честно не люблю по много раз повторять одно и тоже, но ладно давай ещё раз прочитаем что же я писал

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
когда осуществили неверный ввод наш cin имеет флаг ошибки - его надо сбросить
Сообщение от -=ЮрА=-
cin.clear();
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
нет во первых если в потоке возникла ошибка, нужно сбросить её флаг
Сообщение от -=ЮрА=-
cin.clear();
Для буфера
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.sync();//Убираем данные из буфера
Добавлено через 6 минут

Не по теме:

Чтобы снять все непонятки с потокм и буфером предлагаю немного утрировать и рассмотреть скажем пусть explorer.exe (опустим многопоточность и т.д.). Так вот explorer.exe - поток, а объём ОЗУ им занимаемый - его буфер(ну тоже тут кое что упростил для понимания). Как видишь набор инструкций процессору, коим фактически является поток и объём ОЗУ разительно различаются, проведи аналогии на консоль

0
30.04.2012, 05:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2012, 05:05
Привет! Вот еще темы с ответами:

Как отключить автоматическое добавление "_" "@" "number" к имени экстернального метода? - C++
Здраствуйте! Подскажите как это делается? (вопрос в названии темы) среда : VS2013 проект компилируется в dll файл в начале...

дано четырехзначное число. если сумма первых 2 цифр=сумме 2 последних, написать "yes", иначе "no" - C++
Вот попробовал написать код но ошибку выдает: #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; int main() { ...

Написать программу что меняло слово "кукушка" на "груша", с помощью стека - C++
Написать программу что меняло слово кукушка на груша , с помощью стека(1 программа) и очередь(2 программа) Помогите пожалуйста очень...

Написать программу, которая заменяет в указанном слове все буквы "b" на сочетание "ky" - C++
Написать программу, которая заменяет в указанном слове все буквы &quot;b&quot; на сочетание &quot;ky&quot;. Использовать 2 массива: начальный и результирующий....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru