
Программирование на C / C++ / Лабораторные работы2 / lab6
.docxУфимский Государственный Авиационный Технический Университет
Кафедра АСУ
Отчёт
по лабораторной работе №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=An+ Bn;
-
С2=An-1∙B+An-2∙B2+An-3∙B3+…+A2∙Bn-2+A∙Bn-1;
Видно, что вторую часть можно выполнить в цикле, поэтому мы разобьем ее на составные части:
-
Возведение в степень матриц: An-1, B3…
-
Их перемножение: An-1∙B, An-2∙B2…
-
Сложение получившего произведения в одну переменную.
Для этого нам понадобятся следующие функции:
Функции
-
Ввода матрицы
-
Вывода матрицы
-
Сложения матриц
-
Перемножения матриц
-
Возведения матриц в 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