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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2009, 19:00   #11
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Держи писал когда то программу работающую с матрицами
Вычисляется вот такое выражение
([A]*[B]^2+[A]T*P)^3
Только тут работа с комплексными числами, если понадобится могу поискать, где то должна быть эта же программа для обычных чисел
Код:
/*Выполнил: Степченко Пётр (Nitrino)
  ([A]*[B]**2+[A]T*P)**3 
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <conio.h>

typedef struct complex
{
	double a;
	double b;
};


//Выделение памяти
void *Malloc (size_t size)
{
		void *p=malloc(size);
		if (!p)
			 {
				printf("Недостаточно памяти\n");
				exit(1);
			 }
		return p;
}


//Конструктор матрицы
complex **MakeMatr(size_t n)
{
		complex **Matr;
		size_t i;
		Matr=(complex**)Malloc(sizeof(size_t)+n*sizeof(complex *));
		(size_t *)Matr+=1;
		for(i=0; i < n; i++)
			 Matr[i]=(complex *)Malloc(n*sizeof(complex));
		*((size_t *)Matr-1)=n;
		return Matr;
}

//
size_t GetN(complex **Matr)
{
		return *((size_t *)Matr-1);
}

//Заполнение матрицы
void RandMatr(complex **Matr)
{
		int i, j;
		size_t n=GetN(Matr);
		for (i=0; i < n; i++)
			 for (j=0; j < n; j++)
					{
						Matr[i][j].a=random(10);
						Matr[i][j].b=random(10);
					}
}

//Вывод матрицы
void OutMatr(char *name, complex **Matr)
{
		int i, j;
		size_t n=GetN(Matr);
		textcolor(10);
		cprintf("\nМатрица %s\n\r", name);
		for (i=0; i < n; i++)
		{
			 for (j=0; j < n; j++)
					printf("%9.1lf+%1.lfi  ", Matr[i][j].a, Matr[i][j].b);
			 printf("\n");
		}
}

//Деструктор матрицы
void DelMatr(complex **Matr)
{
		size_t i, n=GetN(Matr);
		for (i=0; i < n; i++) free(Matr[i]);
		free((size_t *)Matr-1);
}

//Заполнение матрицы нулевыми значениями
void NullMatr(complex **Matr)
{
		int i, j;
		size_t n=GetN(Matr);
		for (i=0; i < n; i++)
			 for (j=0; j < n; j++)
					{
						Matr[i][j].a=0.0;
						Matr[i][j].b=0.0;
					}
}

//----------------------------------------------------------------------------
//Умножение двух матриц
complex **Multiply(complex **Result, complex **Matr, complex **Matr2)
{
		int i, j, k;
		size_t n=GetN(Matr);
		for (i=0; i < n; i++)
			 for (j=0; j < n; j++)
					for (k=0; k < n; k++)
						 {
							Result[i][j].a+=Matr[i][k].a*Matr2[k][j].a-Matr[i][k].b*Matr2[k][j].b;
							Result[i][j].b+=Matr[i][k].b*Matr2[k][j].a+Matr[i][k].a*Matr2[k][j].b;
						 }
			return Result;

}

//----------------------------------------------------------------------------
//Умножение на число
complex **Const(complex **Matr, complex **Result, int p)
{
		int i, j;
		size_t n=GetN(Matr);
		for (i=0; i < n; i++)
			 for (j=0; j < n; j++)
					{
						Result[i][j].a=p*Matr[i][j].a;
						Result[i][j].b=p*Matr[i][j].b;
					}
		return Result;
}
//----------------------------------------------------------------------------
//Сложение матриц
complex **Plus(complex **Matr, complex **Matr2, complex **Result)
{
		int i, j;
		size_t n=GetN(Matr);
		for (i=0; i < n; i++)
			 for (j=0; j < n; j++)
					{
						Result[i][j].a=Matr[i][j].a+Matr2[i][j].a;
						Result[i][j].b=Matr[i][j].b+Matr2[i][j].b;
					}
		return Result;
}
//----------------------------------------------------------------------------
//возведение в степень
complex **Degree(complex **Matr, complex **Result, int a)
{
		int i, j;
		size_t n=GetN(Matr);
		complex **Result2;
		Result2=MakeMatr(n);


		for (i=0; i < n; i++)
			 for (j=0; j < n; j++)
					{
						Result[i][j].a=Matr[i][j].a;
						Result[i][j].b=Matr[i][j].b;
					}
		for (a--; a; a--)
		{
			 NullMatr(Result2);
			 Multiply(Result2, Result, Matr);
			 for (i=0; i < n; i++)
					for (j=0; j < n; j++)
						 Result[i][j]=Result2[i][j];
		}
		return Result2;
}

//----------------------------------------------------------------------------
//Транспонирование
complex **Transp(complex **Matr, complex **Result)
{
		int i, j;
		size_t n=GetN(Matr);
		

		for (i=0; i < n; i++)
			 for (j=0; j < n; j++)
					{
						Result[i][j].a=Matr[j][i].a;

					}

		return Result;
}


void main(void)
{
	 int n=2;
	 complex **A, **B, **C, **D;

	 clrscr();
	 randomize();

	 A=MakeMatr(n);
	 B=MakeMatr(n);
	 C=MakeMatr(n);
	 D=MakeMatr(n);
	 RandMatr(A);
	 RandMatr(B);

	 OutMatr("A", A);
	 OutMatr("B", B);

	 NullMatr(C);
	 C=Degree(B, C, 2);
	 Multiply(B, C, A);
	 NullMatr(C);
	 Transp(A, C);
	 Const(C, C, 2);
	 Plus(C, B, C);
	 D=Degree(C, D, 3);


	 OutMatr("D", D);

	 DelMatr(A);
	 DelMatr(B);
	 DelMatr(C);
	 DelMatr(D);

	 getch();
}

Последний раз редактировалось Nitrino; 03.12.2009 в 19:03.
Nitrino вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка Матриц(Упорядочивание Элементов,Вывод На Экран Матриц При Условии...) timepoka Помощь студентам 8 01.07.2011 13:20
функции для формирования и обработки матриц aka_faith Общие вопросы C/C++ 0 15.05.2009 01:40
Помогите с калькулятором vishnya454 Помощь студентам 8 07.01.2009 10:35
Проблема з калькулятором carbon383 Помощь студентам 22 02.11.2008 11:49
Проблемы с калькулятором MAKEDON Помощь студентам 18 02.08.2008 14:30