Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.94
MILAN
888 / 782 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
#1

Проверка ввода - C++

09.03.2010, 21:44. Просмотров 4281. Ответов 37
Метки нет (Все метки)

Как ограничить ввод символов в программе!!!! На каждый символ, который был введен выдавать сообщение о неправильном вводе????? Надо чтоб можна было ввести только цифры???
http://www.cyberforum.ru/cpp-beginners/thread1901385.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2010, 21:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Проверка ввода (C++):

C++ проверка ввода
Ребят помогить пожалуста разобраться не работает чертова проверка ввода я в...

Проверка ввода
Доброго вам времени суток. Бывалые, подскажите неопытному, как лучше писать?...

Проверка ввода
Как можно проверить вводимые данные, являются ли они числом. Допустим если...

gets() проверка ввода
возникло слабое звено в программке ... max_length = 100; line = new char;...

Проверка ввода
Всем привет. Прошу обясните мне как зделать проверку вводимых даных. Мне нужно...

37
smithy69
17 / 16 / 7
Регистрация: 06.11.2009
Сообщений: 167
09.03.2010, 21:53 #2
если ввод по символьный, то просто цикл до какого то числа,а в теле цикла read, потом символ сравниваешь, например simvol>'0' && simvol<'9'. На счёт границ не уверен, посмотри ASCII таблицу.
0
MILAN
888 / 782 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
09.03.2010, 22:55  [ТС] #3
Никак непойму с условиям!!!
0
PointsEqual
ниначмуроФ
838 / 522 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
09.03.2010, 23:00 #4
Цитата Сообщение от MILAN Посмотреть сообщение
На каждый символ, который был введен выдавать сообщение о неправильном вводе????? Надо чтоб можна было ввести только цифры???
это вопросы?)
0
MILAN
888 / 782 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
09.03.2010, 23:02  [ТС] #5
Как ограничить ввод символов в программе??? На каждый символ, который был введен выдавать сообщение о неправильном вводе. Надо, чтоб можна было ввести только цифры!!!!!
0
PointsEqual
ниначмуроФ
838 / 522 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
09.03.2010, 23:08 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    while (true){
        switch (getch()){
            case '1':
            cout<<"1";
            break;
            case '2':
            cout<<"2";
            break;
            default:
            cout<<"error symbol";
            break;
        }
    }
также пишеш и про цифры 3 4 5 6 7 8 9 0
0
smithy69
17 / 16 / 7
Регистрация: 06.11.2009
Сообщений: 167
09.03.2010, 23:20 #7
ну смотри, вводишь символ цифру, в таблице ASCII код который соответсвует цифрам так же упорядочен, то есть 0 соответствует 48, 1 - 49 и так далее. то есть simvol>='0' означает, что мы берем код символа simvol и сравниваем с кодом '0', то есть берём цифры больше 0, и так же simvol<=9, и эти два условия объединяем && - истино только тогда когда истинны оба. то есть если мы введём не цифру, то код символа не будет входить в наш промежуток, ну и можешь вывести оповещение какое нибудь

Добавлено через 1 минуту
to PointsEqual

C++
1
while(true)
хорошее ограничение
0
PointsEqual
ниначмуроФ
838 / 522 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
09.03.2010, 23:21 #8
Цитата Сообщение от smithy69 Посмотреть сообщение
ну смотри, вводишь символ цифру, в таблице ASCII код который соответсвует цифрам так же упорядочен, то есть 0 соответствует 48, 1 - 49 и так далее. то есть simvol>='0' означает, что мы берем код символа simvol и сравниваем с кодом '0', то есть берём цифры больше 0, и так же simvol<=9, и эти два условия объединяем && - истино только тогда когда истинны оба. то есть если мы введём не цифру, то код символа не будет входить в наш промежуток, ну и можешь вывести оповещение какое нибудь
как то сложно

Добавлено через 21 секунду
Цитата Сообщение от smithy69 Посмотреть сообщение
while(true)
это просто пример
0
MILAN
888 / 782 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
09.03.2010, 23:21  [ТС] #9
А через ASCII - код можна сделать???
0
PointsEqual
ниначмуроФ
838 / 522 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
09.03.2010, 23:25 #10
Цитата Сообщение от MILAN Посмотреть сообщение
А через ASCII - код можна сделать???
можно все. только это запутаннее
0
smithy69
17 / 16 / 7
Регистрация: 06.11.2009
Сообщений: 167
09.03.2010, 23:25 #11
C++
1
2
3
4
5
6
if ((simvol>='0')&&(simvol<='9')) {
                                                   //то что нужно сделать, если всё ок
                                                  }
  else {
          //то что нужно сделать если не цифра
         }
0
MILAN
888 / 782 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
09.03.2010, 23:30  [ТС] #12
Дело в том, что у меня есть число, я его розбиваю на цифры, и отдельно, в цикле, каждую цифру проверяю, попадает ли она в условие!!! Только вот когда в числе встречается символ.....
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
09.03.2010, 23:43 #13
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 <string>
#include <cctype>
#include <cstdlib>
 
bool isNum(const std::string& buf){
    for ( std::string::const_iterator i = buf.begin(); i != buf.end(); ++i )
        if ( !isdigit(*i) )
            return false;
    return true;
}
 
int main(){
    std::string buf;
    
    while ( true ) {
        std::cout << "Number (empty - exit): ";
        std::getline(std::cin, buf);
        if ( buf.empty() )
            break;
        if ( !isNum(buf) )
            std::cout << "Oh, no! It is not a number!" << std::endl;
        else
            std::cout << "Oh, yeah! It is a number " <<  atoi(buf.c_str()) << std::endl;
    }
    
    exit(0);
}
1
PointsEqual
ниначмуроФ
838 / 522 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
09.03.2010, 23:48 #14
easybudda, я смотрю ты оч хорошо стандартной библиотекой пользуешся) что не сообщение то stl
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
09.03.2010, 23:55 #15
Цитата Сообщение от PointsEqual Посмотреть сообщение
что не сообщение то stl
а так и проще, и короче
0
MILAN
888 / 782 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 00:06  [ТС] #16
easybudda, вы можете поправить код, что бы шла проверка???
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <sstream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdlib>
using namespace std;
int oct_сhislo(unsigned long long int ch, int pos);
long DecToOct(unsigned long long int dec);
long OctToDec(unsigned long long int oct1);
unsigned long long int swap1=0,d,o,o_dec;
string s_oct; 
int ex=0;
bool st=true;
char ch1, var;
int main()
{
    setlocale(LC_ALL,"Russian");
    for (;;)
    {
      cout<<"1 - Перевести число з 8-рiчноi в 10-рiчну систему числення\n";
      cout<<"2 - Перевести число з 10-рiчноi в 8-рiчну систему числення\n";
      cout<<"0 - Вихiд з програми\n\n";
      cin>>var;
         switch(var)
         {
           case '1':
              s_oct="";
              system("cls");
              cout<<"Введiть число в 8-рiчнiй системi числення:  ";
              std::cin>>o;
              cout<<"\nЧисло в 8-рiчнiй системi числення - ";
              DecToOct(o); 
            break;           
           case '2':
               s_oct="";
              system("cls");
              cout<<"Введiть число в 10-рiчнiй системi числення:  ";
              std::cin>>d;
              cout<<"\nЧисло в 8-рiчнiй системi числення - ";
              DecToOct(d); 
             break;
           case '0':
             exit(0);
               break;
           default:
            cout<<"Помилка вибору!!!!";
             break;
        break;
         }
    system("cls");
    }
    return 0;
}
long DecToOct(unsigned long long int dec)
{   
    for (dec;dec>=1;)
       {     
            swap1=static_cast<int>(dec%8);
            std::ostringstream ost;
            ost<<swap1;
            s_oct+=ost.str();
            dec=dec/8;
            
       }
    std::string ss(s_oct);
    std::reverse(ss.begin(), ss.end());
    std::cout<<ss<<std::endl<<std::endl;
    return 0;
}
int oct_chislo(unsigned long long int ch, int pos)
{
    unsigned long long int div = 1;
    int i;
    for(i = 1; i < pos; ++i)
        div *= 10;
    return static_cast<int>((ch/div) % 10);
}
long OctToDec(unsigned long long oct1)
{   
    std::ostringstream sto;
    sto<<oct1;
    int n=(sto.str()).length();
    for(int i=1;i<n+1;++i)
    { 
      o_dec +=(oct_chislo(oct1,i))*pow(static_cast<double>(8),static_cast<int>(i-1));
    }cout<<o_dec<<endl;
    o_dec=0;
    return 0;
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
10.03.2010, 00:42 #17
MILAN, я бы всё не так делал. Число должно читаться, как строка, а потом в соответствии с выбором меню проверяться на допустимые символы. Для восьмеричного числа это 0-7, для шестнадцатиричного 0-9a-f...
0
MILAN
888 / 782 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 00:43  [ТС] #18
Приведите пожалуйста пример!!!
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
10.03.2010, 01:10 #19
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 <string>
 
bool isOctNum(const std::string& s){
    static const std::string valid_chars("01234567");
    return s.find_first_not_of(valid_chars) == std::string::npos;
}
 
bool isHexNum(const std::string& s){
    static const std::string valid_chars("0123456789abcdefABCDEF");
    return s.find_first_not_of(valid_chars) == std::string::npos;
}
 
 
int main(){
    std::string buf;
    
    while ( true ){
        std::cout << "Number: ";
        std::getline(std::cin, buf);
        if ( buf.empty() )
            break;
        std::cout << "Is " << ( isOctNum(buf) ? "" : "not " ) << "valid oct number." << std::endl;
        std::cout << "Is " << ( isHexNum(buf) ? "" : "not " ) << "valid hex number." << std::endl;
    }
    
    return 0;
}
1
MILAN
888 / 782 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
10.03.2010, 02:00  [ТС] #20
А как потом buf перевести в число???
0
10.03.2010, 02:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2010, 02:00
Привет! Вот еще темы с решениями:

Проверка ввода
Всем добрый день! В данный момент пишу фрагмент кода , вот в чем его суть :...

Проверка ввода
Здравствуйте, помогите, пожалуйста, написать функцию для обработки...

Проверка ввода
Здравствуйте! Не нашёл тему, где могут задавать простые вопросы начинающие(если...

Проверка потока ввода
Всем привет , возникла проблема , которая вызывает затруднения. #include...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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