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

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

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

Студворк — интернет-сервис помощи студентам
Всем привет. Прошу обясните мне как зделать проверку вводимых даных. Мне нужно к примеру задать числовой масив типа (int). Как зделать так чтоб когда пользователь вводит к примеру Ф123;:87!"№;;%:!"№;%:?*(99321фвфв и тд.. или что нить подобное после проверки попросить повторить ввод даного елемента масива(или числа)?
Я находил в темах немного подобное моему примеру но не смог розобратса, покажыте пожалуста как ето зделать и если можна то в Borland C++.
Зарание спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.04.2010, 23:47
Ответы с готовыми решениями:

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

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

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

48
 Аватар для Morfiy
5 / 5 / 1
Регистрация: 16.04.2010
Сообщений: 64
17.04.2010, 16:26  [ТС]
Студворк — интернет-сервис помощи студентам
neske те респект!!! neske неске круче всех!!!
твоя прога лутшая я токо доделал чтоб с минусовые значения мона было вводить вот код!!
Code
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
#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
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
17.04.2010, 17:11
Morfiy, код который написал уважаемого neske имеет изьян, т.к. он основывается на конкретных кодах символов цифр, что совсем не хорошо. В зависимости от используемой кодовой страницы, коды символов могут меняться.
Для того чтобы обойти подобную ситуацию необходимо использовать функцию isdigit.
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
17.04.2010, 20:41
CyBOSSeR, на самом деле когда писал, пытался нагуглить что-то подобное, но у меня не удалось.
Учту на будущее, спасибо.

PS - Morfiy,
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
17.04.2010, 21:51
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 / 1
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 12:59  [ТС]
Всем спасибо за помощь если у кого будут идеи как улутшыть способ проверки даных вылажуйте )
0
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
18.04.2010, 15:48
я же написал способ, чтоб вообще нельзя было вводить что-то ненужное, т.е. без всяких всплывающих ошибок, на экран выводится и числу присваивается только то, что можно ввести
там только нужно дописать для плавающей точки и знака минус)
0
 Аватар для Morfiy
5 / 5 / 1
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 16:29  [ТС]
Цитата Сообщение от Vorona Посмотреть сообщение
я же написал способ, чтоб вообще нельзя было вводить что-то ненужное, т.е. без всяких всплывающих ошибок, на экран выводится и числу присваивается только то, что можно ввести
там только нужно дописать для плавающей точки и знака минус)
твоя прога не совсем коректно работа мож помоч ето убать а именно если не чево не вводиш а нажымаеш ентр числу присваюетса 0
0
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
18.04.2010, 16:39
а нужно, чтоб не выводило 0, а дальше запрашивало ввод, пока не будет присвоено какое-либо значение?
т.е. пока мы сами не нажмем 0, число не должно быть образовано?
0
 Аватар для Morfiy
5 / 5 / 1
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 16:54  [ТС]
Цитата Сообщение от Vorona Посмотреть сообщение
а нужно, чтоб не выводило 0, а дальше запрашивало ввод, пока не будет присвоено какое-либо значение?
т.е. пока мы сами не нажмем 0, число не должно быть образовано?
скажу ну оч попроще
когда запускаеш твою прогу и просто нажымаеш токо Enter оно присваюет масиву значение "0"

нада чтоб оно просто не чево не делал)
1
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
18.04.2010, 17:08
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
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
18.04.2010, 17:23
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
void enter(float&);
 
void main(){        
    float x = 2;
    enter(x);
    cout << endl << x << endl;
    system("pause");
}
 
void enter(float &X){
    int i = 0;
    char c = 0, x[10];
    x[0] = 'x';
        
        while(c != 13){
                c = getch();
        if(c == 8){
                        if(x[i] != 'x'){
                                cout << "\b \b";
                                x[(i--)-1] /= 10;
                }
                        if(i == 0)
                x[i] = 'x';
                }
                if(c >= '0' && c <= '9'){
                        x[i] = c;
                        cout << x[i];
                        i++;
                }
    }
 
        if(x[0] != 'x')
        X = atof(x);
}
теперь все, как просили, ничего не жмем, х остается таким, как был прежде)
для проверки в ф-ции main() пишем х, чтобы убедится в том, какое именно значение х остается после ввода, прежнее или введенное и обработанное ф-цией)

p.s. спасибо вам, Morfiy, благодаря вашим замечаниям ф-ция стала лучше)
0
 Аватар для Morfiy
5 / 5 / 1
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 18:02  [ТС]
В 32-й строке кода у меня выдает ошыбку
Expression syntax
Undefined symbol 'ostream_iterator'

Добавлено через 56 секунд
ето у CyBOSSeR

Добавлено через 12 минут
Цитата Сообщение от Vorona Посмотреть сообщение
теперь все, как просили, ничего не жмем, х остается таким, как был прежде)
для проверки в ф-ции main() пишем х, чтобы убедится в том, какое именно значение х остается после ввода, прежнее или введенное и обработанное ф-цией)
Ех...
Ты не понял что я имел виду.
float x=2;//здесь ты задаеш первоначальное значение х которое будет выводитса если пользователь не введет ни одного символа з клавиатуры и нажмет Ентер
Вот так будет работать прога ета:
//------

2
Для продолжения нажмите любую клавишу . . .
//--
суть проблемы в том что к примеру какаято блондинка на роботе будет пить кофе и случайно зажмет Ентер и выйдет так что она задаст весь масив числами 2
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
18.04.2010, 18:04
Цитата Сообщение от Morfiy Посмотреть сообщение
В 32-й строке кода у меня выдает ошыбку
Expression syntax
Undefined symbol 'ostream_iterator'
Попробуй подключить заголовочный файл <iterator>.
C++
1
#include <iterator>
0
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
18.04.2010, 18:14
Morfiy, так вы попросили ничего не присваивать х, вот и ни чего не присваивается, если будет просто float x, то массив будет забит вообще левыми числами, изначально он забивался нулями, и после вашего вопроса, я хотел уточнить, если пользователь нажимает просто Enter, без присваивания до этого какого-либо значения, то программа ничего не делает, а ждет, пока не будет введено хоть какое-то значение?
как обычный cin >> x; жмем Enter, а оператор ждет, пока не получит какой-то символ перед нажатием Enter?
0
 Аватар для Morfiy
5 / 5 / 1
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 18:44  [ТС]
Цитата Сообщение от Vorona Посмотреть сообщение
Morfiy, так вы попросили ничего не присваивать х, вот и ни чего не присваивается, если будет просто float x, то массив будет забит вообще левыми числами, изначально он забивался нулями, и после вашего вопроса, я хотел уточнить, если пользователь нажимает просто Enter, без присваивания до этого какого-либо значения, то программа ничего не делает, а ждет, пока не будет введено хоть какое-то значение?
как обычный cin >> x; жмем Enter, а оператор ждет, пока не получит какой-то символ перед нажатием Enter?
Да.
когда пользователь будет нажымать ентер и перед етим он не ввел ни какого значения, чтоб програма ждала пока независимо скоко раз он надмет ентер пока пользователь не введет значение

Добавлено через 15 минут
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Попробуй подключить заголовочный файл <iterator>
у тя таже проблема что и у Vorona.
когда пользователь будет нажымать ентер и перед етим он не ввел ни какого значения то твоя програма присваиваит значения 0 масиву
//----
std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout, " "));
что у тебя делает ета функцыя?
а то когда я ее удалаю из кода прога в конце выводит результат так:
1 2 3 4 5 6 7 8 9 0
а когда ее не удалять результат выводитса так:
1 2 3 4 5 6 7 8 9 0
1 2 3 4 5 6 7 8 9 0
Вот что я добавил в код твоей програмы:
Code
1
2
3
for (int i = 0; i < size; ++i) {
    std::cout << arr[i]<<" ";  }
    getch();
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
18.04.2010, 18:51
Цитата Сообщение от Morfiy Посмотреть сообщение
std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout, " "));
вывод массива на экран
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
18.04.2010, 19:04
Цитата Сообщение от Morfiy Посмотреть сообщение
C++
1
std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout, " "));
что у тебя делает ета функцыя?
Выводит содержание массива на экран.
Цитата Сообщение от Morfiy Посмотреть сообщение
у тя таже проблема что и у Vorona.
Проблема решается на раз. Новая версия функции EnterNumber:
C++
1
2
3
4
5
6
7
8
9
10
11
int EnterNumber() {
  std::string str;
  std::getline(std::cin, str);
 
  while (str.length() == 0 || 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());
}
1
Peace 2 all shining faces
 Аватар для Vorona
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
18.04.2010, 19:21
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
void enter(float&);
 
void main(){            
        float x;
        enter(x);
        cout << endl << x << endl;
        system("pause");
}
 
void enter(float &X){
        bool flag = true;
    int i = 0;
        char c = 0, x[10];
        x[0] = 'x';
                
        while(flag == true){
                c = getch();
                if(c == 8){
                        if(x[i] != 'x'){
                                cout << "\b \b";
                                x[(i--)-1] /= 10;
                        }
                        if(i == 0)
                                x[i] = 'x';
                }
                if(c >= '0' && c <= '9'){
                        x[i] = c;
                        cout << x[i];
                        i++;
                }
        if(c == 13 && x[i] != 'x')
            flag = false;
    }
        X = atof(x);
}
вот, пожалуйста)
1
 Аватар для Morfiy
5 / 5 / 1
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 19:36  [ТС]
Спасибо всем за помощь!!!
найболее правильный придставили Vorona и CyBOSSeR
0
302 / 160 / 62
Регистрация: 27.02.2010
Сообщений: 317
22.04.2010, 12:18
Понимаю, что уже поздно... но, все же вот еще вариант :
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
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <locale.h>
int proverka (char *b);
 
using namespace std;
 
const int SIZE=100;
 
int main() 
{
    setlocale(LC_ALL,"Russian");
    int n,k=0,d,a[SIZE],t=0;
    char b[SIZE];
 
    cout<<"Vvtdite n: ";
    cin>>n;
    cin.ignore(SIZE, '\n');
    
    for (int i=0; i<n; i++)
    {
        cout<<"Ведите ["<<i+1<<"] элемент массива: ";
        cin.getline(b, SIZE);
        t=proverka(b);
        if (t<0)
        {
            cout<<"Ошибка ввода!\n";
            i--;
        }
        else a[k++]=t;
    }
    cout<<"Rezultat: ";
    for (int i=0; i<k; i++)
        cout<<a[i]<<" ";
    cout<<endl;
}
int proverka (char *b)
{
    int d=0, n, k=0;
    char *b1=b;
    d=strlen(b);
    while(*b1)
    {
        if (*b1>='0'&&*b1<='9')
            k+=1;
        b1++;
    }
    if (k==d)
    {
        n= atoi (b);
        return n;
    }
    else 
        return -1;
}
Конструктивная критика приветствуется
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.04.2010, 12:18

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru