11 Выражение содержащее целые константы арифметические операции скобки

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*11. Выражение, содержащее целые константы,
арифметические операции и скобки, может быть представлено
в виде двоичного дерева. Концевая вершина дерева должна
содержать значение константы. Промежуточная - код операции
и указатели на правый и левый операнды - вершины дерева.
Функция получает строку, содержащую выражение, и строит
по ней дерево. Другая функция производит вычисления по
полученному дереву.
*/
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#define PLUS -1
#define MINUS -2
#define UMN -3
struct tree
{
int elem;
tree *left, *right;
};
int n=0,k=0;
int in(FILE *f, tree **D) //Формирование дерева формулы
{
char ch,t;
fscanf(f,"%c",&ch);
while(!feof(f) && ch != '\n')
{
if(ch <= '9' && ch >= '0')
{
int x = ch - '0'; //численное значение символа
fscanf(f, "%c", &ch);
while(ch >= '0' && ch <= '9')
{
x = 10*x + ch - '0';
fscanf(f, "%c", &ch);
}
ungetc(ch,f);
(*D)->elem = x;
(*D)->left = (*D)->right = NULL;
printf("level=%d # elementa value=%d\n ",k,n++,(*D)->elem);
return 0;
}
else if(ch == '+')
{
(*D)->elem = PLUS;
(*D)->right = new tree;
(*D)->right->left = (*D)->right->right = NULL;
in(f,&((*D)->right));
printf("level=%d # elementa value=%d\n",k,n++,(*D)->elem);
}
else if(ch == '-')
{
(*D)->elem = MINUS;
(*D)->right = new tree;
(*D)->right->left = (*D)->right->right = NULL;
in(f,&((*D)->right));
printf("level=%d # elementa value=%d\n",k,n++,(*D)->elem);
}
else if(ch == '*')
{
(*D)->elem = UMN;
(*D)->right = new tree;
(*D)->right->left = (*D)->right->right = NULL;
in(f,&((*D)->right));
printf("level=%d # elementa value=%d\n",k,n++,(*D)->elem);
}
else if(ch == '(')
{
k++;
(*D)->left = new tree;
(*D)->left->left = (*D)->left->right = NULL;
in(f,&((*D)->left));
}
else if(ch == ')'){k--; return 0;}
fscanf(f,"%c",&ch);
}
//k++;
return 0;
}
int calc(tree **D) //Высчитывание формулы
{
tree* d = (*D);
if(d->elem >= 0) return d->elem;
else
{
int l = calc(&(d->left));
int r = calc(&(d->right));
switch(d->elem)
{
case PLUS: return l+r; break;
case MINUS: return l-r; break;
case UMN: return l*r; break;
}
}
return 0;
}
void main()
{ char stroka;
int n=1;
tree *D = new tree;
D->left = D->right = NULL;
FILE *f = fopen("input.txt","w");
fprintf(f,"%c", &stroka);
in(f,&D);
int res = calc(&D);
printf("%d\n",res);
getch();
}