Форум программистов, компьютерный форум CyberForum.ru

Как работает калькулятор? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ OPZ with STL http://www.cyberforum.ru/cpp-beginners/thread303096.html
Добрый вечер. у меня имеется лаба (Обратная польская запись)... как можно ее лучше переделать, чтобы использовались stl библиотеки? //--------------------------------------------------------------------------- #include <vcl.h> #include "math.h" //#include <vector> #pragma hdrstop
C++ Определить время выполнения программы Господа как засеч време выполнение программы? Заранее всем огромное спасибо!!! http://www.cyberforum.ru/cpp-beginners/thread303094.html
C++ Подмена потоков
freopen("мой_файл.txt", "w", stdout) Как заменить мой_файл.txt на stdout? В Си
C++ программа на классы
Выручите плиз.Напишите программу, в которой класс tools представляет учетные карточки выданных инструментов. В карточке хранятся фамилия получателя, название, учетный код и количество выданных экземпляров инструмента. Функция main ( ) должна продемонстрировать работу с этой картотекой – создание, заполнение и просмотр карточек
C++ Матрица(11,11) в С++! Подскажите решение! http://www.cyberforum.ru/cpp-beginners/thread303085.html
Для матрицы С (11,11) целочисленных коротких чисел найти наименьшую среди сумм элементов диагоналей, параллельных побочной диагонали! ___________ Напишите или подскажите хотя бы приблизительно как делать эту задачу!!!
C++ Двоичные файлы: Переписать элементы первой половины файла в обратном порядке, а второй в исходном Переписать элементы первой половины файла в обратном порядке, а второй в исходном. Помогите пожалуйста(( подробнее

Показать сообщение отдельно
Chipnddail
14 / 14 / 1
Регистрация: 03.09.2009
Сообщений: 109
24.05.2011, 06:46     Как работает калькулятор?
Советую поискать про Обратную Польскую Запись.
С ее помощью можно наиболее эффективно разбирать даже сложные скобочные выражения.
Не так давно сам попробовал реализовать что-то вроде калькулятора на c99.

Возможно, пригодится мой код. Он довольно подробно прокомментирован.
C
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*Методы для преобразования входной текстовой строки в тесктовоую строку
 * в обратной польской записи для дальнейшего вычисления
 Бесскобочная символика Лукашевича*/
 
 
#include <stdio.h>
#include <stdlib.h>
#include "Stack.h"
 
static struct stack *opers_head = NULL; //указатель вершины стека операторов
struct stack *operands = NULL; //указатель вершины стека операндов
extern void operate(char c);
 
int isDigit(char c){ //определяет цифру
    return (c>='0' && c<='9');
}
 
int get_prior(char c){ //возвращает приоритет операции
    switch(c){
        case '(':
            return 0;
        case ')':
            return 1;
        case '+':
        case '-':
            return 2;
        case '*':
        case '/':
            return 3;
        default:
            return -1;
    }
}
int CalcOPN(char *input){
    char c;//Входной символ для анализа
    char buff[11]; //буфер для символов числа для преобразования в число
    char* buff_ptr = buff; //указатель на буфер символов
    int prior; //Приоритет оператора
    int left_oper_count = 0; //число появления открывающей скобки
    //Вынимаем по одному символу из входной строки
    while ((c=*input++)!='\0'){
        //если входной символ операнд(цифра), пишем в буфер
        if (isDigit(c))
        {
            *(buff_ptr++) = c;
        }
        else
        {
            //если оператор, выясняем приоритет
            prior=get_prior(c);
            //символ не является цифрой или оператором
            if (prior==-1){
                //завершаем программу с ошибкой
                fputs("Введен неверный символ", stdout);
                return(EXIT_FAILURE);
            }
            else{
                //есть символы в буфере (был считан операнд)
                //преобразуем его в int и положим в стек операндов
                if (buff_ptr > buff){
                    *buff_ptr = '\0';//нулевой символ в конце строки
                //Преобразованный символ помещаем в стек операндов 
                    push(atoi(buff), &operands);
                //Возвращаем указатель на начало массива
                    buff_ptr = buff;
                }
                    switch(c) {
                        case '(':
                            //увеличить счетчик открытых скобок
                            ++left_oper_count;
                            //затолкать скобку в стек
                            push(c, &opers_head);
                            break;
                        case '+': case '-': case '/': case '*':
               //если стек непустой проверяем приоритеты
                            if (!isEmptyStack(opers_head)) {                              
               //выталкиваем из стека операторы с равным и большим приоритетом
                                while (get_prior(c) < get_prior(peek(opers_head)))
                //вычисляем результат операции и пишем в стек операндов
                                            operate(pop(&opers_head));
                            }
               //заталкиваем орератор в стек
                            push(c, &opers_head);
                            break;
                        case ')':
                            //если нет открывающей скобки
                            if (left_oper_count<=0){
                                fputs("Непарные скобки", stdout);
                                return(EXIT_FAILURE);
                            }
                            //если есть открывающие
                            else {
                             //выталкиваем из стека все, что между скобками
                                while ((c=pop(&opers_head)) != '(')
                             //вычисляем результат и пишем в стек операндов
                                    operate(c);
                                //уменьшаем счетчик открытых скобок
                                --left_oper_count;
                            }
                            break;
                    }
            }
        }
    }
    //если буфер символов не пуст (был считан операнд)
    //преобразуем его в int и положим в стек операндов
    if (buff_ptr>buff){
        *buff_ptr = '\0';//нулевой символ в конце строки
        //Преобразованный символ помещаем в стек операндов 
        push(atoi(buff), &operands);
        //Возвращаем указатель на начало массива
        buff_ptr = buff;
    }
     //выталкием все, что осталось в стеке опрераторов
    while(!isEmptyStack(opers_head))
        //вычисляем результат и пишем в стек операндов
        operate(pop(&opers_head));
    return(EXIT_SUCCESS);
}
 
//вычисление над операндами на основе поступившего оператора
//реализованы только бинарные операции
void operate(char c) {
    //Извлекаем из стека два операнда
    int b = pop(&operands);
    int a = pop(&operands);
    switch(c){
        case '+':
            push(a + b, &operands);
            break;
        case '-':
            push(a - b, &operands);
            break;
        case '/':
            push(a / b, &operands);
            break;
        case '*':
            push(a * b, &operands);
            break;
    }
}
 
Текущее время: 09:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru