Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [С++] Реализация калькулятора 
:(
    Опции темы
reddevil
Дата 28.7.2005, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.6.2005
Где: Украина. г.Днепро петровск

Репутация: нет
Всего: нет



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

Пример: 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

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


PM MAIL   Вверх
reddevil
Дата 28.7.2005, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.6.2005
Где: Украина. г.Днепро петровск

Репутация: нет
Всего: нет



Спасибо всем кто пытался помочь, но не успел smile
Тему можно закрывать, или усовершенствовать код,
я нашел причину неправильного подсчета. smile
Там где я и предполагал, был некоректный выход из рекурсии,
но я уже все исправил.
Еще раз спасибо.
Если что пишите.
З.Ы. Я на форуме часто smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.