Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Тексты программных модулей
/************Файл LAB2.H *****************************/ /*Описание функций и внешних пepeменных файла LAB2.C */ extern int L2_RESULT; /* Глобальна переменная - флаг ошибки */ /*********** Выделение памяти под матрицу */ int creat_matr ( int N ); /***** Чтение элемента матрицы по заданным координатам */ int read_matr ( int х, int у ); /****** Запись элемент в матрицу по заданным координатам */ int write_matr ( int х, int у, int value ); /****** Уничтожение матрицы */ int close_matr ( void ); /******** Конец файла LAB2.H ******************/ /************Файл LAB2.С ****************************/ /* В этом файле определены функции и переменные для обработки матрицы, заполненной нулями ниже главной диагонали */ #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=0; /* Возвращает 0, если выделение произошло успешно, иначе -1 / } /****************.*****************************/ /* Уничтожение матрицы (освобождение памяти) */ int close_matr(void) { if ( m_addr!=NULL ) { free(m_addr); m_addr=NULL; геtuгп L2_RESULT=0; } else return L2_RESULT=-1; /* Возвращает 0, если выделение прошло успешно, иначе -1 */ } /* Чтение элемента матрицы по заданным координатам int геаd_mаtr(int х, int у) { /* х, у -координаты (строка, столбец) */ if ( ch_coord(x,y) ) геtuгт 0; /* Если координаты попадают в нулевой участок - возвращается 0, иначе - применяется функция линеаризации */ return (х > у) ? 0 : m_addr[lin(x,y)]; /* Проверка успешности чтения - по переменной L2_RESULT: 0 - без ошибок, -1 - была ошибка */ /****************.*****************************/ /* Запись элемента матрицы по заданным координатам */ int write_matr(int х, int у, int value) { /* х, у -координаты, value - записываемое значение */ if ( chcoord(x,y) ) return; /* Если координаты попадают в нулевой участок - записи нет, иначе - применяется функция линеаризации */ if ( х > у ) return 0; else return m_addr[lin(x,y)]=value; /* Проверка успешности записи - по L2_RESULT */ } /****************.*****************************/ /* Преобразование 2-мерных координат в линейную */ /* (вариант 3) */ static int lin(int х, int у) { int n; n=NN-х; return SIZЕ-n*(n-1)/2-n+у-х; /* Проверка корректности обращения */ static char ch_coord(int х, int у) { if ( ( m_addr= =NULL ) 11 ( x>SIZE ) || ( y>SIZE ) || ( x<0 ) || ( у<0 ) ) /* Если матрица не размещена в памяти, или заданные координаты выходят за пределы матрицы */ return L2_RESULT=-1; return L2_RESULT=0; } /*******Конец файлаLАВ2. С *******************/ /************** Файл MAIN2.C ********************/ /* "Программа пользователя" */ #include "lab2.h" main() { int R; /* размерность */ int i, j; /* номера строки и столбца */ int m; /* значения элемента */ int ор; /* операция */ clrscr() ; printf(' Введите размерность матрицы>'); scanf("%<d", R); /* создание матрицы */ if ( creat_matr (R) ) { ргiпtf("Ошибка создания матрицы\n"); exit(0); } /* заполнение матрицы */ for ( m=j=0; j<R; j++) for ( i=0; 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>") sсапf( "%d" , &ор); switch(op) { case 0: if (close_matr() ргintf("ошибка при уничтожении\n"); else ргintf("Матрица уничтожена\n"); ехit(0); case 1: case 2: printf( "Введите номер строки >"); scanf( "%d", &j): рrintf ("Введите номер столбца>"); scanf("%d",&i); if (ор= =2) { printf( "Введите значение элемента >"); scanf ("%d" , &m) ; write_matr(j,i,m); if (L2_RESULT<0) рritnf("Ошибка записи\n"); } else { m=read_matr(j,i); if (L2_RESULТ <0) pritnf( "Ошибка считывания\n"); else рrintf("Считано: "%d\n",m); } printf( "Нажмите клавишу\n"); getch(); break; } } } /****Конец файла MAIN2.C **********/ Варианты
Вариант 1 требует: - добавления к общим статическим переменным еще переменной: - добавления такого блока в функцию crea_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--; } - изменения функции lin на: static int lin(int х, int у) { return D[х]+у; }
Вариант 2 требует: изменения функции lin на: static int lin(int х, int у) { int s; for (s=j=0; j<x; j++) s+=NN-j; return s+y-x;
|
Последнее изменение этой страницы: 2019-05-08; Просмотров: 171; Нарушение авторского права страницы