ЗАДАЧА преобразование дертовых координат в полярные и наоборот

1. Дано

#include <cmath>
	// точка на плоскости в декартовой системе координат
		typedef struct {
		 double x, y;
			} DPoint;
	// точка на плоскости в полярной системе координат
		typedef struct {
			  double r, fi;
		 Ppoint;

Написать функции

			PPoint DPointoToPPoint(DPoint dp);
			DPoint PPointoToDPoint(PPoint pp);

выполняющие преобразования точки между различными системами координат.

2. Формулы

от полярных координат r и tg(fi) к декартовым x, y: x = r cos (fi); y = r sin (fi);
от декартовых к полярным: r = (x*x + y*y)^0,5; tg (fi) = y\x;

3. План работы:

/*
основная функция void main считывает с клавиатуры знак "d" или "p".
	от которого будет зависеть исходная система координат вводимой точки.
	если был введен знак "d", значит будет произведено преобразование декартовой 
	системы координат в полярную (если же "p" - то наоборот) - 
	(это есть условие выполнения программы в первом или втором порядке).
	после этого main выводит напоминание "введите ДЕКАРТОВЫ координаты" 
       (или же "введите ПОЛЯРНЫЕ координаты"), считывает с клавиатуры координаты точки, 
       присваивает их значения двум переменным "х" и "у".
	далее вызов PPoint(х, у), кторая вернет видоизмененные значения - 
        полярные координаты.	вывод на экран.
	точно так же при выполнении условия с "p".

	функция PPoint - преобразует декартовы в полярные
	за основу берутся формулы  r = (x*x + y*y)^0,5  и  tg fi = y\x;

	функция DPoint - преобразует полярные в декартовы
	основана на формулах  x = r cos fi  и  y = r sin fi;

	обе функции должны возвращать два значения - 
        реализуется либо работой с указателями на значения, либо функция будет возвращать всю структуру
*/

читаем про структуры, typedef
http://www.cyberforum.ru/cpp-beginners/t...
http://dvo.sut.ru/libr/cvti/i618buz/12.htm
http://life-prog.ru/view_zam.php?id=229&...
http://www.uchi-it.ru/9/8/14.html

освежаем память об указателях.
http://programmersclub.ru/20/
http://code-live.ru/post/cpp-pointers/

как обратиться к элементу структуры -

typedef struct {
	double x, y;
} DPoint;

void main() {  
  DPoint Т;  // создаем элемент Т типа DPoint
  Т.x = 1;   // "подэлемент" х элемента Т - то е. элемент структуры Т типа DPoint приравняли к 1. 
//таким образом с ним можно работать как с обычной переменной
  Т.у = 2;    // аналогично вышесказанному.
// обращение к указателю на элемент структуры - так же, но вместо точки "стрелочка", вот такая:        -> 
getch ();	
}

про обращение к элементу структуры можно подробнее прочесть тут - http://ci.gym5cheb.ru/p35aa1.html

хм, подсвечивать не умеете - и вообще как-то "почитабельнее" неплохо бы)

baton's picture

typedef struct {
	double x, y;
} DPoint;


typedef struct {
	double r, fi;
} Ppoint;


void main() {
  setlocale(LC_ALL, "Russian");
  cout << "если вы хотите преобразовать декартовы в полярные, введите 0" << endl;
	cout << "если наоборот, введите  1" << endl;
	int z;
  cin >> z ;

cout << "введите координаты указанного вами типа"<< endl;
		double X, Y;
  cin >> X >> Y;

  if (z==0){
	  // отдельная функция, преобразующая координаты по вышеописанным формулам
// эта функция будет возвращать указатель на структуру 
  } 
  if (z==1){
	  // отдельная функция...
  }
  if (z!=1 && z!=0){
  cout << "вы ввели неправильное значние";
  }
  DPoint D;
  D.x = 0 ;

getch ();	
}

пишу функции, ною что не получается и через какое-то время сдаю задачу

baton's picture

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

baton's picture

эта прога работает.
но функции не возвращают значения (чего я хочу добиться) а сразу распечатывают координаты.
считаю этот код неплохим промежуточным результатом.

    #include "stdio.h"
    #define _USE_MATH_DEFINES
    #include "math.h"
    #include "string"
    #include "conio.h"
    #include "iostream"
    #include "time.h"
    #include "ctime"
    using std::cout;
    using std::cin;
    using std::endl;
    using namespace std;

typedef struct {
    double x, y;
} DPoint;  
typedef struct {
    double r, fi;
} Ppoint;
 void D_to_P(){

    cout << "введите координаты"<< endl << "обратите внимание: сначала вводится х, потом у"<< endl;
	DPoint D;
	Ppoint P;
    cin >> D.x >> D.y;
	P.r = pow(D.x*D.x + D.y*D.y, 0.5);
	P.fi = tan(D.x/D.y);
	cout << "fi =" << P.fi << "r =" << P.r;
   // return P;
}
void P_to_D(){
	DPoint D; 
	Ppoint P;
    cout << "введите координаты"<< endl << "обратите внимание: сначала вводится угол, потом радиус"<< endl;
    cin >> P.fi >> P.r;
    D.x = P.r * cos (P.fi);	
    D.y = P.r * sin (P.fi);
	cout << "x ="<< D.x << endl << "y =" << D.y;
    //return D;
} /**/
void main() {
  setlocale(LC_ALL, "Russian");
  cout << "если вы хотите преобразовать декартовы в полярные, введите 0" << endl;
    cout << "если наоборот, введите  1" << endl;
    int z;
  cin >> z ;
      DPoint D1, D;
      Ppoint P1, P;
	  
  if (z==0){
	  /*
	cout << "обратите внимание: сначала вводится х, потом у"<< endl;
    cin >> D.x >> D.y;
	P.r = pow(D.x*D.x + D.y*D.y, 0.5);
	P.fi = tan(D.x/D.y);
	cout << "fi =" << P.fi << "r =" << P.r;
	/**/
	D_to_P();

  }
  if (z==1){
	  /*
	cout << "обратите внимание: сначала вводится угол, потом радиус"<< endl;
    cin >> P.fi >> P.r;
    D.x = P.r * cos (P.fi);	
    D.y = P.r * sin (P.fi);
	cout << "x ="<< D.x << endl << "y =" << D.y;
	/**/
	P_to_D();
  }
  if (z!=1 && z!=0){
  cout << "вы неправильно указали тип координат. перезапустите программу";
  }
getch ();  
}
baton's picture

полностью готовый рабочий код. функции возвращают нужные значения - с ними можно продолжать работу после завершения функций - что и требовалось написать.

    #include "stdio.h"
    #define _USE_MATH_DEFINES
    #include "math.h"
    #include "string"
    #include "conio.h"
    #include "iostream"
    #include "time.h"
    #include "ctime"
    using std::cout;
    using std::cin;
    using std::endl;
    using namespace std;
	const double PI = 3.14159265;

typedef struct {
    double x, y;
} DPoint; 

typedef struct {
    double r, fi;
} Ppoint;


Ppoint D_to_P(	DPoint D){
	Ppoint P;
	P.r = pow((D.x * D.x + D.y * D.y), 0.5);

	if (D.x == 0) {
		if (D.y < 0)
			P.fi =  PI / 2;
		else if (D.y > 0)
			P.fi = 3 * PI / 2;
		else
			P.fi = 0;
		return P;
	}

	P.fi = atan(D.y / D.x);

	if (D.x > 0 &&  D.y < 0) // 4
		P.fi += 2 * PI;
	if (D.x < 0)             // 2, 3
		P.fi +=  PI;
	
    return P;
}

DPoint P_to_D(Ppoint P) {
	DPoint D;
    D.x = P.r * cos(P.fi);	
    D.y = P.r * sin(P.fi);
    return D;
}


void main() {
	setlocale(LC_ALL, "Russian");
	cout << "если вы хотите преобразовать декартовы в полярные, введите 0";
        cout << endl << "если наоборот, введите  1" << endl;
	int z;
	cin >> z;

	DPoint D;
	Ppoint P;
	if (z == 0) {
		cout << "введите координаты" << endl;
                cout << "обратите внимание: сначала вводится х, потом у" << endl;
		cin >> D.x >> D.y;
		P = D_to_P(D);
		cout << "fi = " << P.fi << endl << "r = " << P.r;
	}
	if (z == 1) {
		cout << "введите координаты" << endl;
cout << "обратите внимание: сначала вводится угол в радианах (цифрами), потом радиус" << endl;
		cin >> P.fi >> P.r;
		D = P_to_D(P);
		cout << "x = " << D.x << endl << "y = " << D.y;
	}
	if (z != 1 && z != 0)
		cout << "вы неправильно указали тип координат. перезапустите программу";
  
	getch ();
}