- •5. Пример решения задачи (вариант 30)
- •5.1. Разработка алгоритма решения.
- •5.2. Представление матрицы в памяти
- •5.3. Определение переменных программы (вариант 1)
- •5.4. Разработка текста программы (вариант 1)
- •5.5. Отличия для варианта реализации 1
- •5.6. Отладка программы
- •5.5. Результаты работы программы
- •5.6. Выводы
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