Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
1

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

21.11.2012, 01:36. Показов 1510. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Вот начал писать программку простую, которая просто проверяем введено ли число из заданного диапазона. Она работает, но есть вопросы, и хочу ее усовершенствовать.

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
что значит они?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2012, 01:36
Ответы с готовыми решениями:

Максимальное вводимое число
Блин за лето уже все забыл Как сделать чтобы можно было ввести число допустим не больше 50 если...

Максимальное вводимое число
Добрый вечер. Помогите с такой вот задачей: Максимальные вводимые числа ограничены приделом...

ограничение на вводимое число
Добрый день, Нужна ваша помощь) нужно ограничить в интежере вводимое значение от -181 до 181 для...

Программа проверяющая тесты
Здравствуйте, обращаюсь к вам за помощью так как уже нет выхода):wall Надо написать программу...

18
1 / 1 / 1
Регистрация: 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 Посмотреть сообщение
и еще такой вопрос, вот в заголовочном файле среда разместила строки
насколько я понял вы случайно создали тестовый проект или что-то в этом духе.
долго объяснять, в общем в ООП есть принцип раздельной компиляции
так вот подобные директивы препроцессора помогают не включать уже включенные определения классов, структур и т.д. дабы не возникало ошибок компиляции. подрбнее об этом в первом томе книги "Философия С++" Брюса Эккеля

я могу не прав быть, пусть меня поправят более опытные
0
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&) {
так не хочет...
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
21.11.2012, 02:06 4
Что за ужас?
Дабы не было краха и программа лишь говорила ата-та, считывайте в std::string, а далее используя isdigit для каждого её элемента (я бы оформил проверку в функцию с названием типа isInt), ну и если истина, то работаем с ней, предварительно конвертировав std::stoi( our_str ) (C++11), или по старинке atoi(ourStr.c_str() ).
0
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 за пределы этой функции?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
21.11.2012, 02:22 6
Вы что, после бэйзика переходите на C++? Что за сложение строк с манипулятором, да еще и с помощью +? И еще, если мне не изменяет память, при ошибке ввода, поток просто переходит в ошибочное состояние. Чтобы он выбрасывал исключение, нужно ему сначала указать на то, что должен это делать. Да и, имхо, лучше работать с cin.good(), а не с исключениями
0
1 / 1 / 1
Регистрация: 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%::*?:%*(?"№гшлжфдыэжды/+_"+_№" и если я должным образом не защитился от глупостей пользователя , моя прога просто вылетает. поэтому я проверяю абсолютно все варианты, а исключения я использую потому что начитался книжек про ООП
0
5498 / 4893 / 831
Регистрация: 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;
}
0
1 / 1 / 1
Регистрация: 16.11.2012
Сообщений: 27
21.11.2012, 11:28 9
Цитата Сообщение от alsav22 Посмотреть сообщение
Что это такое вы написали?
ой, только сейчас увидел, тупанул
0
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, не совсем понятно, так это значит в буфере остается только первый символ, или что? и объясните пожалуйста на примере как тут исключения сделать.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
22.11.2012, 01:08 11
Цитата Сообщение от time123 Посмотреть сообщение
возвращает функция указатель, так?
так.
Цитата Сообщение от time123 Посмотреть сообщение
вот здесь мы принимаем указатель на
здесь мы принимаем один аргумент типа int и один указатель на char
0
1 / 1 / 1
Регистрация: 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хядерных процессоров.
если бы они так же расходовали свои толстые кошельки, как свои процессоры и гигабайты памяяти

я к тому что , а если писать большую программу?
привычка подключать ненужные библиотеки просто ужасная.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
22.11.2012, 06:05 13
Цитата Сообщение от bychevoz Посмотреть сообщение
рекомендуют нам наши учителя:
а может стоит просто запускать из под консоли? Тогда ничего и не закроется

Цитата Сообщение от bychevoz Посмотреть сообщение
если я подключи иострим и могу использовать только ее для решения задачи, то зачем мне библиотека "конио"
getch() не ждет нажатия enter
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 12:44 14
Цитата Сообщение от bychevoz Посмотреть сообщение
хотя особо умные подключают <conio.h> и исользуют getch() прога весит на десяток килобайт больше изза подключенной библиотеки.
Проверяли?
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.11.2012, 15:33 15
bychevoz, system требует подключения cstdlib, по-хорошему. Сколько байт это добавит к проге?
0
1 / 1 / 1
Регистрация: 16.11.2012
Сообщений: 27
22.11.2012, 16:11 16
system для красоты, можно и без него)
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.11.2012, 16:12 17
Цитата Сообщение от bychevoz Посмотреть сообщение
system для красоты, можно и без него)
Итого мы сэкономили еще 10 байт!
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 16:13 18
Цитата Сообщение от bychevoz Посмотреть сообщение
прога весит на десяток килобайт больше изза подключенной библиотеки
Проверяли?
0
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, не компилируется. Что делать?
0
22.11.2012, 18:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2012, 18:17
Помогаю со студенческими работами здесь

Максимальное вводимое число в Едит
Доброго времени суток! Нужна помощь: Есть edit, число в нём не должно превышать 60, но и быть...

Разбить на группы вводимое число
Ввод: 1000 Вывод: 1.000

Как ограничить вводимое число?
a = int(input()) Как сделать так, чтобы нельзя было ввести &quot;a&quot; больше 10 и меньше 1?

Программа, проверяющая вводимые числа
Всем привет! Может кто-нибудь помочь с написанием кода? Вроде задача не такая уж сложная, но вот...

Программа проверяющая четность числа
Здраствуйте , наткнулся на проблему , с заданием . Создать в редакторе VBA форму и разместить на...

Программа проверяющая на равенство деревья Т1 и Т2
Рекурсивно и не рекурсивно создать и продемонстрировать работу логической функции equal (T1,T2),...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru