Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- #define MAXCOMMAND 256
- typedef struct _progr {
- char inputsymb; //Входной символ
- int state; //Начальное состояние
- char outputsymb; //Символ на выходе
- int newstate; //Новое состояние
- char action; //Действие
- } progr;
- /*----------------------------------Список----------------------------------*/
- /*Структура узел*/
- typedef struct _Raw {
- char value; /*Хранит значение*/
- struct _Raw *next; /*Следующий элемент*/
- struct _Raw *prev; /*Предыдущий элемент*/
- } Raw;
- typedef struct _DbLink {
- size_t size; /*Хранит размер списка*/
- Raw *head; /*Начало списка*/
- Raw *tail; /*Конец списка*/
- } DbLink;
- /*Инициализация списка*/
- DbLink* createDbLink() {
- DbLink *tmp;
- tmp = (DbLink*)malloc(sizeof(DbLink)); //Динамическое выделение памяти
- tmp->size = 0; //Обнуление размера списка
- tmp->head = tmp->tail = NULL;
- return tmp;
- }
- /*Функция удаления списка*/
- void deleteDbLink(DbLink *list) {
- Raw *tmp = list->head;
- Raw *next = NULL;
- while (tmp) {
- next = tmp->next;
- free(tmp);
- tmp = next;
- }
- free(list);
- }
- /*Функция добавления в конец списка (т.к. если добавлять в начало, вся лента будет в обратной последовательности*/
- void pushBack(DbLink *list, void *value) {
- Raw *tmp = (Raw*)malloc(sizeof(Raw));
- if (tmp == NULL) {
- exit;
- }
- tmp->value = value;
- tmp->next = NULL;
- tmp->prev = list->tail;
- if (list->tail) {
- list->tail->next = tmp;
- }
- list->tail = tmp;
- if (list->head == NULL) {
- list->head = tmp;
- }
- list->size++;
- }
- /*Функция распечатывания списка*/
- void printfDbLink(DbLink *list) {
- Raw *tmp;
- tmp = list->head;
- while (tmp != NULL) {
- printf("%c ", tmp->value);
- tmp = tmp->next;
- }
- printf("n");
- }
- /*Операция над лентой(алфавитом)*/
- void turing(DbLink *list, struct _progr arr[], int cmd) {
- int error = 0; //Переменная останова
- int headstate = 1; //Состояние головки
- char replace_symb; //Переменная для внесения нового значения
- FILE *result = fopen("result.txt", "wb");
- int i = 0; //Переменные для счетчика
- Raw *buff, *tmp; //Две переменные ссылающиеся на структуру _Raw
- tmp = list->head; //Присвоение переменной ссылки на Head в списке list
- fprintf(result, "Result is: ");
- while (tmp != NULL && error != 1) {
- for (i = 0; i < cmd; i++) {
- buff = tmp->value; //Присвоение переменной - значения лежащей в Head списка list
- if (buff == arr[i].inputsymb && headstate == arr[i].state) {
- replace_symb = arr[i].outputsymb;
- headstate = arr[i].newstate;
- fprintf(result, "%c", replace_symb);
- printf("%c ", replace_symb);
- switch (arr[i].action) {
- case 'R': { tmp = tmp->next; break;} //При команде R сдвигается на следующий элемент в списке
- case 'L': { tmp = tmp->prev; break;} //При команде L сдвигается на предыдущий элемент в списке
- case 'S': { error = 1; break;}
- }
- }
- }
- }
- printf("n");
- }
- /*---------------------------------main------------------------------------*/
- int main(void) {
- DbLink *list = createDbLink(); //Инициализация списка
- int headstate = 1, bool = 1, len = 0, c = 0, i = 0, b = 0;
- long size = 0;
- char sep[] = ":,";
- char line[100];
- char *token;
- char *buf; //Массив для хранения алфавита считываемого из файла
- progr arr[MAXCOMMAND]; //Массив стуктуры для записи программы МТ
- FILE *fp = fopen("lenta.txt", "r"); //Открытие файла
- fseek(fp, 0, SEEK_END); //Проход до конца файла
- size = ftell(fp); //Узнаем размер файла в байтах
- buf = (char*)malloc(size * sizeof(char)); //Динамическое выделение памяти под массив хранения ленты
- rewind(fp); //Возвращение к началу файла
- while (!feof(fp)) { //До тех пор пока не будет достигнут конец файла
- fscanf(fp, "%c", &buf[i]); //По одному символу будет записыватся в массив
- i++; //Переход на следующий элемент массива
- }
- c = i - 1; ///Без этого печатает лишний пустой символ (????????)
- for (i = 0; i < c; i++) {
- pushBack(list, buf[i]);
- }
- /*---------------Извлечение программы МТ из файла!----------------------*/
- FILE *prog = fopen("prog.txt", "r");
- i = 0;
- while (fgets(line, 100, prog) != NULL) {
- if (bool == 1) {
- len = strlen(line);
- for (i = 0;i<len;i++) {
- if (line[i] != 'r' && line[i] != 'n') {
- }
- else {
- bool = 0;
- break;
- }
- }
- }
- else {
- headstate = 1;
- token = strtok(line, sep);
- while (token != NULL) {
- char symb;
- if (strlen(token) == 1) {
- symb = *token;
- }
- else {
- if (sscanf(token, "%c%cq%d", &(arr[i].outputsymb), &(arr[i].action), &(arr[i].newstate)) >= 0) {
- arr[i].inputsymb = symb;
- arr[i].state = headstate++;
- printf("%cq%d-%cq%d%cn", arr[i].inputsymb, arr[i].state, arr[i].outputsymb, arr[i].newstate, arr[i].action);
- i++;
- }
- }
- token = strtok(NULL, sep);
- }
- }
- }
- /*------------------Окончание считывания!--------------------*/
- printfDbLink(list);
- printf("DBLink length %dn", list->size);
- turing(list, arr, i);
- deleteDbLink(list);
- system("pause");
- }
- char temp = tmp->value;
- temp == arr[i].inputsymbol
- tmp->value = value
- /*Операция над лентой(алфавитом)*/
- void turing(DbLink *list, struct _progr arr[], int cmd) {
- int error = 0; //Переменная останова
- int headstate = 1; //Состояние головки
- char replace_symb; //Переменная для внесения нового значения
- FILE *result = fopen("result.txt", "wb");
- int i = 0; //Переменные для счетчика
- Raw *buff, *tmp; //Две переменные ссылающиеся на структуру _Raw
- tmp = list->head; //Присвоение переменной ссылки на Head в списке list
- fprintf(result, "Result is: ");
- while (tmp != NULL && error != 1) {
- for (i = 0; i < cmd; i++) {
- buff = tmp->value; //Присвоение переменной - значения лежащей в Head списка list
- if (buff == arr[i].inputsymb && headstate == arr[i].state) {
- replace_symb = arr[i].outputsymb;
- headstate = arr[i].newstate;
- fprintf(result, "%c", replace_symb);
- printf("%c ", replace_symb);
- switch (arr[i].action) {
- case 'R': { tmp = tmp->next; break;} //При команде R сдвигается на следующий элемент в списке
- case 'L': { tmp = tmp->prev; break;} //При команде L сдвигается на предыдущий элемент в списке
- case 'S': { error = 1; break;}
- }
- }
- }
- }
- printf("n");
- }
- tmp->value = value;
- buff = tmp->value;
- buff == arr[i].inputsymb
- pushBack(list, buf[i])
- while (!feof(fp)) { //До тех пор пока не будет достигнут конец файла
- fscanf(fp, "%c", &buf[i]); //По одному символу будет записыватся в массив
- i++; //Переход на следующий элемент массива
- }
- c = i - 1; ///Без этого печатает лишний пустой символ (????????)
- fread(buf,1,size,fp);
- buff = tmp->value; //Присвоение переменной - значения лежащей в Head списка list
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement