Міністерство освіти і науки України
Національний у ніверситет "Львівська політехніка"
Кафедра "Інформаційні системи та мережі "
КУРСОВА Р О Б О Т А
з дисципліни "Проблемно-орієнтовані мови програмування"
на тему :
«Програма автоматизованого проектування тестових навчальних систем»
ЛЬВІВ-2006
З А В Д А Н Н Я
на курсову роботу з дисципліни
"Проблемно-орієнтовані мови програмування "
студенту групи КН-115 Свередюку В.Р.
Завдання: Програма автоматизованого проектування тестових навчальних систем.
Вимоги до програми :
програма повинна бути реалізована на мові С/С++
програма повинна забезпечувати проектування систем тестування знань для вибраної дисципліни.
програма повинна включати у себе підсистему навчання, тестового контролю знань та виставлення оцінок.
програма повинна працювати у вікні MS-DOS під керуванням операційної системи Windows.
програма повинна мати інтерфейс у вигляді вікон та меню для вибору режимів її роботи, а також систему допомоги.
передбачити введення/виведення даних з клавіатури та файлів.
забезпечити можливість редагування вхідних даних у межах визначених полів введення даних.
керування режимами роботи програми виконувати за допомогою клавіатури та миші.
ЗМIСТ ЗАВДАННЯ ТА КАЛЕНДАРНИЙ ПЛАН ЙОГО ВИКОНАННЯ
1.
Провести вивчення лiтературних джерел по заданій темi.
30.04
2.
Розробити алгоритм розв’язування задач
30.04
3.
Написати програми на мові Turbo С
30.04
4.
Пiдготувати вхiднi данi для контрольного прикладу, реалiзувати та вiдлагодити програми
30.04
5.
Оформити записку до розрахункової роботи згiдно вимог Мiжнародних стандартiв, дотримуючись такого змiсту:
30.04
вступ;
формулювання задачі
алгоритм розв’язування задачі;
опис програми
інструкція користувачеві;
контрольний приклад та аналіз результатів
висновки
література
додатки
ЗАВДАННЯ ПРИЙНЯТО ДО ВИКОНАННЯ: ____________13.02.2006
пiдпис студента
Керівник роботи: ______________ Кравець П.О.
Зміст
Вступ 4
Формулювання задачі 5
Методи та способи розв’язання задачі 6
Алгоритми розв’язування задачі 12
Опис програми на мові С/С++ 14
Технологія програмування, виконання та від лагодження програми…….15
Інструкція користувачеві 16
Контрольний приклад та аналіз результатів комп’ютерної реалізації
програми 23
Висновки 26
Література 27
Додаток. 28
Вступ
Метою виконання цієї курсової роботи є полегшення роботи викладачам і студентам у ході навчального сезону. Розроблена мною система автоматизованого проектування тестових навчальних систем допомагає швидко перевірити знання студента по даному предмету. Система складається із двох підсистем. Перша – це підсистема створення тестових файлів(для викладачів), введення усієї необхідної інформації для того, щоб друга підсистема (для студентів), змогла коректно перевірити знання студента, проаналізувати і видати результат, з якого студент узнаючи свої помилки (якщо є), зміг би самонавчатись.
Дана система є прикладом автоматизації навчального процесу. Вона економить зусилля і викладачів і студентів, не говорячи вже про папір.
Система володіє віконним інтерфейсом та керується за допомогою клавіатури та миші. Швидкі клавіші дуже допомагають у користуванні. Інтерфейс було розроблено засобами псевдографіки.
Я вважаю, що такі системи потрібні. Адже у наш час весь світ намагається автоматизувати все. Починаючи від виробництва, завершуючи покупками в магазині.
ФОРМУЛЮВАННЯ ЗАДАЧІ
Дана задача є легкою як у розумінні так і у виконанні. Система складається з 2-ох частин.
Підсистема створення тестового завдання
Підсистема перевірки знань по тестовому завданню
Уся схема роботи загальної система показана на Рис.1а.
Рис. 1а
Методи та засоби розв’язування задачі
Турбо Сі містить велике число вбудованих операторів. Оператор - це символ, який указує компілятору, яку математичну або логічну дію необхідно виконати.
У мові Сі є три основні класи операторів:
- арифметичні;
- оператори порівняння і логічні;
- побітові оператори.
Арифметичні оператори
Оператор
Опис
-
віднімання і знак мінус
+
додавання
*
множення
/
ділення
%
остача від ділення націло
--
декремент
++
інкремент
Таблиця 1
Тут оператори +, - * і / працюють точно так само, як і в інших мовах програмування. Ці оператори можна використовувати майже зі всіма допустимими в Сі типами даних.
Слід зауважити, що при застосуванні оператора / до цілих чисел комп'ютер відсікає залишок від ділення..
У мові Сі є два зручні оператори, яких немає у інших мовах програмування: це оператор інкременту ++ і оператор декременту --. Оператор ++ додає до свого операнда 1, а оператор -- віднімає 1. Таким чином, оператори x++; x--; еквівалентні операторам x=x+1; x=x-1;
Пріоритет арифметичних операцій наступний:
Найвищий
++ -- -
* / %
Найнищий
+ -
Таблиця 2
Послідовність операторів одного пріоритету виконується зліва направо. Для зміни цього порядку можна використовувати дужки. У мові Сі дужки сприймаються так само, як і в інших мовах програмування: вираз, що стоїть в них, виконується в першу чергу.
Логічні оператори та оператори порівняння
Оператори порівняння дозволяють визначити співвідношення двох величин.
Логічні оператори встановлюють взаємозв'язок цих співвідношень.
У основі роботи логічних операторів і операторів порівняння лежать поняття "істина" і "брехня". У мові Сі істинним вважається будь-який вираз, відмінний від нуля; нульове значення - "брехня". Результатом виразу, в якому використовуються оператори порівняння і логічні оператори, є 1("істина") або 0 ("брехня").
Оператори порівняння:
Оператор
Опис
>
більше ніж
>=
більше або дорівнює
<
менше ніж
<=
менші або дорівнює
==
Дорівнює
!=
Не дорівнює
Таблиця 3
Логічні оператори:
Оператор
Опис
&&
логічне «і»
||
логічне «або»
!
логічне заперечення
Таблиця 4
Побітові оператори
На відміну від більшості інших мов програмування, мова Сі підтримує деякий арсенал бітових операторів. Оскільки мова Сі створювалася для заміни мови асемблера в більшості завдань програмування, вона повинна володіти здатністю підтримувати всі (або принаймні багато) операцій, які можуть бути виконані в асемблері. Бітові операції відносяться до перевірки, встановлення або зсуву конкретних бітів в байті або слові. Ви не можете використовувати бітові операції для типах float, double, long double, void.
Оператор
Опис
&
побітове «і»
|
побітове «або»
^
виключаюче побітове «або»
~
доповнення до одиниці
>>
побітовий зсув вправо
<<
побітовий зсув вліво
Таблиця 5
Оператори зсуву, >> і <<, переміщають всі біти в змінній управо або вліво залежно від того, що специфіковане. Загальна форма оператора зрушення управо має наступний вигляд:
У міру того як цих операторів зсувають біти за межі одного кінця змінної, ЕОМ вносить нулі на іншій її кінець. Пам'ятайте, зрушення не є циклічним зрушенням: біти, зсунуті за межі одного кінця, не поступають на інший кінець. Ці біти втрачаються, замість них приносяться нулі.
Оператор "?"
Ви можете використовувати оператор ? для заміни операторів if/else загальної форми
іf (умова) вираз else вираз
Оператор ? називається тричленним оператором, тому що він вимагає трьох операндів і приймає загальну форму вираз1 ? вираз2 : вираз3.
Якщо вираз1 приймає істинне значення, виконується вираз2, інакше вираз3.
Операція Кома
Оператор «кома» використовується в ланцюжку декількох сумісних виразів. Компілятор завжди оцінює ліву сторону оператора «кома» як void. Таким чином, вираз з правою сторони стане значенням всього розділеного комою виразу.
Наприклад
x = (y=3, y+1);
спочатку приcвоює змінній значення 3, а потім присвоює змінній x значення 4. Дужки необхідні, оскільки оператор кома має нижчий пріоритет, ніж оператор присвоєння
По суті, ефект коми полягає в тому, що вона викликає виконання послідовності операторів. Коли ви використовуєте її у правій стороні оператора, присвоює значення є значенням останнього виразу розділеного комою списку виразів.
Круглі та квадратні дужки
Мова програмування Сі вважає, що круглі і квадратні дужки є операторами. Круглі дужки збільшують старшинство операцій, які заключаються в ці круглі дужки. Квадратні дужки виконують функцію індексування масиву.
Оператор SizeOf
Ви можете використовувати унарний оператор sizeof для обчислення розміру будь-якою змінної або типу для виключення машиннозалежного коду з ваших програм.
Пріоритет операторів
Слід відзначити, що всі оператори, за виключенням унарних операторів і оператора ?, опрацьовуються зліва направо. Унарні оператори, якими є оператори *, &, - і?, опрацьовуються справа наліво.
найстарший
() [] - . ->
! ~ ++ -- - (type) * & sizeof
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
?
= += -= *= /=
наймолодший
,
Таблиця 6
Масив представляє собою сукупність змінних одного типу із загальним ім'ям. У Турбо Сі масив займає безперервне поле пам'яті, причому найнижча адреса відповідає першому елементу, а найвищий - останньому. Масив може мати від одного до декількох вимірів. Звернення до одного елементу масиву здійснюється за допомогою індексованого імені.
Одновимірні масиви
Формат оголошення одновимірного масиву має вигляд:
тип імя_змінної [розмірність] ;
тут тип визначає базовий тип масиву. У свою чергу базовий тип визначає тип кожного елементу масиву. Розмірність визначає, скільки елементів масив може містити.
У мові Сі перший елемент масиву отримує індекс 0. Для одновимірного масиву повний об'єм занятої пам'яті в байтах обчислюється за формулою:
Байти = sizeof (тип) * довжина масиву
Масиви часто використовуються при програмуванні, оскільки вони дозволяють легко обробляти великі об'єми пов'язаних даних.
У мові Сі не проводиться перевірки меж масивів: таким чином, ніщо не зупинить вас при виході за кінець масиву. Якщо переповнення масиву відбувається під час виконання оператора присвоєння, то зайві значення можуть присвоїтися іншим змінним або навіть включитися в текст програми. Чому ж Турбо Сі або мова Сі не забезпечує перевірку меж масивів? Це пов'язано з тим, що мова Сі була задумана як заміна мові асемблера. Тому в нього не включено ніяких перевірок на помилку, які уповільнюють (і іноді навіть дуже) виконання програми.
Багатовимірні масиви
Мова Сі дозволяє оголошувати багатовимірні масиви. Прикладом багатовимірних масивів є двовимірний масив. Можна сказати, що по суті своїй двомірний масив - це масив з двох одновимірних масивів. Наприклад, для оголошення двовимірного масиву цілих чисел з ім'ям twod і розмірами 10*20
необхідно записати:
int twod[10][20];
Зверніть увагу на це оголошення: на відміну від інших мов програмування, де для розділення індексів по кожному виміру використовуються коми, тут індекси мають свої квадратні дужки.
Під елементи масиву відводиться безперервне поле пам'яті. У випадку двовимірного масиву розрахувати об'єм пам'яті, що виділяється байтах можна по формулі
байти=число рядків * число стовпців * sizeof (тип даних)
Таким чином, масив цілих чисел з розмірами 10, 5 буде займати в пам'яті 10 * 5 * 2 = 100 байтів.
Як наголошувалося раніше, в мові Сі можна оголошувати масиви з більшою кількістю вимірів, ніж два. Загальний формат оголошення багатовимірного масиву має вигляд:
тип ім'я [size 1][size 2]...[size N];
Масиви з трьома або більшими вимірами використовуються відносно рідко, оскільки займають великий об'єм пам'яті. Як говорилося вище, Сі розміщує в пам'яті всі елементи масиву.
Є близький взаємозв'язок між вказівниками і масивами. Розглянемо наступний фрагмент програми:
char str[80] *p1;
char *p1;
p1=str;
У даному фрагменті вказівнику р1 привласнюється адреса першого елементу масиву str. У мові Сі ім'я масиву без індексів трактується як адреса початкового елементу. Тобто ім'я масиву є вказівником на масив. Таким чином, звернення до п'ятого елементу масиву можна записати як
str[4]
або як
*(р1+4)
Обидва оператори повернуть п'ятий елемент масиву. Пам'ятаєте, що елементи масиву починають нумеруватися з нуля, тому в обох вищезгаданих операторах використовується цифра 4. Можна також додати 4 до вказівника р1, оскільки останній указує на перший елемент масиву.
Мову Сі дає два способи звернення до елементу масиву: з допомогою індексованого імені і за допомогою арифметики з вказівниками. Остання здійснюється швидше, ніж звернення до елементу по індексу. У зв'язку з цим використання вказівниками для доступу до елементів масиву в мові Сі застосовується досить часто.
Версія з індексованим ім'ям виконується повільніше, так як в мові Сі на індексування масиву йде більше часу.
Збереження масивів в динамічній пам’яті дозволяє працювати з масивами, розмір яких не є відомим наперед, а задається під час виконання програми. Таким чином програма є більш універсальною. Для виділення пам’яті під масив слід скористатись однією з функцій заголовкових файлів alloc.h або stdlib.h:
A=malloc(n*sizeof(int)); - виділяє під масив А пам’ять на n елементів типу int.
B=calloc(n, sizeof(int)); - те ж саме;
Після виконання дій над масивом слід звільнити динамічну пам’ять з допомогою функції free.
Найчастіше одновимірні масиви використовуються для створення символьних рядків. У мові Сі рядок складається з масиву символів що закінчуються на нуль. Нуль позначається символом '\0'.В зв'язку з цим символьний масив повинен містити на один елемент більше, ніж містить символів записуваний в нього максимальний рядок. Наприклад, якщо ви хочете оголосити масив str, який буде містити рядок з десяти символів, то необхідно записати:
char str[11];
Таке оголошення залишає місце для нуля в кінці рядка.
Незважаючи на те, що в мові Сі відсутній тип даних «символьний рядок», вона дозволяє записувати символьні константи. Пригадаємо, що символьна константа – це набір символів, оточений подвійними апострофами.
У кінець символьної константи вам не потрібно додавати нуль -Турбо Сі робить це автоматично. У зв'язку з цим рядок "HELLO" в пам'яті виглядатиме як:
H
E
L
L
O
/0
Турбо Сі підтримує великий набір функцій обробки рядків. Найбільш поширеними з них є: strсpy(), strcat(), strcmp(), strlen().
Алгоритми розв’язування задачі
Опис програми на мові С/С++
Назва : Система автоматизованого проектування тестових навчальних систем.
Призначення програми : Автоматизувати процес перевірки знань студентів і тим самим полегшити роботу викладачам.
Мова програмування, на яких написана програма : С
Логічна структура програми : описана у розділі «формулювання задачі»
Вхідні дані : усі вхідні дані описані у алгоритмі розв’язування задачі.
Вихідні дані : усі вихідні дані зберігаються у файли (підсистема створення тестового завдання) або на екран (підсистема перевірки знань по тестовому завданню).
Програмні засоби :
ОС Windows 9x-XP SP2, MS-DOS
Компілятор мови С/С++ Borland C 3.1
Технічні засоби :
Процесор любої категорії з тактовою частотою мінімум 133 Mhz
RAM 16 Mb
HDD 100 Mb
Video 1 Mb
Keyboard
Mouse
Monitor VGA
Технологія програмування, виконання та від лагодження програми
Програма була написана на мові програмування С. При створення програми був використаний компілятор Borland C 3.1. Головним об’єктом програми є структура яка містить в собі повну інформацію про тестове завдання окрім назви, предмету та кількості питань. У першій частині програми (створення тестового завдання) ця структура і вище згадані дані записуються у текстовий файл. Дані текстові файли використовуються для подальшого тестування у другій частині (підсистема тестування).
При написанні програми було використано модуль «mouse.h» для зручної роботи з маніпулятором миша. Практично весь код програми є прокоментований для кращого розуміння сторонньою особою, яка не брала участі у розробці програми. Усі ехо - виведення на екран реалізовані на англійській мові.
У програмі був задіяний псевдографічний інтерфейс. За допомогою псевдографіки були створені усі елементи : вікна, тіні вікон, кнопки, поля вводу, рамка вікон.
Для кращого вигляду було розроблено кольорову гаму. Гама не є мало колірною і не нагадує будь-яку іншу програму написану подібним стилем. Також було зроблено анімаційне виведення вікон та інформації в них для кращого ефекту.
Весь код програми є структурризований для кращої читабельності. Після початку усіх підпрограм зроблено відступи.
Під час виконання даної програми не було використано особливих методів програмування, формул та готових алгоритмів. Програма створювалась за допомогою простих функцій, операторів та структур.
Інструкція користувачеві
Частина 1. Підсистема створення тестового завдання.
Файл : create.c
Запуск : create.exe
Рис. 1
Після вікна привітання ви одразу приступаєте до створення тестовго завдання.
Вікно створення приведене на рис.2
Рис. 2
Для створення тестовго завдання вам необхідно заповнити наступні поля:
Title – Заголовок або назва тестової роботи
File name – назва тестового файлу (з розширенням)
Question count – Кількість запитань
Subject – Дисципліна
Далі ви будете автоматично заповнювати поля н-у кількість раз, де н=кількості питань, які ввели у полі Question count.
Тут ви повинні ввести наступні дані :
Question – Текст питання
Variant A – Варіант А
Variant B – Варіант Б
Variant C – Варіант С
Variant D – Варіант Д
Right variant – Правильна відповідь (УВАГА!!! Для безпечної роботи програми було зроблено так, щоб символ правильної відповіді не відображався на екрані, тобто коли курсор встановиться на дане поле ви просто притримуючи клавішу Shift натискаєте символ правильної відповіді – a,b,c,d)
Points - Кількість балів, які даються за правильну відповідь.
Після кожного введення будуть появлятись дві кнопки : Save і Next.
Save – зберігає даний файл і завершує процес введення. (Гаряча клавіша – F2)
Next – переходить до введення наступного питання. (Гаряча клавіша – F3)
Після збереження тестовго фалй на екрані з’явиться повідомлення про збереження файлу. Рис 3
Рис. 3
Створення тестового файлу завершене.
Частина 2 Підсистема перевірки знань по тестовому завданню.
Файл : testing.c
Запуск : testing.exe
Рис. 4
Після вікна привітання студент повинен ввести свої дані. Рис 5.
Поля необхідні для вводу:
Name - Ім’я студента
Surname - Прізвище
Group – Академічна група
File name – Назва тестовго фалу-завдання.
Рис. 5
Наступним етапом є саме тестування. Воно являє собою вікно, яке складаєьться із полів де відображається уся необхідна інформація та кнопкпи для вибору потрібного варіанту.
Кнопка “I don’t know” автоматично вказує вибраний варіант під символ К, тому потім під час порівняння вибрагим з праильним, даний варіант буде рахуватись, як невірний.
В любий момент часу студент зможе завеошити роботу натистувши кнопу “That’s all!”. Вона припиняє роботу і виводить результати. Якщо питань більше не має, то робота завершується автоматично.
Рис. 6
Після завершення роботи усі результати будуть виведені на екран у форматі:
Питання
Правильна відповідь
Ваш вибір
Кількість балів за це питання, якщо відповідь не вірна, то 0.
Для виходу з програми потрібно натистути будь-яку клавішу.
Якщо студент натиснув клавішу до того, як викладач перевіривірив результат то усі дані про результати зберігаються у файлі results.dat у поточному каталозі.
Рис. 7
Контрольний приклад та аналіз результатів комп’ютерної реалізації програми
За допомогою першої частини було створено тестовий файл test1.dat
Вміст файлу :
TEST //Заголовок або назва роботи
POMP //Дисципліна
7 //Кількість питань
Question1 //Питання N
A1 //Варіант А питання N
B1 //Варіант B питання N
C1 //Варіант C питання N
D1 //Варіант D питання N
A //Правильний варіант питання N
1 //Кількість балів за правильний варіант
Question2
A2
B2
C2
D2
B
2
Question3
A3
B3
C3
D3
C
3
Quetion4
A4
B4
C4
D4
D
4
Question5
A5
B5
C5
D5
A
5
Question6
A6
B6
C6
D6
B
6
Question7
A7
B7
C7
D7
C
7
За допомогою другої частини було прведено тестування :
Результати зберігаються у файлі results.dat
Вміст файлу:
Question1 //Питання N
A //Правильнйи варіант питання N
A //Вибраний варіант у питанні N
1 //Кількість балів за правильний варінт у питанні N
Question2
B
C
0
Question3
C
C
3
Quetion4
D
D
4
Question5
A
A
5
Question6
B
A
0
Question7
C
C
7
Висновки:
В ході виконання курсової роботи я закріпив теоретичні знання, здобуті під час вивчення курсу «Проблемно-орієнтовані мови програмування», а також здобув практичні навички роботи з циклами, стандартними типами змінних, символами, ряками символів, масивами, структурами та масивами структур, файлами(відкривання в різних режимах, створення та зберігання), а також розробляти користувацький графічний інтерфейс засобами псевдографіки. Всі програми курсової роботи написані згідно вимог структурного програмування. Усі тексти програми розміщені у додатку.
Список використаної літератури:
Кравець П.О. Методичні вказівки до виконання лабораторних робіт з дисципліни “Проблемно-орієнтовані мови програмування”. – Львів, 2001.
Керниган Б., Ритчи Д. Язык программирования Си. - СПб.: Невский.
Конспект лекцій з курсу «Проблемно-орієнтовані мови програмування».
Фундаментальные алгоритмы на С: Пер. с англ./Роберт Седжвик. – СПб: ООО «ДиасофтЮП»,2003.-1136 с.
Додаток:
Файл create.c
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<dos.h>
#include "mouse.h"
FILE *f;
void cursor_off(void);
void cursor_on(void);
//Cursor off
void cursor_off()
{
_AH=0x1;
_CH=0x20;
geninterrupt(0x10);
}
//Cursor on
void cursor_on()
{
_AH=0x1;
_CH=0x6;
_CL=0x7;
geninterrupt(0x10);
}
void main()
{
struct test
{
char quest[80],ans_a[80],ans_b[80],ans_c[80],ans_d[80],ans_r;
int points;
};
struct test j;
int x,y,z,k,i,count,dly,x1,y1,x2,y2;
char title[12],file[20],subject[12],ch;
textbackground(BLACK);
clrscr();
textcolor(WHITE);
textbackground(LIGHTGRAY);
//Ramka
textmode(C4350);
x=10;
y=20;
dly=50;
cursor_on();
init_mouse();
textcolor(RED);gotoxy(77,2);cputs("(c)");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("╔═══════════════════════════════════════╗");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █▀ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ ▄█ █ █ █▀▀▌ █▀▀▀▄ ▄▀▀█ █ █ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █▄█ █▄▄█ █ ▌ █ █ █ █ █ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █ █ █▀▀ █ █▀▀█ █▀▄ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █ █ █ █ ▄ █ █ █ █ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █ ▀▀ ▀ ▀▀▀▀ ▀ ▀ ▀ ▀ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █▄ SACTW v1.1 final ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ Sytem of Automatic Testing ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ PART 1 : Creating test works ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ Author : Sveredyuk V.R. ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ Group KH-115 ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ e-mail : figazz@ukr.net ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("╚═══════════════════════════════════════╝");
delay(dly);textcolor(RED);textbackground(BLACK);gotoxy(y+7,x+4);cputs("PRESS ANY KEY TO CONTINUE");
getch();
//Create test work
textbackground(BLACK);
clrscr();
x=10;
y=15;
textcolor(RED);gotoxy(77,2);cputs("(c)");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("╔════════════════ Create test work ════════════[x]═╗");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("╠═════════════════ Question Number 1 ══════════════╣");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("╚══════════════════════════════════════════════════╝");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);textcolor(YELLOW);textbackground(BROWN);gotoxy(y+2,x++);cputs("▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒");textbackground(BROWN);cputs("▒");
delay(dly);textbackground(BLACK);
///////////////////// INPUT FIELDS & BUTTONS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//Input title
delay(dly);textbackground(BLUE);textcolor(YELLOW);gotoxy(y+2,x-29);cputs(" Title : ");
delay(dly);textbackground(RED);textcolor(YELLOW);gotoxy(y+20,x-29);cputs(" ");
//Input file name
delay(dly);textbackground(BLUE);textcolor(YELLOW);gotoxy(y+2,x-27);cputs(" File name : ");
delay(dly);textbackground(RED);textcolor(YELLOW);gotoxy(y+20,x-27);cputs(" ");
//Input Quest count
delay(dly);textbackground(BLUE);textcolor(YELLOW);gotoxy(y+2,x-25);cputs("Question count : ");
delay(dly);textbackground(RED);textcolor(YELLOW);gotoxy(y+20,x-25);cputs(" ");
//Input Subject
delay(dly);textbackground(BLUE);textcolor(YELLOW);gotoxy(y+2,x-23);cputs(" Subject : ");
delay(dly);textbackground(RED);textcolor(YELLOW);gotoxy(y+20,x-23);cputs(" ");
//Input Question
delay(dly);textbackground(BLUE);textcolor(YELLOW);gotoxy(y+2,x-19);cputs(" Question : ");
delay(dly);textbackground(RED);textcolor(YELLOW);gotoxy(y+20,x-19);cputs(" ");
//Input Variant A
delay(dly);textbackground(BLUE);textcolor(YELLOW);gotoxy(y+2,x-17);cputs(" Varian A : ");
delay(dly);textbackground(RED);textcolor(YELLOW);gotoxy(y+20,x-17);cputs(" ");
//Input Variant B
delay(dly);textbackground(BLUE);textcolor(YELLOW);gotoxy(y+2,x-15);cputs(" Varian B : ");
delay(dly);textbackground(RED);textcolor(YELLOW);gotoxy(y+20,x-15);cputs(" ");
//Input Variant C
delay(dly);textbackground(BLUE);textcolor(YELLOW);gotoxy(y+2,x-13);cputs(" Varian C : ");
delay(dly);textbackground(RED);textcolor(YELLOW);gotoxy(y+20,x-13);cputs(" ");
//Input Variant D
delay(dly);textbackground(BLUE);textcolor(YELLOW);gotoxy(y+2,x-11);cputs(" Varian D : ");
delay(dly);textbackground(RED);textcolor(YELLOW);gotoxy(y+20,x-11);cputs(" ");
//Input Right variant
delay(dly);textbackground(BLUE);textcolor(YELLOW);gotoxy(y+2,x-9);cputs(" Right variant : ");
delay(dly);textbackground(RED);textcolor(YELLOW);gotoxy(y+20,x-9);cputs(" ");
//Input Points
delay(dly);textbackground(BLUE);textcolor(YELLOW);gotoxy(y+2,x-7);cputs(" Points : ");
delay(dly);
textbackground(RED);textcolor(YELLOW);gotoxy(y+20,x-7);cputs(" ");
////////////////////// INPUT DATA \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//Input info data
gotoxy(y+20,x-29);gets(title);
gotoxy(y+20,x-27);gets(file);
gotoxy(y+20,x-25);scanf("%d",&count);
gotoxy(y+20,x-23);gets(subject);
// Opening file if not exist than create!
if((f=fopen(file,"wt"))!=NULL)
{
gotoxy(2,2);
textcolor(BLINK);
cputs("File is open!");
fprintf(f,"%s\n",title);
fprintf(f,"%s\n",subject);
fprintf(f,"%d\n",count);
}
else {
gotoxy(2,2);
puts("Error opening file");
exit(-1);
delay(3000);
}
// Input questions
for(i=1;i<=count;i++)
{
//Delte Button Next
textbackground(BLUE);textcolor(WHITE);gotoxy(y+10,x-4);cputs(" ");
//Delet Button Next
textbackground(BLUE);textcolor(WHITE);gotoxy(y+30,x-4);cputs(" ");
gotoxy(y+35,x-21);printf("%d",i);
textcolor(YELLOW);
textbackground(RED);
//Cleaning fields
gotoxy(y+20,x-19);cputs(" ");
gotoxy(y+20,x-17);cputs(" ");
gotoxy(y+20,x-15);cputs(" ");
gotoxy(y+20,x-13);cputs(" ");
gotoxy(y+20,x-11);cputs(" ");
gotoxy(y+20,x-9);cputs(" ");
gotoxy(y+20,x-7);cputs(" ");
//Input questions and variants
gotoxy(y+20,x-19);gets(j.quest);fprintf(f,"%s\n",j.quest);
gotoxy(y+20,x-17);gets(j.ans_a);fprintf(f,"%s\n",j.ans_a);
gotoxy(y+20,x-15);gets(j.ans_b);fprintf(f,"%s\n",j.ans_b);
gotoxy(y+20,x-13);gets(j.ans_c);fprintf(f,"%s\n",j.ans_c);
gotoxy(y+20,x-11);gets(j.ans_d);fprintf(f,"%s\n",j.ans_d);
gotoxy(y+20,x-9);j.ans_r=getch();fprintf(f,"%c\n",j.ans_r);
gotoxy(y+20,x-7);scanf("%d",&j.points);fprintf(f,"%d\n",j.points);
fflush(stdin);
//Button Save
textbackground(GREEN);textcolor(WHITE);gotoxy(y+10,x-4);cputs(" Save (F2) ");
//Button Next
if(i>=count)textbackground(BLUE);textcolor(BLUE);gotoxy(y+30,x-4);cputs(" ");
if(i!=count)textbackground(GREEN);textcolor(BLUE);gotoxy(y+30,x-4);cputs(" Next (F3) ");
gotoxy(1,1);
//Click Save
while(1){
x1=25;
y1=37;
x2=39;
y2=37;
k=button_state()==1&&mouse_in_box(x1,y1,x2,y2);
delay(10);
if(k==1)
{
clicksave:
mouse_off();
fclose(f);
//Button Push
textbackground(LIGHTGRAY);textcolor(YELLOW);gotoxy(y+10,x-4);cputs(" Save ");
delay(700);
//Show splash - ok
textbackground(BLACK);
clrscr();
cursor_off();
x=15;
y=20;
textcolor(RED);gotoxy(77,2);cputs("(c)");
textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("╔═══════════════════════════════════════╗");
textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");
textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ FILE WAS SUCCSULFULL CREATED !!! ║");
textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ For open use PART2 ║");
textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");
textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ Sytem of Automatic Testing ║");
textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ PART 1 : Creating test works ║");
textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ Author : Sveredyuk V.R. ║");
textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ Group KH-115 ║");
textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ e-mail : figazz@ukr.net ║");
textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("╚═══════════════════════════════════════╝");
textbackground(BLACK);textcolor(RED);gotoxy(y+10,x+2);cputs("WAIT 5 SEC AND EXIT");
delay(5000);
exit(1);
mouse_on();
}
if(kbhit())
{ch=getch();
if(ch==0) ch=getch();
switch(ch)
{
case 27: exit(1); break;//ESC
}
}
//Click Next
x1=45;
y1=37;
x2=59;
y2=37;
k=button_state()==1&&mouse_in_box(x1,y1,x2,y2);
delay(10);
if(k==1)
{
clicknext:
mouse_off();
//Button Push
textbackground(LIGHTGRAY);textcolor(YELLOW);gotoxy(y+30,x-4);cputs(" Next (F3) ");
delay(700);
mouse_on();
break;
}
//Click X
x1=63;
y1=10;
x2=63;
y2=10;
k=button_state()==1&&mouse_in_box(x1,y1,x2,y2);
delay(10);
if(k==1)
{
clickx:
mouse_off();
//Button Push
textbackground(LIGHTGRAY);textcolor(YELLOW);gotoxy(10,63);cputs("x");
mouse_on();
exit(1);
break;
}
if(kbhit())
{ch=getch();
if(ch==0) ch=getch();
switch(ch)
{
case 60: goto clicksave;//save
case 61: goto clicknext;//next
case 27: goto clickx;//x
}
}
}
}
}
Файл testing.c
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<dos.h>
#include "mouse.h"
FILE *f,*r;
void cursor_off(void);
void cursor_on(void);
//Cursor off
void cursor_off()
{
_AH=0x1;
_CH=0x20;
geninterrupt(0x10);
}
//Cursor on
void cursor_on()
{
_AH=0x1;
_CH=0x6;
_CL=0x7;
geninterrupt(0x10);
}
void main()
{
struct test
{
char quest[80],ans_a[80],ans_b[80],ans_c[80],ans_d[80],ans_r[2];
int points;
};
struct test j;
int x,y,z,k,i,count=1,dly,x1,y1,x2,y2,in=0, sum=0;
char name[12],surname[20],group[12],file[15],ch,title[25],subject[25],chose,right,line[80];
textbackground(BLACK);
clrscr();
textcolor(WHITE);
textbackground(LIGHTGRAY);
//Ramka
textmode(C4350);
x=10;
y=20;
dly=70;
cursor_on();
init_mouse();
textcolor(RED);gotoxy(77,2);cputs("(c)");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("╔═══════════════════════════════════════╗");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █▀ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ ▄█ █ █ █▀▀▌ █▀▀▀▄ ▄▀▀█ █ █ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █▄█ █▄▄█ █ ▌ █ █ █ █ █ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █ █ █▀▀ █ █▀▀█ █▀▄ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █ █ █ █ ▄ █ █ █ █ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █ ▀▀ ▀ ▀▀▀▀ ▀ ▀ ▀ ▀ ║");
delay(dly);textcolor(YELLOW);textbackground(BLUE);gotoxy(y,x++);cputs("║ █ █▄ S...