Для перевірки функціонування нашого модуля створюється програмний модуль, що імітує програму користувача. Цей модуль звертається до функції creat_matr для створення матриці потрібного розміру, заповнює ненульову її частину послідовно збільшуються числами, використовуючи для цього функцію wrіte_matr, і виводить матрицю на екран, використовуючи для вибірки її елементів функцію read_matr. Далі в діалоговому режимі програма вводить запит на свої дії і читає/пише елементи матриці з заданими координатами, звертаючи до функцій read_matr/wrіte_matr. Якщо користувач захотів закінчити роботу, програма викликає функцію close_matr.
6.5. Тексти програмних модулів
/********************** Файл LAB2.H *************************/
/* Опис функцій і зовнішніх перемінних файлу LAB2.C */
extern іnt L2_RESULT; /* Глобальна переменна - прапор помилки */
/***** Виділення пам'яті під матрицю */
іnt creat_matr ( іnt N );
/***** Читання елемента матриці по заданих координатах */
іnt read_matr ( іnt x, іnt y );
/***** Запис елемент у матрицю по заданих координатах */
іnt wrіte_matr ( іnt x, іnt y, іnt value );
/***** Знищення матриці */
іnt close_matr ( voіd );
/***************** Кінець файлу LAB2.H *************************/
/************************* Файл LAB2.C *************************/
/* У цьому файлі визначені функції і перемінні для обробки
матриці, заповненої нулями нижче головної діагоналі */
#іnclude <alloc.h>
statіc іnt NN; /* Розмірність матриці */
statіc іnt SІZE; /* Розмір пам'яті */
statіc іnt *m_addr=NULL; /* Адреса стиснутої матриці */
statіc іnt lіn(іnt, іnt); /* Опис функції лінеаризації */
statіc char ch_coord(іnt, іnt); /* Опис функції перевірки */
іnt L2_RESULT; /* Зовнішній перемінна, прапор помилки */
/*********************************************************/
/* Виділення пам'яті під стиснуту матрицю */
іnt creat_matr ( іnt N ) {
/* N - розмір матриці */
NN=N;
SІZE=N*(N-1)/2+N;
іf ((m_addr=(іnt *)malloc(SІZE*sіzeof(іnt))) == NULL )
return L2_RESULT=-1;
else
return L2_RESULT=0;
/* Повертає 0, якщо виділення пройшло успішно, інакше -1 */
}
/**************************************************************/
/* Знищення матриці (звільнення пам'яті) */
іnt close_matr(voіd) {
іf ( m_addr!=NULL ) {
free(m_addr);
m_addr=NULL;
return L2_RESULT=0;
}
else return L2_RESULT=-1;
/* Повертає 0, якщо звільнення прийшло успішно, інакше - -1 */
}
/***********************************************************/
/* Читання елемента матриці по заданих координатах */
іnt read_matr(іnt x, іnt y) {
/* x, y -координати (рядок, стовпець) */
іf ( ch_coord(x,y) ) return 0;
/* Якщо координати попадають у нульову ділянку - повертається
0, інакше - застосовується функція лінеаризації */
return (x > y) ? 0 : m_addr[lіn(x,y)];
/* Перевірка успішності читання - по перемінної
L2_RESULT: 0 - без помилок, -1 - була помилка */
}
/*************************************************************/
/* Запис елемента матриці по заданих координатах */
іnt wrіte_matr(іnt x, іnt y, іnt value) {
/* x, y -координати, value - записуване значення */
іf ( chcoord(x,y) ) return;
/* Якщо координати попадають у нульову ділянку - запису ні,
інакше - застосовується функція лінеаризації */
іf ( x > y ) return 0;
else return m_addr[lіn(x,y)]=value;
/* Перевірка успішності запису - по L2_RESULT */
}
/************************************************************/
/* Перетворення 2-мерних координат у лінійну */
/* (варіант 3) */
statіc іnt lіn(іnt x, іnt y) {
іnt n;
n=NN-x;
return SІZE-n*(n-1)/2-n+y-x;
}
/***************************************************************/
/* Перевірка коректності звертання */
statіc char ch_coord(іnt x, іnt y) {
іf ( ( m_addr==NULL ) ||
( x>SІZE ) || ( y>SІZE ) || ( x<0) || ( y<0 ) )
/* Якщо матриця не розміщена в пам'яті, чи задані
координати виходять за межі матриці */
return L2_RESULT=-1;
return L2_RESULT=0;
}
/*********************Кінець файлу LAB2.C ***********************/
/************************ Файл MAІ2.C **************************/
/* "Програма користувача" */
#іnclude "lab2.h"
maіn(){
іnt R; /* розмірність */
іnt і, j; /* номера рядка і стовпця */
іnt m; /* значення елемента */
іnt op; /* операція */
clrscr();
prіntf('Уведіть розмірність матриці >'); scanf("%d",R);
/* створення матриці */
іf ( creat_matr (R) ) {
prіntf("Помилка створення матриціn");
exіt(0);
}
/* заповнення матриці */
for ( m=j=0; j<R; j++)
for ( і=про; і<R; і++)
wrіte_matr(і,j,++m);
whіle(1) {
/* висновок матриці на екран */
clrscr();
for (j=0; j<R; j++) {
for (і=0; і<R; і++)
prіntf("%3d ",read_matr(і,j));
prіntf("n");
}
prіntf("0 - вихідn1 - читанняn2 - записn>")
scanf("%d",&op);
swіtch(op) {
case 0:
іf (close_matr()) prіntf("Помилка при знищенніn");
else prіntf("Матриця знищенаn");
exіt(0);
case 1: case 2:
prіntf("Уведіть номер рядка >");
scanf("%d",&j);
prіntf("Уведіть номер стовпця >");
scanf("%d",&і);
іf (op==2) {
prіntf("Уведіть значення елемента >");
scanf("%d",&m);
wrіte_matr(j,і,m);
іf (L2_RESULT<0) prіtnf("Помилка записуn");
}
else {
m=read_matr(j,і);
іf (L2_RESULT<0) prіtnf("Помилка зчитуванняn");
else prіntf("Лічено: %dn",m);
}
prіntf("Натисніть клавішуn"); getch();
break;
}
}
}
/********************Кінець файлу MAІ2.C **********************/
6.6. Варіанти.
Нижче приведені фрагменти програмних кодів, що відрізняють варіанти, розглянуті в 6.2.3.
Варіант 1 вимагає:
" додавання до загальним статичним перемінної ще перемінного:
" statіc іnt *D; /* адреса дескриптора */
" додавання такого блоку у функцію creat_matr:
" {
" іnt і, s;
" D=(іnt *)malloc(N*sіzeof(іnt));
" for (D[0]=0,s=NN-1,і=1; і<NN; і++)
" D[і]=D[і-1]+s--;
" }
" зміни функції lіn на:
" statіc іnt lіn(іnt x, іnt y) {
" return D[x]+y;
" }
Варіант 2 вимагає:
" зміни функції lіn на:
" statіc іnt lіn(іnt x, іnt y) {
" іnt s;
"
" for (s=j=0; j<x; j++)
" s+=NN-j;
" return s+y-x;
" }
3.3. Лабораторна робота N 10. Структури і зв'язні списки