Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМКДО_СистПрог_2016.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

5.3. Программа пользователя

Для проверки функционирования нашего модуля создается программный модуль, который имитирует программу пользователя. Этот модуль обращается к функции creat_matr для создания матрицы нужного размера, заполняет ненулевую ее часть последовательно увеличивающимися числами, используя для этого функцию write_matr, и выводит матрицу на экран, используя для выборки ее элементов функцию read_matr. Далее в диалоговом режиме программа вводит запрос на свои действия и читает/пишет элементы матрицы с заданными координатами, обращаясь к функциям read_matr/write_matr. Если пользователь захотел закончить работу, программа вызывает функцию close_matr.

5.4. Тексты программных модулей

/********************** Файл LAB2.H *************************/

/* Описание функций и внешних переменных файла LAB2.C */

extern int L2_RESULT; /* Глобальна переменна - флаг ошибки */

/***** Выделение памяти под матрицу */

int creat_matr ( int N );

/***** Чтение элемента матрицы по заданным координатам */

int read_matr ( int x, int y );

/***** Запись элемент в матрицу по заданным координатам */

int write_matr ( int x, int y, int value );

/***** Уничтожение матрицы */

int close_matr ( void );

/***************** Конец файла LAB2.H *************************/

/************************* Файл LAB2.C *************************/

/* В этом файле определены функции и переменные для обработки

матрицы, заполненной нулями ниже главной диагонали */

#include <alloc.h>

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

static int SIZE; /* Размер памяти */

static int *m_addr=NULL; /* Адрес сжатой матрицы */

static int lin(int, int); /* Описание функции линеаризации */

static char ch_coord(int, int); /* Описание функции проверки */

int L2_RESULT; /* Внешняя переменная, флаг ошибки */

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

/* Выделение памяти под сжатую матрицу */

int creat_matr ( int N ) {

/* N - размер матрицы */

NN=N;

SIZE=N*(N-1)/2+N;

if ((m_addr=(int *)malloc(SIZE*sizeof(int))) == NULL )

return L2_RESULT=-1;

else

return L2_RESULT=0;

/* Возвращает 0, если выделение прошло успешно, иначе -1 */

}

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

/* Уничтожение матрицы (освобождение памяти) */

int close_matr(void) {

if ( m_addr!=NULL ) {

free(m_addr);

m_addr=NULL;

return L2_RESULT=0;

}

else return L2_RESULT=-1;

/* Возвращает 0, если освобождение пршло успешно, иначе - -1 */

}

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

/* Чтение элемента матрицы по заданным координатам */

int read_matr(int x, int y) {

/* x, y -координати (строка, столбец) */

if ( ch_coord(x,y) ) return 0;

/* Если координаты попадают в нулевой участок - возвращается

0, иначе - применяется функция линеаризации */

return (x > y) ? 0 : m_addr[lin(x,y)];

/* Проверка успешности чтения - по переменной

L2_RESULT: 0 - без ошибок, -1 - была ошибка */

}

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

/* Запись элемента матрицы по заданным координатам */

int write_matr(int x, int y, int value) {

/* x, y -координати, value - записываемое значение */

if ( chcoord(x,y) ) return;

/* Если координаты попадают в нулевой участок - записи нет,

иначе - применяется функция линеаризации */

if ( x > y ) return 0;

else return m_addr[lin(x,y)]=value;

/* Проверка успешности записи - по L2_RESULT */

}

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

/* Преобразование 2-мерних координат в линейную */

/* (вариант 3) */

static int lin(int x, int y) {

int n;

n=NN-x;

return SIZE-n*(n-1)/2-n+y-x;

}

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

/* Проверка корректности обращения */

static char ch_coord(int x, int y) {

if ( ( m_addr==NULL ) ||

( x>SIZE ) || ( y>SIZE ) || ( x<0 ) || ( y<0 ) )

/* Если матрица не размещена в памяти, или заданные

координаты выходят за пределы матрицы */

return L2_RESULT=-1;

return L2_RESULT=0;

}

/********************Конец файла LAB2.C ***********************/

/********************** Файл MAIN2.C **************************/

/* "Программа пользователя" */

#include "lab2.h"

main(){

int R; /* размерность */

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

int m; /* значения элемента */

int op; /* операция */

clrscr();

printf('Введите размерность матрицы >'); scanf("%d",R);

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

if ( creat_matr (R) ) {

printf("Ошибка создания матрицы\n");

exit(0);

}

/* заполнение матрицы */

for ( m=j=0; j<R; j++)

for ( i=о; i<R; i++)

write_matr(i,j,++m);

while(1) {

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

clrscr();

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

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

printf("%3d ",read_matr(i,j));

printf("\n");

}

printf("0 - выход\n1 - чтение\n2 - запись\n>")

scanf("%d",&op);

switch(op) {

case 0:

if (close_matr()) printf("Ошибка при уничтожении\n");

else printf("Матрица уничтожена\n");

exit(0);

case 1: case 2:

printf("Введите номер строки >");

scanf("%d",&j);

printf("Введите номер столбца >");

scanf("%d",&i);

if (op==2) {

printf("Введите значение элемента >");

scanf("%d",&m);

write_matr(j,i,m);

if (L2_RESULT<0) pritnf("Ошибка записи\n");

}

else {

m=read_matr(j,i);

if (L2_RESULT<0) pritnf("Ошибка считывания\n");

else printf("Считано: %d\n",m);

}

printf("Нажмите клавишу\n"); getch();

break;

}

}

}

/********************Конец файла MAIN2.C **********************/