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

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

Войти
Регистрация
Восстановить пароль
 
 
Marad
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 15
#1

Пожалуйста найдите ошибку в Конечном Автомате на С++ - C++

06.04.2013, 00:11. Просмотров 610. Ответов 19
Метки нет (Все метки)

Помогите найти ошибку в Конечном Автомате на С++ для: а*b*с*(d|f)+n*h* .
Может даже и не верна введена таблица для исходного выражения.
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
#include "stdafx.h"
#include "iostream"
#include "string.h"
using namespace std;
 
void main()
{
    int j;  
    int a[6][7]=
            {
             {2,3,4,0,0,0,0},
             {0,3,4,0,0,0,0},
             {0,0,4,5,5,0,0},
             {0,0,0,5,5,6,7},
             {0,0,0,0,0,6,7},
             {0,0,0,0,0,0,7}
            };
char s[50];
cin>>s;
int size=strlen(s);
int i=0;
int q=1;
while ((q!=0)&(i<size))
      {
         cout<<"q=="<< q << "\n";
         switch(s[i])
            {
                case 'a': j=0; break;
                case 'b': j=1; break;
                case 'c': j=2; break;
                case 'd': j=3; break;
                case 'f': j=4; break;
                case 'n': j=5; break;
                case 'h': j=6; break;
                default: q=0; break;
            }
    q=a[q-1][j];
    cout<<"q= "<< q << '\n';
    i++;
      };
 
if ((q==5)|(q==7)) cout<<" Yes\n";
else cout<<" No\n";
system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2013, 00:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пожалуйста найдите ошибку в Конечном Автомате на С++ (C++):

Пожалуйста найдите ошибку - C++
У меня возникла проблема с програмой. Мне нужно вывести данные про ну например троих студентов, тоесть фамилию, имя, возраст и успеваемость...

Пожалуйста, найдите ошибку) - C++
вот такая задачка. Вывести на экран первые пять совершенных чисел (функция возвращает 1, если число совершенное, 0 – в противном...

Пожалуйста найдите ошибку - C++
На форуме нашел такую задачу: Гражданин 1 марта открыл счет в банке, вложив 1000 рублей. Через каждый месяц размер вклада увеличивается...

Найдите ошибку, пожалуйста - C++
Задача: Дано ряд символов. Заменить в нем круглые скобки на квадратные. Строку считывает, выводит не заменив скобки.:wall: ...

Найдите пожалуйста ошибку - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;ctime&gt; using namespace std; int main(){ char a; int zvezd,probel,b; int...

найдите ошибку пожалуйста - C++
Программа крашится сразу после входа в функцию sortsumma, не могу понять, что не так(функция на 49 строке) #include &lt;stdio.h&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.04.2013, 00:30 #2
Что код делать должен?

Добавлено через 8 минут
Что должно вводиться?
Marad
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 15
06.04.2013, 00:55  [ТС] #3
По идее, я должен вводить комбинацию из букв a,b,c,(d или f),n,h , где a* - значит что может быть хоть сколько элементов 'a' или не быть,также для и для b*,c*,n*,h*. А (d|f)+ это какой нибудь из двух элементов d или f ,
в котором может быть хоть сколько элементов, но обязательность должен быть один элемент. К примеру выражение abcdnh - верно, acfn-верно и даже просто d или f - верно.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.04.2013, 06:27 #4
Просто 'а' верно? Одиночные символы из набора - верно?
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
06.04.2013, 07:05 #5
Цитата Сообщение от Marad Посмотреть сообщение
Помогите найти ошибку в Конечном Автомате на С++ для: а*b*с*(d|f)+n*h* .
Может даже и не верна введена таблица для исходного выражения.
Если убрать из таблицы состояние 0, то получается примерно такая картинка. Как это связанно с выражением "а*b*с*(d|f)+n*h*" сложно понять... Вроде бы никак не связанна, т.е. автомат не соответствует этому выражению.
Миниатюры
Пожалуйста найдите ошибку в Конечном Автомате на С++  
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
06.04.2013, 07:44 #6
Вот вроде бы такой автомат должен быть:
Миниатюры
Пожалуйста найдите ошибку в Конечном Автомате на С++  
Marad
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 15
06.04.2013, 12:41  [ТС] #7
kamre, Дело в том, что это еще нужно запрограммировать на С++ таблицой

Добавлено через 6 минут
alsav22, Просто 'а' не будет верен, так как есть 'd' и 'f' , над которым стоит знак плюс, означает что 'd' или 'f' должен быть обязательно, верно будет ad или af. Также ответом является просто элемент 'd' или 'f'.
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
06.04.2013, 13:22 #8
Цитата Сообщение от Marad Посмотреть сообщение
kamre, Дело в том, что это еще нужно запрограммировать на С++ таблицой
Ну так подправьте свою таблицу исходя из картинки автомата. Это совсем не сложно: из состояния '1' при встрече буквы 'b' переход идет в состояние '2', значит на 1 строке (соотв. '1') во 2 столбце (соотв. 'b') стоит значение 2 (соотв. '2').
Marad
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 15
06.04.2013, 15:55  [ТС] #9
Извиняюсь, но до меня ваще не доходит, башка не шарит чета, можешь наброски хотя бы сделать
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
06.04.2013, 22:25 #10
Набросок (переходы из состояния '1'):
C++
1
2
3
4
5
6
7
8
9
10
int a[7][7] = }
/*         a  b  c  d  f  n  h */
/* 0 */  { 0, 0, 0, 0, 0, 0, 0 },
/* 1 */  { 1, 2, 3, 4, 4, 0, 0 },
/* 2 */  { 0, 0, 0, 0, 0, 0, 0 },
/* 3 */  { 0, 0, 0, 0, 0, 0, 0 },
/* 4 */  { 0, 0, 0, 0, 0, 0, 0 },
/* 5 */  { 0, 0, 0, 0, 0, 0, 0 },
/* 6 */  { 0, 0, 0, 0, 0, 0, 0 },
};
Остальные переходы аналогично.
Marad
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 15
07.04.2013, 02:34  [ТС] #11
kamre, Спасибо, программа стала работать лучше но все же есть косяки.
C++
1
2
3
4
5
6
7
8
9
10
    int a[6][7] = 
{
/*         a  b  c  d  f  n  h */
/* 1 */  { 2, 3, 4, 5, 5, 0, 0 },
/* 2 */  { 0, 3, 4, 5, 5, 0, 0 },
/* 3 */  { 0, 0, 4, 5, 5, 0, 0 },
/* 4 */  { 0, 0, 0, 5, 5, 6, 7 },
/* 5 */  { 0, 0, 0, 0, 0, 6, 7 },
/* 6 */  { 0, 0, 0, 0, 0, 0, 7 },
};
Вот я вставил остальные состояния, убрал первую нулевую строку, элементы прибавил на 1, так как использую q=a[q-1][j] в программе.
А можно как нибудь тебе файл отправить чтоб ты подкорректировал программу.

Добавлено через 15 минут
Похоже ошибка в таблице. К примеру, когда я ввожу 'a' 'd' то пишет верно и переходит на 5 строчку, когда 'a' 'd' 'd' то неверно, переходит на ноль.

Добавлено через 54 минуты
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
#include "stdafx.h"
#include "iostream"
#include "string.h"
using namespace std;
 
void main()
{
    int j;  
    int a[7][7] = 
{
/*         a  b  c  d  f  n  h */
/* 1 */  { 2, 3, 4, 0, 0, 0, 0 },
/* 2 */  { 2, 3, 4, 5, 5, 0, 0 },
/* 3 */  { 0, 3, 4, 5, 5, 0, 0 },
/* 4 */  { 0, 0, 4, 5, 5, 0, 0 },
/* 5 */  { 0, 0, 0, 5, 5, 6, 7 },
/* 6 */  { 0, 0, 0, 0, 0, 6, 7 },
/* 7 */  { 0, 0, 0, 0, 0, 0, 7 }
};
char s[50];
cin>>s;
int size=strlen(s);
int i=0;
int q=1;
while ((q!=0)&(i<size))
      {
         cout<<"q=="<< q << "\n";
         switch(s[i])
            {
                case 'a': j=0; break;
                case 'b': j=1; break;
                case 'c': j=2; break;
                case 'd': j=3; break;
                case 'f': j=4; break;
                case 'n': j=5; break;
                case 'h': j=6; break;
                default : q=0; break;
            }
    q=a[q-1][j];
    cout<<"q= "<< q << '\n';
    i++;
      };
 
if ((q==1)||(q==5)||(q==6)||(q==7)) cout<<" Yes\n";
else cout<<" No\n";
system("pause");
}
kamre, программа почти работает правильно, но есть одна ошибка, нужно чтоб было d и f были по отдельности как бы сказать, только d или f. Если же к примеру я ввожу acdddfn он должен вывести ошибку, а он говорит что это верно.

Добавлено через 13 секунд
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
#include "stdafx.h"
#include "iostream"
#include "string.h"
using namespace std;
 
void main()
{
    int j;  
    int a[7][7] = 
{
/*         a  b  c  d  f  n  h */
/* 1 */  { 2, 3, 4, 0, 0, 0, 0 },
/* 2 */  { 2, 3, 4, 5, 5, 0, 0 },
/* 3 */  { 0, 3, 4, 5, 5, 0, 0 },
/* 4 */  { 0, 0, 4, 5, 5, 0, 0 },
/* 5 */  { 0, 0, 0, 5, 5, 6, 7 },
/* 6 */  { 0, 0, 0, 0, 0, 6, 7 },
/* 7 */  { 0, 0, 0, 0, 0, 0, 7 }
};
char s[50];
cin>>s;
int size=strlen(s);
int i=0;
int q=1;
while ((q!=0)&(i<size))
      {
         cout<<"q=="<< q << "\n";
         switch(s[i])
            {
                case 'a': j=0; break;
                case 'b': j=1; break;
                case 'c': j=2; break;
                case 'd': j=3; break;
                case 'f': j=4; break;
                case 'n': j=5; break;
                case 'h': j=6; break;
                default : q=0; break;
            }
    q=a[q-1][j];
    cout<<"q= "<< q << '\n';
    i++;
      };
 
if ((q==1)||(q==5)||(q==6)||(q==7)) cout<<" Yes\n";
else cout<<" No\n";
system("pause");
}
kamre, программа почти работает правильно, но есть одна ошибка, нужно чтоб было d и f были по отдельности как бы сказать, только d или f. Если же к примеру я ввожу acdddfn он должен вывести ошибку, а он говорит что это верно.
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
07.04.2013, 04:48 #12
Цитата Сообщение от Marad Посмотреть сообщение
убрал первую нулевую строку, элементы прибавил на 1
Непонятно зачем прибавлял единицу.
Цитата Сообщение от Marad Посмотреть сообщение
Если же к примеру я ввожу acdddfn он должен вывести ошибку, а он говорит что это верно.
Почему должен вывести ошибку, если эта строка подходит под выражение а*b*с*(d|f)+n*h* ?
И автомат распознает ее корректно:
Миниатюры
Пожалуйста найдите ошибку в Конечном Автомате на С++  
Marad
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 15
07.04.2013, 10:27  [ТС] #13
d|f означает, что должен быть только один из этих элементов, либо d, либо f. И если автомат видит их сразу двоих, то обязан видеть ошибку
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
07.04.2013, 12:21 #14
Цитата Сообщение от Marad Посмотреть сообщение
d|f означает, что должен быть только один из этих элементов, либо d, либо f. И если автомат видит их сразу двоих, то обязан видеть ошибку
(d|f)+ допускает любое сочетание из d и f, откуда ошибка?
Marad
0 / 0 / 0
Регистрация: 05.04.2013
Сообщений: 15
07.04.2013, 14:21  [ТС] #15
Ошибка в том, что должно быть только одна из этих букв d или f, так как символ ' | ' в выражении (d|f)+ означает или f или d. Если я введу выражение abcdfnh acdf acdf df , то все они будет не верны. Должно быть abcdnh или abcfnh, acf, acd, f , d . А где именно исправить это я не знаю. Нужно добавить в программе что если в выражении попадутся d и f, выдавала ошибку. Типо добавить
C++ (Qt)
1
if  f & d =0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2013, 14:21
Привет! Вот еще темы с ответами:

Найдите ошибку пожалуйста... - C++
Программа считает сумму ряда с точность 0.001, формула n!/3*n^n Вроде все правильно, программа запускается но сразу вылетает с ошибкой...

Найдите ошибку пожалуйста - C++
Дана функция f(x) = x3 – 3*sin(x), необходимо определить минимум данной функции на отрезке методом дихотомии. При запуске вылетает...

найдите пожалуйста ошибку - C++
почему то слепляет возраст и имя 2го и 3го рабочих #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; main() { int...

найдите ошибку и покажите пожалуйста - C++
Прошу помочь, сейчас изучаю логическую переменную bool а также такие логические операторы (и,или,не)...так вот. Не могу понять в чем...


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

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

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