Завдання. Скласти на одній з алгоритмічних мов програму, що
запускається і видає на екран меню з двох пунктів (табуляція, вихід).

На вибір першої опції меню згенерувати два однакових масиви Х и Y цілих
чисел у діапазоні від -20 до 32 (кількість елементів – 2000). Масив X
відсортувати методом вибору, Y – методом пухирця, визначивши витрачений
час на кожний з методів. Зробити висновки.

На вибір другої опції меню опції чи меню натисканні користувачем на
клавішу ESC здійснити вихід із програми. Зміст

Вступ………………………………………………………………….3

Загальний опис роботи з файлами…………………………3

Компоновка………………………………………………….5

Інструкція користувачу………………………………………………9

Лістинг програми……………………………………………………10

Висновки…………………………………………………………….18

Вступ

Ітераціия властива людині, рекурсія божественна. — Л. Пітер Дойч

Всі нетривіальні програми складаються з декількох роздільно
компільованих одиниць (їх прийнято називати просто файлами). Розглянемо,
як роздільно відкомпільовані функції можуть бути в обігу одна до одної,
як такі функції можуть спільно користуватися даними (розділяти дані), і
якомога забезпечити погодженість типів, що використовуються в різних
файлах програми. Сюди входять передача параметрів, параметри за
замовчуванням, перевантаження імен функцій, та опис і визначення
функцій.

Мати всю програму в одному файлі зазвичай неможливо, оскільки коди
стандартних бібліотек і операційної системи знаходяться десь в іншому
місці. Крім того, зберігати весь текст користувачевої програми в одному
файлі як правило непрактично і незручно. Спосіб організації програми в
файли може допомогти читачу охопити всю структуру програми, а також дати
можливість компілятору реалізувати цю структуру. Оскільки одиницею
компіляції є файл, то в усіх випадках, коли в файл вноситься модифікація
(яка б мала вона на була), весь файл потрібно компілювать ще раз. Навіть
для програми помірних розмірів час, що витрачається на перекомпіляцію,
можна значно зменшити з допомогою розбиття програми на файли підходящих
розмірів.

Звичайна СІ-програма являє собою визначення функції main, що для
виконання необхідних дій викликає інші функції. Зв’язок між функціями
здійснюється по даним шляхом передачі параметрів і повернення значень
функцій. Але компілятор мови СІ дозволяє також розбити програму на
декілька окремих частин (вихідних файлів), відкорегувати кожну частину
окремо, і після цього об’єднати всі частини в одину, що виконується
файлом за допомогою редактора зв’язків. При такій структурі вихідної
програми функції,що знаходяться в різних вихідних файлах можуть
використовувати глобальні зовнішні змінні.

Всі функції в мові СІ по визначенню зовнішні і завжди доступні з
будь-яких файлів. Наприклад, якщо програма складається з двох вихідних
файлів, як показано нижче., то функція main може викликати будь-яку з
трьох функцій fun1, fun2, fun3, а кожна з цих функцій може викликати
будь-яку іншу.

main ()

{ …

}

fun1 ()

{ …

} fun2 ()

{…

}

fun3 ()

{…

}

file1.c

file2. c

Приклад програми з двох файлів

Для того, щоб функція, що визначається могла виконувати будь-які дії,
вона повинна використовувати змінні. В мові СІ всі змінні повинні бути
оголошені до їхнього використання. Оголошення встановлюють відповідність
імені та атрибутів змінної, функції або типу. Визначення змінної
викликає виділення пам’яті для зберігання її значення. Клас пам’яті, що
виділяється визначається специфікатором класу пам’яті, і визначає час
життя і область видимості змінної, зв’язані з поняттям блоку програми. В
мові СІ блоком вважається послідовність оголошень, визначень і
операторів, укладена в фігурні дужки. Існують два види блоків —
складений оператор і визначення функції, що складається з складеного
оператора, який є тілом функції, і що передує тілу заголовка функції (в
який входять ім’я функції, типи значення ,що вертається і формальних
параметрів). Блоки можуть включати в себе складені оператори, але не
визначення функцій. Внутрішній блок називається вкладеним.

Розглянемо приклад з калькулятором. Він був представлений у вигляді
одного вихідного файлу. Якщо ви його набили, то у вас напевне були
невеликі труднощі з розташуванням описів в правильному порядку, і
довелося використати по меншій мірі один ‘фальшивий’ опис, щоб
компилятор зміг обробити взаємно рекурсивні функції expr (), term () і
prim (). В відзначимо, що програма складається з чотирьох частин
(лексичного аналізатора, програми синтаксичного розбору, таблиці імен і
драйвера), але це ніяк не було відбите в тексті самої програми. По суті,
калькулятор був написаний по-іншому. Так це не робиться; навіть якщо в
цій програмі ‘навикид’ зневажити всіма міркуваннми методики
програмування, експлуатації і ефективності компіляціє, автор все одно
розіб’є цю програму в 200 рядків на декілька файлів, щоб програмувати
було приєиніше. Програма, що складається з декількох роздільно
компільованих файлів, повинна бути погодженої в сенсі використання імен
і типів, точно так же, як і програма, що складається з одного вихідного
файлу. В принципі, це може забезпечити і компоновщик.

Компоновщик — це програма, що стикує окремо скомпільовані частини разом.
Компоновщик часто (плутаючи) називають загрузчиком. В UNIX компоновщик
називається ld. Однак компоновщики, наявні в більшості систем,
забезпечують дуже слабку підтримку перевірки погодженості. Програміст
може компенсувати нестачу підтримки з боку компоновщика, надавши
додаткову інформацію про типи (опису). Після цього погодженість програми
забезпечується перевіркою погодженості описів, що знаходяться в окремо
компільованих частинах. Засоби, що це забезпечують, в CІ розроблені так,
щоб сприяти такій явній компоновці.

Компоновка

Якщо не вказане інше, то ім’я, що не є локальним для функції або класу,
в кожній частині програми, зкомпільованій окремо, повинно відноситись до
одного і того же типу, значенню, функції або об’єкту. Тобто, в програмі
може бути тільки один нелокальный тип, значення, функція або об’єкт з
цим ім’ям. Розглянемо, наприклад, два файли:

// file1.c:

int a=1;

int f () { /*щось робить*/ }

// file2.c:

extern int a;

int f (); void g () {a=f ();}

a і f (), що використаються g () в файлі file2.c, — ті же, що визначені
в файлі file1. c. Ключове слово extern (зовнішній) вказує, що опис a в
file2.c є (тільки) описом, а не визначенням. Якщо б a ініціалізувалась,
extern був б просто проігноровано, оскільки опис з ініціалізацією завжди
є визначенням. Об’єкт в програмі повинен визначатися тільки один раз.
Описуватися він може багато раз, але типи повинні точно погоджуватися.
Наприклад:

// file1.c:

int a=1;

int b=1;

extern int c;

// file2.c:

іnt a;

extern double b;

extern int c;

Тут три помилки: a визначене двічі (int a; є визначенням, що означає int
a=0;), b описане двічі з різними типами, а c описане двічі, але не
визначене. Ці види помилок (помилки компоновки) не можуть бути виявлені
компілятором, що за один раз бачить тільки один файл. Компоновщик,
однак, їх виявляє. Наступна програма не є C++ — програмою (хоча CІ
програмою є):

// file1.c:

int a;

int f () {return a;}

// file2.c:

int a;

int g () {return f ();}

По-перше, file2. c не C++, тому що f () не була описана, і тому
компілятор буде незадоволений. По-друге, (коли file2.c фіксований)
програма не буде скомпонована, оскільки a визначене двічі. Ім’я можна
зробити локальним в файлі, описавши його static. Наприклад:

// file1.c:

static int a=6;

static int f () {/*…*/}

// file2.c:

static int a=7;

static int f () {/*…*/}

Оскільки кожне a і f описане як static, в результаті програма ,що
одержується є правильною. В кожному файлі своя a і своя f (). Коли
змінні і функції явно описані як static, частину програми легше
зрозуміти (вам не треба никуда більше заглядать). Використання static
для функцій може, окрім цього, вигідно впливати на витрати за викликом
функції, оскільки дасть оптимізуючому компілятору більш просту роботу.
Розглянемо два файлу:

// file1.c:

const int a=6;

inline int f () { /*…*/ }

struct s {int a, b;}

// file1.c:

const int a=7;

inline int f () { /*…*/ }

struct s {int a, b;}

Раз правило ‘рівно одне визначення’ застосовується до констант, inline-
функцій і визначення функцій так же, як воно застосовується до функцій і
змінних, то file1.c і file2.c не можуть бути частинами однієї C++ —
програми. Але якщо це так, то як же два файли можуть використати одні і
ті же типи і константи? Коротко, відповідь така: типи, константи і т. д.
можуть визначатися стільки раз, скільки потрібно, за умови, що вони
визначаються однаково. Повна відповідь декілька більш складна.

Інструкція користувачу

Програма запускається і видає на екран меню з трьох пунктів (формування
файлу, запит, вихід).

На вибір першої опції меню формується на одному з дискових пристроїв
двійковий файл SESSIA.DAT, що містить зведення про здачу студентами
сесії. Структура запису: індекс групи (7 символів), Ф.И.О. студента (15
символів), оцінки по чотирьох іспитах ( чи символи цифри в діапазоні 2 (
5) і п’яти залікам (“s”– зараховано, “n”– не зараховано).
Організовується заповнення файлу вмістом у режимі діалогу з користувачем
(уведення закінчується набором індексу групи, що складається з 7
пробілів). Якщо файл із таким ім’ям існує, його коректування не
робиться.

На вибір другої опції меню надається можливість користувачу:

по введенню прізвища студента одержати результати сесії;

по введенню групи одержати результати здачі сесії групою з підрахунком
кількості студентів, що здала всі заліки й іспити на “4” і ”5”, і
кількість невстигаючих студентів, що не здали хоча б один чи залік що
мають “2” хоча б з одного іспиту.

На вибір третьої опції чи меню натисканні користувачем на клавішу ESC
здійснюється вихід із програми зі збереженням введеної інформації.

Лістинг програми

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define PI M_PI

const char *filename = «SESSIA.DAT»;

void draw(int x0,int y0)

{

unsigned char color[16]={0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15};

struct bmpinfo

{

char h1,h2;

unsigned long

size,reserved,offset,b,width,height;

unsigned int plans,bpp;

};

bmpinfo info;

FILE *f;

int x,y;

unsigned char b;

unsigned char bh;

unsigned char bl;

int nb;

int np;

int i,j;

if((f=fopen(«63.bmp»,»rb»))==NULL)

printf(«-1»);

//return -1;

fread(&info,sizeof(info),1,f);

if(info.bpp!=4)

printf(«-2»);

//return -2;

x=x0;

y=y0+info.height;

nb=(info.width/8)*4;

if((info.width/8)!=4)nb+=4;

fseek(f,info.offset,SEEK_SET);

for(i=0;i<=info.height;i++) { np=0; for(j=4;j>4;

putpixel(x,y,color[bh]);

x++;

np++;

}

if (np

Похожие записи