Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб7 программирование.doc
Скачиваний:
3
Добавлен:
03.05.2019
Размер:
642.56 Кб
Скачать

2.2. Случай двумерного динамического массива

Следующий вариант представления динамического двумерного массива позволяет использовать привычную индексацию двумерного массива и передавать массив в функцию. Для удобства создания и удаления такой матрицы рекомендуется создать специальные функцию-конструктор для инициализации этого массива и функцию-деструктор для освобождения памяти от массива. Массив представляется в виде одномерного массива (вектора) указателей на строки массива. Каждой строке выделяется соответствующий блок памяти в конструкторе.

/* Конструктор матрицы */

double **MakeMatr( int n, int m )

{

double **Matr;

int i;

Matr = (double**) Malloc( n * sizeof(double *) );

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

Matr[i] = (double *) Malloc( m * sizeof(double) );

return Matr;

}

/* Деструктор матрицы */

void DelMatr(int n, double *Matr[] )

{

int i;

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

free(Matr[i]); // Сначала удаляем строки

free(Matr); // Затем удаляем вектор указателей на строки

}

/* Вспомогательная функция для обработки случая, когда не хватает памяти*/

/* (не самый лучший подход, но самый простой) */

void *Malloc( int size )

{

void *p = malloc(size);

if( p==NULL )

{

printf("Недостаточно памяти!\n");

exit(1); // Экстренное завершение программы

}

return p;

}

3. Порядок выполнения работы

  1. Изучить методические указания по выполнению лабораторной работы

  2. Составить программу на алгоритмическом языке Си

  3. Составить контрольный пример, отладить программу

  4. Ответить на вопросы преподавателя

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

Вычислить значение матричного выражения. Учесть тип организации хранения данных матриц в соответствии с вариантом (симметричность, ленточность и т.п.). Результат сохранить в матрице общего вида (все элементы которой могут быть ненулевыми, и может отсутствовать симметрия данных). Выделение памяти для матриц определенного типа организовать в отдельных функциях, также реализовать отдельные функции для доступа к данным матриц каждого типа (функция должна получать указатель на массив и индексы i, j. Возвращать функция должна значение элемента из массива данных либо 0, если этот элемент не принадлежит области ненулевых значений, например ленте). Память под все матрицы, в том числе результат, должна быть выделена динамически.

Типы матриц, использующиеся в работе:

    1. Симметричная ленточная. Характеризуется двумя параметрами: размер матрицы и ширина ленты. Ширина ленты – максимальный модуль разности между i и j, за рамками которой нет значений отличных от нуля. Матрица симметрична относительно главной диагонали.

Пример симметричной ленточной матрицы размера 6 с шириной ленты 2:

Хранить данные такой матрицы целесообразно в виде массива полос ленты. В данном примере трех:

1, 2, 3, 4, 5, 6

7, 9, 11, 13, 15

8, 10, 12, 14

Обратите внимание, что каждая следующая полоса ленты короче предыдущей, а самая длинная равна размеру матрицы.

    1. Верхнетреугольная. Пример:

Организовать хранение только ненулевых элементов (по строкам, каждая из которых короче предыдущей).

    1. Нижнетреугольная. Пример:

Организовать хранение только ненулевых элементов (по строкам, каждая из которых длиннее предыдущей).

    1. Симметричная. Пример.

Организовать хранение данных по аналогии с треугольными матрицами. Остальные элементы матрицы симметричны относительно главной диагонали A[i][j]==A[j][i].

V) Профильная. Пример.

Профильная матрица также симметрична относительно главной диагонали, но максимальный модуль разности между i и j, за рамками которого нет значений отличных от нуля, для каждой строки такой матрицы определяется профилем (шаблоном). Например, в приведенном примере профиль матрицы определяется значениями: 3 для первой строки, 0 для второй и пятой, 1 для третей и четвертой.

Примечание: ненулевые значения матриц заполнить последовательными числами от 1.0 с шагом 0.1. Размер матриц и ширину ленты (при необходимости) ввести с клавиатуры. Проверить допустимое значение вводимых данных.

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

Примем обозначение:

A – матрица типа I

B – матрица типа II

C – матрица типа III

D – матрица типа IV

F – матрица типа V

Выражение

Функция, описывающая профиль матрицы F*

1

A·B+C/2-F

2

A-3·D·B-F

3

(2·B+D)·C-F

4

D-B·C/1.5-F

5

(3·A+B)·C-F

6

A·D-2·C-F

7

A·C+4·D-F

8

1.5·(A-D)·B-F

9

B+2·C·D-F

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

Выражение

Функция, описывающая профиль матрицы F

10

(C-3·B) ·D-F

11

(D+C/2) ·A-F

12

D·(B-C) –F

13

A·(C+2·D) –F

14

B·(3·A-D) –F

15

B·C-8·A-F

16

2·(C+A)·B-F

17

B/2+D·A-F

18

D·(B·3-A) –F

19

(C-3·B) ·A-F

20

2·D·C-A-F