Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] с plus plus. корриктеровка задачи


Автор: сахарок 8.4.2008, 20:05
Здравствуйте. не могли бы вы подкорректировать решение моей задачи=)


Написать функцию с четырьмя параметрами, вычисляющую по
декартовым координатам точки на плоскости ее полярные
координаты (использовать адреса в качестве параметров).
Написать вторую функцию С ТЕМ ЖЕ ИМЕНЕМ с четырьмя
параметрами-ссылками, вычисляющую декартовы координаты
точки по ее полярным координатам.
В основной программе в цикле вводить с клавиатуры декартовы
координаты точки и выводить на экран ее полярные координаты.
Затем обращаться ко второй функции и выводить подсчитанные
по полярным координатам значения декартовых координат.
Окончание работы программы - ввод нулевых координат.
Для ввода значений координат и вывода результатов использовать
макросы. Для ввода напишите макрос, в котором выводится
подсказка с именем переменной ("имя="). Макрос для результатов
должен выводить выражение в таком виде:
"изображение выражения=значение выражения".


Код

//Zadanie_1.cpp
#include <iostream>
#include <cmath>
#include "winDos.cpp"
using namespace std;
double X,Y,P,Q;
#define INPUT(n) {cout<<#n"=";cin>>n;}
#define OUTPUT(n){cout<<#n"="<<n<<endl;}
void func_1(double *x, double *y, double *p, double *q){
       x=new double;
       y=new double;
       p=new double;
       q=new double;
       P=sqrt(x*x+y*y);
       if (x<0)       Q=acos(-1)+atan(y/x);
       else Q=atan(y/x);
       }
void func_2(double&x, double&y, double&p, double&q){
       X=p*cos(q);
       Y=p*sin(q);
       }
int main(){
      INPUT(X);
      INPUT(Y);
      while(X!=0 || Y!=0){
        func_1(X,Y,P,Q);
        OUTPUT(P);
        OUTPUT(Q);
        cout<<endl;
        func_2(X,Y,P,Q);
        OUTPUT(X);
        OUTPUT(Y);
        cout<<endl;
        INPUT(X);
        INPUT(Y);
       };

return 0;
}



 ! 
archimed7592
Не забываем пользоваться кнопкой "Код" или тэгами [code=xxx][/code]

Автор: Mephisto 8.4.2008, 21:19
Как минимум так:
Код

#include <iostream>
#include <cmath>
//#include "winDos.cpp"

using namespace std;

#define INPUT(n) {cout<<#n"=";cin>>n;}
#define OUTPUT(n){cout<<#n"="<<n<<endl;}

void func_1(double *x, double *y, double *p, double *q){
       *p=sqrt((*x)*(*x)+(*y)*(*y));
       if (*x<0){
       *q=acos(-1)+atan((*y)/(*x));
       }else{
           *q=atan((*y)/(*x));
       }
}

void func_2(double&x, double&y, double&p, double&q){
       x=p*cos(q);
       y=p*sin(q);
}

int main(){
      double X,Y,P,Q;
      INPUT(X);
      INPUT(Y);
      while(X!=0 || Y!=0){
        func_1(&X,&Y,&P,&Q);
        OUTPUT(P);
        OUTPUT(Q);
        cout<<endl;
        func_2(X,Y,P,Q);
        OUTPUT(X);
        OUTPUT(Y);
        cout<<endl;
        INPUT(X);
        INPUT(Y);
       }

return 0;
}


Добавлено через 1 минуту и 4 секунды
Код

#include "winDos.cpp"

Можешь раскоментить если тебе нужен.  smile

Добавлено через 1 минуту и 53 секунды
П.с. Матчасть не проверял!

Автор: Rififi 8.4.2008, 22:02
немного улучшим smile

Код
#include <math.h>
#include <assert.h>

// необходимая точность вычислений
static const double eps = 0.0001;

void func_1(const double* x, const double* y, double* p, double* q)
{
    static const double acos_neg1 = acos(static_cast<double>(-1.0));
    assert(*x != 0);

    *p = sqrt(*x * *x + *y * *y);
    *q = atan(*y / *x);
    if (fabs(*x) < eps)
        *q += acos_neg1;
}

void func_2(double& x, double& y, const double& p, const double& q)
{
    x = p * cos(q);
    y = p * sin(q);
}

Автор: vinter 8.4.2008, 22:18
Цитата

assert(*x != 0);

плохо, в релизе эта строчка пропадет.

Автор: Mephisto 9.4.2008, 13:00
Цитата(vinter @  8.4.2008,  23:18 Найти цитируемый пост)
плохо, в релизе эта строчка пропадет. 


Rififi, нельзя проверки включать в assert, ибо в релизную версию код который под ассертом не компилируется в исполняемый файл. Там нужно exception генерить по хорошему!

Автор: archimed7592 9.4.2008, 18:25
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

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