Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №2 (Вариант 6, массив указателей)

.doc
Скачиваний:
19
Добавлен:
20.06.2014
Размер:
1.23 Mб
Скачать

2

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

Лабораторная работа №2

по дисциплине

«Программирование на языке высокого уровня»

на тему:

«Операции над матрицами»

Студент

Ключанских А.С

подпись, дата

фамилия, инициалы

Группа

АС-10

Принял

Фарафонов А.С.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2011

  1. Задание

  1. Вычислить заданное матричное выражение, в котором размеры матриц и их содержимое определяются пользователем. Для вычисления суммы, произведения матриц и умножения матриц на константу реализовать и использовать пользовательские функции. Контролировать размерность матриц для осуществления матричных операций. В случае, если размерность матриц не позволяет провести операцию, выдавать сообщение об этом.

  1. Хранить матрицу в виде массива указателей.

6

(A+B/k)T*C

  1. Блок-схема

  1. Листинг программы

#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;

}

  1. Контрольный пример

  1. Выводы о проделанной работе

Я научился реализовывать функции, позволяющие выполнять различные действия над матрицами, в среде языка программирования С. Приобрёл навыки реализаций двумерных матриц в виде одномерного массива.

  1. Список использованной литературы

  1. Шилдт Г. Искусство программирования на C++. БХВ.2005

  2. Шилдт Г. C++ Руководство для начинающих. Вильямс.2005

  3. Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004