Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.91/47: Рейтинг темы: голосов - 47, средняя оценка - 4.91
5 / 5 / 1
Регистрация: 16.04.2010
Сообщений: 64
1

Проверка ввода

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

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

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

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

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

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

48
42 / 24 / 3
Регистрация: 16.03.2010
Сообщений: 199
17.04.2010, 09:33 2
не совсем понятна задача... если массив инт, то может надо потребовать, чтобы вводились только числа? или что, объясни лучше
0
5 / 5 / 1
Регистрация: 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
42 / 24 / 3
Регистрация: 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
5 / 5 / 1
Регистрация: 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
302 / 160 / 62
Регистрация: 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
42 / 24 / 3
Регистрация: 16.03.2010
Сообщений: 199
17.04.2010, 12:49 7
обычного си щас нет...так что написать со скан-кодами не смогу...
0
5 / 5 / 1
Регистрация: 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
Эксперт С++
5037 / 3097 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
17.04.2010, 14:16 9
А почему бы просто не вводить всё изначально в чаровский массив и в нём искать ошибки? Если i-й элемент не является цифрой - записываем его индекс в массив индексов и затем выводим пользователю сообщение с просьбой ввести повторно элементы, стоящие на этих позициях, затем заново менять все введённые элементы в чаровском массиве на вновь введённые и так до тех пор, пока ввод не будет полностью корректен... Это если я правильно понял задание)))
0
1545 / 911 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
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
4335 / 1467 / 680
Регистрация: 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
1545 / 911 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
17.04.2010, 15:39 12
k1ry4, при вводе, к примеру: 123qweqe, всеравно будет записано в массив, хотя и выдает сообщение о повторе.
0
5 / 5 / 1
Регистрация: 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
1545 / 911 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
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
4335 / 1467 / 680
Регистрация: 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
1545 / 911 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
17.04.2010, 15:53 16
k1ry4,
1
Миниатюры
Проверка ввода  
5 / 5 / 1
Регистрация: 16.04.2010
Сообщений: 64
17.04.2010, 15:55  [ТС] 17
Цитата Сообщение от k1ry4 Посмотреть сообщение
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;
}
твоя прога не верно работа когда вводиш 111ййй то выдаетса ошыбка и просит вести следуйщий елемент а прошлому присваюетса 111
0
1545 / 911 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
17.04.2010, 15:58 18
Morfiy, зачем ты на русской раскладке вводишь?
PS - смотри пост #14.
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,283
17.04.2010, 16:00 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 <conio.h>
 
using namespace std;
 
void main(){
    int i = 0;
    float X;
    char c = 0, x[10];
 
    while(c != 13){
        c = getch();
        if(c == 8){
            cout << "\b \b";
            x[(i--)-1] /= 10;
        }
        if(c >= '0' && c <= '9'){
            x[i] = c;
            cout << x[i];
            i++;
        }
    }
 
    X = atof(x);
    cout << endl << X << endl;
 
    system("pause");
}
вот простенький пример, правда нельзя вводить отрицательные числа и числа с плавающей точкой, но это можно доделать
13 - ASCII код Enter
8 - ASCII код Backspace
сначала мы просто проверяем нажатую клавишу на совпадение с диапазоном кодов клавиш, которые мы разрешили вводить (0 - 9)
если совпадает записываем в массив типа char и выводим на экран, если нет - ниче не делаем, при нажатии backspace удаляем символ из массива и затираем символ на экране, после нажатия Enter мы переводим массив символов в число и теперь есть готовое число типа int
1
4335 / 1467 / 680
Регистрация: 12.03.2009
Сообщений: 5,310
17.04.2010, 16:01 20
neske, возможно компилятор по-иному cin воспринимает. На G++ всё прекрасно работает.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2010, 16:01

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

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

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

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

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


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

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

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