Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Програма користувача




 

Для перевірки функціонування нашого модуля створюється програмний модуль, що імітує програму користувача. Цей модуль звертається до функції 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("Лічено: %d\n",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. Структури і зв'язні списки

 

Мета роботи

Закріплення практичних навичок у роботі зі структурами і покажчиками мови C, забезпеченні функціональної модульности






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных