ИДЗ вариант 10
.docxЛипецкий государственный технический университет
Кафедра автоматизированных систем управления
Индивидуальное домашнее задание
по Теории вычислительных процессов и структур
Описание грамматики, порождающей язык
|
Студент |
|
|
|
Ключанских А.С |
|
|||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
|||||||||
|
Группа |
|
АС-10 |
|
|
|
|||||||||
|
|
|
|
|
|
|
|||||||||
|
Принял |
|
|
|
|
|
|||||||||
|
доцент |
|
|
|
Гаев Л.В. |
|
|||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2013
-
Задание кафедры
Описать грамматику, порождающую язык. Написать программу, которая по грамматике генерирует введенную цепочку языка, выдавая все возможные способы ее порождения.
10. Десятичные натуральные числа, кратные 6
-
Описание грамматики
1. SC6A 2. 0DD0 3. 1DD1 4. 2DD2 5. 3DD3 6. 4DD4 7. 5DD5 8. 6DD6 9. 7DD7 10. 8DD8 11. 9DD9 12. AD 13. CD 14. 0A6A 15. 1A7A 16. 2A8A 17. 3A9A 18. 4A B0K 19. 5A B1K 20. 6A B2K 21. 7AB3K 22. 8AB4K 23. 9AB5K |
24. 0B1E 25. 1B2E 26. 2B3E 27. 3B4E 28. 4B5E 29. 5B6E 30. 6B7E 31. 7B8E 32. 8B9E 33. 9BB0 34. CBC1E 35. E00E 36. E11E 37. E22E 38. E33E 39. E44E 40. E55E 41. E66E 42. E77E 43. E88E 44. E99E 45. EKA
|
-
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
void main()
{
setlocale(LC_ALL,"Russian");
int search (char* s ,char* h[2][46],int _ot,int _do);
char stroka[50],*pravil[2][46],*str, *temp,*tmp1;
int fl=0,kol=0,n=0,r=0,scet=0;
pravil[0][1]="S";
pravil[1][1]="C6A";
pravil[0][2]="0D";
pravil[1][2]="D0";
pravil[0][3]="1D";
pravil[1][3]="D1";
pravil[0][4]="2D";
pravil[1][4]="D2";
pravil[0][5]="3D";
pravil[1][5]="D3";
pravil[0][6]="4D";
pravil[1][6]="D4";
pravil[0][7]="5D";
pravil[1][7]="D5";
pravil[0][8]="6D";
pravil[1][8]="D6";
pravil[0][9]="7D";
pravil[1][9]="D7";
pravil[0][10]="8D";
pravil[1][10]="D8";
pravil[0][11]="9D";
pravil[1][11]="D9";
pravil[0][12]="A";
pravil[1][12]="D";
pravil[0][13]="CD";
pravil[1][13]="";
pravil[0][14]="0A";
pravil[1][14]="6A";
pravil[0][15]="1A";
pravil[1][15]="7A";
pravil[0][16]="2A";
pravil[1][16]="8A";
pravil[0][17]="3A";
pravil[1][17]="9A";
pravil[0][18]="4A";
pravil[1][18]="B0K";
pravil[0][19]="5A";
pravil[1][19]="B1K";
pravil[0][20]="6A";
pravil[1][20]="B2K";
pravil[0][21]="7A";
pravil[1][21]="B3K";
pravil[0][22]="8A";
pravil[1][22]="B4K";
pravil[0][23]="9A";
pravil[1][23]="B5K";
pravil[0][24]="0B";
pravil[1][24]="1E";
pravil[0][25]="1B";
pravil[1][25]="2E";
pravil[0][26]="2B";
pravil[1][26]="3E";
pravil[0][27]="3B";
pravil[1][27]="4E";
pravil[0][28]="4B";
pravil[1][28]="5E";
pravil[0][29]="5B";
pravil[1][29]="6E";
pravil[0][30]="6B";
pravil[1][30]="7E";
pravil[0][31]="7B";
pravil[1][31]="8E";
pravil[0][32]="8B";
pravil[1][32]="9E";
pravil[0][33]="9B";
pravil[1][33]="B0";
pravil[0][34]="CB";
pravil[1][34]="C1E";
pravil[0][35]="E0";
pravil[1][35]="0E";
pravil[0][36]="E1";
pravil[1][36]="1E";
pravil[0][37]="E2";
pravil[1][37]="2E";
pravil[0][38]="E3";
pravil[1][38]="3E";
pravil[0][39]="E4";
pravil[1][39]="4E";
pravil[0][40]="E5";
pravil[1][40]="5E";
pravil[0][41]="E6";
pravil[1][41]="6E";
pravil[0][42]="E7";
pravil[1][42]="7E";
pravil[0][43]="E8";
pravil[1][43]="8E";
pravil[0][44]="E9";
pravil[1][44]="9E";
pravil[0][45]="EK";
pravil[1][45]="A";
input: printf ("Пожалуйста, введите число: ");
scanf("%s",&stroka);
if(atoi(stroka) % 6 != 0)
{
printf("Введите число, кратное 6!\n");
memset(stroka, '\0', 50);
goto input;
}
str=(char*)(malloc((150)*sizeof(char)));
temp=(char*)(malloc((150)*sizeof(char)));
str[0]='\0';
temp[0]='\0';
strcat(str,pravil[1][1]);
printf("S --> %s\t(применили правило 1)\n%s",str, str);
for (;;)
{
if (strcmp(str,stroka)==0) break;
if(strstr(str,stroka))
{
for (;;)
{
fl=search(str,pravil,2,13);
strcpy(temp,strstr(str,pravil[0][fl]));
r=strlen(str)-strlen(temp);
str[r]='\0';
strcat(str,pravil[1][fl]);
r= strlen(pravil[0][fl]) ;
if (r>strlen(temp)) r=strlen(temp);
tmp1=&temp[r];
strcat(str,tmp1);
printf(" --> %s\t(применили правило %d)\n%s",str,fl,str);
if (strcmp(str,stroka)==0) break;
}
}
if(strstr(str,"K")) {
for (;;)
{
fl=search(str,pravil,24,45);
strcpy(temp,strstr(str,pravil[0][fl]));
r=strlen(str)-strlen(temp);
str[r]='\0';
strcat(str,pravil[1][fl]);
r= strlen(pravil[0][fl]) ;
if (r>strlen(temp)) r=strlen(temp);
tmp1=&temp[r];
strcat(str,tmp1);
printf(" --> %s\t(применили правило %d)\n%s",str,fl,str);
if(!strstr(str,"K")) break;
}
}
if((strstr(str,"A"))&&(!strstr(str,stroka))) {
for (;;)
{
fl=search(str,pravil,14,23);
strcpy(temp,strstr(str,pravil[0][fl]));
r=strlen(str)-strlen(temp);
str[r]='\0';
strcat(str,pravil[1][fl]);
r= strlen(pravil[0][fl]) ;
if (r>strlen(temp)) r=strlen(temp);
tmp1=&temp[r];
strcat(str,tmp1);
printf(" --> %s\t(применили правило %d)\n%s",str,fl,str);
if(strstr(str,"K")||strstr(str,stroka)) break;
}
}
}
getch();
}
int search (char* str,char* pr[2][46],int _ot,int _do)
{
int i;
for (i=_ot;i<(_do+1);i++)
if(strstr(str,pr[0][i])) return i;
return 0;
}
-
Контрольный пример