Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Класс калькулятор


Автор: Maarriiaa 7.10.2014, 12:20
Подскажите пожалуйста, как написать класс калькулятор(операции только сложение и вычитание). Я знаю как это сделать для определенного числа параметров, но как преобразовать, чтобы пользователь мог вводить арифметическое выражение, состоящее из неограниченного числа цифр-не представляю.
Вот попыталась, но не уверенна, что так
#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 7.10.2014, 16:46
Посмотрите эти статьи
https://ru.wikipedia.org/wiki/Обратная_польская_запись
https://ru.wikipedia.org/wiki/Алгоритм_сортировочной_станции

С помощью них можно сделать калькулятор со всеми арифметическими операциями

Автор: sQu1rr 7.10.2014, 20:46
1. Используйте таги "код" для своего кода, читать невозможно а то.
2. Это С или С++ (судя по инклюдам С++), тогда почему православный std::string не используете?
3. Если еще не научились, то пора бы, если задание по учебе (и нельзя использовать) то есть центр помощи

По вопросу:

Цитата(Maarriiaa @  7.10.2014,  12:20 Найти цитируемый пост)
как преобразовать, чтобы пользователь мог вводить арифметическое выражение

то, тут правильно заметили
Цитата(VSB @  7.10.2014,  16:46 Найти цитируемый пост)
https://ru.wikipedia.org/wiki/Алгоритм_сортировочной_станции

Но я не считаю нужным с обратной польской записью мозг ломать. Это довольно экзотическое решение.
А так да, парсите на токены и собираете выражение


Цитата(Maarriiaa @  7.10.2014,  12:20 Найти цитируемый пост)
состоящее из неограниченного числа цифр

https://mattmccutchen.net/bigint/
или
https://gmplib.org/ (у них есть классы для С++, зарыты где то в примерах)

Добавлено через 1 минуту и 32 секунды
Добавлю, что я понимаю, что мр VSB посоветов польскую запись, ибо скобок нет, и алгоритм конечный будет проще в разы, но ИМХО, это сделает калькулятор неюзабельный для все обычных людей

Автор: baldina 7.10.2014, 23:49
Maarriiaa, есть динамические структуры данных, для которых не требуется заранее знать число элементов. в С++ это стандартные vector, list и некоторые другие.
но в вашей задаче вообще нет необходимости хранить числа (и cоответственно знать их число), т.к. вычислять значение выражения можно в процессе синтаксического анализа.
формула имеет вид 
Код

expression: number [ '+'|'-' expression ]

или подробнее
Код

expression: 
  number '+' expression 
| number '-' expression
| number

в соответствии с этим разбор выражения и вычисление будет примерно таким (предполагается, что number_ устанавливается в get_lexem())
Код

int expression () {
  if (get_lexem () != NUMBER)
    throw SyntaxError();
  int lhs = number_;
  switch (get_lexem ()) {
    case EOS  : return lhs;
    case PLUS : return lhs + expression();      
    case MINUS: return lhs - expression();
    default   : throw SyntaxError();
  }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)