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

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

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

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

16.04.2010, 23:47. Просмотров 5044. Ответов 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
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
18.04.2010, 17:23 #31
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 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 18:02  [ТС] #32
В 32-й строке кода у меня выдает ошыбку
Expression syntax
Undefined symbol 'ostream_iterator'

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

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

2
Для продолжения нажмите любую клавишу . . .
//--
суть проблемы в том что к примеру какаято блондинка на роботе будет пить кофе и случайно зажмет Ентер и выйдет так что она задаст весь масив числами 2
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
18.04.2010, 18:04 #33
Цитата Сообщение от Morfiy Посмотреть сообщение
В 32-й строке кода у меня выдает ошыбку
Expression syntax
Undefined symbol 'ostream_iterator'
Попробуй подключить заголовочный файл <iterator>.
C++
1
#include <iterator>
0
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
18.04.2010, 18:14 #34
Morfiy, так вы попросили ничего не присваивать х, вот и ни чего не присваивается, если будет просто float x, то массив будет забит вообще левыми числами, изначально он забивался нулями, и после вашего вопроса, я хотел уточнить, если пользователь нажимает просто Enter, без присваивания до этого какого-либо значения, то программа ничего не делает, а ждет, пока не будет введено хоть какое-то значение?
как обычный cin >> x; жмем Enter, а оператор ждет, пока не получит какой-то символ перед нажатием Enter?
0
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 18:44  [ТС] #35
Цитата Сообщение от 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
Вот что я добавил в код твоей програмы:
Код
for (int i = 0; i < size; ++i) {
    std::cout << arr[i]<<" ";  }
    getch();
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.04.2010, 18:51 #36
Цитата Сообщение от Morfiy Посмотреть сообщение
std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout, " "));
вывод массива на экран
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
18.04.2010, 19:04 #37
Цитата Сообщение от 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
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
18.04.2010, 19:21 #38
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 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 19:36  [ТС] #39
Спасибо всем за помощь!!!
найболее правильный придставили Vorona и CyBOSSeR
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
22.04.2010, 12:18 #40
Понимаю, что уже поздно... но, все же вот еще вариант :
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
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
22.04.2010, 21:57  [ТС] #41
Цитата Сообщение от NNN777 Посмотреть сообщение
Понимаю, что уже поздно... но, все же вот еще вариант :
Конструктивная критика приветствуется
твоя проверка вовсе не работа ввожу буквы и прога виснет
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
22.04.2010, 22:47 #42
Сейчас нет возможности еще раз проверить, но у меня отлично работала - сначала вводишь число элементов, а потом сами элементы, они-то и проверяются на тип данных... может, потому что моя прога VS написана...
0
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
22.04.2010, 22:56  [ТС] #43
Цитата Сообщение от NNN777 Посмотреть сообщение
Сейчас нет возможности еще раз проверить, но у меня отлично работала - сначала вводишь число элементов, а потом сами элементы, они-то и проверяются на тип данных... может, потому что моя прога VS написана...
Да прошу прощения проверка почти работа
токо в проге не предусмотрено 1 вещь
когда пользователь нечево не вводит а просто нажыме ентер то масиму приспаютса бог зна какие значения нужна чтоб прога ждала пока пользователь не введет значение)
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
23.04.2010, 09:45 #44
Цитата Сообщение от Morfiy Посмотреть сообщение
токо в проге не предусмотрено 1 вещь
когда пользователь нечево не вводит а просто нажыме ентер то масиму приспаютса бог зна какие значения нужна чтоб прога ждала пока пользователь не введет значение)
Точно! Спасибо, что заметили.
Вот исправленная версия программы, но не знаю, насколько она удачна
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
57
58
59
60
61
62
63
64
#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<<"] элемент массива: ";
m:
        cin.getline(b, SIZE);
        t=proverka(b);
        if (t<0)
        {
            cout<<"Ошибка ввода!\n";
            i--;
        }
        else 
        {
            if(t==0&&*b!='0')
                while (t==0)
                    goto m;
            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
Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
23.04.2010, 11:11  [ТС] #45
Цитата Сообщение от NNN777 Посмотреть сообщение
Точно! Спасибо, что заметили.
Вот исправленная версия программы, но не знаю, насколько она удачна
если я правильно понял как работа твоя проверка
то она когда вводитса неверное значение сохраняет пиременной -1 и потом идет проверка если введено менше 0 то выбивает ошыбку но всетаки если так подумать то пользователь может вводить отрицательные числа ,ты смож переделать так чтоб з отрицательными и дробовыми числами?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2010, 11:11
Привет! Вот еще темы с ответами:

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


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

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

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