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

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

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

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

09.10.2012, 00:41. Просмотров 2344. Ответов 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 минуту
Хорошо бы прямо в это условие вставить нужное выражение, только вот какое?
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++
Доброго времени суток,нужна ваша помощь в умножение чисел с плавающей точкой. Суть программы:Умножение чисел в двоичном коде.Первое число...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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
Ладно буду воевать с преподом и пытаться объяснить код=(. Спасибо большое за помощь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2012, 10:58
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.10.2012, 10:58
Ответ Создать тему
Опции темы

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