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

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

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

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

06.11.2012, 22:08. Просмотров 499. Ответов 6
Метки нет (Все метки)

Могу ввести числа в восьмеричной, десятичной или шестнадцатеричной системе счисления.
Но нужно потом перевести все равно в десятичную
Проверка на мой вгляд такая, поправьте если что:
1) убирать "-" если есть, потом запомнить что число отрицательное, либо другой способ
Примеры
-9999 = -9999
--12 = минус не на первой позиции
2) определить, какая с.с.
a) если число начинается с "0"
проверять следующую цифру
1) если дальше идёт "х" - значит число 16ричное
но тоже свои проверки (только большие буквы и т.д.)
Примеры:
0x39
0x00000AB - можно удалить нули для облегчения проверки
00xAB = недопустимые символы
0х8as8 = недопустимые символы
2) если нет "х", значит 8ричная с.с.
>8 и т.д.
Пример
0000026
б) если с != 0 - значит 10чная
Примеры
25
10000
3) проверить, влазит ли в int от -32768 до 32767

С переводом:
25 = 25
-9999 = -9999
0000026 = 22
-0x1 = -1
0xFF = 255

as89 = недопустимые символы
888588 = выход за допустимый диапазон
--12 = минус не на первой позиции
00xAB = недопустимые символы
0A = недопустимые символы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2012, 22:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка на введенные данные (C++):

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

Программа не считывает введенные данные - C++
Программа не считывает введенные данные. Помогите, пожалуйста, не вижу, где проблема) #include <iostream>//файловый ввод вывод ...

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

Проверить введенные данные, и если они некорректны - вывести сообщение - C++
Здравствуйте. Я пытаюсь добавить в свою лабораторную работу проверку введенных данных, и если это не цифры, а буквы, либо символы - то...

Наследование классов: почему производный класс не учитывает данные, введенные в базовом? - C++
Почему при компилляции производный класс не учитывает данные, введенные в базовом? #include <iostream> using namespace std; ...

Visual studio 2008 командная строка не принимает введенные данные с клавы - C++
привет всем такая проблема не могу ввести в программу запрашиваемые данные прога запускается вывдится командная строка но командная строка...

6
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 543
06.11.2012, 22:12 #2
Как пример для проверки на недопустимые символы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool isCorrected(char m_symbol)
{
    if ((m_symbol == '\n') || (m_symbol != '1' && m_symbol != '0'))
        return false;
    else
        return true;
}
int main(void)
{
    char symbol;
 
    cout << "Введите число в двоичной системе счисления (0<x<2).\n";
    do
    {
        cin.get(symbol);
 
        if (!isCorrected(symbol))
            continue;
                ...
1
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
07.11.2012, 14:21 #3
Вроде бы работает
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 <string>
#include <sstream>
#include <map>
#include <climits>
#include <boost/regex.hpp>
#include <boost/lexical_cast.hpp>
 
typedef std::ios_base& (*Pointer)(std::ios_base&);
 
int main ()
{
    if(sizeof(long long) > sizeof(int))
    {
        long long ll;
        std::string s;
        // Таблица соответствий
        std::map<Pointer, boost::regex> map;
        map.insert(std::make_pair(&std::hex, "[+-]?0[xX][\\da-fA-F]{1,8}"));
        map.insert(std::make_pair(&std::oct, "[+-]?0[0-7]{1,11}"));
        map.insert(std::make_pair(&std::dec, "[+-]?[1-9]\\d{0,9}"));
        //
        std::stringstream ss;
        // Лимиты
        std::cout << std::showbase << "Limits:\n";
        std::cout << "INT_MAX hex: " << std::hex << INT_MAX << '\n' << "INT_MIN hex: -" << INT_MIN << std::endl;
        std::cout << "INT_MAX oct: " << std::oct << INT_MAX << '\n' << "INT_MIN oct: -" << INT_MIN << std::endl;
        std::cout << "INT_MAX: " << std::dec << INT_MAX << '\n' << "INT_MIN: " << INT_MIN << std::endl;
        std::cout << '\n';
        //
        bool correct;
        while(true)
        {
            std::cout << "Input int : ";
            std::getline(std::cin, s);
            correct = false;
            for(auto const& pair : map)
            {
                if(boost::regex_match(s, pair.second))
                {
                    correct = true;
                    ss.str(s);
                    ss >> pair.first >> ll;
                    if(INT_MIN <= ll && INT_MAX >= ll)
                        std::cout << ll << std::endl;
                    else
                        std::cout << "Overflow: " << ll << std::endl;
                    ss.clear();
                    break;
                }
            }
            if(!correct)
                std::cerr << "Format not provided" << std::endl;
        }
    }
    return 0;
}
1
stdafx
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
07.11.2012, 23:42  [ТС] #4
Цитата Сообщение от igorrr37 Посмотреть сообщение
Вроде бы работает
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 <string>
#include <sstream>
#include <map>
#include <climits>
#include <boost/regex.hpp>
#include <boost/lexical_cast.hpp>
 
typedef std::ios_base& (*Pointer)(std::ios_base&);
 
int main ()
{
    if(sizeof(long long) > sizeof(int))
    {
        long long ll;
        std::string s;
        // Таблица соответствий
        std::map<Pointer, boost::regex> map;
        map.insert(std::make_pair(&std::hex, "[+-]?0[xX][\\da-fA-F]{1,8}"));
        map.insert(std::make_pair(&std::oct, "[+-]?0[0-7]{1,11}"));
        map.insert(std::make_pair(&std::dec, "[+-]?[1-9]\\d{0,9}"));
        //
        std::stringstream ss;
        // Лимиты
        std::cout << std::showbase << "Limits:\n";
        std::cout << "INT_MAX hex: " << std::hex << INT_MAX << '\n' << "INT_MIN hex: -" << INT_MIN << std::endl;
        std::cout << "INT_MAX oct: " << std::oct << INT_MAX << '\n' << "INT_MIN oct: -" << INT_MIN << std::endl;
        std::cout << "INT_MAX: " << std::dec << INT_MAX << '\n' << "INT_MIN: " << INT_MIN << std::endl;
        std::cout << '\n';
        //
        bool correct;
        while(true)
        {
            std::cout << "Input int : ";
            std::getline(std::cin, s);
            correct = false;
            for(auto const& pair : map)
            {
                if(boost::regex_match(s, pair.second))
                {
                    correct = true;
                    ss.str(s);
                    ss >> pair.first >> ll;
                    if(INT_MIN <= ll && INT_MAX >= ll)
                        std::cout << ll << std::endl;
                    else
                        std::cout << "Overflow: " << ll << std::endl;
                    ss.clear();
                    break;
                }
            }
            if(!correct)
                std::cerr << "Format not provided" << std::endl;
        }
    }
    return 0;
}
Я не очень-то разбираюсь с Boost (вообще впервые вижу), если не удосужит, можете как-нибудь проще составить?
0
stdafx
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 8
10.11.2012, 00:10  [ТС] #5
Есть еще у кого мысли?
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
10.11.2012, 00:15 #6
stdafx, мысль одна - надо писать парсер. Небольшой,, но гордый парсер
Попробуйте решать задачу постепенно. Начните, например, с минуса. Напишите функцию, которая определяет, все ли в порядке с минусом. Пусть возвращает -1, если ошибка, 0 если все ок и минуса нет, 1 если все ок и минус есть.
0
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
10.11.2012, 18:39 #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
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <iostream>
#include <string>
#include <cstdlib>
#include <cerrno>
#include <climits>
 
int main()
{
    std::cout << std::showbase << "Limits:\n";
    std::cout << "INT_MAX hex: " << std::hex << INT_MAX << '\n' << "INT_MIN hex: -" << INT_MIN << std::endl;
    std::cout << "INT_MAX oct: " << std::oct << INT_MAX << '\n' << "INT_MIN oct: -" << INT_MIN << std::endl;
    std::cout << "INT_MAX: " << std::dec << INT_MAX << '\n' << "INT_MIN: " << INT_MIN << std::endl;
    std::cout << '\n';
    enum State
    {
        Base = 0, Sign = 1, Dec  = 2, Hoct = 3, Hex  = 4, Oct  = 5, Inc  = 6
    };
    std::string s;
    long n;
    bool format;
    State state;
    while(true)
    {
        std::cout << "Input long:\n";
        std::getline(std::cin, s);
        state = Base;
        format = false;
        for(std::string::const_iterator cib = s.begin(), cie = s.end(); cib != cie; ++cib)
        {
            switch(*cib)
            {
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                    switch(state)
                    {
                        case Hex:
                        case Oct:
                        case Inc:
                            break;
                        case Hoct:
                            state = Oct;
                            break;
                        default:
                            state = Dec;
                            break;
                    }
                    break;
                case '+':
                case '-':
                    switch(state)
                    {
                        case Base:
                            state = Sign;
                            break;
                        default:
                            state = Inc;
                            break;
                    }
                    break;
                case '0':
                    switch(state)
                    {
                        case Base:
                        case Sign:
                            state = Hoct;
                            break;
                        case Hoct:
                            state = Oct;
                            break;
                        default:
                            break;
                    }
                    break;
                case 'x':
                case 'X':
                    switch(state)
                    {
                        case Hoct:
                            state = Hex;
                            break;
                        default:
                            state = Inc;
                            break;
                    }
                    break;
                case '8':
                case '9':
                    switch(state)
                    {
                        case Base:
                        case Dec:
                        case Sign:
                            state = Dec;
                            break;
                        case Hex:
                            break;
                        default:
                            state = Inc;
                            break;
                    }
                    break;
                case 'a':
                case 'b':
                case 'c':
                case 'd':
                case 'e':
                case 'f':
                case 'A':
                case 'B':
                case 'C':
                case 'D':
                case 'E':
                case 'F':
                    switch(state)
                    {
                        case Hex:
                            break;
                        default:
                            state = Inc;
                            break;
                    }
                    break;
                default:
                    state = Inc;
                    break;
            }
        }
        //std::cout << "state: " << state << std::endl;
        switch(state)
        {
            case Dec:
            case Hoct:
                n = strtol(s.c_str(), 0, 10);
                std::cout << "dec, ";
                format = true;
                break;
            case Hex:
                n = strtol(s.c_str(), 0, 16);
                std::cout << "hex, ";
                format = true;
                break;
            case Oct:
                n = strtol(s.c_str(), 0, 8);
                std::cout << "oct, ";
                format = true;
                break;
        }
        if(!format)
            std::cerr << "format not provided" << std::endl;
        else if(ERANGE == errno)
            std::cout << "overflow" << std::endl;
        else
            std::cout << n << std::endl;
        std::cout << std::endl;
    }
    return 0;
}
0
10.11.2012, 18:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2012, 18:39
Привет! Вот еще темы с ответами:

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

Проверка строки на вводимые данные - C++
Помогите сделать проверку на вводимые данные. Требуется, чтобы строка могла принимать только такие значения: Monday, Tuesday, Wednesday,...

Поменять местами введенные значения - C++
Помогите, пожалуйста, простенько решить задачку. Даны четыре числа А, В, С и D. Поменять их значения местами таким образом, что-бы A &gt; B...

Вывести введенные числа по возрастанию - C++
Здравствуйте помогите написать програму чтобы выводила 5 введеных чисел по возрастанию


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

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

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