Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс калькулятор 
:(
    Опции темы
Maarriiaa
  Дата 7.10.2014, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;
}
}
PM MAIL   Вверх
VSB
Дата 7.10.2014, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 23.8.2007

Репутация: нет
Всего: 2



Посмотрите эти статьи
https://ru.wikipedia.org/wiki/Обратная_польская_запись
https://ru.wikipedia.org/wiki/Алгоритм_сортировочной_станции

С помощью них можно сделать калькулятор со всеми арифметическими операциями
PM MAIL   Вверх
sQu1rr
Дата 7.10.2014, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



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 посоветов польскую запись, ибо скобок нет, и алгоритм конечный будет проще в разы, но ИМХО, это сделает калькулятор неюзабельный для все обычных людей
PM MAIL Skype GTalk   Вверх
baldina
Дата 7.10.2014, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



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();
  }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0869 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.