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

автомат для проверки ввода - C++

Восстановить пароль Регистрация
 
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
04.04.2013, 15:32     автомат для проверки ввода #1
Доброго времени суток,

Нужно проверять ввод на ошибки, читаю матрицу. Пример ввода:
/*{
{1.0,2.0,3.0},
{4.0,5.0,6.0}
}*/

это содержится в переменной типа std::istream is;

начал решать с помощью if else и while, получается какая то большая структура из условий, я сам начинаю путаться, знакомый посоветовал использовать конечный автомат, до этого не был знаком с такой теорией, почитал, выглядит здорово. Но самому написать не выходит, застрял на бумаге...

Тип чисел double, точность произвольная, т.е. нужно по хорошему читать так is>>double d; посимвольно сложно будет

Проблема в том, что между смысловыми знаками в потоке могут случайным образом быть расставлены любые "пробельные" символы (табуляции, пробелы, новые строки). Мне нужно их игнорировать, одна из проблем - новая строка, с одной стороны там должна начаться новая строка матрицы, но ведь это может быть и просто символ если скобка строки еще не закрылась... И последняя строка после закрывающей скобки не имеет запятой, выходит нужно после каждой закрывающей скобки ждать либо запятую либо закрывающую скобку - еще одно условие с циклом у меня...

Буду благодарен, если кто-нибудь набросает на словах, как должен выглядеть такой автомат, или ссылку даст...

Добавлено через 16 минут
И из библиотек только iostream, sstream, iomanip, ничего другого нельзя использовать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2013, 15:32     автомат для проверки ввода
Посмотрите здесь:

C++ Конечный автомат для строк
C++ Как можно бы создать метод для ввода размерности (т.е. для ввода private переменных n,m)?
Не работает программа проверки ввода цифр C++
C++ Проверки ввода
Написать программу для проверки работы процедуры ScalarProduct для вычисления скалярного произведения двух векторов C++
Программа ввода и проверки пароля C++
Добавить в программу функцию проверки правильности ввода даты C++
C++ Ошибка проверки ввода

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2769 / 1582 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
04.04.2013, 18:11     автомат для проверки ввода #2
Мне кажется или эта задача проще, чем кажется?
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
std::vector<float> ReadRow(std::istream& is, size_t nCols)
{
    char c;
    is >> c;
    if (c != '{')
        throw ":-(";
    std::vector<float> result;
    size_t n = 0;
    while (true)
    {
        float x;
        is >> x;
        if (!is.good())
            throw ":-(";
        result.push_back(x);
        ++n;
        is >> c;
        if (n < nCols && c == ',')
            continue;
        else if (n == nCols && c == '}')
            break;
        else
            throw ":-(";
    }
    return result;
}
 
std::vector<std::vector<float>> ReadMatrix(std::istream& is, size_t nRows, size_t nCols)
{
    char c;
    is >> c;
    if (c != '{')
        throw ":-(";
    std::vector<std::vector<float>> result;
    size_t n = 0;
    while (true)
    {
        result.push_back(ReadRow(is, nCols));
        ++n;
        is >> c;
        if (n < nRows && c == ',')
            continue;
        else if (n == nRows && c == '}')
            break;
        else
            throw ":-(";
    }
    return result;
}
(Это если число строк и столбцов надо сверять с заранее известным.)
awpe
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 87
04.04.2013, 21:16  [ТС]     автомат для проверки ввода #3
Только аналог вектора придется написать самому Программу будут тестировать на скорость (до разумных пределов в рамках задания, дальше бонусы, но не с моими знаниями туда соваться ), поэтому попросил описание реализации как конечного автомата со switch case, если писать свой вектор, то ничем хорошим это не кончится , если делать кучу ифов, то либо что-то пропустишь либо скорость неахти, либо повезет и все будет тип топ В любом случае спасибо, потестирую, если все норм, то возьму проверки на вооружение

Добавлено через 3 часа 0 минут
Написал вот так:
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
using namespace std;enum States {
    State_StartMatrix,
    State_Start,
    State_OpenLine,
    State_NextLine,
    State_EndLine,
    State_EndMatrix,
    State_GotNumber,
    State_NextNumber,
    State_Error
};
 
int main(int argc, char** argv) {
 
 
    std::istringstream is;
    std::ostringstream os;
    bool MatrixOpened = false;
    bool LineOpened = false;
    int LinesCount = 0;
    double d;
    char c;
    is . clear();
    is . str("{ { 1.1782, 2, \n\t\r3, \n\t\r4\n\t\r }\n\t\r,\n\t\r {\n\t\r 4, 3, 2, 1 } } ");
 
 
    cout << is.str();
    bool WhileBool = true;
    States state = State_Start;
    const size_t length = is.str().length();
    while (WhileBool) {
        switch (state) {
            case State_Start:
                is >> skipws >> c;
                if (c == '{') {
                    state = State_StartMatrix;
                } else {
                    state = State_Error;
                }
                break;
            case State_StartMatrix:
                is >> skipws >> c;
                if (c == '{') {
                    LinesCount++;
                    state = State_NextNumber;
                } else {
                    state = State_Error;
                }
                break;
            case State_NextNumber:
                is >> skipws >> d;
                if (!is.fail()) {
                    cout << "num: '" << d << "'" << endl;
                    state = State_GotNumber;
                } else {
                    state = State_Error;
                }
                break;
            case State_GotNumber:
                is >> skipws >> c;
                if (c == ',') {
                    state = State_NextNumber;
                } else if (c == '}') {
                    state = State_EndLine;
                } else {
                    state = State_Error;
                }
                break;
            case State_EndLine:
                is >> skipws >> c;
                if (c == ',') {
                    state = State_StartMatrix;
                } else if (c == '}') {
                    state = State_EndMatrix;
                } else {
                    state = State_Error;
                }
                break;
            case State_EndMatrix:
                WhileBool = false;
                break;
            case State_Error:
                is.setstate(std::ios::failbit);
                WhileBool = false;
                break;
        }
    }
 
    cout<<is.fail()<<endl;
 
    return 0;
}
Это чисто проверка идеи, вылизывать не стал - кому надо сам поправит, принцип ясен.
Yandex
Объявления
04.04.2013, 21:16     автомат для проверки ввода
Ответ Создать тему
Опции темы

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