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

Нужен фильтр ввода данных - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
10.03.2014, 17:55     Нужен фильтр ввода данных #1
Собственно вот моя первая программа по переводе арабских цифр в римские (она переводит не в настоящую римскую систему, но суть не в этом).

Столкнулся с проблемой проверки ввода данных, если ввести например "778gkdc8899" то считает 778 а остальное отбрасывает, и ошибку не выбивает - а нужно что бы выбивало ошибку при вводе любой НЕцифры! Также при вводе например 78.7 - не выбивает ошибку.(


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 <stdio.h> // для функций ввода/вывода
#include <conio.h> // для функции getch()
#include <cstdlib> // для функции system("cls")
 
 
int roman(int,int,char);// декларация функции.
 
int main()
{
    int a;
    char con;
    do
    {
     do
      {
        system("cls");
        printf("| 1000 - M | 500 - D | 100 - C | 50 - L | 10 - X | 5 - M | 1 - I |\n");
        printf(" ENTER NATURAL NUMBER (arabic)\n");
        /* %d - специф. формата - решает как вводить и выводить аргумент. */
        if (!(scanf("%d",&a)) || (a<=0))// проверка правильности ввода.
            {
               printf(" ERROR ENTER\a\n");
               printf(" to continue, press any key...\n");
               getch();
               a=0;
               fflush(stdin);// очистка буфера ввода.
            }
       }
     while (a==0);
     printf(" ROMAN NUMBER =>");
     a=roman(a,1000,'M');// подключает функцию roman.
     a=roman(a,500,'D');
     a=roman(a,100,'D');
     a=roman(a,50,'L');
     a=roman(a,10,'X');
     a=roman(a,5,'V');
     a=roman(a,1,'I');
     fflush(stdin);
     printf("\n to continue the program, enter => 'y'\n");
     printf(" to exit the program, enter any key...\n");
     scanf("%c", &con);
     if (con!='y')exit(0);
    }
    while (con=='y');
    getch();
    return 0;
}
int roman(int i, int j, char c) // описание функции roman (выводит результат).
{
    while (i>=j)
    {
        putchar(c);// выводит символ на экран.
        i=i-j;
    }
    return(i);// возврат значения i.
}
Добавлено через 2 часа 1 минуту
Никто не поможет?) Не может быть такого, что никто не сталкивался с этим.

Добавлено через 3 часа 53 минуты
(((((
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kylroma
Одессит
 Аватар для kylroma
44 / 44 / 18
Регистрация: 30.12.2013
Сообщений: 203
Записей в блоге: 1
Завершенные тесты: 1
10.03.2014, 18:20     Нужен фильтр ввода данных #2
Нужно использовать функции isdigit() - возвращает true, если аргумент десятичная цифра. Или isalpha() - возвращает true, если аргумент буква. И не забыть #include <cctype>
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
10.03.2014, 19:06  [ТС]     Нужен фильтр ввода данных #3
Цитата Сообщение от kylroma Посмотреть сообщение
Нужно использовать функции isdigit() - возвращает true, если аргумент десятичная цифра. Или isalpha() - возвращает true, если аргумент буква. И не забыть #include <cctype>
А можно поподробней об этом? С примером, оч благодарен буду.
kylroma
Одессит
 Аватар для kylroma
44 / 44 / 18
Регистрация: 30.12.2013
Сообщений: 203
Записей в блоге: 1
Завершенные тесты: 1
10.03.2014, 20:23     Нужен фильтр ввода данных #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <cctype>
 
using namespace std;
int main()
{
    char ch[20];
    cin.get(ch,20);
    for(int i=0; i<20; i++) {
    if(ch[i] == '.') break;
    if(isdigit(ch[i])) printf("Cifra", ch);
  }
    return 0;
}
Добавлено через 18 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cctype>
 
using namespace std;
int main()
{
    char ch;
    cin.get(ch);
    if(isalpha(ch))// можно поставить  if(!isalpha(ch)), тогда будет наоборот
    cout << "Error" << ch;
    return 0;
}
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
10.03.2014, 20:46  [ТС]     Нужен фильтр ввода данных #5
Цитата Сообщение от kylroma Посмотреть сообщение
Код C++

#include <iostream>
#include <cctype>
using namespace std;
int main()
{
* * char ch[20];
* * cin.get(ch,20);
* * for(int i=0; i<20; i++) {
* * if(ch[i] == '.') break;
* * if(isdigit(ch[i])) printf("Cifra", ch);
* }
* * return 0;
}
Так мне его куда вставлять? Под 18 строку?
kylroma
Одессит
 Аватар для kylroma
44 / 44 / 18
Регистрация: 30.12.2013
Сообщений: 203
Записей в блоге: 1
Завершенные тесты: 1
10.03.2014, 21:55     Нужен фильтр ввода данных #6
Я не правильно написал. Я подумал, что строка вводится в char con, а она в int идёт.

Добавлено через 43 минуты
Долго сидел, так не до чего и не додумался. Честно говоря мне тяжело разобрать код.
Единственное до чего додумался, так это вводить числа в char, проверять на лишние символы и потом переводить в int (вроде как можно Существует ли метод/функция перевода значения символьной переменной в int)
Я сам новичок. Уверен, что есть и проще решения, но я их не знаю. ((
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 07:53     Нужен фильтр ввода данных #7
C++
1
2
3
4
5
6
7
8
// в строке ввода только цифры, перед которыми могут быть + или -.
int a;
while (!(cin >> a) || (cin.peek() != '\n'))
{
    cin.clear();
    while (cin.get() != '\n');
    cout << "Error!" << endl;
}
Если изменить тип a на double или float, то в строке ввода может быть точка.
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
11.03.2014, 10:18  [ТС]     Нужен фильтр ввода данных #8
Цитата Сообщение от alsav22 Посмотреть сообщение
// в строке ввода только цифры, перед которыми могут быть + или -.
int a;
while (!(cin >> a) || (cin.peek() != '\n'))
{
* * cin.clear();
* * while (cin.get() != '\n');
* * cout << "Error!" << endl;
}
Отлично все работает.
Теперь будьте добры, прокомментируйте что тут происходит, если не затруднит)

Добавлено через 17 минут
И нужно что бы со знаком "-" тоже блокировал(
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 10:56     Нужен фильтр ввода данных #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от andreyananas Посмотреть сообщение
И нужно что бы со знаком "-" тоже блокировал(
C++
1
2
3
4
5
6
7
int a;
while (!(cin >> a) || (cin.peek() != '\n') || a < 0)
{
     cin.clear();
     while (cin.get() != '\n');
     cout << "Error!" << endl;
}
andreyananas
 Аватар для andreyananas
17 / 17 / 5
Регистрация: 15.10.2013
Сообщений: 804
11.03.2014, 11:04  [ТС]     Нужен фильтр ввода данных #10
А как же пояснить?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2014, 11:12     Нужен фильтр ввода данных
Еще ссылки по теме:

C++ проверка ввода данных
Проверка ввода данных C++
C++ Фильтр ввода на конкретные символы

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2014, 11:12     Нужен фильтр ввода данных #11
!(cin >> a) // если неправильный ввод (первый символ буква) поток становится false, невведённое остаётся в очереди ввода,
или ввод правильный, но
(cin.peek() != '\n') // в строке ввода осталось ещё что-то кроме '\n' (cin.peek() выдаёт следующий символ в очереди ввода),
или то и то правильно, но число a < 0, то
cin.clear();// сбрасываем флаг ошибки (чтобы поток снова стал рабочим)
while (cin.get() != '\n'); (извлекаем всё, что осталось в очереди при ошибке ввода, в том числе и '\n'(очистака очереди ввода)).
Yandex
Объявления
11.03.2014, 11:12     Нужен фильтр ввода данных
Ответ Создать тему
Опции темы

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