Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2011, 21:35   #1
KAnst
 
Регистрация: 15.04.2011
Сообщений: 4
По умолчанию Калькулятор

Здравствуйте.Столкнулся с такой проблемой: Надо написать калькулятор, который считает по введенной строке.

Подскажите какие алгоритмы лучше использовать?

Пробовал с помощью обратной польской нотации, но там считаются числа от 0 до 9, и стандартные операции.А нужно чтобы числа были любыми, а так -же были функции типа синус , косинус и т.д.
KAnst вне форума Ответить с цитированием
Старый 15.04.2011, 21:52   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

с той же обратной полькой вы можете и считывать числа, и использовать функции, просто отделяя все пробелами, например
56 78 + sqrt
т.е. sqrt(56+78)

есть неплохой алгоритм рекурсивного спуска, для не суперсложного калькулятора подойдет
идея такая
Код:
double expression();

double getnum(){
    if(curchar>='0'&&curchar<='9'){
        //считываем и возвращаем число
    }else return expression();
};

double mult(){
    double result=getnum();
    while(curchar=='*'){
        result=result*getnum();
    };
};

double expression(){
    double result=mult();
    while(currchar=='+'){
        result=result+mult();
    };
};
если надо могу объяснить как это работает
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 15.04.2011, 22:26   #3
KAnst
 
Регистрация: 15.04.2011
Сообщений: 4
По умолчанию

Спасибо, буду пробовать .


Цитата:
Сообщение от Granus Посмотреть сообщение

есть неплохой алгоритм рекурсивного спуска, для не суперсложного калькулятора подойдет
В этом не суперсложном будут тригонометрические функции?
KAnst вне форума Ответить с цитированием
Старый 15.04.2011, 22:32   #4
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

естественно

единственная проблема - в нем нельзя (или, по крайней мере, сложно) сделать право-ассоциативные операции (возведение в степень, например). но скобки, поставленные пользователем, решают проблему
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 15.04.2011, 23:16   #5
KAnst
 
Регистрация: 15.04.2011
Сообщений: 4
По умолчанию

Случайно на этот алгоритм не похоже?
Код:
#include <string.h>
 
int main(void)
{
        float stack[70];
        float res;
        int m = 0;
        char query[100];
 
        printf("Введите выражение: ");
        gets(query);
 
        for (int i = 0; i < strlen(query); i++)
        {
                if (query[i] >= '0' && query[i] <= '9')
                {
                        stack[m] = query[i] - '0';
                        m++;
                        continue;
                }
 
                switch (query[i])
                {
                        case '+':
                        {
                                res = stack[m - 2] + stack[m - 1];
                                break;
                        } 
                        case '-':
                        {
                                res = stack[m - 2] - stack[m - 1];
                                break;
                        }
                        case '*':
                        {
                                res = stack[m - 2] * stack[m - 1];
                                break;
                        }
                        case '/':
                        {
                                res = stack[m - 2] / stack[m - 1];
                                break;
                        }
                }
 
                stack[m - 2] = res;
                m--;
        }
 
        printf("Ответ: %f", res);
        getchar();
 
        return 0;
}
KAnst вне форума Ответить с цитированием
Старый 15.04.2011, 23:21   #6
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

нет, совсем нет
я вам говорю про разбор нормальных выражений, типа sin(pi*5+1)-9/8
а это типичный калькулятор для обратной польки
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 16.04.2011, 15:00   #7
KAnst
 
Регистрация: 15.04.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение

если надо могу объяснить как это работает
Если не сложно.
KAnst вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Калькулятор на с++ Banner Помощь студентам 2 07.02.2011 11:42
Калькулятор @RH@nhel Общие вопросы Delphi 2 24.01.2011 06:39
Калькулятор ser70 JavaScript, Ajax 3 15.01.2011 21:10
калькулятор nexzis Помощь студентам 29 11.11.2010 03:50
калькулятор! Чика Общие вопросы Delphi 7 07.10.2010 18:05