Міністерство освіти і науки України
Національний університет "Львівська політехніка"
Кафедра "Інформаційні системи та мережі "
КУРСО В А Р О Б О Т А
з дисципліни "Проблемно-орієнтовані мови програмування"
на тему:
Навчальна програма
«Вивчення основ програмування Turbo C»
студенту групи КН-17
Тема: Навчальна програма «Вивчення основ програмування Turbo C»
Завдання: Навчальна програма «Вивчення основ програмування Turbo C»
ЗМIСТ ЗАВДАННЯ ТА КАЛЕНДАРНИЙ ПЛАН ЙОГО ВИКОНАННЯ
1.
Провести аналiтичний огляд лiтератури по заданій темi.
2.
Розробити алгоритм та графiчну схему програми розв'язування задачi
3.
Написати програму на мовах C /C++.
Вимоги до програми:
1) програма повинна працювати у вікні MSDOS операційної системи
Windows;
2) програма повинна мати інтерфейс у вигляді вікон та меню для вибору
режимів її роботи;
3) передбачити введення даних з клавіатури та з файлу та виведення
результатів на екран та у файл;
4) керування режимами роботи програми виконати за допомогою
клавіатури та миші.
4.
Пiдготувати вхiднi данi для контрольного прикладу.
5.
Реалiзувати та вiдлагодити програми на вказаних мовах програмування.
6.
Оформити записку до курсової роботи згiдно вимог Мiжнародних
стандартiв, дотримуючись такого змiсту:
28.05
-вступ;
-формулювання задачі;
-алгоритми розв'язування задачі;
-методи та засоби розв’язування задачі;
-опис програми на мові C/C++ ;
-технологія програмування, виконання та відлагодження програми;
-інструкція користувачу;
-контрольний приклад та аналіз результатів комп'ютерної реалізації
програми;
-висновки;
-література;
-додатки
ЗАВДАННЯ ПРИЙНЯТО ДО ВИКОНАННЯ: ____________
пiдпис студента
Керівник роботи: _______________ Кравець П.О.
Формулювання задачі.
Формулювання задачі: Програма може виконуватися на операційній системі DOS, та її емуляцією під Windows. Для її виконання потрібні мінімальні характеристики комп’ютера, головне обладнання: клавіатура, пристрій виведення інформації, та будь-який носій даних (з файловою системою FAT для операційної системи DOS). Керування програмою може здійснюватись за допомогої миші та клавіатури. Програма оформлена у вигляді вікон та меню для вибору режимів її роботи. Також в програмі є підсистема контролю знань. Багато функцій в меню «навчання»: можна безпосередньо перейти на розділ або перейти на закладку, попередньо зберігши її. Пряме призначення програми навчити людину мови програмування Turbo C. І перевірити її знання шляхом проведення тестування по вивчених темах. Для підключення миші потрібно використати функції для роботи з мишою. Для читання даних з файлу з питаннями у підсистемі тестування знань, потрібно розробити структуру з полями для зчитування питання, трьох варіантів відповідей і номера правильної відповіді. Файл структур створюється окремою програмою в якій вводяться всі потрібні дані. Використати оператор switch для перевірки нажатої клавіші і виконання відповідної дії. Програма працює у графічному режимі. Для запуску програми потрібно підключити драйвер EGAVGA.BGI. Розробити функції для побудови вікон кнопок та інших графічних об’єктів. У програмі потрібно передбачити зручну навігацію.
Методи та засоби розв’язування задачі.
Для розв’язування задачі потрібно добре знати такі головні теми: робота з рядками символів, масивами, структурами, графічним режимом, двійковими файлами.
Рядки. У мові програмування С не визначено спеціального типу для опрацювання рядків. Рядок символів розглядається як масив елементів типу char, який закінчується символом ‘\0’(нуль-символ), що є ознакою кінця рядка. Сталі типу рядок записуються у лапках. У сталих рядках нуль-символ записується автоматично.
Підчас оголошення символьного масиву необхідно до фактичної довжини рядка додати одиницю для нульового символа (не у всіх компіляторах). Якщо масив символів оголошують й ініціалізують одночасно, то довжину можна не зазначати, компілятор визначить її. Оскільки рядки є масивами символів, то назва рядка вказівником на його початок (на його перший елемент). Для опрацювання масивів символів у мові С є стандартні функції, які описуються у модулі string.h.
Масиви. Масив – впорядкований скінчений набір даних одного типу, які зберігаються в послідовно розташованих комірках оперативної пам’яті і мають спільну назву. Назву масиву дає користувач.
Масив складається з елементів. Кожен елемент має індекс, за яким його можна знайти у масиві. Кількість Індексів визначає розмірність масиву. Розрізняють одно та багатовимірні масиви. Двовимірний масив – це таблиця яка складається з декількох рядків і стовпців. У математиці поняттю масив відповідає поняття вектора та матриці.
Розмір – це кількість елементів масиву. Розмір масиву треба задати заздалегідь, оскільки компілятор має зарезервувати для нього необхідний обсяг пам’яті. Розміром може бути лише стала величина.
Звернутись до елементів масиву можна двома способами: за допомогою імені масиву та використовуючи вказівники. Нумерація елементів масиву починається від нуля.
Проініціалізувати масив можна одним із способів:
Використовуючи принцип замовчування;
Безпосередньо підчас його оголошення;
Застосовуючи команду присвоювання;
Підчас введення даних з клавіатури.
За замовчанням усім елементам масиву надається значення 0.
Підчас компіляції програмного коду для статичного оголошення масивів надається пам'ять. Для ефективного використання пам'яті призначене динамічне оголошення масивів. Динамічною змінною можна використовувати операції, визначені для даних відповідного базового типу.
Якщо елемент масиву має не один а декілька індексів, то такі масиви називаються багатовимірними. Прикладами багатовимірних масивів можуть бути різноманітні табличні дані. Двовимірному масиву у математиці відповідає поняття матриці.
Кількість індексів визначає вимірність масиву. Усі двовимірні масиви можна опрацьовавути як одновимірні.
Елементи двовимірного масиву визначаються іменем масиву та двома індексами. Перший індекс означає номер рядка а другий номер стовпця. Двовимірні масиви компілятор розглядає як послідовність одновимірних, тому до елементів можна звертатись і через вказівники. В такому випадку це вказівника на вказівник одновимірного масиву.
Структури. Структури дозволяють об'єднувати в єдиному об'єктi сукупнiсть значень, якi можуть мати рiзнi типи. Оголошення структури здiйснюється за допомогою ключового слова struct.
Синтаксис опису структури виглядає так :
struct [iм'я_структури]
{
тип1 елемент1;
тип2 елемент2;
........................
типN елементN;
} [список описiв];
З метою ознайомлення з цим типом даних розглянемо найпростiший приклад представлення поняття "дата", що складається з декiлькох частин: число (день, мiсяць, рiк), назва тижня та мiсяця:
struct date {
int day ;
int month ;
int year;
char day_name[15];
char mon_name[14];
} arr[100],*pd,data,new_data;
В даному прикладi оголошуються:
data, new_data - змiннi типу структури date;
pd - вказiвник на тип data
arr - масив iз 100 елементiв, кожний елемент якого має тип date.
Потрiбно вiдзначити, що на вiдмiну вiд описiв iнших типiв даних, опис структури не видiляє мiсця у пам'ятi пiд елементи структури. Її опис визначає лише так званий шаблон, що описує характеристики змiнних, що будуть розмiщуватися у конкретнiй структурi. Щоб ввести змiннi та зарезервувати для них пам'ять необхiдно або пiсля фiгурної дужки, що завершує опис структури, вказати список iдентифiкаторiв.
Як i звичайними масивами простих типiв, так само можна оперувати масивами структур, елементи якого мають структурований тип. Розглянемо наочний зразок, який iлюструє оголошення масиву структур:
typedef struct Date
{
int d; /* день */
int m; /* мiсяць */
int y; /* рiк */
} Date;
Date arr[100];
Вище було оголошено масив arr, що складається iз 100 елементiв, кожний з яких має тип Data. Кожний елемент масиву - це о крема змiнна типу Data, що складається iз трьох цiлих елементiв - d, m, y.
Доступ до полiв структури аналогiчний доступу до звичайних змiнних, плюс використання iндексу номеру елементу у квадратних дужках:
arr[25].d=24;
arr[12].m=12;
Двійкові файли. Двійковий файл представляє собою просто послідовність символів. Що саме і в якій послідовності зберігається в двійковому файлі - повинна знати програма.
Двійкові файли мають переваги, порівняно з текстовими при зберіганні числових даних. Операції читання і запису з такими файлами виконуються набагато швидше, ніж з текстовими, так як відсутня необхідність форматування (переведення в текстове представлення та навпаки). Двійкові файли зазвичай мають менший розмір, ніж аналогічні текстові файли. В двійкових файлах можна переміщуватися в будь-яку позицію і читати або записувати дані в довільній послідовності, в той час, як в текстових файлах практично завжди виконується послідовна обробка інформації.
Про те, як відкривати двійкові файли було згадано раніше. Запис і читання в двійкових файлах виконується відповідно функціями fwrite і fscanf.
size_t fwrite(const void *ptr, size_t size, size_t n, FILE*stream);
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
В обидві функції повинен передаватися покажчик ptr на дані, які вводяться або виводяться. Параметр size задає розмір в байтах даних, які читаються або записуються.
#include<stdio.h>
#include<conio.h>
struct mystruct
{
int i;
char ch;
};
int main(void)
{
FILE *stream;
struct mystruct s;
if ((stream = fopen("test.txt", "wb")) == NULL)
{
fprintf(stderr, "Неможливо відкрити файл\n");
return 1;
}
s.i = 0;
s.ch = 'A';
fwrite(&s, sizeof(s), 1, stream);
fclose(stream);
return 0;
}
Тепер розглянемо особливості записування і читання рядків.
char s[10];
strcpy(s, "Example");
…
fwrite(s,strlen(s)+1,sizeof(char),stream);
Записування рядків відбувається посимвольно. В даному прикладі число символів, які записуються - strlen(s)+1 (одиниця додається на нульовий символ в кінці). Читається рядок аналогічно:
fread(s,strlen(s)+1,sizeof(char),stream);
При цьому читання проходить теж посимвольно.
Дуже часто доводиться працювати з рядками різних довжин. В таких випадках можна перед рядком записати у файл ціле число, яке рівне числу символів у рядку.
…
int i=strlen(s)+1;
fwrite(&i,1,sizeof(int),stream);
fwrite(s,i,1,stream);
…
fread(&i,1,sizeof(int),stream);
fread(s,i,1,stream)
В усіх наведених вище прикладах читання даних проходило послідовно. Але, працюючи з двійковими файлами, можна організувати читання даних в довільному порядку. Для цього використовується "покажчик файла" (курсор), який визначає поточну позицію у файлі. При читанні даних курсор автоматично зміщується на число прочитаних байтів. Отримати поточну позицію курсору файла можна за допомогою функції ftell().
long ftell(FILE *stream);
А встановлюється поточна позиція курсору у файлі за допомогою функції fseek():
int fseek(FILE *stream, long offset, int whence);
Ця функція задає зміщення на число байтів offset від точки відліку, яка визначається параметром whence. Цей параметр може приймати значення 0, 1, 2.
Графічний режим.
Initgraph – Ініціалізує графічну систему і переводить відеоадаптер у графічний режим. Параметр graphdriver задає графічний драйвер, а параметр graphmode - графічний режим. Якщо graphdriver=DETECT, то викликається процедура автоматичного самовизначення графічного драйвера та режиму. Параметр drivepath задає шлях до графічного драйвера. Якщо drivepath=”” (порожній рядок), то драйвер повинен бути розміщений у поточному каталозі. Для EGA-драйвера визначені наступні режими: EGALO=0 {640*200 пікселів; 16 кольорів; 4 сторінки} EGAHI=1 {640*350 пікселів; 16 кольорів; 2 сторінки} Для VGA-драйвера визначені наступні режими: VGALO=0 {640*200 пікселів; 16 кольорів; 2 сторінки}
VGAMED=1 {640*480 пікселів; 16 кольорів; 2 сторінки} VGAHI=2 {640*480 пікселів; 16 кольорів; 1 сторінка}
closegraph – Закриває графічну систему, відновлює режим екрану, який був до встановлення графічного режиму, та вивільняє пам’ять, яка використовувалася під буфер.
rectangle – Виводить прямокутник з координатами головної діагоналі (left, top)-(right, bottom). Стиль та колір лінії задається функціями setlinestyle та setcolor.
bar - Виводить зафарбований прямокутник з координатами головної діагоналі (left, top)-(right, bottom). Використовується шаблон заповнення та колір, встановлені функціями setfillstyle та
setfillpattern.
cleardevice – Витирає екран кольором, встановленим у setbkcolor, встановлюючи курсор у позицію (0,0).
outtextxy – Виводить рядок textstring у позицію (x,y). Довгий рядок відсікається на межі встановленого вікна. Параметри шрифта встановлюються функцією settextstyle.
etcolor – Встановлює колір зображення в діапазоні від 0 до15, використовуючи задану палітру.
setfillstyle – Встановлює один з стандартних видів заповнення та його колір. Діє на функції fillpoly, bar, bar3d та pieslice.
Алгоритм розв'язування задачі.
Створення програми я розпочав з розроблення алгоритму, після чого приступив до написання програми. Написання програми я почав з підключення директив препроцесора. Після чого оголосив структуру mn з координатами для побудови чотирикутника. Оголосив структуру tt для збереженн координат виведення тексту. Оголосив глобальні змінні:
unsigned i; - для використання в циклі.
char ss,ws[6]; - для читання натисненої клавіші.
int row, col, but,t=0; - координати і статус натиснення клавіші миші.
int z=-1,j,b=0; - активний пункт меню, використання в циклі, булева змінна.
char s[n][30],str[14][30]; - для вивдення написів кнопок.
mn k[40]; tt ou[n]; mn ktr[40]; tt outr[14]; - кнопки і напис кнопок.
Розробив функцію для побудови вікон void vikno(int ub,int x1,int y1, int x2,int y2, char *p), функцію int m_in(int v, int g) для визначення наведення миші на кноаку і статус миші, void rbutton(int g); для перемальовування активної кнопки іншим кольром, void pres_button(int g) для визначення яка кнопка натиснена, void button(int x,int y, int g, char *sx, int d) – малювання кнопки. Оголосив прототипи функцій:
void menu(); - головне меню.
void entk(); - перехід за вибраним пунктом.
void in_box(int w1, int w2); - визначення наведення на кнопку кукрсора миші
void klav(); - керування за допомогою клавіатури.
void test(); - тестування.
void about(); - про програму.
void edu(); - навчання.
Оголосив функцію void run() для початку роботи. Після чого оголосив головну функцію void main(). В ній я забезпечив ініціалізацію графічного режиму і виклик функції run(). Створив функцію void rozdil() для вибору розділу в навчальному режимі, функцію void radio_button() для вибору пункту меню в тестуванні.
Графічна схема програми:
Головна програма:
Функція void menu():
Функція void about():
Функція void edu():
Функція void test():
Функція void run():
Програма та її опис.
Назва програми:
RURS_ZV.cpp;
Призначення програми:
Програма призначена для навчання мови програмування C. Вона забезпечує вивчення основних розділів і перевірку знань.
Мови програмування на яких написана програма:
Сі — мінімалістична мова програмування. Серед її головних цілей: можливість прямолінійної реалізації компіляції, використовуючи відносно простий компілятор, забезпечити низькорівневий доступ до оперативної пам'яті, формувати лише декілька інструкцій машинної мови для кожного елементу мови, і не вимагати обширної динамічної підтримки. У результаті, код Сі придатний для більшості системного програмного забезпечення, котре традиційно писалося на аcемблері.
Незважаючи на її низькорівневі можливості, мова проектувалася для машинно-незалежного програмування. Сумісна зі стандартами та машинно-незалежно написана програма на Сі може легко компілюватися на великій кількості апаратних платформ та операційних систем з мінімальними змінами. Мова стала доступною для великої кількості платформ, від вбудованих мікроконтроллерів до суперкомп'ютерів.
Логічна структура програми:
Дії у програмі оформлені у вигляді окремих функцій. В головній функції викликається функція з якої починається робота програми. Також є функції для побудови кнопок і вікон, функція керування клавішам, визначення попадання курсора на клавішу, функція малювання меню. В навчальній функції здійснюється читання даних з текстового файлу. Організована прокрутка 10-тим перериванням, шоста і сьома функція. В функції тестування забезпечено читання даних з двійкового файлу в якому міститься саме питання, варіанти відповідей, номер правильної відповіді. При завершені тестування передбачено виставлення оцінок.
Коментарі до функцій програми:
void vikno(int ub,int x1,int y1, int x2,int y2, char *p) - Будує вiкно.
Вхiднi данi
ub - Параметр визначає чи активна кнопка закриття вiкна;
x1,y1,x2,y2 - координати вiкна;
*p - Заголовок вiкна.
Функцiя нiчого не повертає.
int m_in(int v, int g) - Функцiя визначає наведення курсора мишi на кнопку.
v - Визначає що перевiряти:
якщо 1 то визначає чи вiдпущена клавiша мишi;
якщо 2 то визначає чи натиснена клавiша мишi;
будь-яке iнше значення - просто перевiрка наведення на клавiшу.
Функцiя нiчого не повертає
void rbutton(int g) - Функцiя перемальвування кнопок.
На вхiд подається активна кнопка для перемальовування iншим кольором.
Функцiя нiчого не повертає.
void button(int x,int y, int g, char *sx, int d) - Функцiя малювання кнопок.
x,y - Координати верхнього лiвого кута;
g - Номер кнопки;
*sx - Напис на кнопцi;
d - Вiдступ напису вiд початку.
Функцiя нiчого не повертає.
void menu() - Малює меню.
Створення кнопок i контуру.
Функцiя нiчого не повертає.
void about() - Функцiя виклику вiкна Про програму.
Малює вiкно i виводить iнформацiю про програму.
Функцiя нiчого не повертає.
void klavtr() - Переключення мiж пунктами меню клавiатурою.
Функцiя нiчого не повертає.
void edu() - Функцiя навчання.
В функцiї органiзована прокрутка.
Вибiр роздiлу. Завантаження/створення закладки.
Функцiя нiчого не повертає.
void test() - Функцiя тестування. Тут потрiбно дати вiдповiдi на 20 питань.
Вкiнцi буде виведено кiлькiсть набраних балiв.
Функцiя нiчого не повертає.
Глобальні змінні:
unsigned i; -Для використання в циклi
int row, col, but,t=0; - координати курсора мишi, статус клавiш, активний пункт меню
int z=-1,j; - Активний пункт меню, для використання в циклi.
char s[n][30],str[14][30]; - Написи кнопок
mn k[40]; tt ou[n]; mn ktr[40]; tt outr[14]; - Масив кнопок
Вхідні та вихідні дані:
В програмі всі потрібні дані зчитуються з файлу. Введення даних з клавіатури не передбачено.
Програмні засоби:
Програма буде працювати під керуванням всіх операційних систем Windows крім Windows Vista і операційною системою DOS. Для запуску програми потрібен графічний драйвер EGAVGA.BGI.
Технічні засоби:
Програма буде працювати при мінімальних характеристиках комп’ютера. З Основними технічними засобами комп’ютера: монітор, клавіатура, постійно запам’ятовуючий пристрій, дисковий накопичувач.
Технологія програмування, виконання та
відлагодження програми.
При тестуванні програми на всіх етапах ніяких багів не було виявлено. Тестування програми пройшло добре. Всі пункти меню працювали добре. Всі передбачені діалоги було виведено. При читанні з файлу помилок не виникало. Для створення програми було використано компілятор Turbo C++ Version 3.0 .
Для набирання тексту програми використовувалось текстове поле середовища. Компілювання програми здійснювалось у тому ж середовищі. В налаштуваннях програми було вибрано тип відкомпільованого файлу Standard EXE. Попередньо була спроба відкомпілювати файл у середовищі Borland C++ 3.1, але спроба закінчилась невдачею. При компіляції програми у цьому середовищі було виведено 8 попереджень і 25 помилок, тому подальша робота виконувалась у середовищі Turbo C++ Version 3.0.
Інструкція користувачеві
Для запуску програми потрібно запустити файл ZV_KURS.BAT. Для вибору режиму навчання потрібно вибрти пункт «Навчання».
Переключення між пунктами меню можна здійснювати як за допомогою клавіатури так і за допомогою миші. Гарячі клавіші режимі навчання описані в програмі. Можна зберегти закладку і при наступному вході буде виведено діалог варіантів початку навчання.
Щоб перейти в режим тестування потрібно вибрати пункт меню «Тестування».
Вибір правильних відповідей можна здійснювати як клавішами 1,2,3 так і з допомогою миші.
Можна попередньо завершити тестування тоді будуть зараховані тільки ті питання на які були дані правильні відповіді. Для перегляду пункту про програму потрібно вибрати відповідний пункт меню – «Про програму».
Для виходу з програми потрібно вибрати пункт «Вихід».
Контрольний приклад та аналіз результатів комп’ютерної реалізації програми
Було проглянуто всі розділи теорії «Програмування Turbo C». Виконано збереження закладки вихід з програми. Повторний вхід у програму і продовження навчання із збереженої закладки. Було здійснено прокрутку теорії до кінця, перехід між розділами. Збереження закладки і вихід з пункту навчання. Було вибрано з головного меню пункт «Тестування». Було вибрано відповіді на 20 питань після чого було виведено результат тестування. Після чого було закінчено тестування. Було здійснено перехід до Пункту «Про програму» і в діалоговому вікні виведено інформацію про автора програми і завдання. Всі дії було виконано два рази з використанням миші і клавіатури.