ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Вычислить значение арифметического выражения, преобразовав его в постфиксную форму. Предусмотреть со скобками и без скобок.(со стеком)#include <stdio.h> #include <string.h> #include <conio.h> // максимальное количество элементов в стеках const int max_stack_len = 10000; char stack_op[max_stack_len]; // Стек операций char stack_nm[max_stack_len]; // Стек операндов int stack_op_top = 0; // Переменная, указывающая на вершину стека операций int stack_nm_top = 0; // Переменная, указывающая на вершину стека операндов // Проверка содержимого вершины стека операций char top_op() { if (stack_op_top!= 0) return (stack_op[stack_op_top-1]); return (0); } // добавление значения в стек операций void push_op(char value) { stack_op[stack_op_top] = value; stack_op_top++; } // снятие элемента с вершины стека операций char pop_op() { stack_op_top--; return stack_op[stack_op_top]; } // проверка на пустоту стека операций int empty_op() { if (stack_op_top == 0) return 1; return 0; } // Проверка содержимого вершины стека операндов char top_nm() { if (stack_nm_top!= 0)return (stack_nm[stack_nm_top-1]); return (0); } // добавление значения в стек операндов void push_nm(char value) { stack_nm[stack_nm_top] = value; stack_nm_top++; } // снятие элемента с вершины стека операндов char pop_nm() { stack_nm_top--; return stack_nm[stack_nm_top]; } // проверка на пустоту стека операндов int empty_nm() { if (stack_nm_top == 0) return 1; return 0; } // выделение числа из строки. вход: str - исходная строка, i - номер элемента, начиная скоторого необходимо выделить число, ф-я возвращает выделенное из строки число и новое значение индекса i float get_digits(char *str, int &i) { float k=0.0, d=0.0; while(str[i]!=0 && ((str[i]>='0' && str[i]<='9') || str[i]=='.')) { if(str[i]=='.') d = 1; else {k *= 10.0; k += str[i]-'0'; d *= 10;} i++; } if(d==0) d=1; return(k/d); } // вычисление находящихся в стеке данных. выход: результаты вычислений накапливаются в стеке операндов int count() { char op; int flag=1; float v1,v2; while(!empty_op() && top_op()!= '(') { op = pop_op(); if(op=='+') { v2 = pop_nm(); v1 = pop_nm(); push_nm(v1+v2); } if(op=='-') { v2 = pop_nm(); v1 = pop_nm(); push_nm(v1-v2); } if(op=='*') { v2 = pop_nm(); v1 = pop_nm(); push_nm(v1*v2); } if(op=='/') { v2 = pop_nm(); v1 = pop_nm(); if(v2==0.0) { flag=0; break; } push_nm(v1/v2); } } return(flag); } void main() { char str[256]; int flag=1; float v; printf("Введите выражение: "); scanf("%s", str); for (int i=0; i<strlen(str); i++) { if (str[i] >= '0' && str[i] <= '9') push_nm(get_digits(str,i)); if (str[i] == '(') push_op(str[i]); if (str[i] == '*' || str[i] == '/') push_op(str[i]); if (str[i] == '+' || str[i] == '-') { if (count()==0) { flag=0; break; } push_op(str[i]); } if (str[i] == ')') { if (count()==0) { flag=0; break; } // если на стеке операций не находится соответствующая // открывающаяся скобка, то скобки неправильно расставлены if (empty_op()) { flag=0; break; } pop_op(); } } if(count()==0) flag=0; //если остались невычисленные операции, то в выражении есть ошибка if(!empty_op()) flag = 0; //если в стеке операндов нет ответа, то в выражении есть ошибка if(empty_nm()) flag = 0; else v = pop_nm(); // если после снятия ответа со стека операндов в нем ещё остались значения, то выражение содержит ошибку if(!empty_nm()) flag=0; if(flag) printf("%f\n", v); else printf("Ошибка в выражении");
}
Не нашли, что искали? Воспользуйтесь поиском:
|