Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
19 / 19 / 2
Регистрация: 30.11.2010
Сообщений: 164
1

Проверка значения

02.04.2011, 18:18. Показов 3280. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Допустим есть фрагмент программы, типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main()
{
setlocale(0,"Rus");
double a;
cout<<"Введите а, от 1 до 5:\n";
cin>>a;
while(a>5 || a<1)
{
    cout<<"Повторите ввод:\n";
    cin>>a;
}
//остальные действия
return 0;
}
То есть пользователь должен ввести число от 1 до 5, если он введет что-то вне допустимого диапазона, выводится сообщение об ошибке и приглашение на повторный ввод. Но если ввести букву или символ, происходит зацикливание или что-то вроде этого.

Как этого избежать, т.е. чтобы при вводе символа также выводилось подобное сообщение?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2011, 18:18
Ответы с готовыми решениями:

Проверка на числовые значения
отладка-командная строка: - как чекнуть и вывести алерт текствой введите корректно значение ПРИ...

Проверка значения функции
Здравствуйте. У меня есть такой фрагмент кода ... if (CheckVariantPlayer(test1, test2,...

проверка введенного значения
Подскажите пожалуйста, хочу реализовать проверку на введенное значение, заметил если получаемой...

Проверка на правильность ввода значения.
Вот пишу так называемую &quot;проверку на дурака&quot;. Столкнулся с проблемой, код: { double ch; int...

11
Заблокирован
02.04.2011, 18:49 2
Необходимо при вводе обрабатывать строку, а затем уже переводить ее в double и манипулировать согласно поставленной задаче.

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
#include <iostream>
#include <sstream>
using namespace std;
 
int main() 
{   setlocale(LC_ALL,"");    
    double a;
    string as;
    cout<<"Введите а, от 1 до 5:\n";
    cin>>as;
    while(!(as[0]<='5' && as[0]>='1' && (as[1] =='.' || as[1]=='\0')))
    {
        cout<<"Повторите ввод:\n";
        cin>>as;
    }
    cout<<"well,well,well...\n";
    system("pause");
 
    istringstream ist(as);
    ist>>a;
 
    cout<<"Ваше число: "<<a<<"\n";
    cout<<"Для доказательства -  его квадрат: "<<a*a<<"\n";
    
    system("pause");
 
    return 0;
}
1
19 / 19 / 2
Регистрация: 30.11.2010
Сообщений: 164
02.04.2011, 19:09  [ТС] 3
спасибо, попробую сделать то же для массива

Добавлено через 6 минут
где можно найти описание библиотеки sstream ?
0
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
02.04.2011, 19:10 4
http://cplusplus.com/reference/iostream/
0
19 / 19 / 2
Регистрация: 30.11.2010
Сообщений: 164
02.04.2011, 22:21  [ТС] 5
на русском желательно

Добавлено через 43 минуты
Цитата Сообщение от IrineK Посмотреть сообщение
C++
1
while(!(as[0]<='5' && as[0]>='1' && (as[1] =='.' || as[1]=='\0')))
почему если сделать вот так:
C++
1
while(!(as[0]<='60' && as[0]>='5' && (as[1] =='.' || as[1]=='\0')))
то пишет что ошибка?
Код
comparison is always true due to limited range of data type
Добавлено через 1 час 31 минуту
update
вот отрывок из моей программы, теперь компилируется, но не принимает никакие значения
C++
1
2
3
4
5
6
7
8
9
10
    string as;
    cout << "Введите значение Urab (5...60 B) = ";
    cin >> as[i];
    while(!(as[0]<'60' && as[0]>'5' && (as[1] =='.' || as[1]=='\0')))
        {
        cout<<"Повторите ввод:\n";
        cin>>as;
        }
    istringstream ist(as);
    ist>>urab[i];
нужно ввести число 5...60

Добавлено через 54 минуты
может есть какие-то другие способы?
0
41 / 41 / 9
Регистрация: 28.01.2011
Сообщений: 175
02.04.2011, 22:40 6
Цитата Сообщение от Valerko Посмотреть сообщение
вот отрывок из моей программы, теперь компилируется, но не принимает никакие значения
C++
1
2
3
4
5
6
7
8
9
10
    string as;
    cout << "Введите значение Urab (5...60 B) = ";
    cin >> as[i];
    while(!(as[0]<'60' && as[0]>'5' && (as[1] =='.' || as[1]=='\0')))
        {
        cout<<"Повторите ввод:\n";
        cin>>as;
        }
    istringstream ist(as);
    ist>>urab[i];
нужно ввести число 5...60
Как это понимать?
C++
1
!(as[0]<'60'
Что за символ '60'? Так нельзя делать! Нужно обрабатывать строку как число и проверять (value <= 60)
0
19 / 19 / 2
Регистрация: 30.11.2010
Сообщений: 164
02.04.2011, 22:42  [ТС] 7
Цитата Сообщение от Subgrando Посмотреть сообщение
Как это понимать?
C++
1
!(as[0]<'60'
Что за символ '60'? Так нельзя делать! Нужно обрабатывать строку как число и проверять (value <= 60)
как исправить?
0
41 / 41 / 9
Регистрация: 28.01.2011
Сообщений: 175
02.04.2011, 22:47 8
Я бы сравнивал так:

C++
1
2
3
4
int x;
cin >> x;
 
while(x >= 5 && x <= 60 && // остальная часть кода
0
19 / 19 / 2
Регистрация: 30.11.2010
Сообщений: 164
02.04.2011, 22:51  [ТС] 9
а можно реализовать с помощью ф-ции sdigit() ??
0
41 / 41 / 9
Регистрация: 28.01.2011
Сообщений: 175
02.04.2011, 22:52 10
Ну тогда нужно проверять не только на isdigit(), но и на то, что символ - точка.
0
19 / 19 / 2
Регистрация: 30.11.2010
Сообщений: 164
02.04.2011, 23:35  [ТС] 11
это как?

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
string as;
 cout << "Введите значение Urab (5...60 B) = ";
 cin >> as[i]; 
while(!(as[0]>'5' && (as[1] =='.' || as[1]=='\0'))) 
{ 
cout<<"Повторите ввод:\n";
 cin>>as;
 } 
istringstream ist(as);
 ist>>urab[i];
вот так работает, если вводить <5, то нужно вводить повторно. Как ограничить, чтобы число было ещё и меньше 60 ???

Добавлено через 35 минут
реализовал примерно таким методом
C++
1
2
3
4
5
6
7
8
             int button;
        do
        {
            cin.clear();
            cin.sync();
            cin>>button;
            if(cin.fail()) cout<<"Введенный тип данных не соответсвует типу переменной....Повторите ввод";
        }while(cin.fail());
вроде работает
0
Заблокирован
03.04.2011, 04:37 12
Вот проверка в общем виде на попадание в интервал [A;B]

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 <sstream>
#define A 5     //нижняя граница интервала
#define B 60    //верхняя граница интервала
using namespace std;
 
bool isDouble(string buf)   //разрешено цифры от 0 до 9 и точка 0-1 раз
{   int k=0;
    for(int i=0;i<buf.length();i++)
        if(buf[i]=='.') k++;
        else if(!(buf[i]>='0' && buf[i]<='9' || buf[i]=='.') || k>1) return false;
    return true;
}
 
double toDouble(string buf) //преобразование в число
{   double res;
    istringstream ist(buf);
        ist>>res;
    return res;
}
 
int main() 
{   setlocale(LC_ALL,"");    
    double a = A-B; //начальное значение - за пределами интервала
    string as;
    cout<<"Введите а, от "<<A<<" до "<<B<<":\n";
    cin>>as;
    if(isDouble(as)) a = toDouble(as);
    while(!(isDouble(as) && a>=A && a<=B))
        {
                cout<<"Повторите ввод:\n";
                cin>>as;
        if(isDouble(as)) a = toDouble(as);
        }
    cout<<"well,well,well...\n";
    system("pause");
 
    cout<<"Ваше число: "<<a<<"\n";
    cout<<"Для доказательства -  его квадрат: "<<a*a<<"\n";
        
    system("pause");
    return 0;
}
Добавлено через 2 часа 22 минуты
Баг в isDouble (запаздывание подсчета ква точек) - исправлен.

Чтобы уж довести до конца - ввод массива с проверкой правильности ввода каждого элемента:

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
51
52
53
54
55
56
57
#include <iostream>
#include <iomanip>
#include <sstream>
 
#define A 5     //нижняя граница интервала
#define B 60    //верхняя граница интервала
#define N 15    //размерность массива
 
using namespace std;
 
bool isDouble(string buf)   //разрешено цифры от 0 до 9 и точка 0-1 раз
{   int i,k=0;
    for(i=0;i<buf.length();i++)
    {   if(buf[i]=='.') k++;
        if(!(buf[i]>='0' && buf[i]<='9' || buf[i]=='.') || k>1) return false;
    }
    return true;
}
 
double toDouble(string buf) //преобразование в число
{   double res;
    istringstream ist(buf);
        ist>>res;
    return res;
}
 
double gotCha(string str, int ind)
{    double a = A-B;         //начальное значение - за пределами интервала
     if(isDouble(str)) a = toDouble(str);
     while(!(isDouble(str) && a>=A && a<=B))
        {       cout<<"Повторите ввод:\n";
        cout<<"arr["<<ind<<"] = ";
                cin>>str;
        if(isDouble(str)) a = toDouble(str);
        }
    return a;
}
 
int main() 
{  setlocale(LC_ALL,"");    
    string as;
    int i;
    double arr[N];
    cout<<"Введите элементы массива, каждый в интервале от "<<A<<" до "<<B<<":\n";
    for(i=0;i<N;i++)
        {   cout<<"arr["<<i<<"] = ";
            cin>>as;
            arr[i] = gotCha(as,i);
        }
 
    cout<<"\n\nМассив:\n";
    for(i=0;i<N;i++)
        cout<<fixed<<setw(8)<<setprecision(3)<<arr[i];
        
    cin.sync(); cin.get();
    return 0;
}
1
03.04.2011, 04:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2011, 04:37
Помогаю со студенческими работами здесь

Проверка чтобы значения не повторялись
Здравствуйте, моё задание звучит так: Описать структуру с именем AEROFLOT, содержащую следующие...

Проверка чтобы значения не повторялись
Люди!!! Как сделать чтобы проверялось всё время. А то если ввести значение, потом ввести такое...

Проверка на ввод правильного значения
Здравствуйте. Как сделать проверку на ввод правильного значения? У меня есть заранее известное...

Проверка на ввод отрицательного значения
Задача заключается в том, чтобы время в формате X часов Y минут Z секунд перевести в N секунд с...


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

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