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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Mishaka
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
09.10.2012, 00:41     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #1
Привет всем! Вот пишу программу, преподаватель сказал чтобы написал защиту от ввода чисел с плавающей точкой, отрицательных, символов. В общем нужны по условию задачи только натуральные числа. Как это осуществить? Вот моя защита от отр. чисел:
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 минуту
Хорошо бы прямо в это условие вставить нужное выражение, только вот какое?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2012, 00:41     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов
Посмотрите здесь:

C++ Определите одномерный массив из 10 чисел с плавающей точкой
Форматирование чисел с плавающей точкой C++
Создать двумерный массив чисел с плавающей точкой и вывести на экран все числа по диагонали с лева на право C++
калькулятор чисел с плавающей точкой C++
C++ Сравнение чисел с плавающей точкой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 03:18     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #2
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;
}
Mishaka
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
09.10.2012, 09:16  [ТС]     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #3
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
2
    
        if (!cin || a < 0 || a != (int)(a))
Извините, а можно пояснить вот эту строчку?Что такое !cin ? и почему a не равно целому типу a?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 09:31     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #4
Защита от ввода символов вместо цифр. Если первым символом будет не цифра, то cin установит флаг ошибки. В таком случае в if() значение cin будет false, а !cin - true. a != (int)(a)) - защита от ввода числа с плавающей точкой. Если а - число с плавающей точкой, то приведение его к int отбросит цифры после запятой и разность между a и (int)a будет не равна 0.
Mishaka
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
09.10.2012, 09:37  [ТС]     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #5
спасибо. Еще вопрос почему а<0 ? и || это логическое или?
-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2012, 09:40     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #6
Цитата Сообщение от 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;
}
Миниатюры
Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов  
-=ЮрА=-
09.10.2012, 09:40
  #7

Не по теме:

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

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

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 10:17     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #8
Код неправильный у меня. Переписывал и неверный вариант выложил. Вот это правильный:
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() не работает. Проверял. И ТС нужен ввод только натуральных чисел.
Mishaka
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
09.10.2012, 10:26  [ТС]     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #9
Спасибо вам!=) проблема в том что препод не примет такого решения к сожалению, вот я сделал под себя, все работает, одна проблема в том что когда вводиш символ цикл становится бесконечным, что нужно изменить чтобы этого не было??
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;
    }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 10:35     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #10
Цитата Сообщение от Mishaka Посмотреть сообщение
проблема в том что препод не примет такого решения
Какого такого? И почему?
-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2012, 10:36     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #11
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 является стандартным методом, а потому работать должен везде
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.10.2012, 10:41     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
не проверял но cin.sync является стандартным методом, а потому работать должен везде
И тем не менее... Проверяли, и не один я.
Mishaka
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 32
09.10.2012, 10:43  [ТС]     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Какого такого? И почему?
Ну просто мы прошли только циклы и условия и элементарные литералы, да и я не оч понимаю как работает программа а защищать программу нужно...=(
-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2012, 10:57     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #14
Цитата Сообщение от alsav22 Посмотреть сообщение
И тем не менее... Проверяли, и не один я.
И что же это значит?
1-е какая то библиотека ввода в Линуксе сбоит - хм маловероятно
2-е компилтор линкует неправильно от того cin.sync не рабоатет - а вот это уже гарячо я думаю даже что 100% ошибка в этом

Не по теме:

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

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

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

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

А теперь посмотрим что нам говорит технический источник
Читаем http://www.cplusplus.com/reference/i.../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 тем самым записывая в буфер ввода символ перевода строки.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.10.2012, 20:21     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
потому и не работает в линуксе
Что?..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2012, 20:46     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов
Еще ссылки по теме:

C++ Считывание из файла чисел с плавающей точкой
C++ Проблема сравнения чисел с плавающей точкой

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
09.10.2012, 20:46     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов #20
Цитата Сообщение от silent_1991 Посмотреть сообщение
Что?..
silent_1991, а как ещё можно объяснить неотработку метода - только небуферезированностью вывода линуксе, либо всё таки имеет место быть 2-е
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
2-е компилтор линкует неправильно от того cin.sync не рабоатет
Других вариантов тут нет!А глядя на компиляторы под линукс сравни 4-му борландСи я коственно нахожу подтверждение именно небуфферезированности вывода в линуксе. Так что вот это хотел написать, если вопрос был адресован мне...
Yandex
Объявления
09.10.2012, 20:46     Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов
Ответ Создать тему
Опции темы

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