Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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 **********************/ Варианты Вариант 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. Date: 2015-05-22; view: 673; Нарушение авторских прав |