Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ИДЗ вариант 10

.docx
Скачиваний:
15
Добавлен:
20.06.2014
Размер:
94.57 Кб
Скачать

Липецкий государственный технический университет

Кафедра автоматизированных систем управления

Индивидуальное домашнее задание

по Теории вычислительных процессов и структур

Описание грамматики, порождающей язык

Студент

Ключанских А.С

подпись, дата

фамилия, инициалы

Группа

АС-10

Принял

доцент

Гаев Л.В.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2013

  1. Задание кафедры

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

10. Десятичные натуральные числа, кратные 6

  1. Описание грамматики

1. SC6A

2. 0DD0

3. 1DD1

4. 2DD2

5. 3DD3

6. 4DD4

7. 5DD5

8. 6DD6

9. 7DD7

10. 8DD8

11. 9DD9

12. AD

13. CD

14. 0A6A

15. 1A7A

16. 2A8A

17. 3A9A

18. 4A B0K

19. 5A B1K

20. 6A B2K

21. 7AB3K

22. 8AB4K

23. 9AB5K

24. 0B1E

25. 1B2E

26. 2B3E

27. 3B4E

28. 4B5E

29. 5B6E

30. 6B7E

31. 7B8E

32. 8B9E

33. 9BB0

34. CBC1E

35. E00E

36. E11E

37. E22E

38. E33E

39. E44E

40. E55E

41. E66E

42. E77E

43. E88E

44. E99E

45. EKA

  1. Листинг программы

#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;

}

  1. Контрольный пример