Advertisement
Guest User

Untitled

a guest
May 28th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.01 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <assert.h>
  5. #define MAXCOMMAND 256
  6. typedef struct _progr {
  7. char inputsymb; //Входной символ
  8. int state; //Начальное состояние
  9. char outputsymb; //Символ на выходе
  10. int newstate; //Новое состояние
  11. char action; //Действие
  12. } progr;
  13. /*----------------------------------Список----------------------------------*/
  14. /*Структура узел*/
  15. typedef struct _Raw {
  16. char value; /*Хранит значение*/
  17. struct _Raw *next; /*Следующий элемент*/
  18. struct _Raw *prev; /*Предыдущий элемент*/
  19. } Raw;
  20. typedef struct _DbLink {
  21. size_t size; /*Хранит размер списка*/
  22. Raw *head; /*Начало списка*/
  23. Raw *tail; /*Конец списка*/
  24. } DbLink;
  25. /*Инициализация списка*/
  26. DbLink* createDbLink() {
  27. DbLink *tmp;
  28. tmp = (DbLink*)malloc(sizeof(DbLink)); //Динамическое выделение памяти
  29. tmp->size = 0; //Обнуление размера списка
  30. tmp->head = tmp->tail = NULL;
  31. return tmp;
  32. }
  33. /*Функция удаления списка*/
  34. void deleteDbLink(DbLink *list) {
  35. Raw *tmp = list->head;
  36. Raw *next = NULL;
  37. while (tmp) {
  38. next = tmp->next;
  39. free(tmp);
  40. tmp = next;
  41. }
  42. free(list);
  43. }
  44. /*Функция добавления в конец списка (т.к. если добавлять в начало, вся лента будет в обратной последовательности*/
  45. void pushBack(DbLink *list, void *value) {
  46. Raw *tmp = (Raw*)malloc(sizeof(Raw));
  47. if (tmp == NULL) {
  48. exit;
  49. }
  50. tmp->value = value;
  51. tmp->next = NULL;
  52. tmp->prev = list->tail;
  53. if (list->tail) {
  54. list->tail->next = tmp;
  55. }
  56. list->tail = tmp;
  57.  
  58. if (list->head == NULL) {
  59. list->head = tmp;
  60. }
  61. list->size++;
  62. }
  63.  
  64. /*Функция распечатывания списка*/
  65. void printfDbLink(DbLink *list) {
  66. Raw *tmp;
  67. tmp = list->head;
  68. while (tmp != NULL) {
  69. printf("%c ", tmp->value);
  70. tmp = tmp->next;
  71. }
  72. printf("n");
  73. }
  74. /*Операция над лентой(алфавитом)*/
  75. void turing(DbLink *list, struct _progr arr[], int cmd) {
  76. int error = 0; //Переменная останова
  77. int headstate = 1; //Состояние головки
  78. char replace_symb; //Переменная для внесения нового значения
  79. FILE *result = fopen("result.txt", "wb");
  80. int i = 0; //Переменные для счетчика
  81. Raw *buff, *tmp; //Две переменные ссылающиеся на структуру _Raw
  82. tmp = list->head; //Присвоение переменной ссылки на Head в списке list
  83. fprintf(result, "Result is: ");
  84. while (tmp != NULL && error != 1) {
  85. for (i = 0; i < cmd; i++) {
  86. buff = tmp->value; //Присвоение переменной - значения лежащей в Head списка list
  87. if (buff == arr[i].inputsymb && headstate == arr[i].state) {
  88. replace_symb = arr[i].outputsymb;
  89. headstate = arr[i].newstate;
  90. fprintf(result, "%c", replace_symb);
  91. printf("%c ", replace_symb);
  92. switch (arr[i].action) {
  93. case 'R': { tmp = tmp->next; break;} //При команде R сдвигается на следующий элемент в списке
  94. case 'L': { tmp = tmp->prev; break;} //При команде L сдвигается на предыдущий элемент в списке
  95. case 'S': { error = 1; break;}
  96. }
  97. }
  98. }
  99. }
  100. printf("n");
  101. }
  102. /*---------------------------------main------------------------------------*/
  103. int main(void) {
  104. DbLink *list = createDbLink(); //Инициализация списка
  105. int headstate = 1, bool = 1, len = 0, c = 0, i = 0, b = 0;
  106. long size = 0;
  107. char sep[] = ":,";
  108. char line[100];
  109. char *token;
  110. char *buf; //Массив для хранения алфавита считываемого из файла
  111. progr arr[MAXCOMMAND]; //Массив стуктуры для записи программы МТ
  112. FILE *fp = fopen("lenta.txt", "r"); //Открытие файла
  113. fseek(fp, 0, SEEK_END); //Проход до конца файла
  114. size = ftell(fp); //Узнаем размер файла в байтах
  115. buf = (char*)malloc(size * sizeof(char)); //Динамическое выделение памяти под массив хранения ленты
  116. rewind(fp); //Возвращение к началу файла
  117. while (!feof(fp)) { //До тех пор пока не будет достигнут конец файла
  118. fscanf(fp, "%c", &buf[i]); //По одному символу будет записыватся в массив
  119. i++; //Переход на следующий элемент массива
  120. }
  121. c = i - 1; ///Без этого печатает лишний пустой символ (????????)
  122. for (i = 0; i < c; i++) {
  123. pushBack(list, buf[i]);
  124. }
  125. /*---------------Извлечение программы МТ из файла!----------------------*/
  126. FILE *prog = fopen("prog.txt", "r");
  127. i = 0;
  128. while (fgets(line, 100, prog) != NULL) {
  129. if (bool == 1) {
  130. len = strlen(line);
  131. for (i = 0;i<len;i++) {
  132. if (line[i] != 'r' && line[i] != 'n') {
  133. }
  134. else {
  135. bool = 0;
  136. break;
  137. }
  138. }
  139. }
  140. else {
  141. headstate = 1;
  142. token = strtok(line, sep);
  143. while (token != NULL) {
  144. char symb;
  145. if (strlen(token) == 1) {
  146. symb = *token;
  147. }
  148. else {
  149. if (sscanf(token, "%c%cq%d", &(arr[i].outputsymb), &(arr[i].action), &(arr[i].newstate)) >= 0) {
  150. arr[i].inputsymb = symb;
  151. arr[i].state = headstate++;
  152.  
  153. printf("%cq%d-%cq%d%cn", arr[i].inputsymb, arr[i].state, arr[i].outputsymb, arr[i].newstate, arr[i].action);
  154. i++;
  155. }
  156. }
  157.  
  158. token = strtok(NULL, sep);
  159. }
  160. }
  161. }
  162. /*------------------Окончание считывания!--------------------*/
  163. printfDbLink(list);
  164. printf("DBLink length %dn", list->size);
  165. turing(list, arr, i);
  166. deleteDbLink(list);
  167. system("pause");
  168. }
  169.  
  170. char temp = tmp->value;
  171. temp == arr[i].inputsymbol
  172. tmp->value = value
  173.  
  174. /*Операция над лентой(алфавитом)*/
  175. void turing(DbLink *list, struct _progr arr[], int cmd) {
  176. int error = 0; //Переменная останова
  177. int headstate = 1; //Состояние головки
  178. char replace_symb; //Переменная для внесения нового значения
  179. FILE *result = fopen("result.txt", "wb");
  180. int i = 0; //Переменные для счетчика
  181. Raw *buff, *tmp; //Две переменные ссылающиеся на структуру _Raw
  182. tmp = list->head; //Присвоение переменной ссылки на Head в списке list
  183. fprintf(result, "Result is: ");
  184. while (tmp != NULL && error != 1) {
  185. for (i = 0; i < cmd; i++) {
  186. buff = tmp->value; //Присвоение переменной - значения лежащей в Head списка list
  187. if (buff == arr[i].inputsymb && headstate == arr[i].state) {
  188. replace_symb = arr[i].outputsymb;
  189. headstate = arr[i].newstate;
  190. fprintf(result, "%c", replace_symb);
  191. printf("%c ", replace_symb);
  192. switch (arr[i].action) {
  193. case 'R': { tmp = tmp->next; break;} //При команде R сдвигается на следующий элемент в списке
  194. case 'L': { tmp = tmp->prev; break;} //При команде L сдвигается на предыдущий элемент в списке
  195. case 'S': { error = 1; break;}
  196. }
  197. }
  198. }
  199. }
  200. printf("n");
  201. }
  202.  
  203. tmp->value = value;
  204.  
  205. buff = tmp->value;
  206.  
  207. buff == arr[i].inputsymb
  208.  
  209. pushBack(list, buf[i])
  210.  
  211. while (!feof(fp)) { //До тех пор пока не будет достигнут конец файла
  212. fscanf(fp, "%c", &buf[i]); //По одному символу будет записыватся в массив
  213. i++; //Переход на следующий элемент массива
  214. }
  215. c = i - 1; ///Без этого печатает лишний пустой символ (????????)
  216.  
  217. fread(buf,1,size,fp);
  218.  
  219. buff = tmp->value; //Присвоение переменной - значения лежащей в Head списка list
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement