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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
Demien-DM
1 / 1 / 0
Регистрация: 07.07.2010
Сообщений: 32
07.07.2010, 13:40     "защита от дурака" #1
Пытаюсь сделать "защиту от дурака"... т.е введенная переменная должна быть только 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";
}
Кампилятор эту конструкцию пропустил но по факту не работает... подскажите пожалуйста есть ли стандартное решение этой задачи.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Demihalf
Унылый школьник
 Аватар для 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 день" Либерти Джонса
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";
 
 }
Demihalf
Унылый школьник
 Аватар для Demihalf
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
07.07.2010, 14:10     "защита от дурака" #4
Есть вариант написать собственную функцию, которая посимвольно считывает число, а если символ недопустимый (не цифра), то просто не выводит его на экран и не считывает. Считанную строку переводим в число с помощью функции atoi
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
07.07.2010, 14:22     "защита от дурака" #5
Посмотри СЮДА
По-моему самое оно...
Demien-DM
1 / 1 / 0
Регистрация: 07.07.2010
Сообщений: 32
07.07.2010, 14:27  [ТС]     "защита от дурака" #6
Спасибо за совет, но для меня это пока сложновато (я занимаюсь программированием не полный месяц ). Постараюсь найти решение попроще.
Vladimir616
110 / 110 / 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;
}
FireNovel
 Аватар для 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;
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;
Да, я знаю что написал не совсем корректно, там нужно просто пустышку поставить, но как это правильно сделать я пока не в курсе. В некоторых учебниках советуют ставить ";" . Я пробовал и компилятор не пропустил. Спасибо за пример
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
07.07.2010, 14:44     "защита от дурака" #10
Vladimir616, а я ввожу abvg456 - ничего не происходит
Demien-DM
1 / 1 / 0
Регистрация: 07.07.2010
Сообщений: 32
07.07.2010, 14:59  [ТС]     "защита от дурака" #11
Цитата Сообщение от PointsEqual Посмотреть сообщение
Vladimir616, а я ввожу abvg456 - ничего не происходит
Да в том то и дело что не должно ничего происходить, но, увы, происходит.
Ввожу символы и программа не дожидаясь ввода второй переменной выдает диапазон чисел
от -858993460 до -858993460
сумма нечетных = 0
А если ввожу дробное число сразу же попадаю в матрицу, т.е. все окно консоли заполняют бегущие цифры.
Почему это происходит не понимаю
Vladimir616
110 / 110 / 3
Регистрация: 05.07.2009
Сообщений: 224
07.07.2010, 15:04     "защита от дурака" #12
PointsEqual, моя функция не на столько крутая, чтобы обработать такую строчку. Но если ввести 456abvg то функция вернёт 456.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.07.2010, 15:05     "защита от дурака" #13
Demien-DM, прочитайте внимательно описание стандартной функции strtol() - будет Вам "защита от дурака"
usernet009
 Аватар для 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 сам только недавно прочитал про эти биты\потоки, так что сильно не пинай если на заработает
ForEveR
07.07.2010, 15:17
  #15

Не по теме:

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

easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
07.07.2010, 15:32     "защита от дурака" #16
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
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <ctype.h>
#include <errno.h>
 
int num_from_str(const char * str, long * num){
    char * tail;
    long res;
    errno = 0;
    res = strtol(str, &tail, 10);
    switch(errno){
    case 0:
        if ( *tail && ! isspace(*tail) ){
            fprintf(stderr, "Wrong value! Only the whole decimal numbers needed!\n");
            return -1;
        }
        *num = res;
        return 0;
    case EINVAL:
        fprintf(stderr, "Wrong value! Only the whole decimal numbers needed!\n");
        return -1;
    case ERANGE:
        if ( res == LONG_MAX )
            fprintf(stderr, "Too big!\n");
        else
            fprintf(stderr, "Too small!\n");
        return -1;
    default:
        fprintf(stderr, "Unknown error!\n");
        return -1;
    }
}
 
int main(void){
    char buf[BUFSIZ];
    long num;
 
    do {
        printf("Number: ");
        if ( ! fgets(buf, BUFSIZ, stdin) ){
            perror("fgets");
            exit(EXIT_FAILURE);
        }
    } while ( num_from_str(buf, &num) );
 
    printf("You have entered: %ld\n", num);
    exit(EXIT_SUCCESS);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2010, 16:47     "защита от дурака"
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Demien-DM
1 / 1 / 0
Регистрация: 07.07.2010
Сообщений: 32
07.07.2010, 16:47  [ТС]     "защита от дурака" #17
Цитата Сообщение от usernet009 Посмотреть сообщение
ТС, у потока 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 сам только недавно прочитал про эти биты\потоки, так что сильно не пинай если на заработает
Все работает просто замечательно !
Это именно то что я искал - короткое, простое решение.
На сколько я понимаю стандартное решение этой проблемы это считать строку с консоли и перевести ее в число (ИММХО наиболее точно этот вариант показал г-н. easybudda ).
Но я не могу использовать этот вариант поскольку еще не знаком с этими операторами.

Всем огромное спасибо и низкий поклон за внимание и помощь !!!
Yandex
Объявления
07.07.2010, 16:47     "защита от дурака"
Ответ Создать тему
Опции темы

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