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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2011, 16:11   #1
ensoleille
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 25
Восклицание Структуры через указатели

Ввести структуру для описания комплексного числа. Составить и протестировать функции для:
а) преобразования комплексного числа из алгебраической формы в показательную;
б) преобразования комплексного числа из показательной формы в алгебраическую;
в) получения сопряженного комплексного числа;
г) возведения комплексного числа в целую положительную степень;
д) умножения комплексных чисел в алгебраической форме;
с) умножения комплексных чисел в показательной форме;

сделала сначала структуру без указателей,вот:
Код:
#include<stdio.h>
#include<conio.h>
#include<math.h>
void main ()
{	
	float r,fi,x,y,pi=3.14,a,b,r1,x1,y1,a1,b1,r2,r3,r4,fi1,fi2,x2,y2,fi3;
	int n;

	struct complex
		{	float a;
			float b;
		}z1,z2,z3;
	//ввод действительных и мнимых частей комплексных чисел
	puts("Vvedite deystvitel'nuyu chast' pervogo chisla");
	scanf("%f",&z1.a);
	puts("Vvedite mnimuyu chast' pervogo chisla");
	scanf("%f",&z1.b);
	puts("Vvedite deystvitel'nuyu chast' vtorogo chisla");
	scanf("%f",&z2.a);
	puts("Vvedite mnimuyu chast' vtorogo kompleksnogo chisla");
	scanf("%f",&z2.b);
	
	//преобразования комплексного числа из алгебраической формы в показательную;
	r=sqrt(z1.a*z1.a+z1.b*z1.b);
		x=z1.a;
		y=z1.b;
	if(x>0)
		fi=atan(y/x);
	if(x<0 && y>=0)
		fi=atan(y/x)+pi;
	if(x<0 && y<0)
		fi=atan(y/x)-pi;
	if(x==0 && y>0)
		fi=pi/2;
	if(x==0 && y<0)
		fi=-pi/2;
	puts("\n");

	puts("Preobrazovannoe chislo iz algebraicheskoi formi v pokazatel'nuyu");
	printf("z1=%.2f*e^(%.2fi)\n",r,fi);
	puts("\n");


	//ïпреобразовние комплексного числа из показательной формы в алгебраическую
	a=z1.a*cos(z1.b);
	b=z1.a*sin(z1.b);

	puts("Preobrazovannoe chislo iz pokazatel'noi formi v algebraicheskuyu");
	printf("z1=%.2f+(%.2f)i\n",a,b);
	puts("\n");


	//получение сопряженного числа
	puts("Chislo v algebraicheskoi forme");
	printf("z1=%.2f+(%.2f)i\n",a,b);
	puts("Sopryajennoe chislo");
	printf("z1=%.2f-(%.2f)i\n",a,b);
	puts("\n");


	//возведения комплексного числа в целую положительную степень;
	puts("Vvedite znachenie stepenya  -  n");
	scanf("%d",&n);
	r=sqrt(z1.a*z1.a+z1.b*z1.b);
		x1=cos(n*fi);
		y1=sin(n*fi);
	r1=pow(r,n);

	puts("Chislo vozvedennoie v stepen' n");
	printf("z=%.2f((%.2f)+i(%.2f))\n",r1,x1,y1,fi);
	puts("\n");


	//умножения комплексных чисел в алгебраической форме;
	a1=z1.a*z2.a-z1.b*z2.b;
	b1=z1.a*z2.b+z1.b*z2.a;

	puts("Proizvedenie kompleksnix chisel v algebraicheskoi forme");
	printf("z3=%.2f+(%.2f)i\n",a1,b1);
	puts("\n");

	//умножения комплексных чисел в показательной форме;
	r2=sqrt(z1.a*z1.a+z1.b*z1.b);
	r3=sqrt(z2.a*z2.a+z2.b*z2.b);
	r4=r2*r3;
	x2=cos(fi1+fi2);
	y2=sin(fi1+fi2);

	puts("Proizvedenie kompleksnix chisel v pokazatel'noi forme v algebraicheskoi zapisi");
	printf("z3=%.2f(%.2f+%.2fi)\n",r4,x2,y2,fi1,fi2);
	puts("\n");

	x2=z3.a;
	y2=z3.b;
	
	if(x>0)
		fi1=atan(y/x);
	if(x<0 && y>=0)
		fi1=atan(y/x)+pi;
	if(x<0 && y<0)
		fi1=atan(y/x)-pi;
	if(x==0 && y>0)
		fi1=pi/2;
	if(x==0 && y<0)
		fi1=-pi/2;

	if(x>0)
		fi2=atan(y/x);
	if(x<0 && y>=0)
		fi2=atan(y/x)+pi;
	if(x<0 && y<0)
		fi2=atan(y/x)-pi;
	if(x==0 && y>0)
		fi2=pi/2;
	if(x==0 && y<0)
		fi2=-pi/2;

	fi3=fi1+fi2;
	if(x>0)
		fi3=atan(y/x);
	if(x<0 && y>=0)
		fi3=atan(y/x)+pi;
	if(x<0 && y<0)
		fi3=atan(y/x)-pi;
	if(x==0 && y>0)
		fi3=pi/2;
	if(x==0 && y<0)
		fi3
		=-pi/2;

	puts("Proizvedenie kompleksnix chisel v pokazatel'noi forme v pokazatel'noi zapisi");
	printf("z3=%.2f*e^(%.2fi)\n",r4,fi3);
	puts("\n");
	
}
работает,даже правильно,преподователь проверяла
далее делаю через указатели:
ensoleille вне форума Ответить с цитированием
Старый 20.02.2011, 16:12   #2
ensoleille
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 25
По умолчанию

Код:
#include<stdio.h>
#include<conio.h>
#include<math.h>
void Complex(float x,float y,float *r,float *fi)
{
	float pi=3.14;
	*r=sqrt(x*x+y*y);
	if(x>0)
		*fi=atan(y/x);
	if(x<0 && y>=0)
		*fi=atan(y/x)+pi;
	if(x<0 && y<0)
		*fi=atan(y/x)-pi;
	if(x==0 && y>0)
		*fi=pi/2;
	if(x==0 && y<0)
		*fi=-pi/2;
	puts("\n");

}
void Complex1(float x,float y,float *a,float *b)
{
	*a=x*cos(y);
	*b=x*sin(y);
}
void Complex2(float x,float y,float r,float *r1,float *fi)
{
	int n;
	x=cos(n*(*fi));
	y=sin(n*(*fi));
	r=(sqrt(x*x+y*y));
	*r1=pow( r,n);
}
void Complex3(float x,float y,float x1,float y1,float *a1,float *b1)
{
	*a1=x*x1-y*y1;
	*b1=x*y1+y*x1;
}
void Complex4(float x2,float y2,float *r4,float *fi1,float *fi2)
{
	float x,y,x1,y1;
	float r2,r3;
	*r4=(sqrt(x*x+y*y))*(sqrt(x1*x1+y1*y1));
	x2=cos((*fi1)+(*fi2));
	y2=sin((*fi1)+(*fi2));
}
void main()
{
	float r,fi,x,y,pi=3.14,a,b,r1,x1,y1,a1,b1,r2,r3,r4,fi1,fi2,x2,y2;
	int n;
	struct complex
		{
			float a;
			float b;
		}z1,z2,z3;
	puts("Vvedite deystvitel'nuyu chast' pervogo chisla");
	scanf("%f",&z1.a);
	puts("Vvedite mnimuyu chast' pervogo chisla");
	scanf("%f",&z1.b);
	puts("Vvedite deystvitel'nuyu chast' vtorogo chisla");
	scanf("%f",&z2.a);
	puts("Vvedite mnimuyu chast' vtorogo chisla");
	scanf("%f",&z2.b);

	Complex(z1.a,z1.b,&r,&fi);

	puts("Preobrazoannoe chislo iz algebraicheskoi formi v pokazatel'nuyu");
	printf("z1=%.2f*^e(%.2fi)\n",r,fi);
	puts("\n");

	Complex1(z1.a,z1.b,&a,&b);

	puts("Preobrazovannoe chislo iz pokazatel'noi formi v algebraicheskuyu");
	printf("z1=%.2f+(%.2f)i\n",a,b);
	puts("\n");

	Complex1(z1.a,z1.b,&a,&b);
	puts("Chislo v algebraicheskoi forme");
	printf("z1=%.2f+(%.2f)i\n",a,b);
	puts("Sopryajennoe chislo");
	printf("z1=%.2f-(%.2f)i\n",a,b);
	puts("\n");

	puts("Vvedite znachenie stepenya  -  n");
	scanf("%d",&n);
	
	Complex2(z1.a,z1.b,r,&r1,&fi);

	puts("Chislo vozvedennoie v stepen' n");
	printf("z=%.2f((%.2f)+i(%.2f))\n",r1,x,y,fi);
	puts("\n");
	
	Complex3(z1.a,z1.b,z2.a,z2.b,&a1,&b1);

	puts("Proizvedenie kompleksnix chisel v algebraicheskoi forme");
	printf("z3=%.2f+(%.2f)i\n",a1,b1);
	puts("\n");
	
	Complex4(z3.a,z3.b,&r2,&fi1,&fi2);

	puts("Proizvedenie kompleksnix chisel v pokazatel'noi forme v algebraicheskoi zapisi");
	printf("z3=%.2f(%.2f+%.2fi)\n",r4,x2,y2,fi1,fi2);
	puts("\n");
}
тоже работает,вычисляет. НО. когда вот возвожу в степень r считает,а действительные и мнимые части выводит какими-то очень странными длинными числами. тоже самое и при произведении в показательной форме,может что то забыла(что очень даже может быть,функции очень туго идут)\упустила.подскажите пожалуйста
(
ensoleille вне форума Ответить с цитированием
Старый 21.02.2011, 14:10   #3
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

вы уверены что функцию Complex1(z1.a,z1.b,&a,&b); нужно вызывать 2 раза?
onewho вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сделать программу через указатели toxa201091 Общие вопросы C/C++ 1 06.11.2010 01:08
обращение к элементам двумерного массива через указатели серг Общие вопросы C/C++ 2 05.12.2009 23:33
Работа с массивом через указатели Kirk_Hammett Общие вопросы C/C++ 2 27.10.2009 22:43
Структуры и указатели. Geg[C/c++] Помощь студентам 3 30.09.2009 12:13
Структуры и указатели phpcreator Помощь студентам 1 09.09.2009 17:57