Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра автоматизованих систем управління
Курсова робота
з дисципліни
«Проблемно-орієнтовані мови програмування»
на тему
СИСТЕМА ПЕРЕВІРКИ БАЗОВИХ
ЗНАНЬ СТУДЕНТІВ
Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра автоматизованих систем управління
Завдання на курсову роботу
з дисципліни
«Проблемно-орієнтовані мови програмування»
Прізвище, ім’я студента Наконечний Віталій
Група КН-111
Тема курсової СИСТЕМА ПЕРЕВІРКИ БАЗОВИХ
ЗНАНЬ СТУДЕНТІВ
Спеціальна частина завдання :
Ознайомитися із стандартними функціями, оголошеними в string.h та ctype.h.
Розробити таблицю опису функцій заголовних файлів string.h та ctype.h..
Розробити тестову систему для контролю знань названих функцій.
Передбачити фіксацію неправильних відповідей і можливість виведення інформаційних даних з відповідних питань.
Термін завершення роботи 5.06.2006р.
Завдання видано
Керівник Шпак Зореслава Ярославівна
Студент Наконечний Віталій Вікторович
Зміст
Вступ 4
1. Огляд літератури 5
2. Алгоритм розв`язку 6
3. Блок-схема головної програми 7
4. Програмні реалізації алгоритму 9
5.Інструкція користувачеві 10
Висновки 11
Список використаної літератури...............................................................................12
Додатки 13
Додаток1. Функції (<string.h>)................................................................................13
Додаток 2. Функції (<ctype.h>)................................................................................17
Додаток 3. Текст головної програми ......................................................................21
Додаток 4. Текст файла “funce.mh”..........................................................................25
Вступ
Актуальність даної роботи полягає втому, що ця програма призначена для перевірки базових знань студентів (запитання по функціях заголовних файлів string.h та ctype.h) і одночасного навчання, якщо користувач не знає правильної відповіді. Програма є цілком проста у користуванні, не потрібно вводити жодних параметрів, що інколи можуть спричиняти проблеми у їх введенні.
Дана курсова робота виконана в графічному режимі, а графічні побудови, переважно є лінійними і складаються з викликів стандартних графічних функцій, які описані у бібліотечному файлі graphics.h. Також обов`язковим є підключення двох текстових файлів для зчитування запитань та описів функцій.
1. Огляд літератури
Оскільки дану роботу я виконував в графічному режимі, то використав деякі функції з бібліотечного файла graphics.h:
initgraph() – встановлення графічного режиму;
setcolor() – задає колір майбутнього зображення;
rectangle() – рисує прямокутник із заданими координатами діагонально протилежних вершин (лівої верхньої та правої нижньої);
ellipse() – рисує еліпс чи дугу еліпса;
setfillstyle() – задає спосіб заповнення замкнутої області залежно від значення параметра заповнення;
floodfill() – заповнює замкнену область, що містить точку (x,y);
outtextxy() – виводить текст у заданому місці;
settextstyle() – задає вигляд символів;
closegraph() – завершення графічного режиму;
В мене виникла потреба зчитування інформації з файлів. Файл – це сукупність даних, які розміщені на зовнішньому носії, зокрема, на жорсткому диску. Для опрацювання даних з файла я використав дві функції: fgets() та fscanf(). Функцією fgets() я зчитував з файла цілі рядки, а fscanf() – числові дані, а зокрема номер правильної відповіді.
2. Алгоритм розв’язку.
Згідно з принципами структурного програмування, алгоритм розв’язку громіздкої задачі складається із алгоритмів розв’язку окремих простіших підзадач. Наслідуючи ці принципи я розробив окремі функції, кожна з яких відповідає за виведення певних даних (наприклад: заставка-привітання, робоче вікно т.п.). Ці функції я зібрав в одному файлі з іменем “funce.mh”. Функції викликаються з головної програми. Розглянемо детальніше алгоритм роботи головної програми, блок-схема якого зображена на Рис 1.
Спочатку виводиться заставка-привітання, де зазначений автор курсової роботи. Через певний час або після натискування на будь-яку клавішу переходимо до робочого вікна. На екрані виведеться вікно із запитанням та чотири менші вікна із відповідями. Перехід між відповідями користувач повинен здійснювати за допомогою клавіші “стрілка вниз”, а вибір здійснювати натискуванням клавіші ENTER. Також можна скористатись прямим натискуванням клавіші відповіді (A,B,C,D). Якщо користувач вибере не варіант відповіді, а „клавішу” “Наступне запитання”, то він автоматично отримає нове запитання та чотири варіанти відповідей.
Для виходу із даної програми потрібно в будь-який момент часу натиснути клавішу “ESC”. Після чого виведеться повідомлення: “Завершення програми”, яке затримається 2-3 секунди, і програма завершиться.
3. Блок-схема головної програми
Рис. 1
4. Програмні реалізації алгоритму
Загальна характеристика програми .
Програма складається з багатьох функцій, три з яких записані у файлі KURSAK.CPP, а решта у файлі FUNCE.MH. У першому вказаному файлі розміщені такі функції: першою є основна функція main(), а після неї функція з іменем func() для зчитування запитання з файла QUESTION.TXT, останньою записана функція rfun() для зчитування з файла DESFUNC.TXT відповідних інформаційних даних. Параметром функцій func()та rfun() є номер запитання, який обирається випадковим чином. func() повертає вказівник на структуру, в яку записується запитання, чотири варіанти відповідей та номер правильної відповіді. rfun() не повертає нічого, оскільки її завданням є тільки виведення інформації про відповідну функцію.
У файлі FUNCE.MH є розміщені всі інші функції, які викликаються в головній програмі, завдяки підключенню цього файла через директиву include. Ці функції в основному зосереджені на створенні інтерфейсу для даної програми. Загальна їх кількість у файлі FUNCE.MH становить - 19 функцій. Найоб`ємнішою і мабуть найважливішою з цих функцій є функція VIKNO(), яка відповідає за виведення на екран робочого вікна програми.
Опис програми на мові C.
Програма написана в середовищі Borland C та збережена у файлі KURSAK.СPP. Об’єм програми в байтах – 6144 байти + 5794 байти файла “FUNCE.MH”. Це 291 + 292 рядки програмного коду.
Програма призначена для перевірки базових знань студентів.
Вхідна інформація – це номер відповіді, який зчитується при виборі користувачем певного варіанту відповіді.
Вихідна інформація виводиться на екран, як інформація про функцію, коли користувач вводить неправильну відповідь, або вікно-заставка „Відповідь правильна”.
5. Інструкція користувачеві.
Програму слід запускати без жодних параметрів за допомогою файла Student.bat. Після запуску на екран виводиться заставка-привітання, а після неї головне меню програми, в якому вікно із запитанням та чотирьма варіантами відповідей. Для активізації певного варіанту відповіді слід натиснути клавішу „стрілка вниз”, а після неї - ENTER. Або простіший варіант натискування клавіші, яка відповідає за відповідь (A,B,C,D). Залежно від того чи правильну вибрав користувач відповідь виведеться відповідне повідомлення. Якщо відповідь правильна, то виведеться на декілька секунд (2-3 сек.), вікно-заставка з надписом „Відповідь правильна”. В іншому випадку користувач отримає в окремому вікні опис функції, на яку він не знав відповіді. Це вікно буде активне, поки користувач не натисне будь-яку клавішу. Після того, як буде натиснута клавіша, виведеться нове вікно, в якому буде розміщене нове запитання та чотири варіанти відповідей. Користувач знову повинен вибрати певний варіант. Програма буде працювати до того часу, поки користувач не натисне на клавішу виходу з програми – Escape. Після її натиснення виводиться на 1-2 секунди вікно з повідомленням „Завершення програми”.
Висновки.
В ході виконання даної курсової роботи було опрацьовано літературу, список якої подано нижче та розроблено алгоритм розв’язку завдання курсової роботи. Дана робота потребувала доброго вивчення графічного режиму та функцій бібліотечного файла graphics.h. Власні розроблені функції для виведення різних вікон-повідомлень я розмістив в окремому файлі з іменем funce.mh, що дало змогу зменшити об`єм головної програми. Функції, розміщені в цьому файлі, я викликаю в головній програмі, підключивши його через директиву.
Для правильної роботи програми в графічному режимі потрібний драйвер egavga.bgi, який додається з курсовою роботою. Для правильної роботи з україномовним текстом потрібне підключення keyukr.com, який також додається з даною роботою. Імя файла із запитаннями Question.txt і файл з описами функцій Desfunc.txt, які розміщені в одному каталозі з головною програмою.
Список використаної літератури
Бочков С.О., Субботин Д.М. Язык программирования Си
для персонального компьютера – М.: СП «Диалог», 1990.
Прата С. Язьык программирования С – К.: ДиаСофт, 2000.
Глинський Я.М., C++ i C++ Builder – Львів, 2004
Додаток 1
Функції роботи з ділянками оперативної пам’яті (ОП)
і символьними рядками (<string.h>)
Функція
Прототип і призначення
memccpy()
void * memccpy (void * m1, const void * m2, int sym, size_t n);
Аналог memcpy(), але зупиняє копіювання байтів з ділянки m2, якщо скопійовано символ sym. Повертає адресу байта, наступного за байтом із символом sym у m1, або NULL, якщо sym не скопійовано.
memchr()
Void * memchr (const void * m, int sym, size_t n);
Перевіряє, чи серед n перших байтів ділянки ОП, заданої адресою m, є байт, рівний символу sym. Повертає адресу цього байта або NULL, якщо sym не зустрічається у заданій ділянці.
memcmp()
int memcmp (const void * m1, const void * m2, size_t n);
Попарно порівнює (як дані з типом unsigned char) n перших байтів ділянок ОП, заданих вказівниками m1 і m2. Повертає цілочисельне значення: < 0, якщо m1 < m2; 0, якщо m1 співпадає з m2;
> 0, якщо m1 > m2.
memcpy()
void * memccpy (void * m1, const void * m2, size_t n);
Копіює n перших байтів з ділянки ОП m2 у ділянку ОП m1 (ділянки не повинні перекриватись). Повертає m1 – адресу скопійованої ділянки.
memicmp()
int memicmp (const void * m1, const void * m2, size_t n);
Аналог memcmp(), але порівнює байти як символи, ігноруючи їх регістри (великі й малі літери не розрізняються).
memmove()
void * memmove(void * m1, const void * m2, size_t n);
Аналог memcpy(), але дозволяє, щоб ділянки ОП m1 та m2 перекривались.
memset()
void * memset (void *m, int c, size_t n);
Записує у перші n байтів ділянки ОП m код символа sym.
movedata()
void movedata (unsigned m1seg, unsigned m1off,
unsigned m2segm2, unsigned m2off, size_t n);
Копіює n байтів з ділянки ОП, заданої адресою m1seg:m1off (сегмент:зміщення) у ділянку m2seg:m2off. Задання повних адрес робить функцію незалежною від моделі пам’яті.
stpcpy()
char * stpcpy (char * s1, const char * s2);
Копіює рядок s2 (з '\0' включно) за адресою, заданою через s1. Повертає адресу кінця скопійованого рядка – значення s1+strlen(s2).
strcat()
char * strcat (char * s1, const char * s2);
Долучає рядок s2 (з '\0' включно) у кінець рядка s1. Повертає адресу доповненого рядка – значення s1 .
strchr()
char * strchr (const char * s, int sym);
Перевіряє, чи символ sym входить у рядок s. Повертає вказівник на перше входження sym у s або NULL, якщо sym не зустрічається в рядку s.
strcmp()
int strcmp (const char * s1, const char * s2);
Послідовно порівнює символи рядків s1 і s2 як дані unsigned char. Повертає ціле число, значення якого: < 0, якщо s1 < s2; 0, якщо s1 співпадає з s2; > 0, якщо s1 > s2.
strcmpi()
int strcmpi (const char * s1, const char * s2);
Макрос, що викликає функцію stricmp().
strcpy()
char * strcpy (char * s1, const char * s2);
Копіює рядок s2 (з '\0' включно) за адресою, заданою через s1. Повертає s1 – адресу скопійованого рядка.
strcspn()
size_t strcspn (const char * s1, const char * s2);
Повертає кількість початкових символів рядка s1, які не входять у рядок s2 (довжину підрядка s1 до появи першого символа з s2).
strdup()
char * strdup (const char * s);
Копіює рядок s (з '\0' включно) в динамічну пам’ять, попередньо виділивши там ділянку розміром strlen(s)+1. Повертає адресу рядка в динамічній пам’яті.
strerror()
char * strerror (int errnumb);
Повертає вказівник на початок стандартного повідомлення про помилку процесу виконання програми з номером errnumb.
stricmp()
int stricmp (const char * s1, const char * s2);
Аналог strcmp(), але порівнює символи рядків s1 і s2, ігноруючи їх регістри (великі й малі літери не розрізняються).
strlen()
unsigned strlen (const char s);
Повертає довжину рядка s у символах ('\0'не враховується).
strlwr()
char * strlwr (char * s);
Міняє великі латинські літери у рядку s на відповідні малі літери, інші символи не змінюються. Повертає s – адресу перетвореного рядка.
strncat()
char * strncat (char * s1, const char * s2, size_t n);
Аналог strcat(), але долучає до рядка s1 тільки n початкових символів з рядка s2 ; у кінець доповненого рядка заноситься '\0'.
strncmp()
char * strncmp (const char * s1, const char * s2, size_t n);
Аналог strcmp(), але порівнюються тільки n початкових символів рядків s1 та s2. Якщо якийсь із рядків є коротшим за n, то порівняння припиняється при досягненні '\0'.
strncmpi()
char * strncmpi (const char * s1, const char * s2, size_t n);
Аналог strncmp(), але порівнює символи рядків s1 і s2, ігноруючи їх регістри (великі й малі літери не розрізняються).
strncpy()
char * strncpy (char * s1, const char * s2, int n);
Аналог strcpy(), але з s2 у рядок s1 копіюється не більше, ніж n початкових символів; якщо скопійована група символів не закінчуються '\0', то нуль-символ у s1 не заноситься.
strnicmp()
char * strnicmp (const char * s1, const char * s2, size_t n);
Макрос, що викликає функцію strncmpi().
strnset()
char * strnset (char * s, int sym, size_t n);
Аналог strset(), але у рядок s заноситься не більше, ніж n символів sym. Заповнення рядка s припиняється, якщо досягнуто '\0'.
strpbrk()
char * strpbrk (const char * s1, const char * s2);
Шукає у рядку s1 перший символ, що входить у рядок s2. Повертає вказівник на знайдений символ або NULL, якщо в рядку s1 немає символів, з яких складається рядок s2.
strrchr()
char * strrchr (const char * s, int sym);
Аналог strchr(). Повертає вказівник на останнє входження символа sym у рядок s або NULL, якщо sym не зустрічається в s.
strnrev()
char * strrev (char * s);
Переставляє символи рядка s (до '\0') у зворотньому порядку. Повертає адресу рядка після реверсування – s.
strset()
char * strset (char * s, int sym);
Заповнює рядок s (до '\0') символом sym. Повертає адресу заповненого рядка – s.
strspn()
size_t strspn (const char * s1, const char * s2);
Повертає кількість початкових символів рядка s1, які входять у рядок s2 (довжину початкового підрядка, що складається із символів s2 ).
strstr()
char * strstr (const char * s1, const char * s2);
Перевіряє, чи рядок s2 входить як підрядок у s1. Повертає вказівник на перший символ рядка s2 у s1 або NULL, якщо s2 не зустрічається у рядку s1.
strtok()
char * strtok (char * s1, const char * s2);
Виділяє в рядку s1 лексеми, обмежені символами з рядка s2. Повертає вказівник на виділену лексему або NULL. (див. 9.4.2)
strupr()
char * strupr (char * s);
Міняє малі латинські літери у рядку s на відповідні великі літери, інші символи не змінюються. Повертає s – адресу перетвореного рядка.
_strerror()
char * _strerror (const char * errtext);
Формує символьний рядок із повідомленням про останню зафіксовану помилку процесу виконання програми у формі: errtext: стандартне повідомлення. Повертає вказівник на початок сформованого рядка (рядок записується у спеціальний внутрішній статичний буфер).
Примітка. У заголовному файлі <string.h> системи програмування Borland C тип size_t задекларовано як unsigned int.
Додаток 2
Функції
(<ctype.h>)
Функція
Прототип і призначення
isalnum()
int isalnum(int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення якщо ціле задовільняє умову тесту, і нульове, якщо ні. Мається такий набір символів для тесту: 'A'-'Z','a'-'z','0'-'9'.
isalpha()
int isalpha (int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення якщо ціле задовільняє умову тесту, і нульове, якщо ні. Мається такий набір символів для тесту: 'A'-'Z','a'-'z'.
isascii()
int isascii(int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення у всіх випадках. Мається набір символів для тесту із кодування ASCII.
iscntrl()
int iscntrl(int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення, якщо значення аргумента задовільняє умову тесту, і нульове значення, якщо ні. Мається на увазі набір символів ASCII.
Функція повертає коректний результат тільки для цілих значень, відповідаючим набору ASCII-символів, для не ASCII-символів повертає значення EOF.
Тест для управляючих символів (0x00-0x1f або 0x7f).
isdigit()
int isdigit(int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення, якщо значення аргумента задовільняє умову тесту, і нульове значення, якщо ні. Мається на увазі набір символів ASCII.
Функція повертає коректний результат тільки для цілих значень, відповідаючим набору ASCII-символів, для не ASCII-символів повертає значення EOF.
Тест для цифр ('0'-'9').
іsgraph()
int isgraph(int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення, якщо значення аргумента задовільняє умову тесту, і нульове значення, якщо ні. Мається на увазі набір символів ASCII.
Функція повертає коректний результат тільки для цілих значень, відповідаючим набору ASCII-символів, для не ASCII-символів повертає значення EOF.
Тест для друкованих символів, не включаючи пробілу (0x21-0x7e).
islower()
int islower(int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення, якщо значення аргумента задовільняє умову тесту, і нульове значення, якщо ні. Мається на увазі набір символів ASCII.
Функція повертає коректний результат тільки для цілих значень, відповідаючим набору ASCII-символів, для не ASCII-символів повертає значення EOF.
Тест для прописних літер ('a'-'z').
isprint()
int isprint(int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення, якщо значення аргумента задовільняє умову тесту, і нульове значення, якщо ні. Мається на увазі набір символів ASCII.
Функція повертає коректний результат тільки для цілих значень, відповідаючим набору ASCII-символів, для не ASCII-символів повертає значення EOF.
Тест для друкованих символів (0x20-0x7e).
ispunct()
int ispunct(int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення, якщо значення аргумента задовільняє умову тесту, і нульове значення, якщо ні. Мається на увазі набір символів ASCII.
Функція повертає коректний результат тільки для цілих значень, відповідаючим набору ASCII-символів, для не ASCII-символів повертає значення EOF.
Тест для символів-знаків пунктуації.
isspace()
int isspace(int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення, якщо значення аргумента задовільняє умову тесту, і нульове значення, якщо ні. Мається на увазі набір символів ASCII.
Функція повертає коректний результат тільки для цілих значень, відповідаючим набору ASCII-символів, для не ASCII-символів повертає значення EOF.
Тест для пробілу (0x09-0x0d або 0x20).
іsxdigit()
int isxdigit(int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення, якщо значення аргумента задовільняє умову тесту, і нульове значення, якщо ні. Мається на увазі набір символів ASCII.
Функція повертає коректний результат тільки для цілих значень, відповідаючим набору ASCII-символів, для не ASCII-символів повертає значення EOF.
Тест для 16-вих цифр ('A'-'F','a'-'f' або '0'-'9').
іsupper()
int isupper(int c);
Функція перевіряє умову для аргументу, повертаючи ненульове значення, якщо значення аргумента задовільняє умову тесту, і нульове значення, якщо ні. Мається на увазі набір символів ASCII.
Функція повертає коректний результат тільки для цілих значень, відповідаючим набору ASCII-символів, для не ASCII-символів повертає значення EOF.
Тест для заголовних літер ('A'-'Z').
toascii()
int toascii(int sim);
Макрос toascii обнулює старший 7-й біт значення аргумента sim, таким чином зминене значення представляє код символа в наборі ASCII. Якщо значення sim вже представляє собою код ASCII-символа, то результат макроса - незмінене значення аргумента sim.
_tolower()
int _tolower(int sim);
Макрос _tolower являється версією tolower, яка використовується тод·, коли відомо, що значення аргумента sim - код рядкової літери.
Результат _tolower не визначений, якщо значення символа sim не являється кодом рядкової літери.
_toupper()
int _toupper(int sim);
Макрос _toupper являється версією toupper, яка використовуµться тоді, коли відомо, що значення аргумента sim - код рядкової літери.
Результат _toupper не визначений, якщо значення символа sim не являється кодом рядкової літери.
tolower()
int tolower(int sim);
Макрос tolower (в системі програмування MSC) і функція tolower (в системі програмування ТС) перетворює код символа, заданий значенням аргумента sim, в код відповідаючий рядковій літері, якщо значення sim являється кодом рядкової літери. Якщо значення
sim не являється кодом рядкової літери, то результат toupper - незмінене значення аргумента sim.
toupper()
int toupper(int sim);
Макрос toupper (в системі програмування MSC) і функція toupper (в системі програмування ТС) перетворює код символа, заданий значенням аргумента sim, в код відповідаючий рядковій літері, якщо значення sim являється кодом прописної літери. Якщо значення
sim не являється кодом прописної літери, то результат toupper - незмінене значення аргумента sim.
Додаток 3
//MAIN//
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <dos.h>
#include "funce.mh"
typedef struct zap{
int pravy;
char zapyt1[44];
char zapyt2[44];
char zapyt3[44];
char zapyt4[44];
char zapyt5[44];
char vidpo[4][20];
} PYT;
PYT func(int k);
void rfun(int k1);
int main(void)
{
PYT pyt;
int a,n,i=0,m;
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, ""); // Ініціалізація графічного режиму
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Графічна помилка: %s\n", grapherrormsg(errorcode));
printf("Натисніть клавішу:");
getch();
exit(1);
}
ZASTAVKA(); // Заставка-привітання
VIKNO(); // Завантаження робочого вікна
randomize();
M:
m=random(50)+1; // Випапдковий вибір запитання
pyt=func(m);
zap(pyt.zapyt1); // Виведення запитання та варіантів
zap2(pyt.zapyt2); // відповідей
zap3(pyt.zapyt3);
zap4(pyt.zapyt4);
zap5(pyt.zapyt5);
vid1(pyt.vidpo[0]);
vid2(pyt.vidpo[2]);
vid3(pyt.vidpo[1]);
vid4(pyt.vidpo[3]);
do{
a=getch(); // Присвоєння коду натисненої клавіші
if(a==80) { switch (i){
case 6: i=1;
case 1: { perehid1(); break; }
case 2: { perehid2(); break; }
case 3: { perehid3(); break; }
case 4: { perehid4(); break; }
case 5: { perehid5(); break; }
}//switch
i++;
}/* Від if */
switch (a) { // Аналіз натисненої клавіші
case 27: { zaversh(); // Заставка-завершення
delay(1500); // Затримка зображення
exit(1); // Вихід з програми
}
case 97: {if(pyt.pravy==1){
zas1(); // Заставка „Правильна відповідь”
VIKNO();
goto M;
}
else{
zas2(); // Заставка „Відповідь неправильна”
VIKNO();
rfun(m); // Зчитування з файла опис
// відповідної функції
VIKNO();
goto M;
}
}
case 98: {if(pyt.pravy==2){
zas1();
VIKNO();
goto M;
}
else{
zas2();
VIKNO();
rfun(m);
VIKNO();
goto M;
}
}
case 99: {if(pyt.pravy==3){
zas1();
VIKNO();
goto M;
}
else{
zas2();
VIKNO();
rfun(m);
VIKNO();
goto M;
}
}
case 100: {if(pyt.pravy==4){
zas1();
VIKNO();
goto M;
}
else{
zas2();
VIKNO();
rfun(m);
VIKNO();
goto M;
}
}
}//switch
} while(a!=13&&a!=27);
n=i-1;
if(n==pyt.pravy){ // Порівняння вибраної відповіді з правильною
zas1();
VIKNO();
goto M;
} /* Від if */
if(n!=pyt.pravy){
if(n==5){
VIKNO();
goto M;
}
zas2();
VIKNO();
rfun(m);
VIKNO();
goto M;
}
closegraph(); // Закриття графічного режиму
}/* Від main*/
PYT func(int k) // Функція зчитування з файла відповідного
// запитання, варіантів відповідей, та номера
// правильної відповіді
{
FILE *stream;
PYT pyt;
char buf[90];
int i;
сhar str[127];
if ((stream = fopen("Question.txt", "r"))== NULL)
fprintf(stderr, "Не вдалося відкрити файл.\n");
for(i=0;i<11*(k-1);i++)
fgets(buf,sizeof(buf),stream); // Перехід до потрібного блоку запитання
fgets(pyt.zapyt1,sizeof(pyt.zapyt1),stream);
pyt.zapyt1[strlen(pyt.zapyt1)-1]='\0';
fgets(pyt.zapyt2,sizeof(pyt.zapyt1),stream);
pyt.zapyt2[strlen(pyt.zapyt2)-1]='\0';
fgets(pyt.zapyt3,sizeof(pyt.zapyt1),stream);
pyt.zapyt3[strlen(pyt.zapyt3)-1]='\0';
fgets(pyt.zapyt4,sizeof(pyt.zapyt1),stream);
pyt.zapyt4[strlen(pyt.zapyt4)-1]='\0';
fgets(pyt.zapyt5,sizeof(pyt.zapyt1),stream);
pyt.zapyt5[strlen(pyt.zapyt5)-1]='\0';
for(i=0;i<4;i++){
fgets(