fork(2) download
  1. #include <stdio.h>
  2. int main(void) {
  3. int i=0; // индекс текущей команды
  4. int j=0; // индекс массива данных
  5. int acc = 0;
  6. int pzflag = 1; // Флаг acc>=0
  7. int zflag =1; // Флаг acc==0
  8. int pz_prev=0; // прыжок назад по условию acc>=0
  9. int z_prev=0; // прыжок назад по условию acc==0
  10. int prev=0; // безусловный прыжок назад
  11.  
  12. char command_mem[100] ="}>>^>+.~<+.~<<^>-<~{";
  13. int data_mem[10]={0};
  14. data_mem[0]=5; //инициализируем начальные значения
  15. data_mem[1]=1;
  16. data_mem[2]=1;
  17.  
  18. while ( command_mem[i] != '\0') {
  19. if(command_mem[i]==',') // считываем число в аккумулятор
  20. scanf("%d", &acc);
  21. if(command_mem[i]=='+') // прибавляем число из data_mem
  22. acc=acc+data_mem[j]; // к аккумулятору
  23. if(command_mem[i]=='-') // вычитаем число data_mem
  24. acc=acc-data_mem[j]; // из аккумулятора
  25. if(command_mem[i]=='>') // переход на следующий элемент данных
  26. j++;
  27. if(command_mem[i]=='<') // переход на предыдущий элемент данных
  28. j--;
  29. if(command_mem[i]=='~') // загружаем число из аккумулятора
  30. data_mem[j]=acc; // в память данных
  31. if(command_mem[i]=='^') // загружаем число из data_mem
  32. acc=data_mem[j]; // в аккумулятор
  33. if(command_mem[i]=='.') { // выводим число из аккумулятора на экран
  34. printf("Output: %d",acc);
  35. printf(" ");
  36. };
  37. if (command_mem[i]=='}') // прыгаем назад?
  38. pz_prev=1;
  39. if (command_mem[i]==')') // прыгаем назад?
  40. z_prev=1;
  41. if (command_mem[i]=='!') // прыгаем назад?
  42. prev=1;
  43. // безусловный переход вперёд
  44. if (command_mem[i]=='?' && prev==0) {
  45. while(command_mem[i] != '!')
  46. i++;
  47. }
  48. // безусловный переход назад
  49. if (command_mem[i]=='?' && prev==1) {
  50. while(command_mem[i] != '!')
  51. i--;
  52. }
  53. // переход вперёд по условию acc=0
  54. if (command_mem[i]=='(' && zflag==1 && z_prev==0) {
  55. while(command_mem[i] != ')')
  56. i++;
  57. }
  58. // переход назад по условию acc=0
  59. if (command_mem[i]=='(' && zflag==1 && z_prev==1) {
  60. while(command_mem[i] != ')')
  61. i--;
  62. }
  63. // переход вперёд по условию acc>=0
  64. if (command_mem[i]=='{' && pzflag==1 && pz_prev==0) {
  65. while(command_mem[i] != '}')
  66. i++;
  67. }
  68. // переход назад по условию acc>=0
  69. if (command_mem[i]=='{' && pzflag==1 && pz_prev==1) {
  70. while(command_mem[i] != '}')
  71. i--;
  72. }
  73. // флаги
  74. if(acc>=0){
  75. pzflag=1;}
  76. else {
  77. pzflag=0;}
  78. if(acc==0){
  79. zflag=1;}
  80. else {
  81. zflag=0;}
  82.  
  83. //printf("i=%d",i);printf(" ");
  84. i++; //увеличиваем индекс текущей команды
  85. }
  86. //переход на новую строку
  87. printf("\n");
  88. // выводим массив данных
  89. for (int k = 0; k<10; k++)
  90. printf("%d ", data_mem[k]);
  91. return 0;
  92. }
  93.  
Success #stdin #stdout 0s 9424KB
stdin
Standard input is empty
stdout
Output: 1 Output: 2 Output: 3 Output: 5 Output: 8 Output: 13 Output: 21 Output: 34 Output: 55 Output: 89 Output: 144 Output: 233 
-1 1 233 144 0 0 0 0 0 0