Лабораторная работа №2 (Вариант 6, массив указателей)
.doc
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №2
по дисциплине
«Программирование на языке высокого уровня»
на тему:
«Операции над матрицами»
|
Студент |
|
|
|
Ключанских А.С |
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
АС-10 |
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
|
|
||||||||
|
|
|
|
|
Фарафонов А.С. |
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2011
-
Задание
-
Вычислить заданное матричное выражение, в котором размеры матриц и их содержимое определяются пользователем. Для вычисления суммы, произведения матриц и умножения матриц на константу реализовать и использовать пользовательские функции. Контролировать размерность матриц для осуществления матричных операций. В случае, если размерность матриц не позволяет провести операцию, выдавать сообщение об этом.
-
Хранить матрицу в виде массива указателей.
6 |
(A+B/k)T*C |
-
Блок-схема
-
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <stdlib.h>
int **umnozhk(int **B, int k, int mB, int nB);
int **summa(int **A, int **B, int mA, int nA, int mB, int nB);
int **transp(int **A, int mA, int nA);
int **matrix(int **C,int **D,int mC, int nC, int mD, int nD);
int **T,**B,**A,**C,**D;
void main(){
setlocale(LC_ALL, "rus");
int mB,nB,mA,nA,mC,nC,k;
printf("-----(A+B/k)T*C-----\n");
printf("Введите размеры матрицы B: ");
scanf("%d%d",&mB,&nB);
B = (int **)malloc(mB*sizeof(int *));
for(int i=0;i<mB;i++)
B[i] = (int *)malloc(nB*sizeof(int));
printf("Заполнение матрицы В:\n");
for(int i=0;i<mB;i++)
for(int j=0;j<nB;j++)
scanf("%d",&B[i][j]);
printf("Введите К: ");
scanf("%d",&k);
umnozhk(B,k,mB,nB);
printf("Результат деления матрицы B на %d:\n",k);
for(int i=0;i<mB;i++)
{
for(int j=0;j<nB;j++)
printf("%-3d ",B[i][j]);
printf("\n");
}
printf("Введите размеры матрицы А: ");
scanf("%d%d",&mA,&nA);
A = (int **)malloc(mA*sizeof(int *));
for(int i=0;i<mA;i++)
A[i] = (int *)malloc(nA*sizeof(int));
printf("Заполнение матрицы A:\n");
for(int i=0;i<mA;i++)
for(int j=0;j<nA;j++)
scanf("%d",&A[i][j]);
if(summa(A,B,mA,nA,mB,nB)==NULL) {
getch();
exit(1);
}
printf("Результат сложение матриц A и B:\n");
for(int i=0;i<mA;i++)
{
for(int j=0;j<nA;j++)
printf("%-3d ",A[i][j]);
printf("\n");
}
transp(A, mA, nA);
printf("Транспонированная матрица:\n");
for(int i=0;i<nA;i++)
{
for(int j=0;j<mA;j++)
printf("%-3d ",T[i][j]);
printf("\n");
}
printf("Введите размеры матрицы C: ");
scanf("%d%d",&mC,&nC);
C = (int **)malloc(mC*sizeof(int *));
for(int i=0;i<mC;i++)
C[i] = (int *)malloc(nC*sizeof(int));
printf("Заполнение матрицы С:\n");
for(int i=0;i<mC;i++)
for(int j=0;j<nC;j++)
scanf("%d",&C[i][j]);
if(matrix(T,C,nA,mA,mC,nC)==NULL) {
getch();
exit(1);
}
printf("Результат умножения матриц:\n");
for(int i=0;i<nA;i++)
{
for(int j=0;j<nC;j++)
printf("%-3d ",D[i][j]);
printf("\n");
}
free(D);
getch();
}
int **umnozhk(int **B,int k,int mB, int nB) {
for(int i=0;i<mB;i++)
for(int j=0;j<nB;j++)
B[i][j] = (int)B[i][j]/k;
return B;
}
int **summa(int **A, int **B, int mA, int nA, int mB, int nB){
if(!((mA==mB)&&(nA==nB)))
{
printf("Невозможно произвести операцию сложения матриц А и В");
return NULL;
}
for(int i=0;i<mA;i++)
for(int j=0;j<nA;j++)
A[i][j] = A[i][j]+B[i][j];
free(B);
return A;
}
int **transp(int **A, int mA, int nA){
T = (int **)malloc(nA*sizeof(int *));
for(int i=0;i<nA;i++)
T[i] = (int *)malloc(mA*sizeof(int));
for(int i=0;i<mA;i++)
for(int j=0;j<nA;j++)
T[j][i] = A[i][j];
free(A);
return T;
}
int **matrix(int **T,int **C,int mT, int nT, int mC, int nC){
if(!(nT==mC)){
printf("Невозможно произвести операцию умножения матриц");
return NULL;
}
D = (int **)malloc(mT*sizeof(int *));
for(int i=0;i<mT;i++)
D[i] = (int *)malloc(nC*sizeof(int));
for(int i=0;i<mT;i++)
{
for(int j=0;j<nC;j++)
{
D[i][j]=0;
for(int k=0;k<nT;k++)
D[i][j]=D[i][j]+T[i][k]*C[k][j];
}
}
free(T);free(C);
return D;
}
-
Контрольный пример
-
Выводы о проделанной работе
Я научился реализовывать функции, позволяющие выполнять различные действия над матрицами, в среде языка программирования С. Приобрёл навыки реализаций двумерных матриц в виде одномерного массива.
-
Список использованной литературы
-
Шилдт Г. Искусство программирования на C++. БХВ.2005
-
Шилдт Г. C++ Руководство для начинающих. Вильямс.2005
-
Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004