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

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

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

Проверка ввода C++
C++ проверка ввода C++
C++ Проверка правильности ввода
Проверка ввода C++
C++ Проверка ввода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
delfamur
 Аватар для delfamur
42 / 42 / 0
Регистрация: 16.03.2010
Сообщений: 199
17.04.2010, 09:33     Проверка ввода #2
не совсем понятна задача... если массив инт, то может надо потребовать, чтобы вводились только числа? или что, объясни лучше
Morfiy
 Аватар для 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;
Думаю суть моей проблемы тепер более ясна!!))
delfamur
 Аватар для delfamur
42 / 42 / 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 ругаться не должен
Morfiy
 Аватар для 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}
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;
}
delfamur
 Аватар для delfamur
42 / 42 / 0
Регистрация: 16.03.2010
Сообщений: 199
17.04.2010, 12:49     Проверка ввода #7
обычного си щас нет...так что написать со скан-кодами не смогу...
Morfiy
 Аватар для 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 записует в масив и выдет ошыбку и просит ввести следущий елемент масива
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.04.2010, 14:16     Проверка ввода #9
А почему бы просто не вводить всё изначально в чаровский массив и в нём искать ошибки? Если i-й элемент не является цифрой - записываем его индекс в массив индексов и затем выводим пользователю сообщение с просьбой ввести повторно элементы, стоящие на этих позициях, затем заново менять все введённые элементы в чаровском массиве на вновь введённые и так до тех пор, пока ввод не будет полностью корректен... Это если я правильно понял задание)))
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,692
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 массива можно изменять, просто я так поставил
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 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 << "Повторите ввод -> ";
  }
}
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,692
17.04.2010, 15:39     Проверка ввода #12
k1ry4, при вводе, к примеру: 123qweqe, всеравно будет записано в массив, хотя и выдает сообщение о повторе.
Morfiy
 Аватар для 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 массива можно изменять, просто я так поставил
у

у тя тож прога работа не верно не розпазнает"/" и когда ввожу "!"№;%:?*()" виснет
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,692
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;
}
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 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;
}
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,692
17.04.2010, 15:53     Проверка ввода #16
k1ry4,
Миниатюры
Проверка ввода  
Morfiy
 Аватар для Morfiy
5 / 5 / 0
Регистрация: 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
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,692
17.04.2010, 15:58     Проверка ввода #18
Morfiy, зачем ты на русской раскладке вводишь?
PS - смотри пост #14.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2010, 16:01     Проверка ввода
Еще ссылки по теме:

C++ gets() проверка ввода
C++ проверка ввода данных
Проверка правильности ввода C++

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

Или воспользуйтесь поиском по форуму:
yanyk1n
 Аватар для yanyk1n
4324 / 1455 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
17.04.2010, 16:01     Проверка ввода #20
neske, возможно компилятор по-иному cin воспринимает. На G++ всё прекрасно работает.
Yandex
Объявления
17.04.2010, 16:01     Проверка ввода
Ответ Создать тему
Опции темы

Текущее время: 04:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru