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

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

09.10.2012, 00:41. Показов 9201. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.10.2012, 00:41
Ответы с готовыми решениями:

Написать функцию, которая возвращает наибольшее из трех чисел с плавающей точкой
Разработать программу, которая использует эту функцию столько раз, сколько укажет користувач.Напишить функцию, которая возвращает...

Написать функцию, которая возвращает наибольшее из трех чисел с плавающей точкой
Разработать программу, которая использует эту функцию столько раз, сколько укажет пользователь. Написать функцию, которая возвращает...

Преобразование чисел с плавающей точкой в числа с фиксированной точкой
Здравствуйте, подскажите пожалуйста как заменить вещественные числа с плавающей точкой, числами округленными до десятых, записанными в...

20
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 03:18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main()
{
    double a;
    while (cin >> a)
    {
        if (!cin || a < 0 || a != (int)(a))
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << "Ne naturalnoe chislo\n" << "Povtorite vvod\n";
        }
        else break;
    } 
    
    system ("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
09.10.2012, 09:16  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
2
    
        if (!cin || a < 0 || a != (int)(a))
Извините, а можно пояснить вот эту строчку?Что такое !cin ? и почему a не равно целому типу a?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 09:31
Защита от ввода символов вместо цифр. Если первым символом будет не цифра, то cin установит флаг ошибки. В таком случае в if() значение cin будет false, а !cin - true. a != (int)(a)) - защита от ввода числа с плавающей точкой. Если а - число с плавающей точкой, то приведение его к int отбросит цифры после запятой и разность между a и (int)a будет не равна 0.
0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
09.10.2012, 09:37  [ТС]
спасибо. Еще вопрос почему а<0 ? и || это логическое или?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.10.2012, 09:40
Цитата Сообщение от Mishaka Посмотреть сообщение
Привет всем! Вот пишу программу, преподаватель сказал чтобы написал защиту от ввода чисел с плавающей точкой, отрицательных, символов. В общем нужны по условию задачи только натуральные числа. Как это осуществить?
- Вот так
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
#include <iostream>
using namespace std;
 
int main()
{
    //Ñêàæåì íàäî ââîä îò -1 äî 5 
    int down = -1;
    int up   = 5;
    int val  = 0;//Áóäåò ñîäåðæàòü íàøå ââîäèìîå ÷èñëî
    while(true)
    {
        cout<<"Enter value in interval[-1;5] : ";
        if(!(cin>>val))// ñëó÷àå îøèáêè ââîäà îïåðàòîð >>
            //âîçâðàòèò êîä îøèáêè, åñëè å¸ íåò âîçâðàò 0 è â óñëîâèå íå ïîïàä¸ì
        {
            cin.clear();//Ñáðàñûâàåì ôëàã îøèáêè
            cin.sync();//Óäàëåÿì ëèøíåå èç áóôôåðà ââîäà
            cout<<"Incorrect input"<<endl;
        }
        else
        if(val < -1 || 5 < val)
            cout<<"Input value not in interval [-1;5]"<<endl;
        else
            cout<<"Your input : "<<val<<endl;
    }
    return 0;
}
Миниатюры
Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов  
0
09.10.2012, 09:40

Не по теме:

alsav22, заменяй это

Цитата Сообщение от alsav22 Посмотреть сообщение
while (cin.get() != '\n');
вот этим
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.sync();//Удалеям лишнее из буффера ввода

1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 10:17
Код неправильный у меня. Переписывал и неверный вариант выложил. Вот это правильный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cstdlib>
using namespace std;
 
int main()
{
    double a;
    while (true)
    {
        cin >> a;
        if (!cin || a < 0 || a != (int)(a))
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << "Ne naturalnoe chislo\n" << "Povtorite vvod\n";
        }
        else break;
    } 
    
    system ("pause");
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от Mishaka Посмотреть сообщение
Еще вопрос почему а<0 ? и || это логическое или?
Чтобы отрицательные не вводили. Да, это логическое или.

Добавлено через 2 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Не по теме:
alsav22, заменяй это
Сообщение от alsav22
while (cin.get() != '\n');
вот этим
Сообщение от -=ЮрА=-
cin.sync();//Удалеям лишнее из буффера ввода
-=ЮрА=-, sync() в Linux() не работает. Проверял. И ТС нужен ввод только натуральных чисел.
1
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
09.10.2012, 10:26  [ТС]
Спасибо вам!=) проблема в том что препод не примет такого решения к сожалению, вот я сделал под себя, все работает, одна проблема в том что когда вводиш символ цикл становится бесконечным, что нужно изменить чтобы этого не было??
C++
1
2
3
4
5
6
7
    double a;
    while (1)
    {
        cin >> a;
        if (!cin || a < 0 || a != (int)(a)) {cout << "oshibka vvoda\n";continue;}
        else cout << "vvedite granicy b\n";break;
    }
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 10:35
Цитата Сообщение от Mishaka Посмотреть сообщение
проблема в том что препод не примет такого решения
Какого такого? И почему?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.10.2012, 10:36
Mishaka, тебе чётко и ясно сказали
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.clear();//Сбрасываем флаг ошибки
* * * * * * cin.sync();//Удалеям лишнее из буффера ввода
-
Цитата Сообщение от alsav22 Посмотреть сообщение
if (!cin || a < 0 || a != (int)(a))
* * * * {
* * * * * * cin.clear();
* * * * * * while (cin.get() != '\n');
* * * * * * cout << "Ne naturalnoe chislo\n" << "Povtorite vvod\n";
* * * * }
без cin.clear и очистки буффера твой цикл всегда будет бесконечным!Поэтому либо бери продуманный код а свой выбрось, либо ты никогда не добъёшся корректной работы защищённого ввода (3-го варианта просто нет)

Цитата Сообщение от alsav22 Посмотреть сообщение
-=ЮрА=-, sync() в Linux() не работает.
- не проверял но cin.sync является стандартным методом, а потому работать должен везде
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 10:41
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
не проверял но cin.sync является стандартным методом, а потому работать должен везде
И тем не менее... Проверяли, и не один я.
0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
09.10.2012, 10:43  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Какого такого? И почему?
Ну просто мы прошли только циклы и условия и элементарные литералы, да и я не оч понимаю как работает программа а защищать программу нужно...=(
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.10.2012, 10:57
Цитата Сообщение от alsav22 Посмотреть сообщение
И тем не менее... Проверяли, и не один я.
И что же это значит?
1-е какая то библиотека ввода в Линуксе сбоит - хм маловероятно
2-е компилтор линкует неправильно от того cin.sync не рабоатет - а вот это уже гарячо я думаю даже что 100% ошибка в этом

Не по теме:

PS:После этого люди закидуют мелкософту создание плохих компиляторов, мило...!

0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
09.10.2012, 10:58  [ТС]
Ладно буду воевать с преподом и пытаться объяснить код=(. Спасибо большое за помощь
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 11:18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
И что же это значит?
Не знаю. Есть ещё загадочный фраза здесь http://cppstudy.wordpress.com/... et-and-co/ :
Использование функции sync() – путь наименьшего сопротивления. Она просто очищает поток от имеющихся в нем символов.
Почему этот способ самый сложный – поищите в Гугле (если есть желание).
Почему самый сложный, непонятно.

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

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

А теперь посмотрим что нам говорит технический источник
Читаем http://www.cplusplus.com/refer... ream/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
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.10.2012, 20:21
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
потому и не работает в линуксе
Что?..
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.10.2012, 20:46
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что?..
silent_1991, а как ещё можно объяснить неотработку метода - только небуферезированностью вывода линуксе, либо всё таки имеет место быть 2-е
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
2-е компилтор линкует неправильно от того cin.sync не рабоатет
Других вариантов тут нет!А глядя на компиляторы под линукс сравни 4-му борландСи я коственно нахожу подтверждение именно небуфферезированности вывода в линуксе. Так что вот это хотел написать, если вопрос был адресован мне...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2012, 20:46
Помогаю со студенческими работами здесь

Вычисление чисел с плавающей точкой
делаю калькулятор и столкнулся с проблемой вычисления чисел с плавающей точкой...как можно реализовать подскажите

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

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

Сравнение чисел с плавающей точкой
Добрый день! Пожалуйста, подскажите, не может ли возникнуть проблем, если я напишу что-то вроде: ......... var A,B:double; ...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru