Вопрос № 180088: Уважаемые эксперты,помогите пожалуйста решить задачу. Организовать меню,в ктором составить описание класса для объектов-векторов, которые задаются координатами конца в трехмерном пространстве. Обеспечить операции сложения и вычитания с получением ...
Вопрос № 180088:
Уважаемые эксперты,помогите пожалуйста решить задачу. Организовать меню,в ктором составить описание класса для объектов-векторов, которые задаются координатами конца в трехмерном пространстве. Обеспечить операции сложения и вычитания с получением вектора(-суммы или -разности), вычисления скалярного произведения двух векторов, длины вектора и косинуса угла между векторами. И если можно,то с комментариями. Очень нужно Заранее спасибо!
Отправлен: 29.09.2010, 16:29
Вопрос задал: Olgaa, Посетитель
Всего ответов: 2 Страница вопроса »
// Программа работает по принципу калькулятора с обратной(польской) записью // Этот класс здесь исключительно для полиморфиз
ма и возможности выводить/хранить // в регистрах как числа, так и вектора class register_object { public: virtual string to_string() const=0; virtual ~register_object(){}; };
// Служит для хранения в регистрах калькулятора чисел типа double class my_num:public register_object { public: explicit my_num(double val=0); virtual ~my_num(); virtual string to_string() const; private: double _val; };
// Собственно программа class application { public: ~application();
void run(); private: // Возможный выбор пользователя enum user_choice { INPUT, PLUS, MINUS, SCALAR, LENGTH, COS, DELETE, QUIT };
application::~application() { // Освободим
память. // Т.к. полиморфизм работает через указатели/ссылки мы ее выреляли динамически while(!registers.empty()) { delete registers.front(); registers.pop_front(); } }
void application::run() { user_choice choice; // Реакция на ввод пользователя while((choice=menu())!=QUIT) { try { switch(choice) { case INPU
T: { registers.push_front(new my_vector(input_vector())); break; } case PLUS: { my_vector tmp=plus_operation();
delete_registers(2); registers.push_front(new my_vector(tmp)); break; } case MINUS: { my_vector tmp=minus_operation();
delete_registers(2); registers.push_front(new my_vector(tmp)); break; } case SCALAR: { double tmp=scalar_operation();
delete_registers(2); registers.push_front(new my_num(tmp)); break; } case LENGTH:
{ double tmp=length_operation();
delete_registers(1); registers.push_front(new my_num(tmp)); break; } case COS: { double tmp=cos_operation();
// Проверяет требуемое количество регистров на наличие в них векторов, а не, например, чисел void application::check_registers( register_stack::size_type count ) const { stringstream sstream;
if(registers.size()<count) {
sstream<<"Требуется "<<count<<" операнд(а)"; throw runtime_error(sstream.str()); } for(register_stack::size_type i=0;i<count;++i) { // Проверка на соответствие по типу указателя if(typeid(*registers[i])!=typeid(my_vector)) { sstream<<"Требуется "<<count<<" вектор(а)"; throw runtime_error(sstream.str
()); } } }
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.