#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();
}
Конечный автомат для определения если в строке многоточие
Но у меня работает только когда я ввожу одну точку, если я ввожу что то другое программа зависает.
Помогите пожалуйста разобратся.
Это мой первый конечный автомат.
Вот для примера:
A... (есть многоточие)
A.... (нет многоточия)
A.A...A (есть многоточие)
A.A....A (нет многоточия)
Вот код на Си++
Код:
Также прилагаю картинку со схемой конечного автомата
Дело в том что я забыл сделать увеличение 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();
}
#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...
И в конце проверяй не только состояние state = F , но и состояние state = 4, как раз для ситуаций, когда строчка кончается многоточием, т.к. следующий символ будет \0 и состояние в F не переключится.
Если я где то сделал ошибку, поправте меня пожалуйста, но вроде всё верно.
Код:
#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();
}
#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 () или есть более лучшие способы реализации конечных автоматов?
Цитата:
И хотел задать ещё маленький вопросик это самый лучший способ для построения конечных автоматов, то есть использовать do{...}while(...); и switch () или есть более лучшие способы реализации конечных автоматов?
Вот этого не знаю... :( Мне кажется, что сочетание do-while и switch лучше всего.
Код:
if (s == '\0')
state = 'F';
state = 'F';
Вроде всё заработало, но это может быть случайным стечением обстоятельств, а хотелось бы знать наверника.
Код:
if (s == '\0')
state = 'F';
state = 'F';
Без него всё и так работает.
А если нужно узнать количество многоточий в строке.
Я пытался сделать так
Обявил переменную
Код:
unsigned int p3 = 0;
И вставил
Код:
if (state == 'F')
p3 = p3 + 1;
p3 = p3 + 1;
перед
Код:
i = i + 1;
А в 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();
}
#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();
}
Цитата:
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 (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();
cout << "Find ..." << endl;
else
cout << "Not Find ..." << endl;
cout << "Numbers ... " << p3;
getch();
Код:
#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();
}
#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();
}