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

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

Войти
Регистрация
Восстановить пароль
 
 
time123
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 53
#1

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

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

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

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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2012, 01:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос простая программа, проверяющая вводимое число (C++):

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

Проверить, является ли вводимое число пятизначным - C++
Доброго времени суток! Я пока новичок в С++, изучаю, тренируюсь писать простенькие программки. Собственно по одной из них и нужна...

Фунция, проверяющая, является ли число степенью числа 5 - C++
Описать функцию IsPower5(K) логического типа, возвращающую True, если целый параметр K (&gt; 0) является степенью числа 5, и False в противном...

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

Проверить, является ли вводимое число степенью числа 3 - C++
Помогите, в 22 строке выводит ошибку: &quot;Требуется while&quot;. Программа должна проверять вводимое число является ли оно степень числа 3 ...

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

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

я могу не прав быть, пусть меня поправят более опытные
0
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&) {
так не хочет...
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
21.11.2012, 02:06 #4
Что за ужас?
Дабы не было краха и программа лишь говорила ата-та, считывайте в std::string, а далее используя isdigit для каждого её элемента (я бы оформил проверку в функцию с названием типа isInt), ну и если истина, то работаем с ней, предварительно конвертировав std::stoi( our_str ) (C++11), или по старинке atoi(ourStr.c_str() ).
0
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 за пределы этой функции?
0
Croessmah
Эксперт CЭксперт С++
13209 / 7480 / 841
Регистрация: 27.09.2012
Сообщений: 18,388
Записей в блоге: 3
Завершенные тесты: 1
21.11.2012, 02:22 #6
Вы что, после бэйзика переходите на C++? Что за сложение строк с манипулятором, да еще и с помощью +? И еще, если мне не изменяет память, при ошибке ввода, поток просто переходит в ошибочное состояние. Чтобы он выбрасывал исключение, нужно ему сначала указать на то, что должен это делать. Да и, имхо, лучше работать с cin.good(), а не с исключениями
0
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%::*?:%*(?"№гшлжфдыэжды/+_"+_№" и если я должным образом не защитился от глупостей пользователя , моя прога просто вылетает. поэтому я проверяю абсолютно все варианты, а исключения я использую потому что начитался книжек про ООП
0
alsav22
5419 / 4815 / 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;
}
0
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27
21.11.2012, 11:28 #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Что это такое вы написали?
ой, только сейчас увидел, тупанул
0
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, не совсем понятно, так это значит в буфере остается только первый символ, или что? и объясните пожалуйста на примере как тут исключения сделать.
0
Croessmah
Эксперт CЭксперт С++
13209 / 7480 / 841
Регистрация: 27.09.2012
Сообщений: 18,388
Записей в блоге: 3
Завершенные тесты: 1
22.11.2012, 01:08 #11
Цитата Сообщение от time123 Посмотреть сообщение
возвращает функция указатель, так?
так.
Цитата Сообщение от time123 Посмотреть сообщение
вот здесь мы принимаем указатель на
здесь мы принимаем один аргумент типа int и один указатель на char
0
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хядерных процессоров.
если бы они так же расходовали свои толстые кошельки, как свои процессоры и гигабайты памяяти

я к тому что , а если писать большую программу?
привычка подключать ненужные библиотеки просто ужасная.
0
Croessmah
Эксперт CЭксперт С++
13209 / 7480 / 841
Регистрация: 27.09.2012
Сообщений: 18,388
Записей в блоге: 3
Завершенные тесты: 1
22.11.2012, 06:05 #13
Цитата Сообщение от bychevoz Посмотреть сообщение
рекомендуют нам наши учителя:
а может стоит просто запускать из под консоли? Тогда ничего и не закроется

Цитата Сообщение от bychevoz Посмотреть сообщение
если я подключи иострим и могу использовать только ее для решения задачи, то зачем мне библиотека "конио"
getch() не ждет нажатия enter
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 12:44 #14
Цитата Сообщение от bychevoz Посмотреть сообщение
хотя особо умные подключают <conio.h> и исользуют getch() прога весит на десяток килобайт больше изза подключенной библиотеки.
Проверяли?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
22.11.2012, 15:33 #15
bychevoz, system требует подключения cstdlib, по-хорошему. Сколько байт это добавит к проге?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2012, 15:33
Привет! Вот еще темы с ответами:

проверить кратное ли вводимое число девяти через функцию - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; bool func(int number) { if(number%9) ...

Написать программу, которая вводимое число преобразует в текст - C++
Написать программу, которая по вводимому числу от 1 до 5 (номеру курса) выдает соответствующее сообщение «Привет, k-курсник». Например,...

программа проверяющая принадлежит ли треугольник ABC кругу радиуса R - C++
проверить, принадлежит ли треугольник ABC кругу радиуса R. известны координаты вершин треугольника и координаты центра круга О. как...

Программа, объединяющая две строки и проверяющая размер первой - C++
Напишите программу, объединяющую две строки и прове-ряющую размер первой.


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

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

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