Некоторые операции над матрицами




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

Обработка двухмерных массивов с использованием указателей

 

 


Цель работы

1.1 Получение навыков в написании программ с использованием указателей.

1.2 Получение навыков программирования некоторых операций над матрицами с использованием указателей.

Техническое обеспечение

2.1 Персональная ЭВМ IBM PC/286 и более поздних моделей.

2.2 Клавиатура.

2.3 Дисплей.

2.4 Печатающее устройство.

Программное обеспечение

3.1 Операционная система MS DOS версия 5.0 и более поздние версии.

3.2 Система программирования Borland C++ версия 3.1 и более поздние версии.

Постановка задачи

Выполнить операции над матрицами согласно указанного варианта.

 

Содержание отчета

5.1. Тема и цель работы.

5.2. Схема алгоритма решения задачи.

5.3. Текст программы.

5.4. Результаты выполнения программы.

 

Общие сведения

Указатели на многомерные массивы

Многомерный массив в языке С – это массив массивов, т. е. Массив, элементами которого являются массивы. Например, двухмерный массив есть массив, элементы которого одномерные массивы

int arr [M][N];

Массив arr состоит из M элементов. Каждый элемент – одномерный массив размерностью N. В памяти массив arr расположен следующим образом:

  ... Первый массив из N элем-тов Второй массив из N элем-тов   ... M - й массив из N элем-тов   ...

 

Рассмотрим, как осуществлять доступ к элементам многомерного массива через указатель. Сделаем это на примере массива arr.

Объявим указатель и свяжем его с массивом arr

int *ptr;

ptr = &arr[0][0];

Необходимо получить доступ к элементу arr [ i ][ j ], или к j -му элементу i -й строки массива arr. Последовательно это вычисляется так:

адрес первого массива arr ptr

адрес j -го элемента i -й строки, ptr + i*N + j

т. е. элемента arr[i][j]

Пример.

/* Сложение двух матриц */

void add_matr(float *matr1, float matr2, int m, int n)

{

int i;

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

*(matr1 + i) = *(matr1 + i) + *(matr2 + i);

out_matr(matr1, m, n);

}

 

 

Передача массивов в функции

Когда массив используется в качестве аргумента функции, передается только адрес массива, а не копия всего массива. При вызове функции с именем массива в функцию передается указатель на первый элемент массива. Параметр должен иметь тип, совместимый с указателем. Имеется три способа объявления параметра, предназначенного для получения указателя на массив. Во-первых, он может быть объявлен как массив:

#include <stdio.h>

void display (int num[10]);

int main (void)

{

int t[10], i;

for (i = 0; i < 10; i++) t[i] = i;

display (t);

return 0;

}

void display (int num[10])

{

int j;

for (j = 0; j < 10; j++) printf(“%d “, num[j]);

}

Второй способ состоит в объявлении параметра для указания на безразмерный массив, как показано ниже:

void display (int num[ ])

{

int j;

for (j = 0; j < 10; j++) printf(“%d “, num[j]);

}

И, наконец, третий способ, которым может быть объявлен num, - это наиболее типичный способ, применяемый при написании профессиональных программ, - через указатель, как показано ниже:

void display (int *num)

{

int j;

for (j = 0; j < 10; j++) printf(“%d “, num[j]);

}

Все три способа объявления параметра приводят к одинаковому результату – указателю.

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

 

Некоторые операции над матрицами

Ввод матрицы обычно задается по строкам с помощью двух циклов. При использовании указателей это будет выглядеть следующим образом:

/* Ввод матрицы по строкам */

void input_matr (float *matr, int m, int n)

{

int i, j;

float b;

for (i = 0; i < m; i++) {

printf(“\nвведите элементы %d-й строки: “, i + 1);

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

scanf(“%f”, &b);

(matr + i*n + j) = b;

}

}

}

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

/* Вывод матрицы по строкам *.

void out_matr(float *matr, int m, int n)

{

int i, j;

for (i = 0; i < m; i++) {

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

printf (“%.2f “, (matr + i*n + j));

printf(“\n”);

}

printf(“\n”);

}

Операции с константами сводятся к сложению или вычитанию элементов матрицы aij с константой, например х, или умножению aij * х или делению aij / х на константу.

Транспонированной матрицей называется матрица, у которой столбцы и строки меняются местами, т. е. из матрицы размера m ´ n получатся матрица размером n ´ m. Например, для матрицы А размером 3´4это:

Нетрудно заметить, что транспонирование матрицы реализуется с помощью соотношения .

Произведением двух квадратных матриц А и В является третья матрица С, элементы которой вычисляются по формуле:

.

Таким образом, элемент сij матрицы С = А×В есть сумма произведений элементов i -й строки матрицы А на соответствующие элементы i -го столбца матрицы В.

Методические указания

7.1 Ввод и вывод массива, а также операции над матрицами оформить в виде функций, не возвращающих значение.

7.2 При вводе, выводе и обработке матриц использовать указатели на массивы

 

Варианты заданий

1. Даны квадратные матрицы А и В порядка n. Получить матрицу С = А×В - В×А.

2. Дана квадратная матрица А порядка n. Получить матрицу А×В, где элементы матрицы В вычисляются по формуле:

3. Даны квадратные матрицы А и В порядка n. Получить матрицу С = АТ - ВТ, где АТ и ВТ – транспонированные матрицы.

4. Даны квадратные матрицы А и В порядка n. Получить произведение А×ВТ

5. Даны квадратные матрицы А и В порядка n. Получить матрицу А2 + В2.

6. Даны квадратные матрицы А, В и С порядка n. Получить матрицу (А + ВС.

7. Дана квадратная матрица А порядка n. Получить матрицу АТ × ВТ, где АТ – транспонированная матрица, а элементы матрицы В вычисляются по формуле:

8. Даны квадратные матрицы А и В порядка n. Получить матрицу А ×(ВЕ) + С, где Е – единичная матрица порядка n, а элементы матрицы С вычисляются по формуле:

i, j = 1, 2, …, n.

9. Дана матрицы А и В размера m´n. Получить матрицу АТ + ВТ, где АТ и ВТ – транспонированные матрицы.

10. Дана квадратная матрица А порядка m. Получить матрицы 0.5×(A + AT) и 0.5×(АА Т), где АТ – транспонированная матрица.

11. Даны квадратные матрицы А и В порядка m. Получить матрицу АТ×В + А×ВТ, где АТ и ВТ – транспонированные матрицы.

12. Даны квадратные матрицы А и В порядка n. Получить матрицу С = АТ - В2, где АТ – транспонированная матрица.

13. Дана квадратная матрица А порядка n. Получить матрицу B порядка n, элементы которой вычисляются как разность между элементом aij и минимальным элементом i-й строки.

14. Дана квадратная матрица А порядка n. Получить матрицу B порядка n, элементы bij которой вычисляются как разность между максимальным элементом j-го столбца и элементом aij.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: