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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
Demien-DM
1 / 1 / 0
Регистрация: 07.07.2010
Сообщений: 32
#1

"защита от дурака" - C++

07.07.2010, 13:40. Просмотров 3036. Ответов 16
Метки нет (Все метки)

Пытаюсь сделать "защиту от дурака"... т.е введенная переменная должна быть только int.. не float и не char. пытался использовать условие:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int a,b;
cin>>a;
cin>>b;
 
switch(a+b)
{
 
   case 'int':
        программа
   break;
 
defoult: cout<<"\n Введите целое число \n\n";
}
Кампилятор эту конструкцию пропустил но по факту не работает... подскажите пожалуйста есть ли стандартное решение этой задачи.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2010, 13:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос "защита от дурака" (C++):

"Защита от дурака" числа с плавающей запятой - C++
Какие есть способы для защиты от ввода чисел с плавающей точкой(запятой) ?

"Защита от дурака" - C++
Здравствуйте! Недавно начал изучать Си и столкнулся с проблемой. Как можно с помощью цикла организовать корректность ввода числа? В Паскале...

"защита от дурака" - C++
всем привет, нужна ваша помощь в реализации защиты от дурака) #include&lt;iostream&gt; #include&lt;locale&gt; #include&lt;stdio.h&gt; ...

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

Программа отгадывает загаданное пользователем число: реализовать "защиту от дурака" - C++
Программа отгадывает, загаданное пользователем число #include &quot;stdafx.h&quot; #include &lt;locale&gt; #include &lt;iostream&gt; #include...

Как с scanf сделать "защиту от дурака"? - C++
Нужно, чтобы пользователь ввел две целочисленные переменные. Как делал я: bool ReadInteger(int &amp;var) { if (scanf(&quot;%d&quot;, &amp;var) != 1)...

16
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
07.07.2010, 13:48 #2
Demien-DM, зачем вам это? Если вы читаете в переменную типа int, то у нее ну просто никак не может внезапно появиться дробная часть. Даже если пользователь вводит, например, "2.2", в переменной будет "2". И еще, "по умолчанию" по-английски "default", а не "defoult". И запись 'int' просто недопустима, т.к. в одинарных кавычках можт стоять только символ. Ну а тем более недопустимо сравнивать целую переменную со строкой. Рекомендую вам почитать какой-нибудь учебник для начинающих, например "C++ за 21 день" Либерти Джонса
0
Demien-DM
1 / 1 / 0
Регистрация: 07.07.2010
Сообщений: 32
07.07.2010, 14:02  [ТС] #3
Я знаю что int должен автоматически "обрезать" дробную часть, но на практике после ввода дробного числа программа виснет, а после ввода символа выдает какой то дикий диапазон чисел (при этом не дожидаясь ввода второй переменной). На пальцах это не объяснить ни понять не возможно поэтому задачу и код приведу ниже.

Задача:Написать программу, которая находит сумму всех целых нечетных чисел в диапазоне, указанном пользователе

Код:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
    SetConsoleOutputCP(1251);
 
    int a,b;
    float i=0;
    int num=0;
    int sum=0;
 
    cout<<"\n";
    cout<<"\t Задайте диапазон чисел \n\n";
    cout<<"\t введите число \"А\"- ", cin>>a, cout<<"\n";
    cout<<"\t введите число \"В\"- ", cin>>b, cout<<"\n\n";
 
    if(a>b)
    {
        cout<<"Диапазон ваших чисел от  "<<b<<" до "<<a<<"\n\n";
        num=b;
        ++a;
        while(a>b)
        {
            i=num%2;
            (i!=0)?sum=sum+num:sum+0; 
            //cout<<num<<", "; Для проверки, посмотреть что он считает
            num++;
            a--;
        }
 
    }
 
    else
    {
        cout<<"Диапазон ваших чисел от  "<<a<<" до "<<b<<"\n\n";
        num=a;
        ++b;
        while(b>a)
        {
            i=num%2;
            (i!=0)?sum=sum+num:sum+0;
            //cout<<num<<", ";
            num++;
            b--;
        }
    }
    cout<<"\n\nСумма нечетных чисел в данном диапазоне = "<<sum<<"\n\n";
 
 }
0
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
07.07.2010, 14:10 #4
Есть вариант написать собственную функцию, которая посимвольно считывает число, а если символ недопустимый (не цифра), то просто не выводит его на экран и не считывает. Считанную строку переводим в число с помощью функции atoi
1
FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
07.07.2010, 14:22 #5
Посмотри СЮДА
По-моему самое оно...
1
Demien-DM
1 / 1 / 0
Регистрация: 07.07.2010
Сообщений: 32
07.07.2010, 14:27  [ТС] #6
Спасибо за совет, но для меня это пока сложновато (я занимаюсь программированием не полный месяц ). Постараюсь найти решение попроще.
0
Vladimir616
112 / 112 / 3
Регистрация: 05.07.2009
Сообщений: 224
07.07.2010, 14:30 #7
Вот написал функцию, возвращает только целые числа, игнорируя буквы, знаки препинания и т.п. Функция немного кривоватая, но работает отлично.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int GetInt()
{
    int value = -100000;
    while(value <= -10000)
    {
        cin >> value;
        if(value < -10000)
        {
        value = -1000000;
        cin.clear();
        cin.ignore(1024, '\n');
        continue;
        }
    }
    return value;
}
1
FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
07.07.2010, 14:33 #8
советую переписать 26 и 42 строку
Цитата Сообщение от Demien-DM Посмотреть сообщение
C++
1
(i!=0)?sum=sum+num:sum+0;
на
C++
1
(i!=0)?sum+=num : sum;
0
Demien-DM
1 / 1 / 0
Регистрация: 07.07.2010
Сообщений: 32
07.07.2010, 14:44  [ТС] #9
Цитата Сообщение от FireNovel Посмотреть сообщение
советую переписать 26 и 42 строку

на
C++
1
(i!=0)?sum+=num : sum;
Да, я знаю что написал не совсем корректно, там нужно просто пустышку поставить, но как это правильно сделать я пока не в курсе. В некоторых учебниках советуют ставить ";" . Я пробовал и компилятор не пропустил. Спасибо за пример
0
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
07.07.2010, 14:44 #10
Vladimir616, а я ввожу abvg456 - ничего не происходит
0
Demien-DM
1 / 1 / 0
Регистрация: 07.07.2010
Сообщений: 32
07.07.2010, 14:59  [ТС] #11
Цитата Сообщение от PointsEqual Посмотреть сообщение
Vladimir616, а я ввожу abvg456 - ничего не происходит
Да в том то и дело что не должно ничего происходить, но, увы, происходит.
Ввожу символы и программа не дожидаясь ввода второй переменной выдает диапазон чисел
от -858993460 до -858993460
сумма нечетных = 0
А если ввожу дробное число сразу же попадаю в матрицу, т.е. все окно консоли заполняют бегущие цифры.
Почему это происходит не понимаю
0
Vladimir616
112 / 112 / 3
Регистрация: 05.07.2009
Сообщений: 224
07.07.2010, 15:04 #12
PointsEqual, моя функция не на столько крутая, чтобы обработать такую строчку. Но если ввести 456abvg то функция вернёт 456.
1
easybudda
Модератор
Эксперт CЭксперт С++
9680 / 5630 / 954
Регистрация: 25.07.2009
Сообщений: 10,807
07.07.2010, 15:05 #13
Demien-DM, прочитайте внимательно описание стандартной функции strtol() - будет Вам "защита от дурака"
1
usernet009
24 / 24 / 1
Регистрация: 28.12.2009
Сообщений: 85
07.07.2010, 15:11 #14
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
ТС, у потока cin есть failbit. Этот фэилбит становится еденичкой если пользователь ввел что то не так, ну например
cin>>i; // i - int
А пользователь вводит 2.2
в переменную i попадает 2 а failbit становится = 1
И, если ты попробуешь дальше ввести чтото, например
cin>>f; //f - float
то ничего не введется так как failbit уже установлен а ввод может происходить только из "хорошего" потока.
В общем. К чему я все это, попробуй вот так
C++
1
2
3
4
5
6
7
cin>>i;
while(cin.fail() == 1) // cin.fail() возвращает 1 если установлет failbit
{
cout<<"IDIOT !! Enter again !\n";
cin.clear(); // сбрасывает все биты потока, тоесть поток становится "хорошим"
cin>>i;
}
p.s сам только недавно прочитал про эти биты\потоки, так что сильно не пинай если на заработает
3
ForEveR
07.07.2010, 15:17     "защита от дурака"
  #15

Не по теме:

usernet009, cout<<"IDIOT !! Enter again !\n";

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

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

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

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...


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

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

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