Сложение двух десятичных чисел в машине Тьюринга - C (СИ)
Формулировка задачи:
Доброе время суток!
сразу дико извеняюсь что влез не в свою ветку (ибо ситуация становится крайне напряженной) но все же...
Есть прогамма на писанная на Си. суть ее в том чтобы производить вычитание двух десятичных чисел в машине тьюринга, а мне нужно сделать сложение 2-х десятичных чисел.
Листинг программы
- #include <stdio.h>
- #include <string.h>
- int i;
- int q=1; /*текущее состояние УУ*/
- int pos; /*позиция текущего символа ленты*/
- char a; /*текущий символ ленты*/
- char lenta[200]="#"; /*лента*/
- char s1[80];
- char s2[80];
- void main(void){
- l1:
- printf("vvedite 1 chislo:");
- gets(s1); /*ввод 1 числа*/
- if (strlen(s1)<1) goto l1; /*проверка ввода*/
- for(i=0;i<strlen(s1);i++) if ((s1[i]<'0')||(s1[i]>'9')) goto l1;
- l2:
- printf("vvedite 2 chislo:");
- gets(s2); /*ввод 2 числа*/
- if (strlen(s2)<1) goto l2; /*проверка ввода*/
- for(i=0;i<strlen(s2);i++) if ((s2[i]<'0')||(s2[i]>'9')) goto l2;
- if (strlen(s1)<strlen(s2)){printf("1 chislo < 2. Vvedite zanovo.\n");goto l1;}
- if (strlen(s1)==strlen(s2)){
- for (i=0;i<strlen(s1);i++){
- if (s1[i]<s2[i]){printf("1 chislo < 2. Vvedite zanovo.\n");goto l1;}
- if (s1[i]>s2[i]) break;}}
- strcat(lenta,s1);
- pos=strlen(s1)+1;
- lenta[pos]='-';
- lenta[pos+1]='\0';
- strcat(lenta,s2);
- pos=pos+strlen(s2)+1;
- lenta[pos]='=';
- lenta[pos+1]='#';
- lenta[pos+2]='\0';
- pos=1;
- puts(lenta); /*вывод ленты на экран*/
- for (i=0;i<pos;i++) putchar(' ');
- putchar('^');
- printf("\t\tcoctoyanie Q%d\n",q);
- getch();
- do{
- a=lenta[pos]; /*выделяем клетку ленты*/
- switch(q) /*анализируем состояние УУ*/
- {case 1:switch(a) /*помечаем цифру 1 числа для переноса*/
- {case('0'):q=2;
- lenta[pos]='a';
- pos++;
- break;
- case('1'):q=3;
- lenta[pos]='b';
- pos++;
- break;
- case('2'):q=4;
- lenta[pos]='c';
- pos++;
- break;
- case('3'):q=5;
- lenta[pos]='d';
- pos++;
- break;
- case('4'):q=6;
- lenta[pos]='e';
- pos++;
- break;
- case('5'):q=7;
- lenta[pos]='f';
- pos++;
- break;
- case('6'):q=8;
- lenta[pos]='g';
- pos++;
- break;
- case('7'):q=9;
- lenta[pos]='h';
- pos++;
- break;
- case('8'):q=10;
- lenta[pos]='i';
- pos++;
- break;
- case('9'):q=11;
- lenta[pos]='j';
- pos++;
- break;
- case('-'):q=13;pos++;break;}
- break;
- case 2:switch(a) /*сдвигаемся в конец ленты и записываем 0*/
- {case('#'):
- q=12;
- lenta[pos]='0';
- lenta[pos+1]='#';
- lenta[pos+2]='\0';
- pos--;
- break;
- default:pos++;break;}
- break;
- case 3:switch(a) /*сдвигаемся в конец ленты и записываем 1*/
- {case('#'):
- q=12;
- lenta[pos]='1';
- lenta[pos+1]='#';
- lenta[pos+2]='\0';
- pos--;
- break;
- default:pos++;break;}
- break;
- case 4:switch(a) /*сдвигаемся в конец ленты и записываем 2*/
- {case('#'):
- q=12;
- lenta[pos]='2';
- lenta[pos+1]='#';
- lenta[pos+2]='\0';
- pos--;
- break;
- default:pos++;break;}
- break;
- case 5:switch(a) /*сдвигаемся в конец ленты и записываем 3*/
- {case('#'):
- q=12;
- lenta[pos]='3';
- lenta[pos+1]='#';
- lenta[pos+2]='\0';
- pos--;
- break;
- default:pos++;break;}
- break;
- case 6:switch(a) /*сдвигаемся в конец ленты и записываем 4*/
- {case('#'):
- q=12;
- lenta[pos]='4';
- lenta[pos+1]='#';
- lenta[pos+2]='\0';
- pos--;
- break;
- default:pos++;break;}
- break;
- case 7:switch(a) /*сдвигаемся в конец ленты и записываем 5*/
- {case('#'):
- q=12;
- lenta[pos]='5';
- lenta[pos+1]='#';
- lenta[pos+2]='\0';
- pos--;
- break;
- default:pos++;break;}
- break;
- case 8:switch(a) /*сдвигаемся в конец ленты и записываем 6*/
- {case('#'):
- q=12;
- lenta[pos]='6';
- lenta[pos+1]='#';
- lenta[pos+2]='\0';
- pos--;
- break;
- default:pos++;break;}
- break;
- case 9:switch(a) /*сдвигаемся в конец ленты и записываем 7*/
- {case('#'):
- q=12;
- lenta[pos]='7';
- lenta[pos+1]='#';
- lenta[pos+2]='\0';
- pos--;
- break;
- default:pos++;break;}
- break;
- case 10:switch(a) /*сдвигаемся в конец ленты и записываем 8*/
- {case('#'):
- q=12;
- lenta[pos]='8';
- lenta[pos+1]='#';
- lenta[pos+2]='\0';
- pos--;
- break;
- default:pos++;break;}
- break;
- case 11:switch(a) /*сдвигаемся в конец ленты и записываем 9*/
- {case('#'):
- q=12;
- lenta[pos]='9';
- lenta[pos+1]='#';
- lenta[pos+2]='\0';
- pos--;
- break;
- default:pos++;break;}
- break;
- case 12:switch(a) /*смещаемся на 1 непомеченую цифру 1 числа*/
- {case('a'):q=1;pos++;break;
- case('b'):q=1;pos++;break;
- case('c'):q=1;pos++;break;
- case('d'):q=1;pos++;break;
- case('e'):q=1;pos++;break;
- case('f'):q=1;pos++;break;
- case('g'):q=1;pos++;break;
- case('h'):q=1;pos++;break;
- case('i'):q=1;pos++;break;
- case('j'):q=1;pos++;break;
- default:pos--;break;}
- break;
- case 13:switch(a) /*смещаемся в конец 2 слова*/
- {case('='):q=14;pos--;break;
- default:pos++;break;}
- break;
- case 14:switch(a) /*выбираем правый непомеченый символ 2 слова и метим*/
- {case('0'):q=15;
- lenta[pos]='a';
- pos++;
- break;
- case('1'):q=16;
- lenta[pos]='b';
- pos++;
- break;
- case('2'):q=17;
- lenta[pos]='c';
- pos++;
- break;
- case('3'):q=18;
- lenta[pos]='d';
- pos++;
- break;
- case('4'):q=19;
- lenta[pos]='e';
- pos++;
- break;
- case('5'):q=20;
- lenta[pos]='f';
- pos++;
- break;
- case('6'):q=21;
- lenta[pos]='g';
- pos++;
- break;
- case('7'):q=22;
- lenta[pos]='h';
- pos++;
- break;
- case('8'):q=23;
- lenta[pos]='i';
- pos++;
- break;
- case('9'):q=24;
- lenta[pos]='j';
- pos++;
- break;
- case('-'):q=13;pos++;break;}
- break;
- case 15:switch(a) /*смещаемся к концу 2 числа*/
- {case('='):q=25;pos++;break;
- default:pos++;break;}
- break;
- case 16:switch(a) /*смещаемся к концу 2 числа*/
- {case('='):q=26;pos++;break;
- default:pos++;break;}
- break;
- case 17:switch(a) /*смещаемся к концу 2 числа*/
- {case('='):q=27;pos++;break;
- default:pos++;break;}
- break;
- case 18:switch(a) /*смещаемся к концу 2 числа*/
- {case('='):q=28;pos++;break;
- default:pos++;break;}
- break;
- case 19:switch(a) /*смещаемся к концу 2 числа*/
- {case('='):q=29;pos++;break;
- default:pos++;break;}
- break;
- case 20:switch(a) /*смещаемся к концу 2 числа*/
- {case('='):q=30;pos++;break;
- default:pos++;break;}
- break;
- case 21:switch(a) /*смещаемся к концу 2 числа*/
- {case('='):q=31;pos++;break;
- default:pos++;break;}
- break;
- case 22:switch(a) /*смещаемся к концу 2 числа*/
- {case('='):q=32;pos++;break;
- default:pos++;break;}
- break;
- case 23:switch(a) /*смещаемся к концу 2 числа*/
- {case('='):q=33;pos++;break;
- default:pos++;break;}
- break;
- case 24:switch(a) /*смещаемся к концу 2 числа*/
- {case('='):q=34;pos++;break;
- default:pos++;break;}
- break;
- case 25:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
- {case('a'):q=35;pos--;break;
- case('b'):q=35;pos--;break;
- case('c'):q=35;pos--;break;
- case('d'):q=35;pos--;break;
- case('e'):q=35;pos--;break;
- case('f'):q=35;pos--;break;
- case('g'):q=35;pos--;break;
- case('h'):q=35;pos--;break;
- case('i'):q=35;pos--;break;
- case('j'):q=35;pos--;break;
- case('#'):q=35;pos--;break;
- default:pos++;break;}
- break;
- case 26:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
- {case('a'):q=36;pos--;break;
- case('b'):q=36;pos--;break;
- case('c'):q=36;pos--;break;
- case('d'):q=36;pos--;break;
- case('e'):q=36;pos--;break;
- case('f'):q=36;pos--;break;
- case('g'):q=36;pos--;break;
- case('h'):q=36;pos--;break;
- case('i'):q=36;pos--;break;
- case('j'):q=36;pos--;break;
- case('#'):q=36;pos--;break;
- default:pos++;break;}
- break;
- case 27:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
- {case('a'):q=37;pos--;break;
- case('b'):q=37;pos--;break;
- case('c'):q=37;pos--;break;
- case('d'):q=37;pos--;break;
- case('e'):q=37;pos--;break;
- case('f'):q=37;pos--;break;
- case('g'):q=37;pos--;break;
- case('h'):q=37;pos--;break;
- case('i'):q=37;pos--;break;
- case('j'):q=37;pos--;break;
- case('#'):q=37;pos--;break;
- default:pos++;break;}
- break;
- case 28:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
- {case('a'):q=38;pos--;break;
- case('b'):q=38;pos--;break;
- case('c'):q=38;pos--;break;
- case('d'):q=38;pos--;break;
- case('e'):q=38;pos--;break;
- case('f'):q=38;pos--;break;
- case('g'):q=38;pos--;break;
- case('h'):q=38;pos--;break;
- case('i'):q=38;pos--;break;
- case('j'):q=38;pos--;break;
- case('#'):q=38;pos--;break;
- default:pos++;break;}
- break;
- case 29:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
- {case('a'):q=39;pos--;break;
- case('b'):q=39;pos--;break;
- case('c'):q=39;pos--;break;
- case('d'):q=39;pos--;break;
- case('e'):q=39;pos--;break;
- case('f'):q=39;pos--;break;
- case('g'):q=39;pos--;break;
- case('h'):q=39;pos--;break;
- case('i'):q=39;pos--;break;
- case('j'):q=39;pos--;break;
- case('#'):q=39;pos--;break;
- default:pos++;break;}
- break;
- case 30:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
- {case('a'):q=40;pos--;break;
- case('b'):q=40;pos--;break;
- case('c'):q=40;pos--;break;
- case('d'):q=40;pos--;break;
- case('e'):q=40;pos--;break;
- case('f'):q=40;pos--;break;
- case('g'):q=40;pos--;break;
- case('h'):q=40;pos--;break;
- case('i'):q=40;pos--;break;
- case('j'):q=40;pos--;break;
- case('#'):q=40;pos--;break;
- default:pos++;break;}
- break;
- case 31:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
- {case('a'):q=41;pos--;break;
- case('b'):q=41;pos--;break;
- case('c'):q=41;pos--;break;
- case('d'):q=41;pos--;break;
- case('e'):q=41;pos--;break;
- case('f'):q=41;pos--;break;
- case('g'):q=41;pos--;break;
- case('h'):q=41;pos--;break;
- case('i'):q=41;pos--;break;
- case('j'):q=41;pos--;break;
- case('#'):q=41;pos--;break;
- default:pos++;break;}
- break;
- case 32:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
- {case('a'):q=42;pos--;break;
- case('b'):q=42;pos--;break;
- case('c'):q=42;pos--;break;
- case('d'):q=42;pos--;break;
- case('e'):q=42;pos--;break;
- case('f'):q=42;pos--;break;
- case('g'):q=42;pos--;break;
- case('h'):q=42;pos--;break;
- case('i'):q=42;pos--;break;
- case('j'):q=42;pos--;break;
- case('#'):q=42;pos--;break;
- default:pos++;break;}
- break;
- case 33:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
- {case('a'):q=43;pos--;break;
- case('b'):q=43;pos--;break;
- case('c'):q=43;pos--;break;
- case('d'):q=43;pos--;break;
- case('e'):q=43;pos--;break;
- case('f'):q=43;pos--;break;
- case('g'):q=43;pos--;break;
- case('h'):q=43;pos--;break;
- case('i'):q=43;pos--;break;
- case('j'):q=43;pos--;break;
- case('#'):q=43;pos--;break;
- default:pos++;break;}
- break;
- case 34:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
- {case('a'):q=44;pos--;break;
- case('b'):q=44;pos--;break;
- case('c'):q=44;pos--;break;
- case('d'):q=44;pos--;break;
- case('e'):q=44;pos--;break;
- case('f'):q=44;pos--;break;
- case('g'):q=44;pos--;break;
- case('h'):q=44;pos--;break;
- case('i'):q=44;pos--;break;
- case('j'):q=44;pos--;break;
- case('#'):q=44;pos--;break;
- default:pos++;break;}
- break;
- case 35:switch(a) /*записываем результат разности данного разряда*/
- {case('0'):q=45;
- lenta[pos]='a';
- pos--;
- break;
- case('1'):q=45;
- lenta[pos]='b';
- pos--;
- break;
- case('2'):q=45;
- lenta[pos]='c';
- pos--;
- break;
- case('3'):q=45;
- lenta[pos]='d';
- pos--;
- break;
- case('4'):q=45;
- lenta[pos]='e';
- pos--;
- break;
- case('5'):q=45;
- lenta[pos]='f';
- pos--;
- break;
- case('6'):q=45;
- lenta[pos]='g';
- pos--;
- break;
- case('7'):q=45;
- lenta[pos]='h';
- pos--;
- break;
- case('8'):q=45;
- lenta[pos]='i';
- pos--;
- break;
- case('9'):q=45;
- lenta[pos]='j';
- pos--;
- break;}
- break;
- case 36:switch(a) /*записываем результат разности данного разряда*/
- {case('0'):q=46;
- lenta[pos]='j';
- pos--;
- break;
- case('1'):q=45;
- lenta[pos]='a';
- pos--;
- break;
- case('2'):q=45;
- lenta[pos]='b';
- pos--;
- break;
- case('3'):q=45;
- lenta[pos]='c';
- pos--;
- break;
- case('4'):q=45;
- lenta[pos]='d';
- pos--;
- break;
- case('5'):q=45;
- lenta[pos]='e';
- pos--;
- break;
- case('6'):q=45;
- lenta[pos]='f';
- pos--;
- break;
- case('7'):q=45;
- lenta[pos]='g';
- pos--;
- break;
- case('8'):q=45;
- lenta[pos]='h';
- pos--;
- break;
- case('9'):q=45;
- lenta[pos]='i';
- pos--;
- break;}
- break;
- case 37:switch(a) /*записываем результат разности данного разряда*/
- {case('0'):q=46;
- lenta[pos]='i';
- pos--;
- break;
- case('1'):q=46;
- lenta[pos]='j';
- pos--;
- break;
- case('2'):q=45;
- lenta[pos]='a';
- pos--;
- break;
- case('3'):q=45;
- lenta[pos]='b';
- pos--;
- break;
- case('4'):q=45;
- lenta[pos]='c';
- pos--;
- break;
- case('5'):q=45;
- lenta[pos]='d';
- pos--;
- break;
- case('6'):q=45;
- lenta[pos]='e';
- pos--;
- break;
- case('7'):q=45;
- lenta[pos]='f';
- pos--;
- break;
- case('8'):q=45;
- lenta[pos]='g';
- pos--;
- break;
- case('9'):q=45;
- lenta[pos]='h';
- pos--;
- break;}
- break;
- case 38:switch(a) /*записываем результат разности данного разряда*/
- {case('0'):q=46;
- lenta[pos]='h';
- pos--;
- break;
- case('1'):q=46;
- lenta[pos]='i';
- pos--;
- break;
- case('2'):q=46;
- lenta[pos]='j';
- pos--;
- break;
- case('3'):q=45;
- lenta[pos]='a';
- pos--;
- break;
- case('4'):q=45;
- lenta[pos]='b';
- pos--;
- break;
- case('5'):q=45;
- lenta[pos]='c';
- pos--;
- break;
- case('6'):q=45;
- lenta[pos]='d';
- pos--;
- break;
- case('7'):q=45;
- lenta[pos]='e';
- pos--;
- break;
- case('8'):q=45;
- lenta[pos]='f';
- pos--;
- break;
- case('9'):q=45;
- lenta[pos]='g';
- pos--;
- break;}
- break;
- case 39:switch(a) /*записываем результат разности данного разряда*/
- {case('0'):q=46;
- lenta[pos]='g';
- pos--;
- break;
- case('1'):q=46;
- lenta[pos]='h';
- pos--;
- break;
- case('2'):q=46;
- lenta[pos]='i';
- pos--;
- break;
- case('3'):q=46;
- lenta[pos]='j';
- pos--;
- break;
- case('4'):q=45;
- lenta[pos]='a';
- pos--;
- break;
- case('5'):q=45;
- lenta[pos]='b';
- pos--;
- break;
- case('6'):q=45;
- lenta[pos]='c';
- pos--;
- break;
- case('7'):q=45;
- lenta[pos]='d';
- pos--;
- break;
- case('8'):q=45;
- lenta[pos]='e';
- pos--;
- break;
- case('9'):q=45;
- lenta[pos]='f';
- pos--;
- break;}
- break;
- case 40:switch(a) /*записываем результат разности данного разряда*/
- {case('0'):q=46;
- lenta[pos]='f';
- pos--;
- break;
- case('1'):q=46;
- lenta[pos]='g';
- pos--;
- break;
- case('2'):q=46;
- lenta[pos]='h';
- pos--;
- break;
- case('3'):q=46;
- lenta[pos]='i';
- pos--;
- break;
- case('4'):q=46;
- lenta[pos]='j';
- pos--;
- break;
- case('5'):q=45;
- lenta[pos]='a';
- pos--;
- break;
- case('6'):q=45;
- lenta[pos]='b';
- pos--;
- break;
- case('7'):q=45;
- lenta[pos]='c';
- pos--;
- break;
- case('8'):q=45;
- lenta[pos]='d';
- pos--;
- break;
- case('9'):q=45;
- lenta[pos]='e';
- pos--;
- break;}
- break;
- case 41:switch(a) /*записываем результат разности данного разряда*/
- {case('0'):q=46;
- lenta[pos]='e';
- pos--;
- break;
- case('1'):q=46;
- lenta[pos]='f';
- pos--;
- break;
- case('2'):q=46;
- lenta[pos]='g';
- pos--;
- break;
- case('3'):q=46;
- lenta[pos]='h';
- pos--;
- break;
- case('4'):q=46;
- lenta[pos]='i';
- pos--;
- break;
- case('5'):q=46;
- lenta[pos]='j';
- pos--;
- break;
- case('6'):q=45;
- lenta[pos]='a';
- pos--;
- break;
- case('7'):q=45;
- lenta[pos]='b';
- pos--;
- break;
- case('8'):q=45;
- lenta[pos]='c';
- pos--;
- break;
- case('9'):q=45;
- lenta[pos]='d';
- pos--;
- break;}
- break;
- case 42:switch(a) /*записываем результат разности данного разряда*/
- {case('0'):q=46;
- lenta[pos]='d';
- pos--;
- break;
- case('1'):q=46;
- lenta[pos]='e';
- pos--;
- break;
- case('2'):q=46;
- lenta[pos]='f';
- pos--;
- break;
- case('3'):q=46;
- lenta[pos]='g';
- pos--;
- break;
- case('4'):q=46;
- lenta[pos]='h';
- pos--;
- break;
- case('5'):q=46;
- lenta[pos]='i';
- pos--;
- break;
- case('6'):q=46;
- lenta[pos]='j';
- pos--;
- break;
- case('7'):q=45;
- lenta[pos]='a';
- pos--;
- break;
- case('8'):q=45;
- lenta[pos]='b';
- pos--;
- break;
- case('9'):q=45;
- lenta[pos]='c';
- pos--;
- break;}
- break;
- case 43:switch(a) /*записываем результат разности данного разряда*/
- {case('0'):q=46;
- lenta[pos]='c';
- pos--;
- break;
- case('1'):q=46;
- lenta[pos]='d';
- pos--;
- break;
- case('2'):q=46;
- lenta[pos]='e';
- pos--;
- break;
- case('3'):q=46;
- lenta[pos]='f';
- pos--;
- break;
- case('4'):q=46;
- lenta[pos]='g';
- pos--;
- break;
- case('5'):q=46;
- lenta[pos]='h';
- pos--;
- break;
- case('6'):q=46;
- lenta[pos]='i';
- pos--;
- break;
- case('7'):q=46;
- lenta[pos]='j';
- pos--;
- break;
- case('8'):q=45;
- lenta[pos]='a';
- pos--;
- break;
- case('9'):q=45;
- lenta[pos]='b';
- pos--;
- break;}
- break;
- case 44:switch(a) /*записываем результат разности данного разряда*/
- {case('0'):q=46;
- lenta[pos]='b';
- pos--;
- break;
- case('1'):q=46;
- lenta[pos]='c';
- pos--;
- break;
- case('2'):q=46;
- lenta[pos]='d';
- pos--;
- break;
- case('3'):q=46;
- lenta[pos]='e';
- pos--;
- break;
- case('4'):q=46;
- lenta[pos]='f';
- pos--;
- break;
- case('5'):q=46;
- lenta[pos]='g';
- pos--;
- break;
- case('6'):q=46;
- lenta[pos]='h';
- pos--;
- break;
- case('7'):q=46;
- lenta[pos]='i';
- pos--;
- break;
- case('8'):q=46;
- lenta[pos]='j';
- pos--;
- break;
- case('9'):q=45;
- lenta[pos]='a';
- pos--;
- break;}
- break;
- case 45:switch(a) /*смещаемся ко 2 числу*/
- {case('='):q=47;pos--;break;
- default:pos--;break;}
- break;
- case 46:switch(a) /*переносим 1 из старшего разряда*/
- {case('0'):
- lenta[pos]='9';
- pos--;
- break;
- case('1'):q=45;
- lenta[pos]='0';
- pos--;
- break;
- case('2'):q=45;
- lenta[pos]='1';
- pos--;
- break;
- case('3'):q=45;
- lenta[pos]='2';
- pos--;
- break;
- case('4'):q=45;
- lenta[pos]='3';
- pos--;
- break;
- case('5'):q=45;
- lenta[pos]='4';
- pos--;
- break;
- case('6'):q=45;
- lenta[pos]='5';
- pos--;
- break;
- case('7'):q=45;
- lenta[pos]='6';
- pos--;
- break;
- case('8'):q=45;
- lenta[pos]='7';
- pos--;
- break;
- case('9'):q=45;
- lenta[pos]='8';
- pos--;
- break;}
- break;
- case 47:switch(a) /*ищем непомеченый разряд 2 числа и помечаем его, если его нет, то операция разности завершена*/
- {case('0'):q=14;break;
- case('1'):q=14;break;
- case('2'):q=14;break;
- case('3'):q=14;break;
- case('4'):q=14;break;
- case('5'):q=14;break;
- case('6'):q=14;break;
- case('7'):q=14;break;
- case('8'):q=14;break;
- case('9'):q=14;break;
- case('-'):q=48;pos++;break;
- default:pos--;break;}
- break;
- case 48:switch(a) /*перемещаемся в конец ленты*/
- {case('#'):q=49;pos--;break;
- default:pos++;break;}
- break;
- case 49:switch(a) /*восстанавливаем все помеченные символы*/
- {case('a'):
- lenta[pos]='0';
- pos--;
- break;
- case('b'):
- lenta[pos]='1';
- pos--;
- break;
- case('c'):
- lenta[pos]='2';
- pos--;
- break;
- case('d'):
- lenta[pos]='3';
- pos--;
- break;
- case('e'):
- lenta[pos]='4';
- pos--;
- break;
- case('f'):
- lenta[pos]='5';
- pos--;
- break;
- case('g'):
- lenta[pos]='6';
- pos--;
- break;
- case('h'):
- lenta[pos]='7';
- pos--;
- break;
- case('i'):
- lenta[pos]='8';
- pos--;
- break;
- case('j'):
- lenta[pos]='9';
- pos--;
- break;
- case('#'):q=0;pos++;break;
- default:pos--;break;}
- break;
- }
- puts(lenta); /*вывод ленты на экран*/
- for (i=0;i<pos;i++) putchar(' ');
- putchar('^');
- printf("\t\tcoctoyanie Q%d\n",q);
- getch();
- } while(q!=0); /*q0-заключительное состояние*/
- printf("\nkonec raboty");
- getch();
- }
Решение задачи: «Сложение двух десятичных чисел в машине Тьюринга»
textual
Листинг программы
- #include <iostream>
- #include <windows.h>
- #include <clocale>
- #include <conio.h>
- using namespace std;
- //Выводим на печать
- void print(char *str, int pos, int q){
- cout<<"\nq="; cout<<q;
- cout <<"\n@";
- for (int i=1; str[i]!='@' ;i++)
- cout <<str[i];
- cout<<"@\n";
- for (int i=0;i<pos;i++)
- cout <<" ";
- cout <<"^";
- }
- int q3_g12 (char *str, int &pos, int &q, char chch)
- {
- char ch = str[pos];
- switch(ch)
- {
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'):
- case ('-'):
- case ('='): pos++; break;
- case ('@')://Обработка символа @
- str[pos] = chch;
- pos--;//Движение головки влево
- q=13;//Новое состояние q13
- break;
- default: return q;
- }
- return 99;
- } 
- int razn (char* str)
- {
- int pos=1;
- char ch=str[pos];//Текущий символ
- int q=0;
- do
- {
- print(str, pos, q); Sleep(200);//_getch();
- switch (q)
- {
- case 0://Обрабатываем состояние q0
- switch(ch)
- {
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'):
- case ('-'): pos++; break;
- case ('@')://Обработка символа @
- q=1;//Новое состояние q1
- str[pos] = '=';//Новый символ =
- print(str, pos, q); Sleep(200); pos--;//Движение головки влево
- break;
- default: return q;
- }break;
- case 1:
- switch(ch)
- {
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'):
- case ('-'): pos--; break;
- case ('@'): pos++; q=2; break;
- default: return q;
- }break;
- case 2:
- switch(ch)
- {
- case ('0'): str[pos] = 'A'; pos++; q=3; break;
- case ('1'): str[pos] = 'B'; pos++; q=4; break;
- case ('2'): str[pos] = 'C'; pos++; q=5; break;
- case ('3'): str[pos] = 'D'; pos++; q=6; break;
- case ('4'): str[pos] = 'E'; pos++; q=7; break;
- case ('5'): str[pos] = 'F'; pos++; q=8; break;
- case ('6'): str[pos] = 'G'; pos++; q=9; break;
- case ('7'): str[pos] = 'H'; pos++; q=10; break;
- case ('8'): str[pos] = 'I'; pos++; q=11; break;
- case ('9'): str[pos] = 'J'; pos++; q=12; break;
- case ('-'): pos++; q=14; break;
- case ('='): pos++; q=16; break;
- default: return q;
- }break;
- case 3:
- q3_g12(str, pos, q, '0');
- break;
- case 4:
- q3_g12(str, pos, q, '1');
- break;
- case 5:
- q3_g12(str, pos, q, '2');
- break;
- case 6:
- q3_g12(str, pos, q, '3');
- break;
- case 7:
- q3_g12(str, pos, q, '4');
- break;
- case 8:
- q3_g12(str, pos, q, '5');
- break;
- case 9:
- q3_g12(str, pos, q, '6');
- break;
- case 10:
- q3_g12(str, pos, q, '7');
- break;
- case 11:
- q3_g12(str, pos, q, '8');
- break;
- case 12:
- q3_g12(str, pos, q, '9');
- break;
- case 13:
- switch(ch)
- {
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'):
- case ('-'):
- case ('='): pos--; break;
- case ('A'):
- case ('B'):
- case ('C'):
- case ('D'):
- case ('E'):
- case ('F'):
- case ('G'):
- case ('H'):
- case ('I'):
- case ('J'): pos++; q=2; break;
- default: return q;
- }break;
- case 14:
- switch(ch)
- {
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'):
- case ('='): pos++; break;
- case ('@'):
- str[pos] = '-';
- pos--; q=15; break;
- default: return q;
- }break;
- case 15:
- switch(ch)
- {
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'):
- case ('='): pos--; break;
- case ('-'): pos++; q=2; break;
- default: return q;
- }break;
- case 16:
- switch(ch)
- {
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'):
- case ('-'): pos++; break;
- case ('@'): pos--; q=17; break;
- default: return q;
- }break;
- case 17:
- switch(ch)
- {
- case ('9'): str[pos] = '8'; q=20; break;
- case ('8'): str[pos] = '7'; q=20; break;
- case ('7'): str[pos] = '6'; q=20; break;
- case ('6'): str[pos] = '5'; q=20; break;
- case ('5'): str[pos] = '4'; q=20; break;
- case ('4'): str[pos] = '3'; q=20; break;
- case ('3'): str[pos] = '2'; q=20; break;
- case ('2'): str[pos] = '1'; q=20; break;
- case ('1'): str[pos] = '0'; q=20; break;
- case ('0'): pos--; q=18; break;
- default: return q;
- }break;
- case 18:
- switch(ch)
- {
- case ('9'): str[pos] = '8'; pos++; q=19; break;
- case ('8'): str[pos] = '7'; pos++; q=19; break;
- case ('7'): str[pos] = '6'; pos++; q=19; break;
- case ('6'): str[pos] = '5'; pos++; q=19; break;
- case ('5'): str[pos] = '4'; pos++; q=19; break;
- case ('4'): str[pos] = '3'; pos++; q=19; break;
- case ('3'): str[pos] = '2'; pos++; q=19; break;
- case ('2'): str[pos] = '1'; pos++; q=19; break;
- case ('1'): str[pos] = '0'; pos++; q=19; break;
- case ('0'): pos--; break;
- case ('-'): str[pos] = '@'; pos++; q=22; break;
- default: return q;
- }break;
- case 19:
- switch(ch)
- {
- case ('0'): str[pos] = '9'; pos++; break;
- case ('-'):
- case ('@'): pos--; q=20; break;
- default: return q;
- }break;
- case 20:
- switch(ch)
- {
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'): pos--; break;
- case ('-'): pos--; q=17; break;
- case ('='): pos++; q=21; break;
- default: return q;
- }break;
- case 21:
- switch(ch)
- {
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'):
- case ('-'): pos++; break;
- case ('@'): pos--; q=17; break;
- default: return q;
- }break;
- case 22:
- switch(ch)
- {
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'): str[pos] = '@'; pos++; break;
- case ('@'): pos--; q=23; break;
- default: return q;
- }break;
- case 23:
- switch(ch)
- {
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'):
- case ('@'): pos--; break;
- case ('='): pos--; q=24; break;
- default: return q;
- }break;
- case 24:
- switch(ch)
- {
- case ('A'): str[pos] = '0'; pos--; break;
- case ('B'): str[pos] = '1'; pos--; break;
- case ('C'): str[pos] = '2'; pos--; break;
- case ('D'): str[pos] = '3'; pos--; break;
- case ('E'): str[pos] = '4'; pos--; break;
- case ('F'): str[pos] = '5'; pos--; break;
- case ('G'): str[pos] = '6'; pos--; break;
- case ('H'): str[pos] = '7'; pos--; break;
- case ('I'): str[pos] = '8'; pos--; break;
- case ('J'): str[pos] = '9'; pos--; break;
- case ('-'): pos--; break;
- case ('@'): pos++; q=99; break;
- default: return q;
- }break;
- }
- ch=str[pos];
- }while (q!=99);
- return q;
- }
- int main ()
- {
- setlocale(LC_CTYPE,"Russian");//установка русской кодировки в консоле
- char lenta[255];//входная строка
- lenta[0] = '@';
- cout<<"Эмуляция работы машины Тьюринга"<<endl;
- cout<<"Введите два 10-х числа, между ними поставьте знак минуса (например 123-23):"<<endl;
- cin>>&lenta[1];
- for (size_t i=strlen(lenta) ;i<255;i++) lenta[i]='@';//Заполняем ленту служебными симполами
- int q;
- if ((q=razn(lenta))!=99)
- {
- cout <<"\nОшибка на состоянии " <<q;
- _getch();
- return 1;
- }
- cout <<"\nРезультат равен:";
- print (lenta, 0, 99);
- _getch();
- return 0;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д