Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [С++] Реализация калькулятора


Автор: reddevil 28.7.2005, 01:07
Помогите ПЛЗ!
Надо заматрячить калькулятор, но не такой как все, а, когда пользователь вводит
выражение, а потом получает ответ.
Выражение может быть любым.

Пример: 5+4*(8/(2*2))
Резултат: 5+4*(8/(2/2))=7

Написал код, но дощел до тупика! smile
После закрывающейся скобки, выражение не считается smile

Я в коде написал коментарии в том месте где предпологоаемая ошибка,
но как ее исправить я не знаю.

Код

// 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 smile

Заранее Спасибо!


Автор: reddevil 28.7.2005, 22:10
Спасибо всем кто пытался помочь, но не успел smile
Тему можно закрывать, или усовершенствовать код,
я нашел причину неправильного подсчета. smile
Там где я и предполагал, был некоректный выход из рекурсии,
но я уже все исправил.
Еще раз спасибо.
Если что пишите.
З.Ы. Я на форуме часто smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)