aiNayan

prooooooooooo

Dec 26th, 2020 (edited)
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.22 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define TRUE 1
  5. #define FALSE 0
  6. #define STACK_SIZE 100
  7. #define BUFFER_SIZE 100
  8.  
  9. typedef int bool;
  10.  
  11. typedef struct {
  12. char name;
  13. bool val;
  14. } var;
  15.  
  16. typedef struct {
  17. int top;
  18. bool els[STACK_SIZE];
  19. } stack_of_bool;
  20.  
  21. char expr[BUFFER_SIZE];
  22. int expr_len;
  23. var vars[24];
  24. int vars_len;
  25.  
  26.  
  27. bool is_full(stack_of_bool *sp) {
  28. return sp->top == STACK_SIZE - 1;
  29. }
  30.  
  31. bool is_empty(stack_of_bool *sp) {
  32. return sp->top == -1;
  33. }
  34.  
  35. bool peek(stack_of_bool *sp) {
  36. if (!is_empty(sp))
  37. return sp->els[sp->top];
  38. else {
  39. printf("Stack is empty.\n");
  40. exit(1);
  41. }
  42. }
  43.  
  44. void push(stack_of_bool *sp, bool val) {
  45. if (!is_full(sp)) {
  46. sp->els[++(sp->top)] = val;
  47. }
  48. else {
  49. printf("Stack is full.\n");
  50. exit(1);
  51. }
  52. }
  53.  
  54. bool pop(stack_of_bool *sp) {
  55. if (!is_empty(sp))
  56. return sp->els[(sp->top)--];
  57. else {
  58. printf("\nStack is empty.\n");
  59. exit(1);
  60. }
  61. }
  62.  
  63. void make_empty(stack_of_bool *sp) {
  64. sp->top = -1;
  65. }
  66.  
  67. int elems_count(stack_of_bool *sp) {
  68. return (sp->top) + 1;
  69. }
  70.  
  71. bool is_operator(const char c) {
  72. return c == '&' || c == '|' || c == '!' || c == '^';
  73. }
  74.  
  75. int vars_index(const char c) {
  76. int i;
  77. for (i = 0; i < vars_len; ++i) {
  78. if (vars[i].name == c) return i;
  79. }
  80. return -1;
  81. }
  82.  
  83. bool eval_expr() {
  84. int i, vi;
  85. char e;
  86. stack_of_bool s;
  87. stack_of_bool *sp = &s;
  88. make_empty(sp);
  89. for (i = 0; i < expr_len; ++i) {
  90. e = expr[i];
  91. if (e == 'T')
  92. push(sp, TRUE);
  93. else if (e == 'F')
  94. push(sp, FALSE);
  95. else if((vi = vars_index(e)) >= 0) {
  96. push(sp, vars[vi].val);
  97. }
  98. else switch(e) {
  99. case '&':
  100. push(sp, pop(sp) & pop(sp));
  101. break;
  102. case '|':
  103. push(sp, pop(sp) | pop(sp));
  104. break;
  105. case '!':
  106. push(sp, !pop(sp));
  107. break;
  108. case '^':
  109. push(sp, pop(sp) ^ pop(sp));
  110. break;
  111. default:
  112. printf("\nNon-conformant character '%c' in expression.\n", e);
  113. exit(1);
  114. }
  115. }
  116. if (elems_count(sp) != 1) {
  117. printf("\nStack should contain exactly one element.\n");
  118. exit(1);
  119. }
  120. return peek(sp);
  121. }
  122.  
  123. void set_vars(int pos) {
  124. int i;
  125. if (pos > vars_len) {
  126. printf("\nArgument to set_vars can't be greater than the number of variables.\n");
  127. exit(1);
  128. }
  129. else if (pos == vars_len) {
  130. for (i = 0; i < vars_len; ++i) {
  131. printf((vars[i].val) ? "T " : "F ");
  132. }
  133. printf("%c\n", (eval_expr()) ? 'T' : 'F');
  134. }
  135. else {
  136. vars[pos].val = FALSE;
  137. set_vars(pos + 1);
  138. vars[pos].val = TRUE;
  139. set_vars(pos + 1);
  140. }
  141. }
  142.  
  143. void process_expr() {
  144. int i, count = 0;
  145. for (i = 0; expr[i]; ++i) {
  146. if (!isspace(expr[i])) expr[count++] = toupper(expr[i]);
  147. }
  148. expr[count] = '\0';
  149. }
  150.  
  151. int main() {
  152. int i, h;
  153. char e;
  154. printf("&|!^ for and, or, not, xor, respectively\n");
  155.  
  156. while (TRUE) {
  157. printf("\nBoolean expression: ");
  158. fgets(expr, BUFFER_SIZE, stdin);
  159. fflush(stdin);
  160. process_expr();
  161. expr_len = strlen(expr);
  162. if (expr_len == 0) break;
  163. vars_len = 0;
  164. for (i = 0; i < expr_len; ++i) {
  165. e = expr[i];
  166. if (!is_operator(e) && e != 'T' && e != 'F' && vars_index(e) == -1) {
  167. vars[vars_len].name = e;
  168. vars[vars_len].val = FALSE;
  169. vars_len++;
  170. }
  171. }
  172. printf("\n");
  173. if (vars_len == 0) {
  174. printf("No variables were entered.\n");
  175. }
  176. else {
  177. for (i = 0; i < vars_len; ++i)
  178. printf("%c ", vars[i].name);
  179. printf("%s\n", expr);
  180. h = vars_len * 3 + expr_len;
  181. for (i = 0; i < h; ++i) printf("=");
  182. printf("\n");
  183. set_vars(0);
  184. }
  185. }
  186. return 0;
  187. }
Add Comment
Please, Sign In to add comment