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

простая программа, проверяющая вводимое число - C++

Восстановить пароль Регистрация
 
time123
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
21.11.2012, 01:36     простая программа, проверяющая вводимое число #1
Всем привет. Вот начал писать программку простую, которая просто проверяем введено ли число из заданного диапазона. Она работает, но есть вопросы, и хочу ее усовершенствовать.

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
#include  <iostream >
using namespace std;
 
int get_num(int min_value, int max_value) {
 
    while (true) {
        int n;
 
        if(cin>>n) {
            if(n > max_value || n < min_value) {
                cout << "incorrect num, must be > " << min_value << " and > " << max_value << endl;
            } else {
                return n;
            }
        }
    }
 
}
 
 
int main () {
    cout << "enter number" << endl;
 
    int get_nuber_var = get_num(0, 10);
 
    cout << "good.";
 
    return 0;
}
интересуют вопросы:

почему при указании

get_num(int& min_value, int& max_value)

не хочет компилироваться

а так же почему не работает такая запись для конкатенации

cout << "enter number" + endl;

(и как сделать чтоб заработало)

а так же как сделать проверку что введено именно число а не строка?

Добавлено через 16 минут
и еще такой вопрос, вот в заголовочном файле среда разместила строки

C++
1
2
3
4
5
6
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
 
 
 
#endif // TEST_H_INCLUDED
что значит они?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
21.11.2012, 01:49     простая программа, проверяющая вводимое число #2
Цитата Сообщение от time123 Посмотреть сообщение
get_num(int& min_value, int& max_value)
C++
1
get_num(int min_value&, int max_value&)

Цитата Сообщение от time123 Посмотреть сообщение
cout << "enter number" + endl;
C++
1
2
3
4
5
6
7
cout<<"enter number"<<endl;
//или
cout<<"enter number\n";
//или
cout<<"enter number" + "\n";
//или даже
cout<<"enter number" "\n";
ответ: потому что endl - это манипулятор и он передается в поток cout только через оператор <<


Цитата Сообщение от time123 Посмотреть сообщение
а так же как сделать проверку что введено именно число а не строка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
try
{
 cin>>num;
 if (!cin) throw domain_error("Input error");
 ...
}
catch (exception& ex)
{
cout<<ex.what();
cin.ignore(cin.rdbuf()->in_avail())
cin.get();
exit(0);
}
необходимо #include <exception>


Цитата Сообщение от time123 Посмотреть сообщение
и еще такой вопрос, вот в заголовочном файле среда разместила строки
насколько я понял вы случайно создали тестовый проект или что-то в этом духе.
долго объяснять, в общем в ООП есть принцип раздельной компиляции
так вот подобные директивы препроцессора помогают не включать уже включенные определения классов, структур и т.д. дабы не возникало ошибок компиляции. подрбнее об этом в первом томе книги "Философия С++" Брюса Эккеля

я могу не прав быть, пусть меня поправят более опытные
time123
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
21.11.2012, 02:05  [ТС]     простая программа, проверяющая вводимое число #3
Нашел вот хороший пример кода насчет ввода именно тех символов, которые нам нужны

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cstdio>
int main()
{    char c1;
    short s1;
    int i1;
    unsigned int u1;
    long L1;
    float f1;
    double d1;
    printf("input char >"); scanf("%c",  &c1); printf(" %c\n",  c1);
    printf("input short>"); scanf("%hd", &s1); printf(" %hd\n", s1);
    printf("input int  >"); scanf("%d",  &i1); printf(" %d\n",  i1);
    printf("input uint >"); scanf("%u",  &u1); printf(" %u\n",  u1);
    printf("input octal>"); scanf("%o",  &i1); printf(" %o\n",  i1);
    printf("input hexa >"); scanf("%x",  &i1); printf(" %x\n",  i1);
    printf("input long >"); scanf("%ld", &L1); printf(" %ld\n", L1);
    printf("input float>"); scanf("%f",  &f1); printf(" %f\n",  f1);
    printf("input double>"); scanf("%lf", &d1);printf(" %lf\n", d1);
    return 0;
}
но вот такой вопрос, как проверить что scanf вернул системную константу EOF (ну в случае если формат ввода неверный)? или она для этого не предназначена? значит if (!cin) будет выдавать ошибку всякий раз если вводимое значение не соответствует типу переменной?

Добавлено через 10 минут
C++
1
int get_num(int min_value&, int max_value&) {
так не хочет...
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
21.11.2012, 02:06     простая программа, проверяющая вводимое число #4
Что за ужас?
Дабы не было краха и программа лишь говорила ата-та, считывайте в std::string, а далее используя isdigit для каждого её элемента (я бы оформил проверку в функцию с названием типа isInt), ну и если истина, то работаем с ней, предварительно конвертировав std::stoi( our_str ) (C++11), или по старинке atoi(ourStr.c_str() ).
time123
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
21.11.2012, 02:12  [ТС]     простая программа, проверяющая вводимое число #5
ну меня устраивает и такой вариант. только вот компилироваться не хочет

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
#include  <iostream >
#include <exception>
 
using namespace std;
 
int get_num(int min_value, int max_value) {
    try {
 
    while (true) {
        int n;
 
        if(cin>>n) {
 
            if(n > max_value || n < min_value) {
                cout << "incorrect num, must be > " << min_value << " and > " << max_value << endl;
            } else {
                return n;
            }
        } else {
            throw domain_error("Input error");
        }
    }
 
  }
 
    catch (exception& ex) {
        cout << ex.what();
        cin.ignore(cin.rdbuf()->in_avail())
        cin.get();
        exit(0);
    }
 
}
 
 
int main () {
    cout << "enter number" << endl;
 
    int get_nuber_var = get_num(0, 10);
 
    cout << "good.";
 
    return 0;
}
не понятно что этот код делает cin.ignore(cin.rdbuf()->in_avail())
и еще ругается на то что domain_error не определена...

и можно вынести блок catch за пределы этой функции?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
21.11.2012, 02:22     простая программа, проверяющая вводимое число #6
Вы что, после бэйзика переходите на C++? Что за сложение строк с манипулятором, да еще и с помощью +? И еще, если мне не изменяет память, при ошибке ввода, поток просто переходит в ошибочное состояние. Чтобы он выбрасывал исключение, нужно ему сначала указать на то, что должен это делать. Да и, имхо, лучше работать с cin.good(), а не с исключениями
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
21.11.2012, 06:01     простая программа, проверяющая вводимое число #7
Цитата Сообщение от time123 Посмотреть сообщение
что этот код делает cin.ignore(cin.rdbuf()->in_avail())
если вы считываете одно число, а пользователь через пробел вводит два, то в потоке остается мусор, который надо проигнорить. cin.rdbuf() возвращает указатель на этот самый буфер в котором остался мусор
->in_avail() дает нам количество символов в этом буфере.
игнор имеет синтаксис (кол-во символов которые надо проигнорить (по умолчанию 1, символ на котором закончить, по умолчанию еоф)

я все это почему:
я вообще первокурсник. и мой препод когда проверяет лабу, он просматривает с полминутки мой код, а потом просит меня показать екзешник. я показываю. и он вводит в консоль что-то вроде "ЮРЮЛГАЛПИМЮ ЛПдшНЕЩ976Щ876Щ876%::*?:%*(?"№гшлжфдыэжды/+_"+_№" и если я должным образом не защитился от глупостей пользователя , моя прога просто вылетает. поэтому я проверяю абсолютно все варианты, а исключения я использую потому что начитался книжек про ООП
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 11:15     простая программа, проверяющая вводимое число #8
Цитата Сообщение от bychevoz Посмотреть сообщение
get_num(int min_value&, int max_value&)
Что это такое вы написали?

Цитата Сообщение от time123 Посмотреть сообщение
почему при указании
get_num(int& min_value, int& max_value)
не хочет компилироваться
Потому что в main() у get_num() аргументы - числа. Нужно вызывать её с аргументами-переменными. Например:
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
#include  <iostream>
using namespace std;
 
int get_num(int &min_value, int &max_value) 
{
 
    while (true) 
    {
        int n;
 
        if(cin>>n) 
        {
            if(n > max_value || n < min_value) 
            {
                cout << "incorrect num, must be > " << min_value << " and > " << max_value << endl;
            } 
            else 
            {
                return n;
            }
        }
    }
 
}
 
 
int main () 
{
    cout << "enter number" << endl;
    
    int min = 0, max = 10;
 
    int get_nuber_var = get_num(min, max);
 
    cout << "good.";
 
    return 0;
}
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
21.11.2012, 11:28     простая программа, проверяющая вводимое число #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Что это такое вы написали?
ой, только сейчас увидел, тупанул
time123
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
22.11.2012, 00:57  [ТС]     простая программа, проверяющая вводимое число #10
так, а если символ * идет перед именем функции, например

char* example_func(int somenum, char* str_get)

вот здесь мы принимаем указатель на str_get (а передается просто str_get), и возвращает функция указатель, так?

bychevoz, не совсем понятно, так это значит в буфере остается только первый символ, или что? и объясните пожалуйста на примере как тут исключения сделать.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
22.11.2012, 01:08     простая программа, проверяющая вводимое число #11
Цитата Сообщение от time123 Посмотреть сообщение
возвращает функция указатель, так?
так.
Цитата Сообщение от time123 Посмотреть сообщение
вот здесь мы принимаем указатель на
здесь мы принимаем один аргумент типа int и один указатель на char
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
22.11.2012, 05:57     простая программа, проверяющая вводимое число #12
Цитата Сообщение от time123 Посмотреть сообщение
bychevoz, не совсем понятно, так это значит в буфере остается только первый символ, или что? и объясните пожалуйста на примере как тут исключения сделать
вот код одной из моих лабораторок по с++. нужно считать два параметра, сделать проверку введенных значений и если все хорошо, вычислить значение функции

многие могут сказать что тут слишком все усложнено, но тут показан оень важный аспект обработки исключений, и, вообще ООП

если присмотреться, то можно увидеть что я генерирую исключения класса domain_error. но обработчик обрабатывает исключения класса exception. на самом деле я решил продемонстрировать самому себе работу виртуальных ункций. данном случае, тип исключения определяется на стадии выполнения, а не компилции. не могу точно все это обяснить, но это круто рассказано в книгах.
это мало относится к теме, но мне просто нравится именно такой код

многие предпочитают чтобы параметры скушала переменная string и далее они проанализировались, но мне приятнее делать так. на самом деле - исключения - тема очень глубокая и область ее применения гораздо больше чем просто проверка введенных значений.
просто такова была тема лабораторки и мне это понрвилось

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
#include <iostream>
#include <exception>
#include <math.h>
using namespace std;
 
int main()
{
    double a;
    double x;
    double y;
    while (true)
    {
        try 
        {
            cout<<"input a:";
            cin>>a;
            if (!cin) throw domain_error("Failed input operation"); 
/*когда перегруженный ">>" не может преобразовать поток в переменную, устанавливается соответствующий флаг. флаг можно считать оператором "!" или его вернет функция bool good()*/
            cout<<"input x:";
            cin.ignore(cin.rdbuf()->in_avail());
            cin>>x;
            if (!cin) throw domain_error("Failed input operation");
            if ((x==a)||((2*x+3*a)<0)) throw domain_error("Domain error");
//если а или х не входят в ОДЗ генерируем исключение с соответствующей строкой
            break; 
//если мы достигли конца (т.е. никаких исключений нет, надо выйти из бесконечного цикла)
        }
        catch(exception& ex)
        {
            cout<<ex.what(); //вывели строку переданную в исключение
            cin.clear(); //установили все флаги потока в состояние готовности
            cin.ignore(cin.rdbuf()->in_avail());
 //чистим буфер ввода чтобы можно было использовать cin.get()
        }
        cin.get();
        system("cls");
    }
    cout<<"OK\n";
    y=tan(1/(x-a))-sqrt(2*x+3*a);
    cout<<"y="<<y;
    cin.get();
    cin.get();
}
Добавлено через 10 минут
а насчет буфера, яркий пример: попробуйте
скомпилировать это:

cin>>x;
cin.get();
}//конец функции main()

программа законится сразу после того как вы нажмете энтер хотя, вы же вроде как написали cin.get()
все потому что в буфере остался знак переноса строки , который считается cin.get()'ом
выход который используют все одногруппники и рекомендуют нам наши учителя: писать два сингета
а если пользователь введет не просто число, а через пробел еще какой-то бред?
два сингета не спасут, так как в буфере, осталось еще неизвестное количество символов.
тут на помощь приходит син.игнор(син.рдбуф->ин_эвэйл).

хотя особо умные подключают <conio.h> и исользуют getch() прога весит на десяток килобайт больше изза подключенной библиотеки.
мне кажется, ели подключать библиотеку - так использовать ее.
если я подключи иострим и могу использовать только ее для решения задачи, то зачем мне библиотека "конио" (консоль инпут аутпут)??

я упрекал их в килобайтах, но они мыслят гигагерцами своеих 4хядерных процессоров.
если бы они так же расходовали свои толстые кошельки, как свои процессоры и гигабайты памяяти

я к тому что , а если писать большую программу?
привычка подключать ненужные библиотеки просто ужасная.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
22.11.2012, 06:05     простая программа, проверяющая вводимое число #13
Цитата Сообщение от bychevoz Посмотреть сообщение
рекомендуют нам наши учителя:
а может стоит просто запускать из под консоли? Тогда ничего и не закроется

Цитата Сообщение от bychevoz Посмотреть сообщение
если я подключи иострим и могу использовать только ее для решения задачи, то зачем мне библиотека "конио"
getch() не ждет нажатия enter
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 12:44     простая программа, проверяющая вводимое число #14
Цитата Сообщение от bychevoz Посмотреть сообщение
хотя особо умные подключают <conio.h> и исользуют getch() прога весит на десяток килобайт больше изза подключенной библиотеки.
Проверяли?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
22.11.2012, 15:33     простая программа, проверяющая вводимое число #15
bychevoz, system требует подключения cstdlib, по-хорошему. Сколько байт это добавит к проге?
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
22.11.2012, 16:11     простая программа, проверяющая вводимое число #16
system для красоты, можно и без него)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
22.11.2012, 16:12     простая программа, проверяющая вводимое число #17
Цитата Сообщение от bychevoz Посмотреть сообщение
system для красоты, можно и без него)
Итого мы сэкономили еще 10 байт!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 16:13     простая программа, проверяющая вводимое число #18
Цитата Сообщение от bychevoz Посмотреть сообщение
прога весит на десяток килобайт больше изза подключенной библиотеки
Проверяли?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2012, 18:17     простая программа, проверяющая вводимое число
Еще ссылки по теме:

C++ Программа, проверяющая принадлежность точки к данному графику
Фунция, проверяющая, является ли число степенью числа 5 C++
C++ Ошибка в алгоритме - программа выводит n, вводимое с клавиатуры, а не из формул

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

Или воспользуйтесь поиском по форуму:
time123
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
22.11.2012, 18:17  [ТС]     простая программа, проверяющая вводимое число #19
Ну так а чего вы игнорите буфер, может лучше просто очищать его ?

Добавлено через 5 минут
и что думаете насчет cin.sync(); ?

Добавлено через 7 минут
вот так у меня сейчас программа выглядит

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
#include <iostream>
#include <exception>
 
using namespace std;
 
int get_num(int &min_value, int &max_value) {
    try {
 
    while (true) {
        int n;
 
        cin.ignore(cin.rdbuf()->in_avail());
 
        if(cin>>n) {
 
            if(n > max_value || n < min_value) {
                cout << "incorrect num, must be > " << min_value << " and > " << max_value << endl;
            } else {
                return n;
            }
        } else {
            // введено что-то не то...
 
            throw domain_error("Domain error");
        }
    }
 
    }
 
 
     catch(exception& ex){
        cout<<ex.what();
        cin.clear();
    }
}
 
int main () {
    cout << "enter number" << endl;
 
    int min = 0, max = 10;
 
    int get_nuber_var = get_num(min, max);
 
    cout << "good.";
 
    return 0;
}
но ругается на то что не объявлена domain_error, не компилируется. Что делать?
Yandex
Объявления
22.11.2012, 18:17     простая программа, проверяющая вводимое число
Ответ Создать тему
Опции темы

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