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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.91
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
#1

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

16.04.2010, 23:47. Просмотров 5161. Ответов 48
Метки нет (Все метки)

Всем привет. Прошу обясните мне как зделать проверку вводимых даных. Мне нужно к примеру задать числовой масив типа (int). Как зделать так чтоб когда пользователь вводит к примеру Ф123;:87!"№;;%:!"№;%:?*(99321фвфв и тд.. или что нить подобное после проверки попросить повторить ввод даного елемента масива(или числа)?
Я находил в темах немного подобное моему примеру но не смог розобратса, покажыте пожалуста как ето зделать и если можна то в Borland C++.
Зарание спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2010, 23:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка ввода (C++):

Visual C++ проверка ввода на число, проверка на кирилицу - C++
Суть ввести с клавиатуры нечто, и повторять ввод до тех пор пока введенное число не будет числом. Этот код проверяет на буквы и знаки,...

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

Проверка ввода - C++
Доброго вам времени суток. Бывалые, подскажите неопытному, как лучше писать? И если несложно, то скажите почему. for(;;) { ...

Проверка ввода - C++
Как ограничить ввод символов в программе!!!! На каждый символ, который был введен выдавать сообщение о неправильном вводе????? Надо чтоб...

Проверка ввода - C++
Как можно проверить вводимые данные, являются ли они числом. Допустим если ввели "08098рррр9" - запросить повторный ввод, а если "43543"...

C++ проверка ввода - C++
Ребят помогить пожалуста разобраться не работает чертова проверка ввода я в коментарии вынес текст ошибки гляньте ... // laba1.cpp:...

48
delfamur
42 / 24 / 0
Регистрация: 16.03.2010
Сообщений: 199
17.04.2010, 09:33 #2
не совсем понятна задача... если массив инт, то может надо потребовать, чтобы вводились только числа? или что, объясни лучше
0
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
17.04.2010, 10:37  [ТС] #3
Вот самый простой пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream.h>
#include<conio.h>
main(){
int a[16383],r;
cout<<"vvedite rozmirnist";
cin>>r;
cout<<"vvedite vvedite masiv";
for(int i=1;i<=r;i++)
cin>>a[i];
getch();
return 0;
}
мне нужно зделать так чтоб когда пользователь введет в (r a[i]) какую нибудь чуж к примеру:Ё!"№;%:?*()_+\ ЙЦУКПРОЛОЛРkljnklnn и тд. Нада чтоб выбило сообщение про ошыбку ввода и попросило ввести снова.
но суть дела когда в переменною вводиш какое нибудь символ кроме числапрограма виснет.
Я думаю проверка должна ити по принцыпу гдето так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream.h>
#include<conio.h>
main(){
int key,a[16383];
char ch;
A:
cout<<"-----";
cin>>ch;
key=(int)ch;//переводит в код,для от 0 до 9 ето 48-57
if((key==48)||(key==49)||(key==50)||(key==51)||(key==52)||(key==53)||(key==54)||(key==54)||(key==55)||(key==56)||(key==57))
{cout<<"vvod vernuy";
key=key-48;
cout<<key;
}
else {cout<<"oshubka"; goto A;
getch();
return 0;
}
ну вот такую проверку делал я но у нее оч много минусов:
1)розпознаетиса токо 1 символ тоитсть если веду 27 мне выведе в конце 2
2)когда идет присвоения к масиву в цыкле типа a[i]=key; и я перед етим ввел сh=111111
то оно присвоит так
а[i]=1;
а[i+1]=1;
а[i+2]=1;
а[i+3]=1;
а[i+4]=1;
а[i+5]=1;
Думаю суть моей проблемы тепер более ясна!!))
0
delfamur
42 / 24 / 0
Регистрация: 16.03.2010
Сообщений: 199
17.04.2010, 10:52 #4
про скан-код (анси-код) слышал? задай просто диапазон вводимых значений.
что-то типа...:

C++
1
2
3
4
5
{
cin >> a[i];
if (a[i]>={скан-код 0}&&a[i]<={скан-код 0})
cout << a[i]
}
вроде на enter ругаться не должен
1
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
17.04.2010, 11:30  [ТС] #5
Цитата Сообщение от delfamur Посмотреть сообщение
про скан-код (анси-код) слышал? задай просто диапазон вводимых значений.
что-то типа...:

{
cin >> a[i];
if (a[i]>={скан-код 0}&&a[i]<={скан-код 0})
cout << a[i]
}

вроде на enter ругаться не должен
можеш плз показать что именно тут длолжни быть {скан-код 0}
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
17.04.2010, 12:41 #6
Можно так, но тоже не очень удобно, т.к. вводить нужно только строго по одному числу...
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
#include <iostream>
#include <cstdlib>
using namespace std;
 
const int SIZE=100;
 
int main() 
{
    int a[SIZE]; 
    int n, j=0,b;
    
    cout<<"Vvtdite n: ";
    cin>>n;
    
    for (int i=0; i<n; i++)
    {
        cout<<"Vvedite chislo massiva: ";
        cin>>b;
        if (cin.good()) //проверка ввода (если верно, присваиваем элементу массива)
            a[j++]=b;
        else 
        {
            cout << "Nevernoe chislo. "; //если нет, выводим сообщение ошибке
            i--;
            cin.clear();// удаляем введенное число
            flushall();
 
        }
    }
    cout<<"Rezultat: ";
    for (int i=0; i<n; i++)
        cout<<a[i]<<" ";
    cout<<endl;
}
0
delfamur
42 / 24 / 0
Регистрация: 16.03.2010
Сообщений: 199
17.04.2010, 12:49 #7
обычного си щас нет...так что написать со скан-кодами не смогу...
0
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
17.04.2010, 14:03  [ТС] #8
Цитата Сообщение от NNN777 Посмотреть сообщение
Можно так, но тоже не очень удобно, т.к. вводить нужно только строго по одному числу...
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
#include <iostream>
#include <cstdlib>
using namespace std;
 
const int SIZE=100;
 
int main() 
{
    int a[SIZE]; 
    int n, j=0,b;
    
    cout<<"Vvtdite n: ";
    cin>>n;
    
    for (int i=0; i<n; i++)
    {
        cout<<"Vvedite chislo massiva: ";
        cin>>b;
        if (cin.good()) //проверка ввода (если верно, присваиваем элементу массива)
            a[j++]=b;
        else 
        {
            cout << "Nevernoe chislo. "; //если нет, выводим сообщение ошибке
            i--;
            cin.clear();// удаляем введенное число
            flushall();
 
        }
    }
    cout<<"Rezultat: ";
    for (int i=0; i<n; i++)
        cout<<a[i]<<" ";
    cout<<endl;
}
програма работает неверно когда пользователь вводит Qwe!!#$%^&*(13313 то она выдает ошыбку а если 123Qwe!!#$%^&*(13313 то она123 записует в масив и выдет ошыбку и просит ввести следущий елемент масива
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.04.2010, 14:16 #9
А почему бы просто не вводить всё изначально в чаровский массив и в нём искать ошибки? Если i-й элемент не является цифрой - записываем его индекс в массив индексов и затем выводим пользователю сообщение с просьбой ввести повторно элементы, стоящие на этих позициях, затем заново менять все введённые элементы в чаровском массиве на вновь введённые и так до тех пор, пока ввод не будет полностью корректен... Это если я правильно понял задание)))
0
neske
1502 / 869 / 84
Регистрация: 26.03.2010
Сообщений: 2,983
17.04.2010, 15:24 #10
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>
 
int main()
{
    setlocale( LC_ALL,"Russian" );
 
    int N;
    std::cout << "Введите кол-во элементов массива: ";
    std::cin >> N;
    int *MAS=new int [N];
 
    char ch[20]={'0'}; // заполняем char массив нулями.
    int key; 
 
    for (int i=0; i<N; i++)
    {
        std::cout << "MAS["<< i <<"]: "; // запрашиваем число,
        std::cin >> ch;                 // и записываем его в массив char.
            
        for (int j=0; j<20; j++) // циклом проходим по всем элементам массива char.
        {
            key=int(ch[j]); // переменной key присваиваем номер знака в ANSI.
            if (key==0) break; // т.к. первоначально массив был заполнен нулями, делаем проверку.
            if ((key<47) || (key>58)) // если это не цифра, выводим сообщение и запрашиваем ввод еще раз.
            {
                std::cout << "Неверный ввод. Попробуйте еще раз:\n";
                i-=1;
                break;
            }
        }
 
    MAS[i]=atoi(ch);
    }
 
    delete []MAS;
    system("pause");
    return 0;
}
Размер char массива можно изменять, просто я так поставил
1
yanyk1n
4330 / 1461 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
17.04.2010, 15:30 #11
C++
1
2
3
4
5
6
7
8
9
10
for (int i=0;i<N;i++)
{
  cout << "A[ << i << ]-> ";
  while (!(cin >> A[i]))
  {
    cin.clear();
    while (cin.get() != '\n') continue;
    cout << "Повторите ввод -> ";
  }
}
0
neske
1502 / 869 / 84
Регистрация: 26.03.2010
Сообщений: 2,983
17.04.2010, 15:39 #12
k1ry4, при вводе, к примеру: 123qweqe, всеравно будет записано в массив, хотя и выдает сообщение о повторе.
0
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
17.04.2010, 15:44  [ТС] #13
Цитата Сообщение от neske Посмотреть сообщение
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>
 
int main()
{
    setlocale( LC_ALL,"Russian" );
 
    int N;
    std::cout << "Введите кол-во элементов массива: ";
    std::cin >> N;
    int *MAS=new int [N];
 
    char ch[20]={'0'}; // заполняем char массив нулями.
    int key; 
 
    for (int i=0; i<N; i++)
    {
        std::cout << "MAS["<< i <<"]: "; // запрашиваем число,
        std::cin >> ch;                 // и записываем его в массив char.
            
        for (int j=0; j<20; j++) // циклом проходим по всем элементам массива char.
        {
            key=int(ch[j]); // переменной key присваиваем номер знака в ANSI.
            if (key==0) break; // т.к. первоначально массив был заполнен нулями, делаем проверку.
            if ((key<47) || (key>58)) // если это не цифра, выводим сообщение и запрашиваем ввод еще раз.
            {
                std::cout << "Неверный ввод. Попробуйте еще раз:\n";
                i-=1;
                break;
            }
        }
 
    MAS[i]=atoi(ch);
    }
 
    delete []MAS;
    system("pause");
    return 0;
}
Размер char массива можно изменять, просто я так поставил
у

у тя тож прога работа не верно не розпазнает"/" и когда ввожу "!"№;%:?*()" виснет
0
neske
1502 / 869 / 84
Регистрация: 26.03.2010
Сообщений: 2,983
17.04.2010, 15:48 #14
Да, увидел ошибку.
Исправил:
Код
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>
 
int main()
{
        setlocale( LC_ALL,"Russian" );
 
        int N;
    std::cout << "Введите кол-во элементов массива: ";
    std::cin >> N;
    int *MAS=new int [N];
 
        char ch[20]={'0'}; // заполняем char массив нулями.
        int key; 
 
        for (int i=0; i<N; i++)
        {
                std::cout << "MAS["<< i <<"]: "; // запрашиваем число,
                std::cin >> ch;                                 // и записываем его в массив char.
                        
                for (int j=0; j<20; j++) // циклом проходим по всем элементам массива char.
                {
                        key=int(ch[j]); // переменной key присваиваем номер знака в ANSI.
                        if (key==0) break; // т.к. первоначально массив был заполнен нулями, делаем проверку.
                        if ((key<48) || (key>58)) // если это не цифра, выводим сообщение и запрашиваем ввод еще раз.
                        {
                                std::cout << "Неверный ввод. Попробуйте еще раз:\n";
                                i-=1;
                                break;
                        }
                }
 
        MAS[i]=atoi(ch);
        }
 
        delete []MAS;
    system("pause");
        return 0;
}
1
yanyk1n
4330 / 1461 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
17.04.2010, 15:49 #15
neske, вот полный код, рабочий:
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
#include <iostream>
using namespace std;
 
int main()
{
    int N;
    cout << "N -> ";
    cin >> N;
    int* A = new int[N];
    for (int i=0;i<N;i++)
    {
        cout << "A[ " << i << " ]-> ";
        while (!(cin >> A[i]))
        {
            cin.clear();
            while (cin.get() != '\n') continue;
            cout << "Повторите ввод -> ";
        }
    }
    for (int i=0;i<N;i++) cout << A[i] << " ";
    cout << endl;
    return 0;
    delete [] A;
}
1
17.04.2010, 15:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2010, 15:49
Привет! Вот еще темы с ответами:

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

Проверка правильности ввода - C++
Пишу программу С++ в консоле в RAD Studio. Программа представляет собой задачу. Пользователь вводит число, а программа решает. Мне нужно...

Проверка правильности ввода - C++
1)Вывести ошибку в консоль, если в символ пользователь пытается вбить строку. 2)Вывести ошибку в консоль, если строка не является...

Проверка ввода данных в C++ - C++
/* Программа сложения */ #include &lt;math.h&gt;/* подключение математической библиотеки */ #include &lt;stdio.h&gt;/*подсоединение раздела...


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

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

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