/******* Файл 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 **********************/
Варианты
Вариант 1 требует:
u добавления к общим статическим переменным еще переменной:
static int *D; /* адрес дескриптора */
u добавления такого блока в функцию creat_matr:
{
int i, s;
D=(int *)malloc(N*sizeof(int));
for (D[0]=0,s=NN-1,i=1; i<NN; i++)
D[i]=D[i-1]+s--;
}
u изменения функции lin на:
static int lin(int x, int y) {
return D[x]+y;
}
Вариант 2 требует:
u изменения функции lin на:
static int lin(int x, int y) {
int s;
for (s=j=0; j<x; j++)
s+=NN-j;
return s+y-x;
}
Лабораторная работа №4.
Проверка оборудования