Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 29.10.2008
Сообщений: 19
1

Дерево, калькулятор

19.11.2008, 21:17. Показов 6383. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Разработать программу «калькулятор». По запросу с клавиатуры вводится строка, которая может содержать: знаки операций +,-,*,/; константы, скобки (); имена функций sin, cos, tg, ctg, exp; переменную x. Строка задает некоторую математическую формулу. После проверки правильности формулы запрашивается значение переменной x и вычисляется результат.
Например, вводится следующее:
cos(x-5)*10/(2*x-5)
x=5
Результат: 2

Добавлено через 4 минуты 9 секунд
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
char *str="*-+/"; // Строка со знаками операций
struct Tree // Бинарное дерево
{
    char Ch; // Знак операции
    char sk; // Скобки
    double x,y; // 2 операнда
    Tree *pL, *pR; // Указатели на поддеревья
};
int Rang(char Ch) // Функция возвращает приоритет операции
{
    if (Ch=='+' || Ch=='-') return 1;
    else return 2;
}int priror(char sk)
{
    if (sk=='(' || sk==')') return 3;
}
void FormTree(char *s, Tree *&pV) // По строке формирует бинарное дерево
{
    int i=0, j;
    Tree *p;
    while((j=strcspn(s+i+1, str))!=strlen(s+i+1))  // Ищем знаки операций в строке
    {
        j+=(i+1);  // j - абсолютный индекс очередного знака операции в строке
        if (pV==0) // Дерево пустое
        {
            p=new Tree;
            p->pL=p->pR=0;
            sscanf(s+i, "%lf", &p->x); // Получаем значение первого операнда
            sscanf(s+j+1, "%lf", &p->y); // Получаем значение второго операнда
            p->Ch=s[j]; // Знак
            pV=p;
        }
        else // Дерево не пустое
        {
            p=new Tree;
            p->Ch=s[j]; // Знак операции для вершины дерева  
            sscanf(s+j+1, "%lf", &p->y); // Получаем значение второго операнда
            p->pR=0; // Правого поддерева нет
            if (((Rang(s[j])>Rang(pV->Ch))) && (Rang(s[j])>priror(pV->sk))) // Если ранг операции выше чем у вершины
            { // Новый элемент добавляем вниз и справо от от вершины  
                // Правое поддерево вершины становится левым поддеревом нового элемента
                p->pL=pV->pR; 
                p->x=pV->y;
                pV->pR=p; // Новый элемент становится правым поддеревом вершины 
            }
            else
            { // Ранг операции нового элемента не больше чем у вершина
                // Новый элемент становится новой вершиной
                // Старая вершина будет левым поддеревом нового элемента
                p->pL=pV;
                pV=p;
            }
        }
        i=j+1;
    }
 
}
 
double RezDer(Tree *pV)
{   // Функция получает результат по дереву
    double x, y;
    if (pV->pL) x=RezDer(pV->pL);
    else x=pV->x;
    if (pV->pR) y=RezDer(pV->pR);
    else y=pV->y;
    switch(pV->Ch)
    {
    case '+': return x+y;
    case '-': return x-y;
    case '*': return x*y;
    case '/': return x/y;
    }
    return 0;
}
 
int main(int argc, char* argv[])
{
    char Mystr[100];
    scanf("%s", Mystr);
 
    Tree *pV=0;
    FormTree(Mystr, pV);
    printf("Rez=%f", RezDer(pV));
    getch();
 
    return 0;
}
Например ввведем 2*((3+4)*2-4)
результат 20
Помогите плиз
Но моя прога не так работает
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2008, 21:17
Ответы с готовыми решениями:

Калькулятор выражений(строковый) через бинарное дерево
Создал калькулятор выражений, но он считает только целые числа. Не могу доработать чтобы работал на...

Бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой
Дано бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой.

Как преобразовать обычный калькулятор в калькулятор использующий класс стек?
#include <iostream> int main(){ int a = 0; int b = 0; char operation; ...

Дано дерево. Распечатать дерево по уровням
Дано дерево. Распечатать дерево по уровням.

0
19.11.2008, 21:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2008, 21:17
Помогаю со студенческими работами здесь

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при...

Напишите программу, которая бы читала дерево в формате (а) и затем печатала бы это дерево в формате (б).
Представление дерева: а) Д (Б (А, Ф (В,)), Е (,З (Ж, И))) б) Д Б ...

Дерево дерево, странное дерево
Нужна помощь в построении дерева. Задание таково: Вершина дерева содержит N целых значений и два...

Простой калькулятор и калькулятор с парсингом
Ребят я совсем не давно только начал изучать сишку, решил написать простенький калькулятор который...

Дерево, бинарное дерево
Читаю про дерево и не до конца понимаю, а точнее понимаю, но вопрос в том, правильно ли я понимаю,...

Бинарное дерево: как происходит добавления элемента в дерево с двумя параметрами
Здравствуйте! Прошу помощи у опытных программистов...)))) Есть класс дерево: class class1 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru