С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Spirit2222
0 / 0 / 1
Регистрация: 02.11.2013
Сообщений: 32
#1

Калькулятор для курсовой - C++

24.11.2014, 15:28. Просмотров 221. Ответов 0
Метки нет (Все метки)

Как тему курсовой работы взял написание калькулятора. Не могу понять, как реализовать ввод с клавиатуры всего выражения в одну строку так, чтоб его потом распознать. Суть вопроса: как разобрать строку типа "2+(4*7^2)" на действия и выполнить их в нужном порядке?

Добавлено через 16 минут
Вот нашел решение, может кому понадобится)
P.S. ШАГовцам привет)

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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#define _CRT_SECURE_NO_WARNINGS
 
#include <iostream>
#include <conio.h>
//#include <string>
using namespace std;
 
#define Esc 27
 
double Do_Polynom(const char* polynom, int first, int last);
 
// не учитывает пробелы, которые пользователь может ввести
void Space(char* string)
{
    int i = 0;                          // индекс места в строке "куда копировать"
    int j = 0;                          // индекс места в строке "откуда копировать"
 
    /*while (   (  *(string + i) = *(string + j++)  ) != '\0'   ) // цикл, пока очередной символ не '\0'
    {
    if (*(string + i) != ' ')  // увеличиваем i, если символ не пробел
    i++;
    }
    return;*/
 
    while ((string[i] = string[j++]) != '\0')
    {
        if (string[i] != ' ')
            i++;
    }
    return;
}
 
//переводит входящую строку в число с учетом скобок и десятичной точки
double Do_Number(const char* number, int first, int last)
{
    if (number[first] == '(')
        return Do_Polynom(number, first + 1, last - 1);
 
    int length = last - first + 1;
 
    if (!length) // если длина = 0
        return 0;
 
    char* temp = new char[length + 1];
 
    for (int i = 0; i < length; i++)
        temp[i] = number[i + first];
 
    temp[length] = '\0';
 
    double result = atof(temp);
 
    delete[] temp;
 
    return result;
}
 
//вычисляет степень - принимает строку и индексы символов, ограничивающие степень
double Do_Power(const char* power, int first, int last)
{
    int i = last;
 
    for (int count = 0; i >= first; i--)
    {
        if (power[i] == ')')
            count++;
 
        else if (power[i] == '(')
            count--;
 
        if (!count && power[i] == '^')
            break;
    }
 
    if (i < first)
        return Do_Number(power, first, last);
 
    double base = Do_Power(power, first, i - 1);
    double exponent = Do_Number(power, i + 1, last);
 
    return pow(base, exponent); // функция pow вычисляет base, возведённое в степень exponent
}
 
//вычисляет одночлен - принимает строку и индексы символов, ограничивающие нужный одночлен
double Do_Monom(const char* monom, int first, int last)
{
    int i = last;
 
    for (int count = 0; i >= first; i--)
    {
        if (monom[i] == ')')
            count++;
 
        else if (monom[i] == '(')
            count--;
 
        if (!count && (monom[i] == '*' || monom[i] == '/'))
            break;
    }
 
    if (i < first)
        return Do_Power(monom, first, last);
 
    double right = Do_Monom(monom, first, i - 1);
    double left = Do_Power(monom, i + 1, last);
 
    if (monom[i] == '*')
        return right * left;
 
    if (!left)
        cout << "Division by zero is forbidden! Try again more carefully";
    return right / left;
}
 
//вычисляет многочлен - принимает строку и индексы символов, ограничивающие нужный многочлен
double Do_Polynom(const char* polynom, int first, int last)
{
    int i = last;
 
    for (int count = 0; i >= first; i--)
    {
        if (polynom[i] == ')')
            count++;
 
        else if (polynom[i] == '(')
            count--;
 
        if (!count && (polynom[i] == '+' || polynom[i] == '-'))
            break;
    }
 
    if (i < first)
        return Do_Monom(polynom, first, last);
 
    return Do_Polynom(polynom, first, i - 1) + ((polynom[i] == '+') ? 1 : -1) * Do_Monom(polynom, i + 1, last);
}
 
//вычисляет выражение, переданное строкой
double Execute(char* expression) // expression - выражение
{
    int length = strlen(expression);
 
    if (!length)
        return 0;
 
    int count = 0;
 
    for (int i = 0; i < length; i++)
    {
        if (expression[i] == '(') // скобка открылась
            count++;
 
        else if (expression[i] == ')') // скобка должна закрыться
            count--;
 
        else if (!(expression[i] == '.' || expression[i] == '+' || expression[i] == '-' ||
            expression[i] == '*' || expression[i] == '/' || expression[i] == ' ' || expression[i] == '^' || expression[i] >= '0' && expression[i] <= '9'))
        {
            cout << "Wrong symbol detected! Try again more carefully";
            return 0;
        }
    }
 
    if (count)
    {// если случилась лишняя скобка
        cout << "Wrong count of brackets!" << endl;
        cout << "Try again more carefully";
 
        return 0;
    }
 
    return Do_Polynom(expression, 0, length - 1);
}
 
void main()
{
    //cout << Execute("(3+5)*6.34-8+9^2/2") << endl;
    //cout << "3.5+2*5" << " = " << Execute("3.5+2*5") << endl;                              //  13.5
    //cout << "(3+2)*5" << " = " << Execute("(3+2)*5") << endl;                              //  25
    //cout << "(3+4*(5-2)-1)/2" << " = " << Execute("(3+4*(5-2)-1)/2") << endl;        //   7
    //cout << "(3+5)^2-60-2^3" << " = " << Execute("(3+5)^2-60-2^3") << endl;       //  -4
 
    setlocale(LC_ALL, "Russian");
    char s[80] = { 0 };
 
    while (true)
    {
        cout << "Введите арифметическое выражение:" << endl;
        //cin.getline(s, 80);
        //cin.getline(s, sizeof s);
 
        gets(s);
        Space(s); // удаляем все пробелы из строки
        if (!s[0])
            return;
 
        cout << " = " << Execute(s) << endl;
 
        if (_getch() == Esc)
            exit(0);
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2014, 15:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Калькулятор для курсовой (C++):

Работа для курсовой - C++
Задание: Даны N точек на плоскости. Для всех треугольников, образуемых любыми тремя точками, определить, является ли треугольник...

Тема для курсовой - C++
Добрый день! Тема для курсовой должна быть из области &quot;Компьютерной графики&quot;. Темы по обработке и распознаванию изображений довольно...

Темя для курсовой - C++
Всем привет) Есть у меня идея создать одну прогу, сам я будущий программист 4 курс уже) и вот хочу на курсовую создать программу, похожая...

Тема для курсовой - C++
И снова здравствуйте :) в связи с началом учёбы, встал вопрос, что надо писать курсовую работу, может кто посоветует, какую тему лучше...

Тема для курсовой(DLL, C++) - C++
Всем привет. Пожалуйста, помогите с заданием для курсовой. Идея заключается в использовании собственных библиотек DLL, язык С++. Нужно...

Оригинальная идея для курсовой - C++
Прошу помочь подсказать оригинальную идею для проекта. Огромную важность играет, чтобы проект в дальнейшем смог распостраняться бесплатно и...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2014, 15:28
Привет! Вот еще темы с ответами:

Придумать тему для курсовой.. - C++
Ну в общем все сказано в названии этой темы. Тема должна быть актуальной) Программа любого вида, на любом языке. Программа может быть...

Нужна заставка для курсовой C++ - C++
код какой-либо заставки для курсовой с надо

Нужны материалы для курсовой - C++
Помогите скиньте книги материалы и т.д где можно почитать про ниже сказанное буду очень благодарен Распознавание образов. Основные...

Тема для курсовой работы - C++
Добрый вечер. Нас сегодня обрадовали курсачом, а точнее так: делать его будем со второго полусеместра, но я задумываюсь над ним...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.