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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2011, 09:01   #1
Colder M
Пользователь
 
Регистрация: 28.02.2011
Сообщений: 16
По умолчанию Взаимно зависимые поля

Здравствуйте.
Существует ли способ задать взаимно-однозначное соответствие между полями, т.е., чтобы при изменении одного поля менялось значение соответствующего ему другого поля, и наоборот: при изменении последнего менялось бы значение первого.
Например, пусть создан класс комплексных чисел, допускающий двоякое представление членов:
Код:
class complex
{
        public:
	double Re, Im,        //z = z.Re + i * z.Im
               Abs, Ang;      //z = Abs * (cos(Ang) + i * sin(Ang));
/* another code */
}
Скажите пожалуйста, как при изменении одного из полей (Abs, Ang), поменять другие (Re, Im)?
Colder M вне форума Ответить с цитированием
Старый 16.04.2011, 09:35   #2
Lyubimov
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 53
По умолчанию

Можно указателями воспользоваться

Код:
double Re, Im;        //z = z.Re + i * z.Im
double* Abs, Ang;      //z = Abs * (cos(Ang) + i * sin(Ang));

// В конструкторе

Abs = ℜ
Im = &Ang;
Тогда при обращении *Abs и *Im будем получать значение Re и Ang
И при изменении *Abs и *Im будут изменяться значения Re и Ang

Последний раз редактировалось Lyubimov; 16.04.2011 в 09:38.
Lyubimov вне форума Ответить с цитированием
Старый 16.04.2011, 11:26   #3
Colder M
Пользователь
 
Регистрация: 28.02.2011
Сообщений: 16
По умолчанию

К сожалению, здесь не все так тривиально. Зависимость между полями более сложная, ссылкой не обойтись:
Abs = sqrt(Re * Re + Im * Im);
Ang = acos(Re / Abs);
соотв.,
Re = Abs * cos(Ang);
Im = Abs * sin(Ang);

Быть может, есть способ объявить внутри класса процедуру, отслеживающую изменение полей и действующую по вышеописанным правилам?
Colder M вне форума Ответить с цитированием
Старый 16.04.2011, 13:33   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,725
По умолчанию

Пойдите по правилам ООП: спрячте поля класса, меняйте из функциям и проблем не будет
p51x вне форума Ответить с цитированием
Старый 16.04.2011, 20:28   #5
Colder M
Пользователь
 
Регистрация: 28.02.2011
Сообщений: 16
По умолчанию

Придется действовать так =). В любом случае, спасибо за помощь.
Colder M вне форума Ответить с цитированием
Старый 16.04.2011, 20:46   #6
Indian
Форумчанин
 
Регистрация: 23.02.2010
Сообщений: 107
По умолчанию

Если C/C++, то union.
Код:
#include <stdio.h>
struct{
	union
	{
		struct {double Re, Im;};
		struct {double Abs, Ang;};
	};
}z;

int main(int argc, char **argv)
{
	z.Abs=9.0;
	z.Ang=2.0;
	
	printf("%f\n",z.Re);
	printf("%f\n",z.Im);
	
	return 0;
}
Indian вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Взаимно простые числа Bek-Z Помощь студентам 6 24.12.2010 20:57
Зависимые списки Verano naranjo Microsoft Office Access 2 04.06.2010 22:35
Установка взаимно расположенных окружностей на плоскости. SVadiks Помощь студентам 2 30.11.2009 20:14
взаимно простое числы Cantana Помощь студентам 4 07.03.2008 08:46