Advertisement
Guest User

Untitled

a guest
Jun 1st, 2016
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define SIZE_INPUT 1024
  6. #define SIZE_STR 40
  7.  
  8. typedef struct node{
  9.     char data[SIZE_STR];
  10.     struct node *left;
  11.     struct node *right;
  12. } node;
  13.  
  14. void check_tree(node* tree);
  15. node* zip_multip(node* tree);
  16. node* add_multip(node* tree);
  17. node* add_node(char* dt, node* l, node* r);
  18. int priority(char c);
  19. node* make_tree(char* expr, int first, int last);
  20. void print_tree(node* tree, int lrc);
  21. node* zip_tree(node* tree);
  22. int check_int(char* str);
  23. void tree_to_expr(node* tree, int priority_node);
  24. void int2str(int n, char* s);
  25. void reverse_t(char* s);
  26. int check_variable(char* str);
  27. int node_coount = 0, int_count = 0;
  28.  
  29.  
  30. int zip_array[50];
  31. int zip_count = 0, add_element = 1, entr = 0;
  32.  
  33. int main(int argc, char* argv[]){
  34.     char input[SIZE_INPUT];
  35.     node* tree;
  36.     node* tree_s;
  37.  
  38.     printf("Input expression: ");
  39.     fgets(input, SIZE_INPUT-2, stdin);
  40.     input[strlen(input)-1] = 0;
  41.     printf("-----------------------\n");
  42.     tree = make_tree(input, 0, strlen(input)-1);
  43.     print_tree(tree, 0);
  44.     printf("-----------------------\n");
  45.     tree = zip_tree(tree);
  46.     check_tree(tree);
  47.     while (tree != tree_s) {
  48.         tree_s = tree;
  49.         int_count = 0;
  50.         check_tree(tree);
  51.         if (int_count > 0) tree = zip_multip(tree);
  52.     }
  53.     tree = add_multip(tree);
  54.     print_tree(tree, 0);
  55.     printf("-----------------------\n");
  56.     tree_to_expr(tree, 1);
  57.     printf("\n\n");
  58.  
  59.     return 0;
  60. }
  61.  
  62. node* add_node(char *dt, node* l, node* r){
  63.     node* add = (node*)malloc(sizeof(node));
  64.     strcpy(add->data, dt);
  65.     add->left = l;
  66.     add->right = r;
  67.     node_coount++;
  68.     printf("%d\n", node_coount);
  69.     return add;
  70. }
  71.  
  72. int priority(char c){
  73.     switch(c){
  74.         case '+': case '-': return 1;
  75.         case '*': case '/': return 2;
  76.         default: return 3;
  77.     }
  78. }
  79.  
  80. node* make_tree(char* expr, int first, int last){
  81.     int minprt = 3, nest = 0, i, k, prt;
  82.     char temp[SIZE_STR];
  83.  
  84.     if(first == last){
  85.         temp[0] = expr[first];
  86.         temp[1] = 0;
  87.         return add_node(temp, 0, 0);
  88.     }
  89.     for(i = first; i<=last; i++){
  90.         if(expr[i] == '(') {nest++; continue;}
  91.         if(expr[i] == ')') {nest--; continue;}
  92.         if(nest>0) continue;
  93.         prt = priority(expr[i]);
  94.         if(prt <= minprt) {minprt = prt; k = i;}
  95.     }
  96.     if(minprt == 3){
  97.         if((expr[first] == '(') && (expr[last] == ')'))
  98.             return make_tree(expr, first+1, last-1);
  99.         else {
  100.             k = last-first+1;
  101.             strncpy(temp, expr+first, k);
  102.             temp[k] = 0;
  103.             return add_node(temp, 0, 0);
  104.         }
  105.     }
  106.     temp[0] = expr[k];
  107.     temp[1] = 0;
  108.     return add_node(temp, make_tree(expr, first, k-1), make_tree(expr, k+1, last));
  109. }
  110.  
  111. void print_tree(node* tree, int lrc){
  112.     static int level = 0;
  113.     int i;
  114.  
  115.     level++;
  116.     if (tree){
  117.         print_tree(tree->right, 2);
  118.         for (i = 0; i<level; i++) printf("  ");
  119.         if(lrc == 1) printf("\\_%s\n", tree->data);
  120.         else if (lrc == 2) printf("__%s\n", tree->data);
  121.         else printf("_%s\n", tree->data);
  122.         print_tree(tree->left, 1);
  123.     }
  124.     level--;
  125. }
  126.  
  127. void check_tree(node* tree)
  128. {
  129.     if (tree) {
  130.         if (check_int(tree->data)) {
  131.             int_count++;
  132.         }
  133.         check_tree(tree->left);
  134.         check_tree(tree->right);
  135.     }
  136. }
  137.  
  138. node* zip_multip(node* tree)
  139. {
  140.     zip_count++;
  141.     entr++;
  142.     printf("zc=%d\n", entr);
  143.     char temp[SIZE_STR];
  144.     if (!strcmp(tree->data, "*") && int_count > 1) {
  145.         if (check_variable(tree->right->data) && check_int(tree->left->data)) {
  146.             add_element *= atoi(tree->left->data);
  147.             printf("tree->left->data = %d, el = %d\n %s\n", atoi(tree->left->data), add_element, tree->right->data);
  148.             zip_multip(tree->left);
  149.            /* zip_multip(tree->right);*/
  150.             tree->left = 0;
  151.             strcpy(tree, tree->right);
  152.             tree->right = 0;
  153.  
  154.         }
  155.         else if (check_variable(tree->left->data) && check_int(tree->right->data)) {
  156.             add_element *= atoi(tree->right->data);
  157.             printf("tree->right->data = %d, el = %d\n %s\n", atoi(tree->right->data), add_element, tree->left->data);
  158.            /* zip_multip(tree->right);*/
  159.             zip_multip(tree->left);
  160.             tree->right = 0;
  161.             strcpy(tree, tree->left);
  162.             tree->left = 0;
  163.  
  164.         }
  165.          else if (tree->right) {
  166.             zip_multip(tree->left);
  167.  
  168.         }
  169.         else if (tree->left) zip_multip(tree->left);
  170.     }
  171.     return tree;
  172. }
  173.  
  174. node* add_multip(node* tree)
  175. {
  176.     if (zip_count == 1) return tree;
  177.     char temp[SIZE_STR];
  178.     if (!strcmp(tree->data, "*") && check_int(tree->right->data)) {
  179.         printf("add_multip = %d, add-el = %d \n", atoi(tree->right->data), add_element);
  180.         int2str(atoi(tree->right->data)*add_element, temp);
  181.         strcpy(tree->right->data, temp);
  182.         printf("add_multip = %d\n", atoi(tree->right->data));
  183.         return tree;
  184.     }
  185.     else if (!strcmp(tree->data, "*") && check_variable(tree->right->data)) {
  186.         tree = add_multip(tree->left);
  187.     }
  188.     return tree;
  189. }
  190.  
  191. node* zip_tree(node* tree){
  192.     char temp[SIZE_STR];
  193.     node *zip_node;
  194.     if(tree){
  195.         if(!check_int(tree->data)){
  196.             tree->left = zip_tree(tree->left);
  197.             tree->right = zip_tree(tree->right);
  198.         }
  199.         if(!strcmp(tree->data, "*")){
  200.             if(check_int(tree->left->data) && check_int(tree->right->data)){
  201.                 int2str(atoi(tree->left->data)*atoi(tree->right->data), temp); //itoa нет на лаб.компах
  202.                 strcpy(tree->data, temp);
  203.                 tree->left = 0;
  204.                 tree->right = 0;
  205.             }
  206.             /*else if ((check_int(tree->left->data) && check_variable(tree->right->data)) || (check_int(tree->right->data) && check_variable(tree->left->data))) {
  207.                 zip_multip(tree);
  208.             }*/
  209.         }
  210.     }
  211.     return tree;
  212. }
  213.  
  214. int check_int(char* str){
  215.     int i;
  216.     for(i = 0; i<strlen(str); i++) if(!(str[i]>='0' && str[i]<='9')) return 0;
  217.     return 1;
  218. }
  219.  
  220. int check_variable(char* str)
  221. {
  222.     int i;
  223.     printf("zz\n");
  224.     for(i = 0; i <strlen(str); i++) if(!isalpha(str[i])) return 0;
  225.     printf("xx\n");
  226.     return 1;
  227. }
  228.  
  229. void tree_to_expr(node* tree, int priority_node){
  230.     if(priority_node == 2) printf("(");
  231.     if(tree->left) {
  232.         if(!tree->left->left && !tree->left->right) tree_to_expr(tree->left, 1);
  233.         else tree_to_expr(tree->left, priority(tree->data[0]));
  234.     }
  235.     printf("%s", tree->data);
  236.     if(tree->right) {
  237.         if(!tree->right->left && !tree->right->right) tree_to_expr(tree->right, 1);
  238.         else tree_to_expr(tree->right, priority(tree->data[0]));
  239.     }
  240.     if(priority_node == 2) printf(")");
  241. }
  242.  
  243. void int2str(int n, char* s){
  244.     int i, sign;
  245.     if((sign = n) < 0) n = -n;
  246.     i = 0;
  247.     do {
  248.         s[i++] = n % 10 + '0';
  249.     } while ((n /= 10) > 0);
  250.     if (sign < 0) s[i++] = '-';
  251.     s[i] = '\0';
  252.     reverse_t(s);
  253. }
  254.  
  255. void reverse_t(char* s){
  256.     int i, j;
  257.     char c;
  258.     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
  259.         c = s[i];
  260.         s[i] = s[j];
  261.         s[j] = c;
  262.     }
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement