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

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

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

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

16.04.2010, 23:47. Просмотров 4922. Ответов 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:...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
17.04.2010, 15:53 #16
k1ry4,
1
Миниатюры
Проверка ввода  
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
0
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
17.04.2010, 15:58 #18
Morfiy, зачем ты на русской раскладке вводишь?
PS - смотри пост #14.
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 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
yanyk1n
4329 / 1460 / 152
Регистрация: 12.03.2009
Сообщений: 5,310
17.04.2010, 16:01 #20
neske, возможно компилятор по-иному cin воспринимает. На G++ всё прекрасно работает.
0
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
17.04.2010, 16:26  [ТС] #21
neske те респект!!! neske неске круче всех!!!
твоя прога лутшая я токо доделал чтоб с минусовые значения мона было вводить вот код!!
Код
#include <iostream.h>
 
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<45) ||(key==46) ||(key==47) || (key>57)) // если это не цифра, выводим сообщение и запрашиваем ввод еще раз.
                        {
                                std::cout << "Неверный ввод. Попробуйте еще раз:\n";
                                i-=1;
                                break;
                        }
                }
 
        MAS[i]=atoi(ch);
        }
        for(int i=0;i<N;i++){cout<<" "<<MAS[i];}
 
        delete []MAS;
    system("pause");
        return 0;
}
Добавлено через 3 минуты
[
0
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.04.2010, 17:11 #22
Morfiy, код который написал уважаемого neske имеет изьян, т.к. он основывается на конкретных кодах символов цифр, что совсем не хорошо. В зависимости от используемой кодовой страницы, коды символов могут меняться.
Для того чтобы обойти подобную ситуацию необходимо использовать функцию isdigit.
1
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
17.04.2010, 20:41 #23
CyBOSSeR, на самом деле когда писал, пытался нагуглить что-то подобное, но у меня не удалось.
Учту на будущее, спасибо.

PS - Morfiy,
0
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.04.2010, 21:51 #24
neske, не за что.
Еще было бы неплохо выделить код отвечающий за ввод цифры в отдельную функцию, как то так например (не проверял):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <string>
#include <algorithm>
#include <functional>
#include <cctype>
#include <cstdlib>
 
int EnterNumber() {
  std::string str;
  std::getline(std::cin, str);
 
  while (std::find_if(str.begin(), str.end(), std::not1(std::isdigit)) != str.end()) {
    std::cout << "Input error. Repeat input: ";
    std::getline(std::cin, str);
  }
 
  return std::atoi(str.c_str());
}
0
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 12:59  [ТС] #25
Всем спасибо за помощь если у кого будут идеи как улутшыть способ проверки даных вылажуйте )
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
18.04.2010, 15:48 #26
я же написал способ, чтоб вообще нельзя было вводить что-то ненужное, т.е. без всяких всплывающих ошибок, на экран выводится и числу присваивается только то, что можно ввести
там только нужно дописать для плавающей точки и знака минус)
0
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 16:29  [ТС] #27
Цитата Сообщение от Vorona Посмотреть сообщение
я же написал способ, чтоб вообще нельзя было вводить что-то ненужное, т.е. без всяких всплывающих ошибок, на экран выводится и числу присваивается только то, что можно ввести
там только нужно дописать для плавающей точки и знака минус)
твоя прога не совсем коректно работа мож помоч ето убать а именно если не чево не вводиш а нажымаеш ентр числу присваюетса 0
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
18.04.2010, 16:39 #28
а нужно, чтоб не выводило 0, а дальше запрашивало ввод, пока не будет присвоено какое-либо значение?
т.е. пока мы сами не нажмем 0, число не должно быть образовано?
0
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 16:54  [ТС] #29
Цитата Сообщение от Vorona Посмотреть сообщение
а нужно, чтоб не выводило 0, а дальше запрашивало ввод, пока не будет присвоено какое-либо значение?
т.е. пока мы сами не нажмем 0, число не должно быть образовано?
скажу ну оч попроще
когда запускаеш твою прогу и просто нажымаеш токо Enter оно присваюет масиву значение "0"

нада чтоб оно просто не чево не делал)
1
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
18.04.2010, 17:08 #30
Morfiy, попробуй:
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
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
#include <cstdlib>
 
bool IsNotDigit(char ch) {
  return !std::isdigit(ch);
}
 
int EnterNumber() {
  std::string str;
  std::getline(std::cin, str);
 
  while (std::find_if(str.begin(), str.end(), IsNotDigit) != str.end()) {
    std::cout << "Input error. Repeat input: ";
    std::getline(std::cin, str);
  }
 
  return std::atoi(str.c_str());
}
 
int main() {
  const int size      = 10;
        int arr[size];
 
  for (int i = 0; i < size; ++i) {
    std::cout << "arr[" << i + 1 << "] = ";
    arr[i] = EnterNumber();
  }
 
  std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout, " "));
 
  std::cout << std::endl;
 
  return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2010, 17:08
Привет! Вот еще темы с ответами:

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;/*подсоединение раздела...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.04.2010, 17:08
Ответ Создать тему
Опции темы

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