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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Mishaka
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
#1

Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов - C++

09.10.2012, 00:41. Просмотров 2543. Ответов 20
Метки нет (Все метки)

Привет всем! Вот пишу программу, преподаватель сказал чтобы написал защиту от ввода чисел с плавающей точкой, отрицательных, символов. В общем нужны по условию задачи только натуральные числа. Как это осуществить? Вот моя защита от отр. чисел:
C++
1
2
3
4
5
6
 cin >> a; 
    while (1)
    {
       if (a>0) {cout <<"vvedite granicy b\n";break;}
       else {cout << "Ne naturalnoe chislo\n" << "Povtorite vvod\n"; cin >> a;}
    }
Добавлено через 1 минуту
Хорошо бы прямо в это условие вставить нужное выражение, только вот какое?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2012, 00:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов (C++):

Представление чисел с плавающей точкой - C++
Никак не пойму почему в коде: double helper; bool cond; int dim_2; int dim_1; helper=0.0; ...

Сравнение чисел с плавающей точкой - C++
Известно, что числа с плавающей точкой нельзя сравнивать с помощью ==. Однако, нет ли исключения из этого правила? Дело вот в чём. Если мы...

Форматирование чисел с плавающей точкой - C++
Все знают про проблемы с представлением дробных чисел. Например: double test = .58; printf(&quot;%f\n&quot;, test); //...

Калькулятор чисел с плавающей точкой - C++
double calculate(float x, char s, float y); int main() { float x,y; char s; x=y=0; cin&gt;&gt;x&gt;&gt;s&gt;&gt;y;

Массив чисел с плавающей точкой - C++
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;fstream&gt; using namespace std; int main() { float randomDigits_5 {}; ...

Умножения чисел с плавающей точкой - C++
Доброго времени суток,нужна ваша помощь в умножение чисел с плавающей точкой. Суть программы:Умножение чисел в двоичном коде.Первое число...

20
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 11:18 #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
И что же это значит?
Не знаю. Есть ещё загадочный фраза здесь http://cppstudy.wordpress.com/2009/03/27/cin-get-and-co/ :
Использование функции sync() – путь наименьшего сопротивления. Она просто очищает поток от имеющихся в нем символов.
Почему этот способ самый сложный – поищите в Гугле (если есть желание).
Почему самый сложный, непонятно.

Цитата Сообщение от Mishaka Посмотреть сообщение
Ладно буду воевать с преподом
Вы так и не объяснили, что преподавателя может не устроить в предложенных вариантах.
0
Mishaka
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
09.10.2012, 12:11  [ТС] #17
Цитата Сообщение от alsav22 Посмотреть сообщение
Не знаю. Есть ещё загадочный фраза здесь http://cppstudy.wordpress.com/2009/03/27/cin-get-and-co/ : Почему самый сложный, непонятно.

Вы так и не объяснили, что преподавателя может не устроить в предложенных вариантах.
то что я не смогу к сожалению объяснить как работает вот это
C++
1
2
3
4
5
{
            cin.clear();
            while (cin.get() != '\n');
            cout << "Ne naturalnoe chislo\n" << "Povtorite vvod\n";
        }
если есть возможность объяснить как работает каждая функция буду признателен!
0
-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2012, 13:42 #18
Цитата Сообщение от alsav22 Посмотреть сообщение
И что же это значит?
Не знаю.
Потрясающий ответ!

А теперь посмотрим что нам говорит технический источник
Читаем http://www.cplusplus.com/reference/iostream/istream/sync/
std::istream::sync
<istream>
int sync ( );
Synchronize input buffer with source of characters
Synchronizes the buffer associated with the stream to its controlled input sequence. This effectively means that the unread characters in the buffer are discarded.

The function only has meaning for buffered streams, in which case it effectively calls the pubsync member of the streambuf object (rdbuf()->pubsync()) associated to the input sequence.
The function only has meaning for buffered streams - т.е функция работает только для буфферезированных потоков, потому и не работает в линуксе


Цитата Сообщение от Mishaka Посмотреть сообщение
cin.clear();
- сброс флагов ошибок в потоке ввода
Цитата Сообщение от Mishaka Посмотреть сообщение
while (cin.get() != '\n');
- очистка буфера ввода от сбойных символов(то что у меня шло как cin.sync()) Почему '\n' потому что когда вводим жмем Enter тем самым записывая в буфер ввода символ перевода строки.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
09.10.2012, 20:21 #19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
потому и не работает в линуксе
Что?..
0
-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2012, 20:46 #20
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что?..
silent_1991, а как ещё можно объяснить неотработку метода - только небуферезированностью вывода линуксе, либо всё таки имеет место быть 2-е
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
2-е компилтор линкует неправильно от того cin.sync не рабоатет
Других вариантов тут нет!А глядя на компиляторы под линукс сравни 4-му борландСи я коственно нахожу подтверждение именно небуфферезированности вывода в линуксе. Так что вот это хотел написать, если вопрос был адресован мне...
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 21:38 #21
Цитата Сообщение от Mishaka Посмотреть сообщение
если есть возможность объяснить как работает каждая функция буду признателен!
Работает всё так. cin >> ожидает ввод числа, т.е. первым символом для ввода должна быть цифра. Вы набираете, например, asd345 и жмете Enter. Встретив вместо ожидаемой цифры букву (а), cin устанавливает для потока ввода флаг ошибки (для if() cin теперь будет false) и ввод с консоли становится невозможен. В переменную, куда читает cin, ничего не заносится, а то что не ввелось (в данном случае: asd345) остаётся в очереди ввода. Для того, чтобы поток ввода заработал снова, нужно сбросить флаг ошибки. Это делает cin.clear(). Потом нужно очистить очередь ввода, иначе первым символом для cin >> опять будет буква (а) и всё повторится. Очистку делает эта конструкция:
C++
1
while (cin.get() != '\n');
При каждой итерации цикла, cin.get() будет извлекать из потока ввода по одному символу пока не извлечёт символ новой строки '\n' (последний символ из предыдущего ввода - попадает в поток при нажатии Enter), извлечёт и его, и будет выход из цикла. После этого поток для ввода будет чист и готов для дальнейшей работы.
0
09.10.2012, 21:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2012, 21:38
Привет! Вот еще темы с ответами:

Считывание из файла чисел с плавающей точкой - C++
программа считывания из файла чисел в двумерный массив но как только в файле обнаруживаются числа с плавающей точкой то программа перестает...

Проблема сравнения чисел с плавающей точкой - C++
Добрый вечер, развивая тему к которой меня подтолкнул, Байт, посоветуйте ряд лайффаков на тему фикса (кроссплатформенность же ж ) ...

Округление положительных чисел с плавающей точкой - C++
Добрый день ! Нужно округлить положительных чисел с плавающей точкой в большую сторону к числу кратному 5. то есть если есть...

Определите одномерный массив из 10 чисел с плавающей точкой - C++
1. Определите одномерный массив из 10 чисел с плавающей точкой в тексте программы. Вычислите минимальное и максимальное значение и позиции...


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

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

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