Сложение двух десятичных чисел в машине Тьюринга - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброе время суток! сразу дико извеняюсь что влез не в свою ветку (ибо ситуация становится крайне напряженной) но все же... Есть прогамма на писанная на Си. суть ее в том чтобы производить вычитание двух десятичных чисел в машине тьюринга, а мне нужно сделать сложение 2-х десятичных чисел.
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. int i;
  4. int q=1; /*текущее состояние УУ*/
  5. int pos; /*позиция текущего символа ленты*/
  6. char a; /*текущий символ ленты*/
  7. char lenta[200]="#"; /*лента*/
  8. char s1[80];
  9. char s2[80];
  10. void main(void){
  11. l1:
  12. printf("vvedite 1 chislo:");
  13. gets(s1); /*ввод 1 числа*/
  14. if (strlen(s1)<1) goto l1; /*проверка ввода*/
  15. for(i=0;i<strlen(s1);i++) if ((s1[i]<'0')||(s1[i]>'9')) goto l1;
  16. l2:
  17. printf("vvedite 2 chislo:");
  18. gets(s2); /*ввод 2 числа*/
  19. if (strlen(s2)<1) goto l2; /*проверка ввода*/
  20. for(i=0;i<strlen(s2);i++) if ((s2[i]<'0')||(s2[i]>'9')) goto l2;
  21. if (strlen(s1)<strlen(s2)){printf("1 chislo < 2. Vvedite zanovo.\n");goto l1;}
  22. if (strlen(s1)==strlen(s2)){
  23. for (i=0;i<strlen(s1);i++){
  24. if (s1[i]<s2[i]){printf("1 chislo < 2. Vvedite zanovo.\n");goto l1;}
  25. if (s1[i]>s2[i]) break;}}
  26. strcat(lenta,s1);
  27. pos=strlen(s1)+1;
  28. lenta[pos]='-';
  29. lenta[pos+1]='\0';
  30. strcat(lenta,s2);
  31. pos=pos+strlen(s2)+1;
  32. lenta[pos]='=';
  33. lenta[pos+1]='#';
  34. lenta[pos+2]='\0';
  35. pos=1;
  36. puts(lenta); /*вывод ленты на экран*/
  37. for (i=0;i<pos;i++) putchar(' ');
  38. putchar('^');
  39. printf("\t\tcoctoyanie Q%d\n",q);
  40. getch();
  41. do{
  42. a=lenta[pos]; /*выделяем клетку ленты*/
  43. switch(q) /*анализируем состояние УУ*/
  44. {case 1:switch(a) /*помечаем цифру 1 числа для переноса*/
  45. {case('0'):q=2;
  46. lenta[pos]='a';
  47. pos++;
  48. break;
  49. case('1'):q=3;
  50. lenta[pos]='b';
  51. pos++;
  52. break;
  53. case('2'):q=4;
  54. lenta[pos]='c';
  55. pos++;
  56. break;
  57. case('3'):q=5;
  58. lenta[pos]='d';
  59. pos++;
  60. break;
  61. case('4'):q=6;
  62. lenta[pos]='e';
  63. pos++;
  64. break;
  65. case('5'):q=7;
  66. lenta[pos]='f';
  67. pos++;
  68. break;
  69. case('6'):q=8;
  70. lenta[pos]='g';
  71. pos++;
  72. break;
  73. case('7'):q=9;
  74. lenta[pos]='h';
  75. pos++;
  76. break;
  77. case('8'):q=10;
  78. lenta[pos]='i';
  79. pos++;
  80. break;
  81. case('9'):q=11;
  82. lenta[pos]='j';
  83. pos++;
  84. break;
  85. case('-'):q=13;pos++;break;}
  86. break;
  87. case 2:switch(a) /*сдвигаемся в конец ленты и записываем 0*/
  88. {case('#'):
  89. q=12;
  90. lenta[pos]='0';
  91. lenta[pos+1]='#';
  92. lenta[pos+2]='\0';
  93. pos--;
  94. break;
  95. default:pos++;break;}
  96. break;
  97. case 3:switch(a) /*сдвигаемся в конец ленты и записываем 1*/
  98. {case('#'):
  99. q=12;
  100. lenta[pos]='1';
  101. lenta[pos+1]='#';
  102. lenta[pos+2]='\0';
  103. pos--;
  104. break;
  105. default:pos++;break;}
  106. break;
  107. case 4:switch(a) /*сдвигаемся в конец ленты и записываем 2*/
  108. {case('#'):
  109. q=12;
  110. lenta[pos]='2';
  111. lenta[pos+1]='#';
  112. lenta[pos+2]='\0';
  113. pos--;
  114. break;
  115. default:pos++;break;}
  116. break;
  117. case 5:switch(a) /*сдвигаемся в конец ленты и записываем 3*/
  118. {case('#'):
  119. q=12;
  120. lenta[pos]='3';
  121. lenta[pos+1]='#';
  122. lenta[pos+2]='\0';
  123. pos--;
  124. break;
  125. default:pos++;break;}
  126. break;
  127. case 6:switch(a) /*сдвигаемся в конец ленты и записываем 4*/
  128. {case('#'):
  129. q=12;
  130. lenta[pos]='4';
  131. lenta[pos+1]='#';
  132. lenta[pos+2]='\0';
  133. pos--;
  134. break;
  135. default:pos++;break;}
  136. break;
  137. case 7:switch(a) /*сдвигаемся в конец ленты и записываем 5*/
  138. {case('#'):
  139. q=12;
  140. lenta[pos]='5';
  141. lenta[pos+1]='#';
  142. lenta[pos+2]='\0';
  143. pos--;
  144. break;
  145. default:pos++;break;}
  146. break;
  147. case 8:switch(a) /*сдвигаемся в конец ленты и записываем 6*/
  148. {case('#'):
  149. q=12;
  150. lenta[pos]='6';
  151. lenta[pos+1]='#';
  152. lenta[pos+2]='\0';
  153. pos--;
  154. break;
  155. default:pos++;break;}
  156. break;
  157. case 9:switch(a) /*сдвигаемся в конец ленты и записываем 7*/
  158. {case('#'):
  159. q=12;
  160. lenta[pos]='7';
  161. lenta[pos+1]='#';
  162. lenta[pos+2]='\0';
  163. pos--;
  164. break;
  165. default:pos++;break;}
  166. break;
  167. case 10:switch(a) /*сдвигаемся в конец ленты и записываем 8*/
  168. {case('#'):
  169. q=12;
  170. lenta[pos]='8';
  171. lenta[pos+1]='#';
  172. lenta[pos+2]='\0';
  173. pos--;
  174. break;
  175. default:pos++;break;}
  176. break;
  177. case 11:switch(a) /*сдвигаемся в конец ленты и записываем 9*/
  178. {case('#'):
  179. q=12;
  180. lenta[pos]='9';
  181. lenta[pos+1]='#';
  182. lenta[pos+2]='\0';
  183. pos--;
  184. break;
  185. default:pos++;break;}
  186. break;
  187. case 12:switch(a) /*смещаемся на 1 непомеченую цифру 1 числа*/
  188. {case('a'):q=1;pos++;break;
  189. case('b'):q=1;pos++;break;
  190. case('c'):q=1;pos++;break;
  191. case('d'):q=1;pos++;break;
  192. case('e'):q=1;pos++;break;
  193. case('f'):q=1;pos++;break;
  194. case('g'):q=1;pos++;break;
  195. case('h'):q=1;pos++;break;
  196. case('i'):q=1;pos++;break;
  197. case('j'):q=1;pos++;break;
  198. default:pos--;break;}
  199. break;
  200. case 13:switch(a) /*смещаемся в конец 2 слова*/
  201. {case('='):q=14;pos--;break;
  202. default:pos++;break;}
  203. break;
  204. case 14:switch(a) /*выбираем правый непомеченый символ 2 слова и метим*/
  205. {case('0'):q=15;
  206. lenta[pos]='a';
  207. pos++;
  208. break;
  209. case('1'):q=16;
  210. lenta[pos]='b';
  211. pos++;
  212. break;
  213. case('2'):q=17;
  214. lenta[pos]='c';
  215. pos++;
  216. break;
  217. case('3'):q=18;
  218. lenta[pos]='d';
  219. pos++;
  220. break;
  221. case('4'):q=19;
  222. lenta[pos]='e';
  223. pos++;
  224. break;
  225. case('5'):q=20;
  226. lenta[pos]='f';
  227. pos++;
  228. break;
  229. case('6'):q=21;
  230. lenta[pos]='g';
  231. pos++;
  232. break;
  233. case('7'):q=22;
  234. lenta[pos]='h';
  235. pos++;
  236. break;
  237. case('8'):q=23;
  238. lenta[pos]='i';
  239. pos++;
  240. break;
  241. case('9'):q=24;
  242. lenta[pos]='j';
  243. pos++;
  244. break;
  245. case('-'):q=13;pos++;break;}
  246. break;
  247. case 15:switch(a) /*смещаемся к концу 2 числа*/
  248. {case('='):q=25;pos++;break;
  249. default:pos++;break;}
  250. break;
  251. case 16:switch(a) /*смещаемся к концу 2 числа*/
  252. {case('='):q=26;pos++;break;
  253. default:pos++;break;}
  254. break;
  255. case 17:switch(a) /*смещаемся к концу 2 числа*/
  256. {case('='):q=27;pos++;break;
  257. default:pos++;break;}
  258. break;
  259. case 18:switch(a) /*смещаемся к концу 2 числа*/
  260. {case('='):q=28;pos++;break;
  261. default:pos++;break;}
  262. break;
  263. case 19:switch(a) /*смещаемся к концу 2 числа*/
  264. {case('='):q=29;pos++;break;
  265. default:pos++;break;}
  266. break;
  267. case 20:switch(a) /*смещаемся к концу 2 числа*/
  268. {case('='):q=30;pos++;break;
  269. default:pos++;break;}
  270. break;
  271. case 21:switch(a) /*смещаемся к концу 2 числа*/
  272. {case('='):q=31;pos++;break;
  273. default:pos++;break;}
  274. break;
  275. case 22:switch(a) /*смещаемся к концу 2 числа*/
  276. {case('='):q=32;pos++;break;
  277. default:pos++;break;}
  278. break;
  279. case 23:switch(a) /*смещаемся к концу 2 числа*/
  280. {case('='):q=33;pos++;break;
  281. default:pos++;break;}
  282. break;
  283. case 24:switch(a) /*смещаемся к концу 2 числа*/
  284. {case('='):q=34;pos++;break;
  285. default:pos++;break;}
  286. break;
  287. case 25:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
  288. {case('a'):q=35;pos--;break;
  289. case('b'):q=35;pos--;break;
  290. case('c'):q=35;pos--;break;
  291. case('d'):q=35;pos--;break;
  292. case('e'):q=35;pos--;break;
  293. case('f'):q=35;pos--;break;
  294. case('g'):q=35;pos--;break;
  295. case('h'):q=35;pos--;break;
  296. case('i'):q=35;pos--;break;
  297. case('j'):q=35;pos--;break;
  298. case('#'):q=35;pos--;break;
  299. default:pos++;break;}
  300. break;
  301. case 26:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
  302. {case('a'):q=36;pos--;break;
  303. case('b'):q=36;pos--;break;
  304. case('c'):q=36;pos--;break;
  305. case('d'):q=36;pos--;break;
  306. case('e'):q=36;pos--;break;
  307. case('f'):q=36;pos--;break;
  308. case('g'):q=36;pos--;break;
  309. case('h'):q=36;pos--;break;
  310. case('i'):q=36;pos--;break;
  311. case('j'):q=36;pos--;break;
  312. case('#'):q=36;pos--;break;
  313. default:pos++;break;}
  314. break;
  315. case 27:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
  316. {case('a'):q=37;pos--;break;
  317. case('b'):q=37;pos--;break;
  318. case('c'):q=37;pos--;break;
  319. case('d'):q=37;pos--;break;
  320. case('e'):q=37;pos--;break;
  321. case('f'):q=37;pos--;break;
  322. case('g'):q=37;pos--;break;
  323. case('h'):q=37;pos--;break;
  324. case('i'):q=37;pos--;break;
  325. case('j'):q=37;pos--;break;
  326. case('#'):q=37;pos--;break;
  327. default:pos++;break;}
  328. break;
  329. case 28:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
  330. {case('a'):q=38;pos--;break;
  331. case('b'):q=38;pos--;break;
  332. case('c'):q=38;pos--;break;
  333. case('d'):q=38;pos--;break;
  334. case('e'):q=38;pos--;break;
  335. case('f'):q=38;pos--;break;
  336. case('g'):q=38;pos--;break;
  337. case('h'):q=38;pos--;break;
  338. case('i'):q=38;pos--;break;
  339. case('j'):q=38;pos--;break;
  340. case('#'):q=38;pos--;break;
  341. default:pos++;break;}
  342. break;
  343. case 29:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
  344. {case('a'):q=39;pos--;break;
  345. case('b'):q=39;pos--;break;
  346. case('c'):q=39;pos--;break;
  347. case('d'):q=39;pos--;break;
  348. case('e'):q=39;pos--;break;
  349. case('f'):q=39;pos--;break;
  350. case('g'):q=39;pos--;break;
  351. case('h'):q=39;pos--;break;
  352. case('i'):q=39;pos--;break;
  353. case('j'):q=39;pos--;break;
  354. case('#'):q=39;pos--;break;
  355. default:pos++;break;}
  356. break;
  357. case 30:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
  358. {case('a'):q=40;pos--;break;
  359. case('b'):q=40;pos--;break;
  360. case('c'):q=40;pos--;break;
  361. case('d'):q=40;pos--;break;
  362. case('e'):q=40;pos--;break;
  363. case('f'):q=40;pos--;break;
  364. case('g'):q=40;pos--;break;
  365. case('h'):q=40;pos--;break;
  366. case('i'):q=40;pos--;break;
  367. case('j'):q=40;pos--;break;
  368. case('#'):q=40;pos--;break;
  369. default:pos++;break;}
  370. break;
  371. case 31:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
  372. {case('a'):q=41;pos--;break;
  373. case('b'):q=41;pos--;break;
  374. case('c'):q=41;pos--;break;
  375. case('d'):q=41;pos--;break;
  376. case('e'):q=41;pos--;break;
  377. case('f'):q=41;pos--;break;
  378. case('g'):q=41;pos--;break;
  379. case('h'):q=41;pos--;break;
  380. case('i'):q=41;pos--;break;
  381. case('j'):q=41;pos--;break;
  382. case('#'):q=41;pos--;break;
  383. default:pos++;break;}
  384. break;
  385. case 32:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
  386. {case('a'):q=42;pos--;break;
  387. case('b'):q=42;pos--;break;
  388. case('c'):q=42;pos--;break;
  389. case('d'):q=42;pos--;break;
  390. case('e'):q=42;pos--;break;
  391. case('f'):q=42;pos--;break;
  392. case('g'):q=42;pos--;break;
  393. case('h'):q=42;pos--;break;
  394. case('i'):q=42;pos--;break;
  395. case('j'):q=42;pos--;break;
  396. case('#'):q=42;pos--;break;
  397. default:pos++;break;}
  398. break;
  399. case 33:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
  400. {case('a'):q=43;pos--;break;
  401. case('b'):q=43;pos--;break;
  402. case('c'):q=43;pos--;break;
  403. case('d'):q=43;pos--;break;
  404. case('e'):q=43;pos--;break;
  405. case('f'):q=43;pos--;break;
  406. case('g'):q=43;pos--;break;
  407. case('h'):q=43;pos--;break;
  408. case('i'):q=43;pos--;break;
  409. case('j'):q=43;pos--;break;
  410. case('#'):q=43;pos--;break;
  411. default:pos++;break;}
  412. break;
  413. case 34:switch(a) /*смещаемся на 1 непомеченую клетку результата*/
  414. {case('a'):q=44;pos--;break;
  415. case('b'):q=44;pos--;break;
  416. case('c'):q=44;pos--;break;
  417. case('d'):q=44;pos--;break;
  418. case('e'):q=44;pos--;break;
  419. case('f'):q=44;pos--;break;
  420. case('g'):q=44;pos--;break;
  421. case('h'):q=44;pos--;break;
  422. case('i'):q=44;pos--;break;
  423. case('j'):q=44;pos--;break;
  424. case('#'):q=44;pos--;break;
  425. default:pos++;break;}
  426. break;
  427. case 35:switch(a) /*записываем результат разности данного разряда*/
  428. {case('0'):q=45;
  429. lenta[pos]='a';
  430. pos--;
  431. break;
  432. case('1'):q=45;
  433. lenta[pos]='b';
  434. pos--;
  435. break;
  436. case('2'):q=45;
  437. lenta[pos]='c';
  438. pos--;
  439. break;
  440. case('3'):q=45;
  441. lenta[pos]='d';
  442. pos--;
  443. break;
  444. case('4'):q=45;
  445. lenta[pos]='e';
  446. pos--;
  447. break;
  448. case('5'):q=45;
  449. lenta[pos]='f';
  450. pos--;
  451. break;
  452. case('6'):q=45;
  453. lenta[pos]='g';
  454. pos--;
  455. break;
  456. case('7'):q=45;
  457. lenta[pos]='h';
  458. pos--;
  459. break;
  460. case('8'):q=45;
  461. lenta[pos]='i';
  462. pos--;
  463. break;
  464. case('9'):q=45;
  465. lenta[pos]='j';
  466. pos--;
  467. break;}
  468. break;
  469. case 36:switch(a) /*записываем результат разности данного разряда*/
  470. {case('0'):q=46;
  471. lenta[pos]='j';
  472. pos--;
  473. break;
  474. case('1'):q=45;
  475. lenta[pos]='a';
  476. pos--;
  477. break;
  478. case('2'):q=45;
  479. lenta[pos]='b';
  480. pos--;
  481. break;
  482. case('3'):q=45;
  483. lenta[pos]='c';
  484. pos--;
  485. break;
  486. case('4'):q=45;
  487. lenta[pos]='d';
  488. pos--;
  489. break;
  490. case('5'):q=45;
  491. lenta[pos]='e';
  492. pos--;
  493. break;
  494. case('6'):q=45;
  495. lenta[pos]='f';
  496. pos--;
  497. break;
  498. case('7'):q=45;
  499. lenta[pos]='g';
  500. pos--;
  501. break;
  502. case('8'):q=45;
  503. lenta[pos]='h';
  504. pos--;
  505. break;
  506. case('9'):q=45;
  507. lenta[pos]='i';
  508. pos--;
  509. break;}
  510. break;
  511. case 37:switch(a) /*записываем результат разности данного разряда*/
  512. {case('0'):q=46;
  513. lenta[pos]='i';
  514. pos--;
  515. break;
  516. case('1'):q=46;
  517. lenta[pos]='j';
  518. pos--;
  519. break;
  520. case('2'):q=45;
  521. lenta[pos]='a';
  522. pos--;
  523. break;
  524. case('3'):q=45;
  525. lenta[pos]='b';
  526. pos--;
  527. break;
  528. case('4'):q=45;
  529. lenta[pos]='c';
  530. pos--;
  531. break;
  532. case('5'):q=45;
  533. lenta[pos]='d';
  534. pos--;
  535. break;
  536. case('6'):q=45;
  537. lenta[pos]='e';
  538. pos--;
  539. break;
  540. case('7'):q=45;
  541. lenta[pos]='f';
  542. pos--;
  543. break;
  544. case('8'):q=45;
  545. lenta[pos]='g';
  546. pos--;
  547. break;
  548. case('9'):q=45;
  549. lenta[pos]='h';
  550. pos--;
  551. break;}
  552. break;
  553. case 38:switch(a) /*записываем результат разности данного разряда*/
  554. {case('0'):q=46;
  555. lenta[pos]='h';
  556. pos--;
  557. break;
  558. case('1'):q=46;
  559. lenta[pos]='i';
  560. pos--;
  561. break;
  562. case('2'):q=46;
  563. lenta[pos]='j';
  564. pos--;
  565. break;
  566. case('3'):q=45;
  567. lenta[pos]='a';
  568. pos--;
  569. break;
  570. case('4'):q=45;
  571. lenta[pos]='b';
  572. pos--;
  573. break;
  574. case('5'):q=45;
  575. lenta[pos]='c';
  576. pos--;
  577. break;
  578. case('6'):q=45;
  579. lenta[pos]='d';
  580. pos--;
  581. break;
  582. case('7'):q=45;
  583. lenta[pos]='e';
  584. pos--;
  585. break;
  586. case('8'):q=45;
  587. lenta[pos]='f';
  588. pos--;
  589. break;
  590. case('9'):q=45;
  591. lenta[pos]='g';
  592. pos--;
  593. break;}
  594. break;
  595. case 39:switch(a) /*записываем результат разности данного разряда*/
  596. {case('0'):q=46;
  597. lenta[pos]='g';
  598. pos--;
  599. break;
  600. case('1'):q=46;
  601. lenta[pos]='h';
  602. pos--;
  603. break;
  604. case('2'):q=46;
  605. lenta[pos]='i';
  606. pos--;
  607. break;
  608. case('3'):q=46;
  609. lenta[pos]='j';
  610. pos--;
  611. break;
  612. case('4'):q=45;
  613. lenta[pos]='a';
  614. pos--;
  615. break;
  616. case('5'):q=45;
  617. lenta[pos]='b';
  618. pos--;
  619. break;
  620. case('6'):q=45;
  621. lenta[pos]='c';
  622. pos--;
  623. break;
  624. case('7'):q=45;
  625. lenta[pos]='d';
  626. pos--;
  627. break;
  628. case('8'):q=45;
  629. lenta[pos]='e';
  630. pos--;
  631. break;
  632. case('9'):q=45;
  633. lenta[pos]='f';
  634. pos--;
  635. break;}
  636. break;
  637. case 40:switch(a) /*записываем результат разности данного разряда*/
  638. {case('0'):q=46;
  639. lenta[pos]='f';
  640. pos--;
  641. break;
  642. case('1'):q=46;
  643. lenta[pos]='g';
  644. pos--;
  645. break;
  646. case('2'):q=46;
  647. lenta[pos]='h';
  648. pos--;
  649. break;
  650. case('3'):q=46;
  651. lenta[pos]='i';
  652. pos--;
  653. break;
  654. case('4'):q=46;
  655. lenta[pos]='j';
  656. pos--;
  657. break;
  658. case('5'):q=45;
  659. lenta[pos]='a';
  660. pos--;
  661. break;
  662. case('6'):q=45;
  663. lenta[pos]='b';
  664. pos--;
  665. break;
  666. case('7'):q=45;
  667. lenta[pos]='c';
  668. pos--;
  669. break;
  670. case('8'):q=45;
  671. lenta[pos]='d';
  672. pos--;
  673. break;
  674. case('9'):q=45;
  675. lenta[pos]='e';
  676. pos--;
  677. break;}
  678. break;
  679. case 41:switch(a) /*записываем результат разности данного разряда*/
  680. {case('0'):q=46;
  681. lenta[pos]='e';
  682. pos--;
  683. break;
  684. case('1'):q=46;
  685. lenta[pos]='f';
  686. pos--;
  687. break;
  688. case('2'):q=46;
  689. lenta[pos]='g';
  690. pos--;
  691. break;
  692. case('3'):q=46;
  693. lenta[pos]='h';
  694. pos--;
  695. break;
  696. case('4'):q=46;
  697. lenta[pos]='i';
  698. pos--;
  699. break;
  700. case('5'):q=46;
  701. lenta[pos]='j';
  702. pos--;
  703. break;
  704. case('6'):q=45;
  705. lenta[pos]='a';
  706. pos--;
  707. break;
  708. case('7'):q=45;
  709. lenta[pos]='b';
  710. pos--;
  711. break;
  712. case('8'):q=45;
  713. lenta[pos]='c';
  714. pos--;
  715. break;
  716. case('9'):q=45;
  717. lenta[pos]='d';
  718. pos--;
  719. break;}
  720. break;
  721. case 42:switch(a) /*записываем результат разности данного разряда*/
  722. {case('0'):q=46;
  723. lenta[pos]='d';
  724. pos--;
  725. break;
  726. case('1'):q=46;
  727. lenta[pos]='e';
  728. pos--;
  729. break;
  730. case('2'):q=46;
  731. lenta[pos]='f';
  732. pos--;
  733. break;
  734. case('3'):q=46;
  735. lenta[pos]='g';
  736. pos--;
  737. break;
  738. case('4'):q=46;
  739. lenta[pos]='h';
  740. pos--;
  741. break;
  742. case('5'):q=46;
  743. lenta[pos]='i';
  744. pos--;
  745. break;
  746. case('6'):q=46;
  747. lenta[pos]='j';
  748. pos--;
  749. break;
  750. case('7'):q=45;
  751. lenta[pos]='a';
  752. pos--;
  753. break;
  754. case('8'):q=45;
  755. lenta[pos]='b';
  756. pos--;
  757. break;
  758. case('9'):q=45;
  759. lenta[pos]='c';
  760. pos--;
  761. break;}
  762. break;
  763. case 43:switch(a) /*записываем результат разности данного разряда*/
  764. {case('0'):q=46;
  765. lenta[pos]='c';
  766. pos--;
  767. break;
  768. case('1'):q=46;
  769. lenta[pos]='d';
  770. pos--;
  771. break;
  772. case('2'):q=46;
  773. lenta[pos]='e';
  774. pos--;
  775. break;
  776. case('3'):q=46;
  777. lenta[pos]='f';
  778. pos--;
  779. break;
  780. case('4'):q=46;
  781. lenta[pos]='g';
  782. pos--;
  783. break;
  784. case('5'):q=46;
  785. lenta[pos]='h';
  786. pos--;
  787. break;
  788. case('6'):q=46;
  789. lenta[pos]='i';
  790. pos--;
  791. break;
  792. case('7'):q=46;
  793. lenta[pos]='j';
  794. pos--;
  795. break;
  796. case('8'):q=45;
  797. lenta[pos]='a';
  798. pos--;
  799. break;
  800. case('9'):q=45;
  801. lenta[pos]='b';
  802. pos--;
  803. break;}
  804. break;
  805. case 44:switch(a) /*записываем результат разности данного разряда*/
  806. {case('0'):q=46;
  807. lenta[pos]='b';
  808. pos--;
  809. break;
  810. case('1'):q=46;
  811. lenta[pos]='c';
  812. pos--;
  813. break;
  814. case('2'):q=46;
  815. lenta[pos]='d';
  816. pos--;
  817. break;
  818. case('3'):q=46;
  819. lenta[pos]='e';
  820. pos--;
  821. break;
  822. case('4'):q=46;
  823. lenta[pos]='f';
  824. pos--;
  825. break;
  826. case('5'):q=46;
  827. lenta[pos]='g';
  828. pos--;
  829. break;
  830. case('6'):q=46;
  831. lenta[pos]='h';
  832. pos--;
  833. break;
  834. case('7'):q=46;
  835. lenta[pos]='i';
  836. pos--;
  837. break;
  838. case('8'):q=46;
  839. lenta[pos]='j';
  840. pos--;
  841. break;
  842. case('9'):q=45;
  843. lenta[pos]='a';
  844. pos--;
  845. break;}
  846. break;
  847. case 45:switch(a) /*смещаемся ко 2 числу*/
  848. {case('='):q=47;pos--;break;
  849. default:pos--;break;}
  850. break;
  851. case 46:switch(a) /*переносим 1 из старшего разряда*/
  852. {case('0'):
  853. lenta[pos]='9';
  854. pos--;
  855. break;
  856. case('1'):q=45;
  857. lenta[pos]='0';
  858. pos--;
  859. break;
  860. case('2'):q=45;
  861. lenta[pos]='1';
  862. pos--;
  863. break;
  864. case('3'):q=45;
  865. lenta[pos]='2';
  866. pos--;
  867. break;
  868. case('4'):q=45;
  869. lenta[pos]='3';
  870. pos--;
  871. break;
  872. case('5'):q=45;
  873. lenta[pos]='4';
  874. pos--;
  875. break;
  876. case('6'):q=45;
  877. lenta[pos]='5';
  878. pos--;
  879. break;
  880. case('7'):q=45;
  881. lenta[pos]='6';
  882. pos--;
  883. break;
  884. case('8'):q=45;
  885. lenta[pos]='7';
  886. pos--;
  887. break;
  888. case('9'):q=45;
  889. lenta[pos]='8';
  890. pos--;
  891. break;}
  892. break;
  893. case 47:switch(a) /*ищем непомеченый разряд 2 числа и помечаем его, если его нет, то операция разности завершена*/
  894. {case('0'):q=14;break;
  895. case('1'):q=14;break;
  896. case('2'):q=14;break;
  897. case('3'):q=14;break;
  898. case('4'):q=14;break;
  899. case('5'):q=14;break;
  900. case('6'):q=14;break;
  901. case('7'):q=14;break;
  902. case('8'):q=14;break;
  903. case('9'):q=14;break;
  904. case('-'):q=48;pos++;break;
  905. default:pos--;break;}
  906. break;
  907. case 48:switch(a) /*перемещаемся в конец ленты*/
  908. {case('#'):q=49;pos--;break;
  909. default:pos++;break;}
  910. break;
  911. case 49:switch(a) /*восстанавливаем все помеченные символы*/
  912. {case('a'):
  913. lenta[pos]='0';
  914. pos--;
  915. break;
  916. case('b'):
  917. lenta[pos]='1';
  918. pos--;
  919. break;
  920. case('c'):
  921. lenta[pos]='2';
  922. pos--;
  923. break;
  924. case('d'):
  925. lenta[pos]='3';
  926. pos--;
  927. break;
  928. case('e'):
  929. lenta[pos]='4';
  930. pos--;
  931. break;
  932. case('f'):
  933. lenta[pos]='5';
  934. pos--;
  935. break;
  936. case('g'):
  937. lenta[pos]='6';
  938. pos--;
  939. break;
  940. case('h'):
  941. lenta[pos]='7';
  942. pos--;
  943. break;
  944. case('i'):
  945. lenta[pos]='8';
  946. pos--;
  947. break;
  948. case('j'):
  949. lenta[pos]='9';
  950. pos--;
  951. break;
  952. case('#'):q=0;pos++;break;
  953. default:pos--;break;}
  954. break;
  955. }
  956. puts(lenta); /*вывод ленты на экран*/
  957. for (i=0;i<pos;i++) putchar(' ');
  958. putchar('^');
  959. printf("\t\tcoctoyanie Q%d\n",q);
  960. getch();
  961. } while(q!=0); /*q0-заключительное состояние*/
  962. printf("\nkonec raboty");
  963. getch();
  964. }

Решение задачи: «Сложение двух десятичных чисел в машине Тьюринга»

textual
Листинг программы
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <clocale>
  4. #include <conio.h>
  5. using namespace std;
  6. //Выводим на печать
  7. void print(char *str, int pos, int q){
  8.     cout<<"\nq="; cout<<q;
  9.     cout <<"\n@";
  10.     for (int i=1; str[i]!='@' ;i++)
  11.         cout <<str[i];
  12.     cout<<"@\n";
  13.     for (int i=0;i<pos;i++)
  14.         cout <<" ";
  15.     cout <<"^";
  16. }
  17. int q3_g12 (char *str, int &pos, int &q, char chch)
  18. {
  19.     char ch = str[pos];
  20.     switch(ch)
  21.     {
  22.     case ('0'):
  23.     case ('1'):
  24.     case ('2'):
  25.     case ('3'):
  26.     case ('4'):
  27.     case ('5'):
  28.     case ('6'):
  29.     case ('7'):
  30.     case ('8'):
  31.     case ('9'):
  32.     case ('-'):
  33.     case ('='): pos++;  break;
  34.     case ('@')://Обработка символа @
  35.         str[pos] = chch;
  36.         pos--;//Движение головки влево
  37.         q=13;//Новое состояние q13
  38.         break;
  39.     default: return q;
  40.     }
  41.     return 99;
  42. } 
  43. int razn (char* str)
  44. {
  45.     int pos=1;
  46.     char ch=str[pos];//Текущий символ
  47.     int q=0;
  48.     do
  49.     {
  50.         print(str, pos, q); Sleep(200);//_getch();
  51.         switch (q)
  52.         {
  53.         case 0://Обрабатываем состояние q0
  54.             switch(ch)
  55.                 {
  56.                     case ('0'):
  57.                     case ('1'):
  58.                     case ('2'):
  59.                     case ('3'):
  60.                     case ('4'):
  61.                     case ('5'):
  62.                     case ('6'):
  63.                     case ('7'):
  64.                     case ('8'):
  65.                     case ('9'):
  66.                     case ('-'): pos++;  break;
  67.                     case ('@')://Обработка символа @
  68.                         q=1;//Новое состояние q1
  69.                         str[pos] = '=';//Новый символ =
  70.                         print(str, pos, q); Sleep(200); pos--;//Движение головки влево
  71.                         break;
  72.                     default: return q;
  73.             }break;
  74.         case 1:
  75.             switch(ch)
  76.                 {
  77.                     case ('0'):
  78.                     case ('1'):
  79.                     case ('2'):
  80.                     case ('3'):
  81.                     case ('4'):
  82.                     case ('5'):
  83.                     case ('6'):
  84.                     case ('7'):
  85.                     case ('8'):
  86.                     case ('9'):
  87.                     case ('-'): pos--; break;
  88.                     case ('@'): pos++; q=2; break;
  89.                     default: return q;
  90.             }break;
  91.         case 2:
  92.             switch(ch)
  93.             {
  94.                 case ('0'): str[pos] = 'A'; pos++; q=3; break;
  95.                 case ('1'): str[pos] = 'B'; pos++; q=4; break;
  96.                 case ('2'): str[pos] = 'C'; pos++; q=5; break;
  97.                 case ('3'): str[pos] = 'D'; pos++; q=6; break;
  98.                 case ('4'): str[pos] = 'E'; pos++; q=7; break;
  99.                 case ('5'): str[pos] = 'F'; pos++; q=8; break;
  100.                 case ('6'): str[pos] = 'G'; pos++; q=9; break;
  101.                 case ('7'): str[pos] = 'H'; pos++; q=10; break;
  102.                 case ('8'): str[pos] = 'I'; pos++; q=11; break;
  103.                 case ('9'): str[pos] = 'J'; pos++; q=12; break;
  104.                 case ('-'): pos++; q=14; break;
  105.                 case ('='): pos++; q=16; break;
  106.                 default: return q;
  107.             }break;
  108.         case 3:
  109.             q3_g12(str, pos, q, '0');
  110.             break;
  111.         case 4:
  112.             q3_g12(str, pos, q, '1');
  113.             break;
  114.         case 5:
  115.             q3_g12(str, pos, q, '2');
  116.             break;
  117.         case 6:
  118.             q3_g12(str, pos, q, '3');
  119.             break;
  120.         case 7:
  121.             q3_g12(str, pos, q, '4');
  122.             break;
  123.         case 8:
  124.             q3_g12(str, pos, q, '5');
  125.             break;
  126.         case 9:
  127.             q3_g12(str, pos, q, '6');
  128.             break;
  129.         case 10:
  130.             q3_g12(str, pos, q, '7');
  131.             break;
  132.         case 11:
  133.             q3_g12(str, pos, q, '8');
  134.             break;
  135.         case 12:
  136.             q3_g12(str, pos, q, '9');
  137.             break;
  138.         case 13:
  139.             switch(ch)
  140.                 {
  141.                     case ('0'):
  142.                     case ('1'):
  143.                     case ('2'):
  144.                     case ('3'):
  145.                     case ('4'):
  146.                     case ('5'):
  147.                     case ('6'):
  148.                     case ('7'):
  149.                     case ('8'):
  150.                     case ('9'):
  151.                     case ('-'):
  152.                     case ('='): pos--; break;
  153.                     case ('A'):
  154.                     case ('B'):
  155.                     case ('C'):
  156.                     case ('D'):
  157.                     case ('E'):
  158.                     case ('F'):
  159.                     case ('G'):
  160.                     case ('H'):
  161.                     case ('I'):
  162.                     case ('J'): pos++; q=2; break;
  163.                     default: return q;
  164.             }break;
  165.         case 14:
  166.             switch(ch)
  167.                 {
  168.                     case ('0'):
  169.                     case ('1'):
  170.                     case ('2'):
  171.                     case ('3'):
  172.                     case ('4'):
  173.                     case ('5'):
  174.                     case ('6'):
  175.                     case ('7'):
  176.                     case ('8'):
  177.                     case ('9'):
  178.                     case ('='): pos++;  break;
  179.                     case ('@'):
  180.                         str[pos] = '-';
  181.                         pos--; q=15; break;
  182.                     default: return q;
  183.             }break;
  184.         case 15:
  185.             switch(ch)
  186.                 {
  187.                     case ('0'):
  188.                     case ('1'):
  189.                     case ('2'):
  190.                     case ('3'):
  191.                     case ('4'):
  192.                     case ('5'):
  193.                     case ('6'):
  194.                     case ('7'):
  195.                     case ('8'):
  196.                     case ('9'):
  197.                     case ('='): pos--;  break;
  198.                     case ('-'): pos++; q=2; break;
  199.                     default: return q;
  200.             }break;
  201.         case 16:
  202.             switch(ch)
  203.                 {
  204.                     case ('0'):
  205.                     case ('1'):
  206.                     case ('2'):
  207.                     case ('3'):
  208.                     case ('4'):
  209.                     case ('5'):
  210.                     case ('6'):
  211.                     case ('7'):
  212.                     case ('8'):
  213.                     case ('9'):
  214.                     case ('-'): pos++;  break;
  215.                     case ('@'): pos--; q=17; break;
  216.                     default: return q;
  217.             }break;
  218.         case 17:
  219.             switch(ch)
  220.             {
  221.                 case ('9'): str[pos] = '8'; q=20; break;
  222.                 case ('8'): str[pos] = '7'; q=20; break;
  223.                 case ('7'): str[pos] = '6'; q=20; break;
  224.                 case ('6'): str[pos] = '5'; q=20; break;
  225.                 case ('5'): str[pos] = '4'; q=20; break;
  226.                 case ('4'): str[pos] = '3'; q=20; break;
  227.                 case ('3'): str[pos] = '2'; q=20; break;
  228.                 case ('2'): str[pos] = '1'; q=20; break;
  229.                 case ('1'): str[pos] = '0'; q=20; break;
  230.                 case ('0'): pos--; q=18; break;
  231.                 default: return q;
  232.             }break;
  233.         case 18:
  234.             switch(ch)
  235.             {
  236.                 case ('9'): str[pos] = '8'; pos++; q=19; break;
  237.                 case ('8'): str[pos] = '7'; pos++; q=19; break;
  238.                 case ('7'): str[pos] = '6'; pos++; q=19; break;
  239.                 case ('6'): str[pos] = '5'; pos++; q=19; break;
  240.                 case ('5'): str[pos] = '4'; pos++; q=19; break;
  241.                 case ('4'): str[pos] = '3'; pos++; q=19; break;
  242.                 case ('3'): str[pos] = '2'; pos++; q=19; break;
  243.                 case ('2'): str[pos] = '1'; pos++; q=19; break;
  244.                 case ('1'): str[pos] = '0'; pos++; q=19; break;
  245.                 case ('0'): pos--; break;
  246.                 case ('-'): str[pos] = '@'; pos++; q=22; break;
  247.                 default: return q;
  248.             }break;
  249.         case 19:
  250.             switch(ch)
  251.                 {
  252.                     case ('0'): str[pos] = '9'; pos++;  break;
  253.                     case ('-'):
  254.                     case ('@'): pos--; q=20; break;
  255.                     default: return q;
  256.             }break;
  257.         case 20:
  258.             switch(ch)
  259.                 {
  260.                     case ('0'):
  261.                     case ('1'):
  262.                     case ('2'):
  263.                     case ('3'):
  264.                     case ('4'):
  265.                     case ('5'):
  266.                     case ('6'):
  267.                     case ('7'):
  268.                     case ('8'):
  269.                     case ('9'): pos--; break;
  270.                     case ('-'): pos--; q=17; break;
  271.                     case ('='): pos++; q=21; break;
  272.                     default: return q;
  273.             }break;
  274.         case 21:
  275.             switch(ch)
  276.                 {
  277.                     case ('0'):
  278.                     case ('1'):
  279.                     case ('2'):
  280.                     case ('3'):
  281.                     case ('4'):
  282.                     case ('5'):
  283.                     case ('6'):
  284.                     case ('7'):
  285.                     case ('8'):
  286.                     case ('9'):
  287.                     case ('-'): pos++; break;
  288.                     case ('@'): pos--; q=17; break;
  289.                     default: return q;
  290.             }break;
  291.         case 22:
  292.             switch(ch)
  293.                 {
  294.                     case ('0'):
  295.                     case ('1'):
  296.                     case ('2'):
  297.                     case ('3'):
  298.                     case ('4'):
  299.                     case ('5'):
  300.                     case ('6'):
  301.                     case ('7'):
  302.                     case ('8'):
  303.                     case ('9'): str[pos] = '@'; pos++; break;
  304.                     case ('@'): pos--; q=23; break;
  305.                     default: return q;
  306.             }break;
  307.         case 23:
  308.             switch(ch)
  309.                 {
  310.                     case ('0'):
  311.                     case ('1'):
  312.                     case ('2'):
  313.                     case ('3'):
  314.                     case ('4'):
  315.                     case ('5'):
  316.                     case ('6'):
  317.                     case ('7'):
  318.                     case ('8'):
  319.                     case ('9'):
  320.                     case ('@'): pos--; break;
  321.                     case ('='): pos--; q=24; break;
  322.                     default: return q;
  323.             }break;
  324.         case 24:
  325.             switch(ch)
  326.             {
  327.                 case ('A'): str[pos] = '0'; pos--;  break;
  328.                 case ('B'): str[pos] = '1'; pos--;  break;
  329.                 case ('C'): str[pos] = '2'; pos--;  break;
  330.                 case ('D'): str[pos] = '3'; pos--;  break;
  331.                 case ('E'): str[pos] = '4'; pos--;  break;
  332.                 case ('F'): str[pos] = '5'; pos--;  break;
  333.                 case ('G'): str[pos] = '6'; pos--;  break;
  334.                 case ('H'): str[pos] = '7'; pos--;  break;
  335.                 case ('I'): str[pos] = '8'; pos--;  break;
  336.                 case ('J'): str[pos] = '9'; pos--;  break;
  337.                 case ('-'): pos--; break;
  338.                 case ('@'): pos++; q=99; break;
  339.                 default: return q;
  340.             }break;
  341.         }
  342.     ch=str[pos];
  343.     }while (q!=99);
  344.     return q;
  345. }
  346. int main ()
  347. {
  348.     setlocale(LC_CTYPE,"Russian");//установка русской кодировки в консоле
  349.     char lenta[255];//входная строка
  350.     lenta[0] = '@';
  351.     cout<<"Эмуляция работы машины Тьюринга"<<endl;
  352.     cout<<"Введите два 10-х числа, между ними поставьте знак минуса (например 123-23):"<<endl;
  353.     cin>>&lenta[1];
  354.     for (size_t i=strlen(lenta) ;i<255;i++) lenta[i]='@';//Заполняем ленту служебными симполами
  355.     int q;
  356.     if ((q=razn(lenta))!=99)
  357.     {
  358.         cout <<"\nОшибка на состоянии " <<q;
  359.         _getch();
  360.         return 1;
  361.     }
  362.     cout <<"\nРезультат равен:";
  363.     print (lenta, 0, 99);
  364.     _getch();
  365.     return 0;
  366. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы