Скачиваний:
24
Добавлен:
02.05.2014
Размер:
147.9 Кб
Скачать

Уфимский Государственный Авиационный Технический Университет

Кафедра АСУ

Отчёт

по лабораторной работе №6

по дисциплине ”Программирование на ЯВУ”

вариант №19

Выполнил: студент группы АСОИ-136

Багавутдинов Ильдар Проверил: доцент кафедры АПРиС

Фёдорова Н.И.

Уфа 2008.

Тема: Функции

Цель работы: Знакомство и получение навыков реализации подпрограмм в языке С.

Вариант №19.

Задание:

Заданы 2 квадратные матрицы А и B. Вычислить матрицу:

C=An+An-1∙B+An-2∙B2+An-3∙B3+…+A2∙Bn-2+A∙Bn-1+Bn.

Решение:

Задачу можно разбить на этапы:

  1. С1=An+ Bn;

  2. С2=An-1∙B+An-2∙B2+An-3∙B3+…+A2∙Bn-2+A∙Bn-1;

Видно, что вторую часть можно выполнить в цикле, поэтому мы разобьем ее на составные части:

  1. Возведение в степень матриц: An-1, B3

  2. Их перемножение: An-1∙B, An-2∙B2

  3. Сложение получившего произведения в одну переменную.

Для этого нам понадобятся следующие функции:

Функции

  • Ввода матрицы

  • Вывода матрицы

  • Сложения матриц

  • Перемножения матриц

  • Возведения матриц в n-ю степень

Ввод матрицы:

void input(double x[][n])

{

int i,j;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

{

cout<<"x["<<i+1<<"]["<<j+1<<"]=";

cin>>x[i][j];

}

return;

}

Вывод матрицы:

void output(double x[][n])

{

int i,j;

for(i=0;i<n;i++)

{

cout<<endl;

for(j=0;j<n;j++)

{

cout<<x[i][j]<<" ";

}

}

return;

}

Используя математические принципы сложения и умножения матриц, получим:

Сложение матриц:

void summa(double x[][n],double y[][n],double z[][n])

{

int i,j;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

z[i][j]=x[i][j]+y[i][j];

return;

}

Перемножение матриц:

void mult(double x[][n],double y[][n],double z[][n])

{

double s;

int i,j,k;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

{

s=0;

for(k=0;k<n;k++)

s+=x[i][k]*y[k][j];

z[i][j]=s;

}

return;

}

Возведение в n- ю степень:

void degree(double x[][n],

double y[][n],double z[][n],int deg)

{

void mult(double x[][n],

double y[][n],double z[][n]);

int i,j,k;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

y[i][j]=x[i][j];

if(deg==1)

for(i=0;i<n;i++)

for(j=0;j<n;j++)

z[i][j]=x[i][j];

for(k=1;k<deg;k++)

{

mult(x,y,z);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

y[i][j]=z[i][j];

}

return;

}

Задача:

Блок схема:

Текст программы на С++

#include<iostream.h>

#include<conio.h>

const n=3;

void main()

{

void input(double x[][n]);

void output(double x[][n]);

void summa(double x[][n],double y[][n],double z[][n]);

void mult(double x[][n],double y[][n],double z[][n]);

void degree(double x[][n],double y[][n],double z[][n],int deg);

int i,j;

double a[n][n],b[n][n],c[n][n],d[n][n],e[n][n],f1[n][n],f2[n][n];

clrscr();

for(i=1;i<n;i++)

for(j=1;j<n;j++)

c[i][j]=0;

cout<<"------------------------------"<<endl;

cout<<"-------------lab6-------------"<<endl<<endl;

cout<<" please, input matrix A:"<<endl;

input(a);

cout<<endl;

cout<<" please, input matrix B:"<<endl;

input(b);

cout<<endl;

degree(a,d,c,n);

degree(b,e,c,n);

summa(d,e,c);

cout<<"------------------------------"<<endl;

cout<<" C=A^n+b^n:"<<endl;

output(c);

cout<<endl<<"------------------------------"<<endl;

for(i=1;i<n;i++)

{

degree(a,e,f1,n-i);

cout<<endl<<endl<<"A^"<<n-i<<":"<<endl;

output(f1);

cout<<endl<<"------------------------------";

degree(b,e,f2,i);

cout<<endl<<endl<<"B^"<<i<<":"<<endl;

output(f2);

cout<<endl<<"------------------------------";

mult(f1,f2,d);

cout<<endl<<endl<<"A^"<<n-i<<"+B^"<<i<<":"<<endl;

output(d);

cout<<endl<<"------------------------------";

summa(c,d,c);

}

cout<<endl<<endl<<"OTVET C="<<endl;

output(c);

getch();

}

void input(double x[][n])

{

int i,j;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

{

cout<<"x["<<i+1<<"]["<<j+1<<"]=";

cin>>x[i][j];

}

return;

}

void output(double x[][n])

{

int i,j;

for(i=0;i<n;i++)

{

cout<<endl;

for(j=0;j<n;j++)

{

cout<<x[i][j]<<" ";

}

}

return;

}

void summa(double x[][n],double y[][n],double z[][n])

{

int i,j;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

z[i][j]=x[i][j]+y[i][j];

return;

}

void mult(double x[][n],double y[][n],double z[][n])

{

double s;

int i,j,k;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

{

s=0;

for(k=0;k<n;k++)

s+=x[i][k]*y[k][j];

z[i][j]=s;

}

return;

}

void degree(double x[][n],double y[][n],double z[][n],int deg)

{

void mult(double x[][n],double y[][n],double z[][n]);

int i,j,k;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

y[i][j]=x[i][j];

if(deg==1)

for(i=0;i<n;i++)

for(j=0;j<n;j++)

z[i][j]=x[i][j];

for(k=1;k<deg;k++)

{

mult(x,y,z);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

y[i][j]=z[i][j];

}

return;

}

Проверка:

При n=3;

Матрица А:

1 1 1

1 1 1

1 1 1

Матрица В:

1 1 1

1 1 1

1 1 1

А2:

1*1+1*1+1*1; 1*1+1*1+1*1; 1*1+1*1+1*1

1*1+1*1+1*1; 1*1+1*1+1*1; 1*1+1*1+1*1

1*1+1*1+1*1; 1*1+1*1+1*1; 1*1+1*1+1*1

=

3 3 3

3 3 3

3 3 3

А3:

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

=

9 9 9

9 9 9

9 9 9

B2:

1*1+1*1+1*1; 1*1+1*1+1*1; 1*1+1*1+1*1

1*1+1*1+1*1; 1*1+1*1+1*1; 1*1+1*1+1*1

1*1+1*1+1*1; 1*1+1*1+1*1; 1*1+1*1+1*1

=

3 3 3

3 3 3

3 3 3

B3:

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

=

9 9 9

9 9 9

9 9 9

A2*B=

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

=

9 9 9

9 9 9

9 9 9

A*B2=

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

3*1+3*1+3*1;3*1+3*1+3*1;3*1+3*1+3*1

=

9 9 9

9 9 9

9 9 9

A3+A2*B+A*B2+B3=C=

9 9 9 9 9 9 9 9 9 9 9 9 36 36 36

9 9 9 + 9 9 9 + 9 9 9 + 9 9 9 = 36 36 36

9 9 9 9 9 9 9 9 9 9 9 9 36 36 36

Аналогично:

При n=3

Матрица А:

2 2 2

2 2 2

2 2 2

Матрица В:

3 3 3

3 3 3

3 3 3

Матрица С:

585 585 585

585 585 585

585 585 585