Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №11_по функциям в си+.doc
Скачиваний:
2
Добавлен:
17.11.2018
Размер:
182.27 Кб
Скачать

5.5. Отличия для варианта реализации 1

    В тексте программы для варианта реализации 1 мы для упрощения исключили все проверки корректности и использовали для динамического массива устаревшие функции malloc и free. Описание реализации мы ограничиваем только отличиями от варианта 1.

    Указатель Ar в функции main() тут - указатель на массив указателей, следовательно, его тип - int**. Выделение памяти ведется в несколько приемов: сначала выделяется память для массива из S указателей, а потом в цикле - S раз выделяется память для массива из S целых чисел, адреса выделенных массивов записываются в элементы массива указателей. При выводе матрицы используются i и j - номера строки и столбца и обращение к элементам матрицы ведется как к элементам 2-мерного массива.

    Первый параметр функции fill() - указатель на указатель на int. Это дает возможность использовать номера строки и столбца - l и r также и для обращения к элементам матрицы.

/***************************************************/

/* Лабораторная работа ╧11 */

/* Функции */

/* Пример выполнения. Вариант ╧30. */

/* Вариант реализации 2 */

/***************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <alloc.h>

void fill(int far **, int);

/*** главная функция ***/

main() {

int far **Ar; /* указатель на массив указателей */

int i, j; /* строка и столбец */

int S; /* размерность матрицы */

/* ввод размерности */

printf("Enter S>"); scanf("%d",&S);

printf("S=%d\n",S);

/* выделение памяти для массива указателей */

Ar=(int far **)malloc(sizeof(int *)*S);

/* выделение памяти для каждой строки

и заполнение массива указателей */

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

Ar[i]=(int far *)malloc(sizeof(int)*S);

/* обращение к функции заполнения матрицы */

fill(Ar,S);

/* вывод матрицы */

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

for (j=0; j<S; printf("%3d",Ar[i][j++]) );

putchar('\n');

}

/* освобождение памяти строк */

for ( i=0; i<S; free(Ar[i++]) );

/* освобождение памяти массива указателей */

free(Ar);

return 0;

}

/*** функция заполнения матрицы ***/

/* параметры: A - указатель на массив указателей

s - размерность матрицы */

void fill(int far **A, int s) {

short l, r; /* строка и столбец */

short k=1; /* текущий член ЛП */

for (l=0; l<s; l++) /* перебор строк */

for (r=0; r<s; r++) /* перебор столбцов */

/* условие нулевого значения */

if ((r>=max(l,s-l-1))||(r<=min(l,s-l-1)))

A[l][r]=0;

else A[l][r]=k++;

/* конец перебору строк */

/* конец перебору столбцов */

}

5.6. Отладка программы

    При отладке программы срабатывают те же соображения, которые высказаны к работе ╧10: рекомендуется вести поиск ошибок на основе анализа выведенных программой данных, но при желании можно использовать и пошаговый режим.

5.5. Результаты работы программы

    Ниже приведены два примера результатов работы программы: для четного и нечетного значений размерности.

S=10

0 1 2 3 4 5 6 7 8 0

0 0 9 10 11 12 13 14 0 0

0 0 0 15 16 17 18 0 0 0

0 0 0 0 19 20 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 21 22 0 0 0 0

0 0 0 23 24 25 26 0 0 0

0 0 27 28 29 30 31 32 0 0

0 33 34 35 36 37 38 39 40 0

S=9

0 1 2 3 4 5 6 7 0

0 0 8 9 10 11 12 0 0

0 0 0 13 14 15 0 0 0

0 0 0 0 16 0 0 0 0

0 0 0 0 0 0 0 0 0

0 0 0 0 17 0 0 0 0

0 0 0 18 19 20 0 0 0

0 0 21 22 23 24 25 0 0

0 26 27 28 29 30 31 32 0