![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Maarriiaa |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
Подскажите пожалуйста, как написать класс калькулятор(операции только сложение и вычитание). Я знаю как это сделать для определенного числа параметров, но как преобразовать, чтобы пользователь мог вводить арифметическое выражение, состоящее из неограниченного числа цифр-не представляю.
Вот попыталась, но не уверенна, что так #include<iostream> #include<string.h> #include<stdio.h> #define ZNAK 1 #define CHISLO 2 using namespace std; class calculator {private: char *formula; char leks[100]; char lek_tip; public: void calculator::Nachalo(double *result){ get_leks(); sloz_vichet(result); } void calculator::sloz_vichet (double *result){ char up; double temp; while((up = *leks) == '+' || up == '-'){ get_leks(); switch(up){ case '-': *result= *result-temp; break; case '+': *result= *result+temp; break; }}} void calculator:: leks_potok(){ char *t; t=leks; for(;*t;t++) formula--; } void calculator::get_leks(){ char *temp; lek_tip=0; temp=leks; *temp='\0'; if(!*formula) return; while(isspace(*formula)) ++formula; if(strchr("+-=",*formula)){ lek_tip=ZNAK; *temp++= *formula++; } else if(isdigit(*formula)){ *temp++= *formula++; lek_tip=CHISLO; } *temp='\0'; }; int main() { double result; char *p; p=(char *)malloc(100); if(!p) cout«"Oshibka"; do{ formula=p; cout«"Vvedite virazenie: "«endl; gets(formula); if(!*formula) break; Nachalo(&result); cout«"Result: "«result«endl«endl; } while(*p); system ("pause"); return 0; } } |
|||
|
||||
VSB |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 23.8.2007 Репутация: нет Всего: 2 |
Посмотрите эти статьи
https://ru.wikipedia.org/wiki/Обратная_польская_запись https://ru.wikipedia.org/wiki/Алгоритм_сортировочной_станции С помощью них можно сделать калькулятор со всеми арифметическими операциями |
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
1. Используйте таги "код" для своего кода, читать невозможно а то.
2. Это С или С++ (судя по инклюдам С++), тогда почему православный std::string не используете? 3. Если еще не научились, то пора бы, если задание по учебе (и нельзя использовать) то есть центр помощи По вопросу:
то, тут правильно заметили Но я не считаю нужным с обратной польской записью мозг ломать. Это довольно экзотическое решение. А так да, парсите на токены и собираете выражение https://mattmccutchen.net/bigint/ или https://gmplib.org/ (у них есть классы для С++, зарыты где то в примерах) Добавлено через 1 минуту и 32 секунды Добавлю, что я понимаю, что мр VSB посоветов польскую запись, ибо скобок нет, и алгоритм конечный будет проще в разы, но ИМХО, это сделает калькулятор неюзабельный для все обычных людей |
|||
|
||||
baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Maarriiaa, есть динамические структуры данных, для которых не требуется заранее знать число элементов. в С++ это стандартные vector, list и некоторые другие.
но в вашей задаче вообще нет необходимости хранить числа (и cоответственно знать их число), т.к. вычислять значение выражения можно в процессе синтаксического анализа. формула имеет вид
или подробнее
в соответствии с этим разбор выражения и вычисление будет примерно таким (предполагается, что number_ устанавливается в get_lexem())
|
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |