Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Конечный автомат для определения если в строке многоточие

11K
04 ноября 2008 года
zuze
84 / / 07.03.2008
Я хотел сделать конечный автомат для определения многоточия (трёх точек подряд)

Но у меня работает только когда я ввожу одну точку, если я ввожу что то другое программа зависает.

Помогите пожалуйста разобратся.
Это мой первый конечный автомат.

Вот для примера:

A... (есть многоточие)
A.... (нет многоточия)
A.A...A (есть многоточие)
A.A....A (нет многоточия)

Вот код на Си++

Код:
#include <iostream>
#include <conio.h>
using namespace std;

void main(void)
{
// Вводимая строка
char s[256];
// Начальное состояние
char state = '1';
// Индекс текущего символа
unsigned int i = 0;

      cout << "Enter string:" << endl;
      cin >> s;

     // Определение многоточия


     while (s[i+1] != '\0')
     {
            switch (state)
            {
              case '1':
              if (s == '.')
                state = '2';
              else
                state = '1';
              break;
              case '2':
              if (s == '.')
                state = '3';
                  else
                state = '1';
              break;
              case '3':
              if (s == '.')
                state = '4';
              else
                              state = '1';
              break;
              case '4':
              if (s == '.')
                state = '1';
              else
                state = 'F';
              break;
            }
     }

     if (state == 'F')
       cout << "Find ...";
     else
       cout << "Not Find ...";

     getch();
}


Также прилагаю картинку со схемой конечного автомата
11K
04 ноября 2008 года
zuze
84 / / 07.03.2008
Я исправил

Дело в том что я забыл сделать увеличение i в цикле

Код:
#include <iostream>
#include <conio.h>
using namespace std;

void main(void)
{
// Вводимая строка
char s[256];
// Начальное состояние
char state = '1';
// Индекс текущего символа
unsigned int i = 0;

      cout << "Enter string:" << endl;
      cin >> s;

     // Определение многоточия


     while (s[i+1] != '\0')
     {
            switch (state)
            {
              case '1':
              if (s == '.')
                state = '2';
              else
                state = '1';
              break;
              case '2':
              if (s == '.')
                state = '3';
                  else
                state = '1';
              break;
              case '3':
              if (s == '.')
                state = '4';
              else
                              state = '1';
              break;
              case '4':
              if (s == '.')
                state = '1';
              else
                state = 'F';
              break;
            }
     i = i + 1;
     }

     if (state == 'F')
       cout << "Find ...";
     else
       cout << "Not Find ...";

     getch();
}


Правельной работы стало больше.

Теперь работает не правельно вот в этих ситуациях:
Ввод:
...
A...A
...A
A...
40K
04 ноября 2008 года
Freya
11 / / 04.11.2008
Исправь : while(s != '\0') А то проверяешь не текущий элемент, а через один.
И в конце проверяй не только состояние state = F , но и состояние state = 4, как раз для ситуаций, когда строчка кончается многоточием, т.к. следующий символ будет \0 и состояние в F не переключится.
11K
04 ноября 2008 года
zuze
84 / / 07.03.2008
Всё работает, спасибо!!!

Если я где то сделал ошибку, поправте меня пожалуйста, но вроде всё верно.

Код:
#include <iostream>
#include <conio.h>
using namespace std;

void main(void)
{
// Вводимая строка
char s[256];
// Начальное состояние
char state = '1';
// Индекс текущего символа
unsigned int i = 0;

      cout << "Enter string:" << endl;
      cin >> s;

     // Определение многоточия
     do
     {
            switch (state)
            {
              case '1':
              if (s == '.')
                state = '2';
              else
                state = '1';
              break;
              case '2':
              if (s == '.')
                state = '3';
                  else
                state = '1';
              break;
              case '3':
              if (s == '.')
                state = '4';
              else
                state = '1';
              break;
              case '4':
              if (s == '.')
                state = '1';
              else
              if (s == '\0')
                 state = 'F';
              else
                state = 'F';
              break;
            }
     i = i + 1;
     }
     while (s[i-1] != '\0');

     if (state == 'F')
       cout << "Find ...";
     else
       cout << "Not Find ...";

     getch();
}


И хотел задать ещё маленький вопросик это самый лучший способ для построения конечных автоматов, то есть использовать do{...}while(...); и switch () или есть более лучшие способы реализации конечных автоматов?
40K
04 ноября 2008 года
Freya
11 / / 04.11.2008
Цитата:
И хотел задать ещё маленький вопросик это самый лучший способ для построения конечных автоматов, то есть использовать do{...}while(...); и switch () или есть более лучшие способы реализации конечных автоматов?



Вот этого не знаю... :( Мне кажется, что сочетание do-while и switch лучше всего.

11K
04 ноября 2008 года
zuze
84 / / 07.03.2008
А вот это условие я правельно добавил или нет?

 
Код:
if (s == '\0')
   state = 'F';


Вроде всё заработало, но это может быть случайным стечением обстоятельств, а хотелось бы знать наверника.
11K
04 ноября 2008 года
zuze
84 / / 07.03.2008
Этот код лишний

 
Код:
if (s == '\0')
   state = 'F';


Без него всё и так работает.
11K
05 ноября 2008 года
zuze
84 / / 07.03.2008
У меня ещё возникл маленький вопросик

А если нужно узнать количество многоточий в строке.

Я пытался сделать так

Обявил переменную

 
Код:
unsigned int p3 = 0;



И вставил

 
Код:
if (state == 'F')
   p3 = p3 + 1;


перед

 
Код:
i = i + 1;


А в p3 как был ноль так и остаётся чтобы я не вводил.

Как же мне зделать?
11K
05 ноября 2008 года
zuze
84 / / 07.03.2008
Прошу прощения в p3 не ноль, а всякое непонятное значение, но иногда работает правельно.

Правельная работа

Ввод: ...
Вывод: Numbers ... 1
Ввод: A...
Вывод: Numbers ... 1

Неправельная работа

Ввод: ...A...
Вывод: Numbers ... 5
Должно быть
Вывод: Numbers ... 2

Ввод: ...A
Вывод: Numbers ... 2
Должно быть
Вывод: Numbers ... 1

На всякий случай полный код

Код:
#include <iostream>
#include <conio.h>
using namespace std;

void main(void)
{
// Вводимая строка
char s[256];
// Начальное состояние
char state = '1';
// Индекс текущего символа
unsigned int i = 0;
unsigned int p3 = 0;

      cout << "Enter string:" << endl;
      cin >> s;

     // Определение многоточия
     do
     {
            switch (state)
            {
              case '1':
              if (s == '.')
                state = '2';
              else
                state = '1';
              break;
              case '2':
              if (s == '.')
                state = '3';
                  else
                state = '1';
              break;
              case '3':
              if (s == '.')
                state = '4';
              else
                state = '1';
              break;
              case '4':
              if (s == '.')
                state = '1';
              else
              if (s == '\0')
                 state = 'F';
              else
                state = 'F';
              break;
            }
     if (state == 'F')
        p3 = p3 + 1;
     i = i + 1;
     }
     while (s[i-1] != '\0');

     if (state == 'F')
       cout << "Find ..." << endl;
     else
       cout << "Not Find ..." << endl;

     cout << "Numbers ... " << p3;

     getch();
}
9.0K
05 ноября 2008 года
t-34
129 / / 30.11.2007
Цитата:

case '4':
if (s == '.')
state = '1';
else
if (s == '\0')
state = 'F';
else
state = 'F';
break;
}
if (state == 'F')
p3 = p3 + 1;


можно заменить на

 
Код:
case '4':
              if (s == '.')
                state = '1';
              else
              {
               state = '1';
               p3++;
               }
              break;
              default:state='1';

и в самом конце
 
Код:
if (p3>0)
       cout << "Find ..." << endl;
     else
       cout << "Not Find ..." << endl;

     cout << "Numbers ... " << p3;

     getch();
11K
06 ноября 2008 года
zuze
84 / / 07.03.2008
Кому интересно конечный автомат для определения количества точек не вошедших в многоточие и количество многоточий

Код:
#include <iostream>
#include <algorithm>
#include <conio.h>
using namespace std;

void main(void)
{
char s[256];
int i = 0;
unsigned int state = 0;

      cout << "Enter string:" << endl;
      cin >> s;

// Определения количества точек не входящих в многоточие
// и количества многоточий
do
{
    if (s != '.')
    {
       if (state == 3)
       {
          p3++;
          p1 -= 3;
       }
       state = 0;
    }
    else
    {
          p1++;
          state = std::min(state + 1, 4u);
    }
}
while (s[i++]);

cout << "Numbers . " << p1 << endl;
cout << "Numbers ... " << p3;

getch();
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог