Помогите ПЛЗ! Надо заматрячить калькулятор, но не такой как все, а, когда пользователь вводит выражение, а потом получает ответ. Выражение может быть любым.
Пример: 5+4*(8/(2*2)) Резултат: 5+4*(8/(2/2))=7
Написал код, но дощел до тупика! После закрывающейся скобки, выражение не считается
Я в коде написал коментарии в том месте где предпологоаемая ошибка, но как ее исправить я не знаю.
| Код | // Kalkulator.cpp : Defines the entry point for the console application. //
#include "stdafx.h" #include "conio.h"
using namespace std;
int Counter(char*); float Result(char *enter,int start,int count);
//-------------------------------------------------------------------------- Main int _tmain(int argc, _TCHAR* argv[]) { const int enter_size=75; char enter[enter_size]; int start =0; cout<<"Enter expression:\n"; cin.getline(enter,enter_size);
int count=Counter(enter);
for(int i=0;i<count;i++) cout<<enter[i];
cout<<"="<<Result(enter,start,count)<<endl<<endl;
getch();
return 0; }
//------------------------------------------------------------------------- Counter // Нахождение длинны введеннрго выражения int Counter(char *enter) { int count=0; while(enter[count]!=NULL) { count++; } return count; }
//------------------------------------------------------------------------- Result //Вычисление выражения float Result(char*enter,int start,int count) { float number[50]={0};//массив чисел char mark[50]={0};// массив знаков int n=0;// номер элемента массива
// Инициализация масивoв числами и знаками while(start<count) { if(enter[start]=='(')// если встретилась скобка вызвать функцию Result { start++; number[n]=Result(enter,start,count);// присвоить элементу массива результат // вычисления в скобках
/* Гдето тут должно быть присвоение в mark[n] следующего за скобкой знака,если он есть. Но как это реализовать, я не могу вкурить. помогите избавиться от БАГА (3+2)*4=5 */ n++;// на следующий элемент массива }
int point=0;// для плавающей точки while(enter[start]>='0' && enter[start]<='9'|| enter[start]=='.') { if(enter[start]>='0'&&enter[start]<='9') { number[n]=number[n]*10+(enter[start]-'0');// присвоение числа start++; } else { point=start;// если число дробное start++; } } if(point!=0) { for(int p=(start-1)-point;p>0;p--) number[n]=number[n]/10.0;// вычисление дробного числа } mark[n]=enter[start];// присвоение знака n++;// на следующий элемент массивов number и mark start++;// на следующий элемент массива enter }
while(n)// вычисление, результат в первом элементе массива { for(int i=0;i<=n;i++) { if(mark[i]=='*' || mark[i]=='/')// умножение и деление { if(mark[i]=='*') { number[i]*=number[i+1]; mark[i]=mark[i+1]; i++; for(int c=i;c<n;c++)//ротоция массива за результатом влево { number[c]=number[c+1]; mark[c]=mark[c+1]; } } else { number[i]/=number[i+1]; mark[i]=mark[i+1]; i++; for(int c=i;c<n;c++)// ротация { number[c]=number[c+1]; mark[c]=mark[c+1]; } } } } for(int i=0;i<n;i++) { if(mark[i]=='+' || mark[i]=='-')// сложение и вычитание { if(mark[i]=='+') { number[i]+=number[i+1]; mark[i]=mark[i+1]; for(int c=i+1;c<n;c++)// ротация { number[c]=number[c+1]; mark[c]=mark[c+1]; } } else { number[i]-=number[i+1]; mark[i]=mark[i+1]; for(int c=i+1;c<n;c++)// { number[c]=number[c+1]; mark[c]=mark[c+1]; } } } } n--; }
return number[0]; }
|
Подскажите пожалуйста как исправить этот BUG
Заранее Спасибо!
|