Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2010, 21:58   #1
Anastassija
Новичок
Джуниор
 
Регистрация: 22.06.2010
Сообщений: 3
По умолчанию Калькулятор на С++ с двусвязным списком

Всем привет!

Мне нужно сделать на С++ калькультор для консоли, выполняющий 4 действия (сложение, вычитание, умножение, деление).
Программа должна быть основана на принципах объектно-ориентированного программирования (в идеале надо сделать класс списка). Для промежуточного хранения чисел и знаков, надо использовать двусвязанный список.



1. Калькулятор должен работать как с целыми числами, так и с дробными числами и только в десятичной системе (Должен использоваться тип double).
2. Он должен работать "цепочкой" , т.е. производить действия не только над двумя числами, а например считать 3+8*9/15.
3. Должно учитываться приоритетное выполнение умножения и деления.
4. При делении на ноль должно выдаваться сообщение об ошибке
5. Программа должна быть бесконечным циклом, с возможностью прерывания пользователем (введение какого-либо специального знака).



Я что-то пробывала написать, но получается как-то кусками и мозги в кучку не собираются...... может быть кто-то сможет помочь...

Код:
#include <iostream>
#include <list>

using namespace std;

class Liste {
public:
double zahl;
char op;

Liste* next;
Liste* last;
Liste(double, char);
~Liste();

}


#include "Zulassungsaufgabe.h"

double zahl;
char op;

Liste* createList();
Liste* start=new Liste(zahl, op);
Liste* temp=start;
Liste* aftertemp=temp+1;
int main(){
while(op!='s', op!='=')
{
cout<<"Enter number: "<<zahl<<endl;
cin>>zahl;
cout<<"Enter operand: "<<op<<endl;
cin>>op;
Liste* neu= new Liste(zahl, op);
neu->last=temp;
temp=neu;
start->next=neu;
}

while (op=='*') {
temp->zahl=(temp->zahl)*(aftertemp->zahl);
temp->op=aftertemp->op;
temp->next=aftertemp->next;
temp->last=temp;}

while (op=='/') {
if(aftertemp->zahl==0){
cout<<"Fehler";}
else{
temp->zahl=(temp->zahl)/(aftertemp->zahl);
temp->op=aftertemp->op;
temp->next=aftertemp->next;
temp->last=temp;}}
while (op=='+') {
temp->zahl=(temp->zahl)+(aftertemp->zahl);
temp->op=aftertemp->op;
temp->next=aftertemp->next;
temp=temp->last;}
while (op=='-') {
temp->zahl=(temp->zahl)*(aftertemp->zahl);
temp->op=aftertemp->op;
temp->next=aftertemp->next;
temp->last=temp;}
}
Anastassija вне форума Ответить с цитированием
Старый 23.06.2010, 17:40   #2
romlo
Пользователь
 
Аватар для romlo
 
Регистрация: 21.06.2010
Сообщений: 49
По умолчанию

Я как раз пишу такой калькулятор на delphi. Объясню вкратце:
Сначала сделай функцию для примеров с действиями умножения и деления(то есть n*s/r и т.п.).
Т.к. приоритет вычисления у них одинаковый, их можно считать в строку. Организовать это легко.
Затем сделай функцию для примеров с действиями сложения и вычитания(то есть n+s-r и т.п.).
Опять же можно считать в строку.
Ну и наконец объедини.
Поставь цикл на оборачивание всех действий умножения и деления, идущих подряд, в скобки, затем цикл вычисления примеров в скобках при помощи первой функции. Ну и наконец обработай полученную строку второй функцией.

...Твой код я не разбирал и в консольных приложениях не силён. Но, надеюсь, мой совет тебе поможет.

Что касается деления на ноль, поставь перед обработкой примера что-то вроде "если позиция /0 в примере <> 0 и позиция /0. = 0 то выдать сообщение об ошибке и прервать процедуру.
romlo вне форума Ответить с цитированием
Старый 23.06.2010, 22:15   #3
Anastassija
Новичок
Джуниор
 
Регистрация: 22.06.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от romlo Посмотреть сообщение
Я как раз пишу такой калькулятор на delphi. Объясню вкратце:
Сначала сделай функцию для примеров с действиями умножения и деления(то есть n*s/r и т.п.).
Т.к. приоритет вычисления у них одинаковый, их можно считать в строку. Организовать это легко.
Затем сделай функцию для примеров с действиями сложения и вычитания(то есть n+s-r и т.п.).
Опять же можно считать в строку.
Ну и наконец объедини.
Поставь цикл на оборачивание всех действий умножения и деления, идущих подряд, в скобки, затем цикл вычисления примеров в скобках при помощи первой функции. Ну и наконец обработай полученную строку второй функцией.

...Твой код я не разбирал и в консольных приложениях не силён. Но, надеюсь, мой совет тебе поможет.

Что касается деления на ноль, поставь перед обработкой примера что-то вроде "если позиция /0 в примере <> 0 и позиция /0. = 0 то выдать сообщение об ошибке и прервать процедуру.


Да у меня в том и проблема...алгоритм я себе очень хорошо представляю, а вот воплотить его на практике совсем не получается...
Anastassija вне форума Ответить с цитированием
Старый 23.06.2010, 23:31   #4
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Цитата:
Сообщение от Anastassija Посмотреть сообщение
Программа должна быть основана на принципах объектно-ориентированного программирования (в идеале надо сделать класс списка).
Основная идея ООП - упростить повторное использование кода. std::list наше всио.

Код:
class Digit{
public:
    class NullDivision(){};
    Digit( const std::string from );
    Digit( const double from );
    double Get() const;
    void Multiplication( const Digit &digit );
    void Division( const Digit &digit );
    void Subtraction( const Digit &digit );
    void Addition( const Digit &digit );
protected:
    double value;
};
Можно красиво распарсить строку, распихать по спискам числа и операции и имея что-то типа такого класса можно производить их.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 24.06.2010, 11:20   #5
Anastassija
Новичок
Джуниор
 
Регистрация: 22.06.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от ozo Посмотреть сообщение
Основная идея ООП - упростить повторное использование кода. std::list наше всио.

Код:
class Digit{
public:
    class NullDivision(){};
    Digit( const std::string from );
    Digit( const double from );
    double Get() const;
    void Multiplication( const Digit &digit );
    void Division( const Digit &digit );
    void Subtraction( const Digit &digit );
    void Addition( const Digit &digit );
protected:
    double value;
};
Можно красиво распарсить строку, распихать по спискам числа и операции и имея что-то типа такого класса можно производить их.
Спасибо...а как распихивать числа по спискам? (кстати там должен быть всего один список)
Anastassija вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поле со списком Diamand Microsoft Office Access 4 14.05.2010 21:28
поля со списком linkin241 Microsoft Office Access 1 25.03.2010 22:51
Поле со списком Underfinder Microsoft Office Access 7 21.03.2010 17:17
работы со списком felmor Паскаль, Turbo Pascal, PascalABC.NET 0 06.06.2009 22:18
програма со списком maner0k Помощь студентам 0 13.04.2009 20:10