powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Неправильная работа распознавателя единиц
10 сообщений из 10, страница 1 из 1
Неправильная работа распознавателя единиц
    #38931297
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот у меня есть созданный код для выявление в введеной строке консоле
трех единиц. Если ввожу сразу 111 то получаю ответ что строка правльная, если иначе --0111, -1011 --что неправильная, хотя это уведомления должно было появляться лиш при например 00011
Код: plaintext
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.
#include <stdio.h>
#include <iostream>
#include <string.h>

using namespace std;

void razposnavatel() {
	char k[10];
	cout << "VVesti stroku 0 i 1:";
	cin >> k;
	int state = 0;
	for (int i = 0; k[i] != '0'; i++) {
		switch (state) {
		case 0: {
			if (k[i] == '0') {
				state = 0;
				break;
			};
			if (k[i] == '1') {
				state = 1;
				break;
			};
			break;
		}
		case 1: {
			if (k[i] == '0') {
				state = 1;
				break;
			};
			if (k[i] == '1') {
				state = 2;
				break;
			};
			break;
		}
		case 2: {
			if (k[i] == '0') {
				state = 2;
				break;
			};
			if (k[i] == '1') {
				state = 3;
				break;
			};
			break;
		}
		case 3: {
			if (k[i] == '0') {
				state = 3;
				break;
			};
			if (k[i] == '1') {
				state = 4;
				break;
			};
			break;
		}
		}
	}
	if (state == 3)
		cout << "pravylno";
	else
		cout << "netu v stroke 3 edinicy";
	cout << state;

}

int main() {
	razposnavatel();
	return 0;
}
...
Рейтинг: 0 / 0
Неправильная работа распознавателя единиц
    #38931299
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut,
То есть если в начале есть 0 то
cout<<state; выводит что состояние 0 --= хотя потом могут идти 1 которые при состояние 0 увеличивают его на 1.
Если 10111 -- то состояние 1?
...
Рейтинг: 0 / 0
Неправильная работа распознавателя единиц
    #38931316
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut, да вы шутите. Пройдитесь циклом по массиву, и в счётчик просуммируйте количество единиц.



Код: plaintext
1.
2.
3.
4.
5.
for(...){
   if(...){
        ++count;
   }
}




PS
Ваш код выше полностью некорректен.
...
Рейтинг: 0 / 0
Неправильная работа распознавателя единиц
    #38931317
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подробнее на всякий случай.
SSstut, да вы шутите. Пройдитесь циклом по массиву, и в счётчик просуммируйте количество единиц.



Код: plaintext
1.
2.
3.
4.
5.
6.
count==0;
for(int i=0;i<len;++i){
   if(a[i]=='1'){
        ++count;
   }
}
...
Рейтинг: 0 / 0
Неправильная работа распознавателя единиц
    #38931320
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ищи ошибку в этой строчке.
stut
Код: plaintext
1.
for (int i=0; k[i]!='0'; i++) {


Как написал - так и работает.
...
Рейтинг: 0 / 0
Неправильная работа распознавателя единиц
    #38931668
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошие у вас подсказки о сумирование.
for (int i=0; k[i]!='0'; i++) ---> for (int i=0; k[i]!='\0'; i++) -- вот спасибо очень -- а то бы еще долго искал.
У меня еще другой пример уже не к конечным автоматам, а к МП-автоматам с магазинной памяттью. У них должен быть магазин (где нули заставляют стек увеличиватся на 1, а 1--выталкивают некий условный символ Z. D начале есть еще в стеке символ пустого пространства-p.)/ Мне надо следующий код записать с помошью стека.
надо распознавателем проверить строку: {In0n |n=5} + {Im0m |n=4} n--верхний индекс -- я так понимаю мне надо найти такую строку в входных цепях:
1111100000|00001111 или если между двумя подмножествами может быть иная упорядоченость символов то например 1111100000|0001|00001111.
Это я делаю с помошью кода такого как предыдущий а надо с помощью стека. Не подскажите как это делать. Я так понимаю--состояние1--вход 1 (занесение в стек), 2-потом вход 0 выталикание со стека. Потом надо наверное изменить ход работы стека на занесение Z
при встече 0 в {Im0m |n=4}, а потом выталкивание при встрече 1.
Вот код который подходит под ка, а не мп-автомат.

Код: plaintext
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.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
#include <stdio.h>
#include <iostream>
#include <string.h>

using namespace std;

int state = 0;

void razpoznavat() {
	char k[20];
	cout << "Vvesti stroku 0 i 1:";
	cin >> k;
	for (int i = 0; k[i] != '\0'; i++) {

		switch (state) {
		case 0: {
			if (k[i] == '0') {
				state = 20;
				break;
			};
			if (k[i] == '1') {
				state = 1;
				break;
			};
			break;
		}

		case 1: {
			if (k[i] == '0') {
				state = 20;
				break;
			};
			if (k[i] == '1') {
				state = 2;
				break;
			};
			break;
		}

		case 2: {
			if (k[i] == '0') {
				state = 20;
				break;
			};
			if (k[i] == '1') {
				state = 3;
				break;
			};
			break;
		}

		case 3: {
			if (k[i] == '0') {
				state = 20;
				break;
			};
			if (k[i] == '1') {
				state = 4;
				break;
			};
			break;
		}

		case 4: {
			if (k[i] == '0') {
				state = 20;
				break;
			};
			if (k[i] == '1') {
				state = 5;
				break;
			};
			break;

			case 5:
			{
				if (k[i] == '0') {
					state = 6;
					break;
				};
				if (k[i] == '1') {
					state = 20;
					break;
				};
				break;
			}

			case 6:
			{
				if (k[i] == '0') {
					state = 7;
					break;
				};
				if (k[i] == '1') {
					state = 20;
					break;
				};
				break;
			}

			case 7:
			{
				if (k[i] == '0') {
					state = 8;
					break;
				};
				if (k[i] == '1') {
					state = 20;
					break;
				};
				break;
			}

			case 8:
			{
				if (k[i] == '0') {
					state = 9;
					break;
				};
				if (k[i] == '1') {
					state = 20;
					break;
				};
				break;
			}

			case 9:
			{
				if (k[i] == '0') {
					state = 10;
					break;
				};
				if (k[i] == '1') {
					state = 20;
					break;
				};
				break;
			}

			case 10:
			{
				if (k[i] == '0') {
					state = 11;
					break;
				};
				if (k[i] == '1') {
					state = 20;
					break;
				};
				break;
			}

			case 11:
			{
				if (k[i] == '0') {
					state = 12;
					break;
				};
				if (k[i] == '1') {
					state = 20;
					break;
				};
				break;
			}

			case 12:
			{
				if (k[i] == '0') {
					state = 13;
					break;
				};
				if (k[i] == '1') {
					state = 20;
					break;
				};
				break;
			}

			case 13:
			{
				if (k[i] == '0') {
					state = 14;
					break;
				};
				if (k[i] == '1') {
					state = 20;
					break;
				};
				break;
			}

			case 14:
			{
				if (k[i] == '0') {
					state = 20;
					break;
				};
				if (k[i] == '1') {
					state = 15;
					break;
				};
				break;
			}

			case 15:
			{
				if (k[i] == '0') {
					state = 20;
					break;
				};
				if (k[i] == '1') {
					state = 16;
					break;
				};
				break;
			}

			case 16:
			{
				if (k[i] == '0') {
					state = 20;
					break;
				};
				if (k[i] == '1') {
					state = 17;
					break;
				};
				break;
			}

			case 17:
			{
				if (k[i] == '0') {
					state = 20;
					break;
				};
				if (k[i] == '1') {
					state = 18;
					break;
				};
				break;

			}
		}
		}
	}
}


int main()
{
	razpoznavat()
	if (state == 18)
		cout << " Pravilnaya cep ";
	else
		cout << "Nepravilnaya cep";
	cout << state;
	return 0;
}

...
Рейтинг: 0 / 0
Неправильная работа распознавателя единиц
    #38931763
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutУ меня еще другой пример уже не к конечным автоматам, а к МП-автоматам с магазинной памяттью. У них должен быть магазин (где нули заставляют стек увеличиватся на 1, а 1--выталкивают некий условный символ Z. D начале есть еще в стеке символ пустого пространства-p.)/ Мне надо следующий код записать с помошью стека.
надо распознавателем проверить строку: {In0n |n=5} + {Im0m |n=4} n--верхний индекс -- я так понимаю мне надо найти такую строку в входных цепях:
1111100000|00001111 или если между двумя подмножествами может быть иная упорядоченость символов то например 1111100000|0001|00001111.
Это я делаю с помошью кода такого как предыдущий а надо с помощью стека. Не подскажите как это делать. Я так понимаю--состояние1--вход 1 (занесение в стек), 2-потом вход 0 выталикание со стека. Потом надо наверное изменить ход работы стека на занесение Z
при встече 0 в {Im0m |n=4}, а потом выталкивание при встрече 1.
Ничего не понял. Какой-то поток сознания. Объясни на простом примере чего делаешь.
...
Рейтинг: 0 / 0
Неправильная работа распознавателя единиц
    #38931942
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНичего не понял. Какой-то поток сознания. Объясни на простом примере чего делаешь.

Да лабы человек делает...
...
Рейтинг: 0 / 0
Неправильная работа распознавателя единиц
    #38932193
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интерес бы представлял генератор который такие автоматы создаёт. Но копать
рукотворный код весьма уныло. Он слишком плоский чтобы представлять интерес
для изучения, но и слишком объёмный (этакую "простыню" только под спойлер) чтобы
рассматривать его как учебное пособие.
...
Рейтинг: 0 / 0
Неправильная работа распознавателя единиц
    #38932509
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дан МП-автомат точнее строка которую он распознает.
{In0n |n=5} + {Im0m |n=4}. Знаю что первый или второй компонент занчит что после ен или ем 0 (1) идет столько же другой двоечной цыфри. А что значит сумирование точно не знаю. Хотя вполне логичное предположение я сделал.
Потом есть код который рапознает эти строчки:
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
int state=0;
void rozpiznavach () {
char k[20];
cout<<"Vvedit ryadok 0 i 1:";
cin >>k;
for (int i=0; k[i]!='\0'; i++) {

switch (state) {
case 0: {
if (k[i]=='0') {state=20; break;};
if (k[i]=='1') {state=1; break;};
break;
}

case 1: {
if (k[i]=='0') {state=20; break;};
if (k[i]=='1') {state=2; break;};
break;
}

case 2: {
if (k[i]=='0') {state=20; break;};
if (k[i]=='1') {state=3; break;};
break;
}


case 3: {
if (k[i]=='0') {state=20; break;};
if (k[i]=='1') {state=4; break;};
break;
}

case 4: {
if (k[i]=='0') {state=20; break;};
if (k[i]=='1') {state=5; break;};
break;

case 5: {
if (k[i]=='0') {state=6; break;};
if (k[i]=='1') {state=20; break;};
break;
}

case 6: {
if (k[i]=='0') {state=7; break;};
if (k[i]=='1') {state=20; break;};
break;
}



case 7: {
if (k[i]=='0') {state=8; break;};
if (k[i]=='1') {state=20; break;};
break;
}

case 8: {
if (k[i]=='0') {state=9; break;};
if (k[i]=='1') {state=20; break;};
break;
}



case 9: {
if (k[i]=='0') {state=10; break;};
if (k[i]=='1') {state=20; break;};
break;
}

case 10: {
if (k[i]=='0') {state=11; break;};
if (k[i]=='1') {state=20; break;};
break;
}


case 11: {
if (k[i]=='0') {state=12; break;};
if (k[i]=='1') {state=20; break;};
break;
}


case 12: {
if (k[i]=='0') {state=13; break;};
if (k[i]=='1') {state=20; break;};
break;
}


case 13: {
if (k[i]=='0') {state=14; break;};
if (k[i]=='1') {state=20; break;};
break;
}

case 14: {
if (k[i]=='0') {state=20; break;};
if (k[i]=='1') {state=15; break;};
break;
}

case 15: {
if (k[i]=='0') {state=20; break;};
if (k[i]=='1') {state=16; break;};
break;
}


case 16: {
if (k[i]=='0') {state=20; break;};
if (k[i]=='1') {state=17; break;};
break;
}

case 17: {
if (k[i]=='0') {state=20; break;};
if (k[i]=='1') {state=18; break;};
break;

}
}
}
}
}
int main()

{
rozpiznavach ();
if (state==18) cout<<"ryadok pravylnyy";
else cout<<"ryadok ne mistyt 3-yoh odynyc";
return 0;
}
--но это только один вариант. Вообще МП-автомат работает со стеком. Сперва помещается символ пустого пространства --потом при поступление нулей стек заполняется знаком Z--потом при входе 1. выталкивается.Е если все 1 выталкнуты значит строчка подходит под правило.
{0mIm |n=4} -- а не под {Im0m |n=4}. Думаю схема со {In0n |n=5} --аналогична.
Здесь сумирование этих действий?
Потому и вопрос как сделать со стеком.
stack.push (V) пустое пространтсво.
if (k[i]==1) stack.push (Z);
if (k[i]==0) stack.pop;
if stack.top==V; cout<<число единиц равно число нулей в даной цепочке.
Хотя Если не поставит счетчик после каждого push или pop то наверное
не подсчитает сколько там подоряд было единиц и нулей -- 5 или 10 или 100.
В теории МП-автоматы именно через стек моделируются а что через код невозможно реализовать-- задание такое ж ведь есть.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Неправильная работа распознавателя единиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]