Тест програмних програм b> p>
Передмова. b> p>
Як відомо, в даний час найбільш поширеними алгоритмічними мовами є Паскаль і Сі. Саме ці
мови використовуються практично на всіх діючих обчислювальних системах-от супер-ЕОМ до персональних комп'ютерів. Що стосується ПЕОМ, то лідером сімейства
мов Паскаль для них, без сумніву, є Турбо Паскаль 7.0, розроблений фірмою Borland. Ця остання версія дозволила об'єднати в рамках
єдиної системи потужний алгоритмічний потенціал мови, методи об'єктно-орієнтованого програмування, сучасну графіку, зручні
засоби тестування й налагодження програм, а також забезпечити дружній інтерфейс з користувачами. [1] Тому я вибрав цю мову програмування як основу для створення тестового
редактора. p>
Я вирішив створити тестовий редактор, тому що саме тести останнім часом завойовують все більшу популярність. Вони дозволяють
швидко і досить точно перевірити рівень знань з того чи іншого предмету, дізнатися ту чи іншу інформацію про тестується. Звичайно, тест без зусиль можна
скласти вручну, але буде потрібно багато часу, щоб його розмножити. Крім того, можна в будь-який момент протестуватися і миттєво дізнатися результати. P>
Розробляючи програму крок за кроком, я виділив основні функції, які присутні в будь-якому редакторі і, звичайно, в моєму,
а саме: p>
1. створення нового файлу тесту p>
2. відкриття тесту і тестування p>
3. редагування тесту p>
4. перегляд результатів p>
5. друк файлу p>
6. вихід з програми. p>
У процесі створення редактора я виділив основні етапи моєї роботи, що виникають у зв'язку з цим задачі та їх вирішення.
Сподіваюся, прочитавши мою роботу, ви врахуєте мій досвід і продовжите розпочаті дослідження в області редакторів. Програма може бути використана навчальними
закладами як посібник для створення тестів. p>
Почнемо дослідження зі статті про конструювання програм. p>
Конструювання програм. b> p>
Конструювання програм - одна з найважливіших розділів сучасної інформатики. Бурхливий розвиток
програмно-апаратних засобів, поява нових стилів і технологій програмування, як не парадоксально, не знижують, а підвищують рівень
вимог до масової алгоритмічної культури. Практично всі діалогові системи є програмованими. Методика конструювання програм легко
переноситься на інші процедурні мови програмування, у тому числі й об'єктно-орієнтовані. [2] p>
Відповідно до технології конструювання програм побудована програма тестового редактора. Я розділив її
на етапи: p>
1. Створення структурної програми, багато в чому незручною у використанні через відсутність діалогу,
упорядкованого введення та виведення інформації і багато чого іншого. Вихідна програма мала лише основні функції. Вона була «ядром», яка здійснювала всі процеси і функції редактора. У
наступному розділі в точності наведено текст структурної програми. p>
2. Розбиття суцільного тексту програми на процедури. Таким чином, текст став займати не так багато
місця, зник оператор варіанту, багато мітки, посилання і т. п. Треба сказати, багато програмісти віддають перевагу вводити процедури в програму. Це значно
спрощує її. p>
3. Введення віконної системи за допомогою доступних можливостей мови (оператор Window b>). Це дозволило значно спростити роботу, створити
діалог користувача з програмою, зменшити кількість інформації, що надходить до користувача і кількість її «потоків». p>
4. Введення об'єкта-панелі управління. Ви можете бачити її внизу екрану. Вона взяла на себе управління
функціями редактора. Причому введення об'єкта значно спростило програму. Методи роботи з об'єктами ви можете прочитати у розділі «Об'єктне
програмування ». p>
5. Оформлення роботи p>
Структурне програмування. b> p>
Структурне програмування-це програмування, технологія якого припускає використання суперпозиції
трьох базових алгоритмічних структур: лінійної, розгалуженої та циклічної. Але для створення складних програм використовуються більш складні принципи. Принцип
Суперпозиції-поєднання структур з взаємним вкладенням (складанням). Передбачає взаємне включення структур.
p>
Турбо Паскаль сприяє впровадженню сучасної технології програмування, заснованої на принципах
структурного програмування і покроковому методі проектування програм. Основні оператори мови є хорошою ілюстрацією базових керуючих
конструкцій структурного програмування. Їх використання дозволяє записувати складні алгоритми обробки даних в компактній формі. [3] p>
Хоча Бейсік не є повністю структурним мовою, в ньому відображені основні концепції структурного програмування. розглянемо їх
докладніше. p>
Бейсік-мова програмування ПЕОМ. b> p>
Бейсік - інтерактивна мова високого рівня, орієнтований на користувачів ПЕОМ, непрофесіоналів в області
обчислювальної техніки. Бейсік - переважно інтерпретує програма, що дозволяє виробляти порядково налагодження текстів програм. Даний спосіб
набагато зручніше для початківців програмістів, ніж компіляція (компілятор виробляє налагодження тільки цілої програми, а не по частинах), і широко
використовується в Паскалі. Відмінною рисою структурних мов є короткі однозначні оператори (на відміну від довжелезних команд об'єктного
програмування )*. p>
У деяких версіях Бейсіка є вбудований редактор програм, що дозволяє працювати з текстом програми з
командного вікна. Робота з програмою здійснюється в трьох різних режимах: p>
Безпосереднє спілкування p>
Введення програм p>
Обчислення по введеної в ОЗУ програмі p>
В основному, Паскаль виконує ті ж функції що і Бейсік. Однак Паскаль має більший потенціал в областях програмімірованія,
роботи з «комп'ютерним залізом», створення власних модулів і систем. p>
p>
Структурна програма. b> p>
Першим етапом розробки програми стало написання тексту структурної програми. Структурна програма -
послідовність простих команд, операторів, що реалізує ядро, тобто дія програми. Уже на цьому етапі програма працює з текстовими файлами.
Для здійснення зв'язків між окремими частинами програми, що реалізують функції редактора, я використовував оператор безумовного переходу GoTo b>. P>
Нижче наведена схема структурної програми тестового редактора, що пояснює відповідний підхід до програмування.
Основний список операторів вирізано і замінено на <набір операторів>. Кінцевий вигляд програми буде приведений у розділі
"Об'єктне програмування" об'єктів. P>
Program redactor; p>
uses crt, printer; ( b> підключення модулів b> ) b> p>
label l1, l2, l3, l4; (мітки) b> p>
Var a, f, f1, a2: string; (розділ описів) b> p>
b, k: char; p>
c, u, y, a1, b1: text; p>
d, e, i, j, p, z: integer; p>
c1: boolean; p>
Procedure oform; (процедура оформлення початку програми) b> p>
Begin p>
<набір операторів> p>
End; p>
Begin p>
oform; (оформлення початку програми) b> p>
<набір операторів> p>
Writeln ( 'Новий файл (New), Відкрити файл (Open), Редагування (Redact ),'); (висновок
b> p>
альтернативних функцій) b> p>
Writeln ( 'Перегляд результатів (Search), Вихід (Any key )'); p>
b: = readkey; (вибір потрібної функції) b> p>
case b of (оператор варіанту) b> p>
При натисканні відповідної клавіші відбувається вибір функції. p>
'n', 'в': Begin p>
l1: <набір операторів> (виконання функції) b> p>
End; p>
'o', 'й': Begin p>
l2: <набір операторів> (виконання функції) b> p>
End; p>
'r', 'Є': Begin p>
l3: <набір операторів> (виконання функції) b> p>
End; p>
's', 'и': Begin p>
l4: <набір операторів> (виконання функції) b> p>
End; p>
End; p>
<набір опреаторов> p>
Writeln ( 'Новий файл (New),) Відкрити файл (Open), Редагувати (Redact)'); (запит про вибір перед b> p>
виходом) b> p>
Writeln ( 'Перегляд результатів (Search), Вихід (Any key )'); p>
b: = readkey; (вибір варіанту) b> p>
<набір операторів> p>
case b of (оператор варіанту) b> p>
'n', 'т': GoTo l1; (посилання на мітку) b> p>
'o', 'щ': GoTo l2; p>
'r', 'до': GoTo l3; p>
's', 'и': GoTo l4; p>
End; p>
Набір операторів безумовного переходу для повернення до тієї чи іншої функції. p>
<набір операторів> p>
End. p>
На екран виводиться список можливих функцій програми. Для вибору певної функції необхідно натиснути відповідну
клавішу (вказана в дужках великою літерою). Потім оператор варіанту запускає потрібну функцію. Як видно, врахований випадок непереключенного алфавіту (букви
вводяться як латинські, так і російські). p>
Перед виходом знову виводиться цей запит (так як цикл недоречний) і у випадку вибору певної функції відбувається
посилання на функцію. p>
p>
Інтерфейс структурної програми b> p>
Доопрацювання програми. b> p>
Після налагодження початкової програми треба було ввести додаткові функції. Крім стандартної функції
створення та відкриття готового тіста, з'явилися такі як редагування тестів, підрахунок результатів і виставлення оцінки, таймер, складання звіту, захист
тестів від перегляду. Але найголовніше-це вдосконалення інтерфейсу, введення віконної діалогової системи. P>
Розглянемо перераховані функції. Функція підрахунку результату записана так: p>
z: = p * 100 div z; (розрахунок кількості правильних відповідей) b> p>
Writeln ( 'кількість правильних відповідей:', p); p>
Write ( 'оцінка'); (виставлення оцінки) b> p>
If z> = 90 Then Begin p>
Writeln ('5 ') p>
Writeln (b1, '5'); p>
End; p>
else If z> = 70 Then Begin p>
Writeln ('4 ') p>
Writeln (b1, '4'); p>
End; p>
else If z> = 40 Then Begin p>
Writeln ('3 ') p>
Writeln (b1, '3'); p>
End; p>
else Begin p>
Writeln ('2 ') p>
Writeln (b1, '2'); p>
End; p>
Readln; p>
Write ( 'Прізвище:'); (вписування прізвища) b> p>
Readln (a); b> p>
d: = length (a); (виставлення прогалин) b> p>
Write (b1, a); (запис у файл) b> p>
For i: = 1 to 14-d do Write (b1, ''); p>
Write ( 'Ім'я:'); (вписування імені, процедура повторюється) b> p>
Readln (a); p>
Write (b1, a); p>
d: = length (a); p>
For i: = 1 to 11-d do Write (b1, ''); p>
Write ( 'Отчесчтво:'); (вписування по батькові, процедура повторюється) b> p>
Readln (a); p>
Write (b1, a); p>
d: = length (a); p>
For i: = 1 to 17-d do Write (b1, ''); p>
Write (b1, f); p>
d: = length (f); p>
For i: = 1 to 8 do Write (b1, ''); p>
GetDate (g1, g2, g3, g4); (проставлення дати) b> p>
Writeln (b1, g3 ,'.', g2 ,'.', g1); p>
close (b1); p>
Window (15,10,50,19); p>
TextBackGround (black); p>
clrscr; p>
Програма розраховує кількість правильних відповідей за формулою, відповідно до цього виставляє оцінку,
запитує ваші ПІБ, записує їх у файл, проставляє назва тесту і дату його проходження. При цьому використовується метод роботи з рядками:
конкатенація (злиття) строк. Проблемою стало коректне вписування в файл рядки, тому що кількість букв може бути різним, тому програма
проставляє прогалини в файл між даними, використовуючи дані про довжину рядків прізвища, імені, по батькові і віднімаючи їх з постійного числа p>
Таймер, системний час. b> p>
Таймер був розроблений для відліку часу на тест, час вводиться попередньо укладачем тесту. Крім того,
паралельно з висновком часу на тест виводиться поточний системний час. Дія таймера засноване на змінній-лічильнику, яка через певні
проміжки часу зменшує своє значення на 1 (секунду). Системний час виводиться завдяки процедурі GetTime. B> p>
Repeat (цикл лічильника часу) b> p>
Window (60,20,70,21); (вікно виведення часу) b> p>
TextBackGround (black); p>
clrscr; p>
z2: = z2-1; (зворотний відлік секунд) b> p>
If z2 <0 Then Begin (обнулення лічильника) b> p>
z1: = z1-1; p>
z2: = 60; p>
End; p>
If (z1 = 0) and (z2 = 0) Then GoTo l1; (перевірка результату часу) b> p>
GetTime (g1, g2, g3, g4); (висновок таймера і поточного часу) b> p>
Writeln (z1 ,':', z2); (висновок часу на екран) b> p>
Write (g1 ,':', g2, '', g3); p>
Delay (1000); p>
until keypressed; p>
Оголошується змінна, з якої кожну секунду віднімається 1. Так здійснюється зворотний відлік. З
результатом часу програма автоматично переходить до виставлення оцінки. p>
Віконна система діалогу. b> p>
Оскільки минула моя робота була присвячена діалоговим системам, я врахував той досвід, але в цій програмі зробив нововведення,
наблизило програму до сучасного «віконного» увазі. p>
Над оформленням вікна довелося посидіти не одну годину, так як звичайне вікно у вигляді квадрата на екрані зовсім не
привабливо. Я вивчив будову вікон в середовищі MS-DOS b> і спробував відтворити дизайн вікна у своїй програмі.
Якщо ви коли-небудь бачили схему вікна в MS-DOS b>, то помітили, що вікно оточеного подвійною рамкою,
нагорі якої знаходиться назва вікна. Тут мені допомогло хитре рішення. Я заглянув в таблицю символів ASCII b> b> і знайшов символ подвійної
рамки! Далі все просто: відкривається вікно, закрашується, по краях за допомогою циклів малюється рамка і виводиться назва вікна. Але це ще не все. Всередині вікна
відкривається інше вікно того ж кольору, b> щоб було непомітно. Тепер під час введення або виведення даних рамка не буде рухатися разом з текстом,
розриватися і т. д. Ми отримуємо повноцінне вікно. p>
Я зробив оформлення вікна у вигляді процедури, необхідно лише ввести координати вікна
і його назва. Нижче наведений код оформлення вікна: p>
Procedure windows (x, y, x1, y1: integer; b: string); p>
Var a, t: integer; p>
Begin p>
Window (x +1, y +1, x1 1, y1 +1); b> ( b> малювання тіні від вікна b> ) b> p>
TextBackGround (black); p>
clrscr; p>
Window (x, y, x1, y1); b> (малювання вікна) b> p>
TextBackGround (blue); p>
clrscr; p>
TextColor (darkgray); b> (колір тексту) b> p>
Write ( ''); p>
Write (chr (201)); b> (малювання куточка) b> p>
For a: = 1 to 4 do Write (chr (205)); b> (малювання смуги) b> p>
Write ( ''); p>
TextColor (green); b> (колір тексту) b> p>
Write (b); b> (висновок назви вікна) b> p>
Write ( ''); p>
TextColor (darkgray); b> (колір тексту) b> p>
For a: = 1 to (x1-x-9-length (b)) do Write (chr (205)); b> (малювання лінії) b> p>
Writeln (chr (187)); b> (малювання куточка) b> p>
For a: = 1 to (y1-y-1) do Begin b> (малювання ліній з боків) b> p>
Write ( ''); p>
Write (chr (186 )); p>
For t: = 1 to (x1-x-3) do Write ( ''); b> p>
Writeln (chr (186 )); p>
End; p>
Write ( ''); p>
Write (chr (200)); b> (малювання куточка) b> p>
For a: = 1 to (x1-x-3) do Write (chr (205)); b> (малювання лінії) b> p>
Write (chr (188)); b> (малювання куточка) b> p>
Window (x 2, y 1, x1-2, y1-1); b> (відкриття вікна введення всередині вікна) b> p>
TextColor (black); b> p>
End; p>
Тут все досить просто: вікно відкривається оператором Window b> із зазначенням координат. Після закінчення поточного сеансу
вікно закривається (закрашується) тією ж командою. У даній програмі вікна закриваються і відкриваються багато разів, запитуючи кожне свої дані, що
виглядає набагато простіше, ніж безліч рядків на екрані, чи не так? p>
Ось як це виглядає в програмі: p>
Window (10,22,69,22); (вказується вікно з координатами) b> p>
TextBackGround (green); (задається колір фону) b> p>
clrscr; (вікно закрашується) b> p>
Введення процедур. Основні функції редактора. B> p>
Як видно у структурній програмі, функції визначені в операторі варіанту case b>. Для зручності звернення до них і для встановлення
більш ефективних зв'язків між ними я вирішив винести функції в окремі процедури. Це створило додаткові труднощі: потрібно змінити
структуру змінних, ввести локальні змінні. У результаті?? бщій вигляд програми змінився, збільшилася її швидкодію. p>
Я до сих пір говорив про основні функції редактора, але не показував їх програмного коду. Почнемо з функції створення
тесту b>. Вона створює файл тесту і файл відповідей, послідовно записує питання і відповіді із наступним закриттям
файл. p>
Procedure NewF; p>
Var h1: string; b> ( b> оголошення локальних змінних b> ) b> p>
Begin p>
Window (10,10,53,15); b> p>
TextBackGround (black); b> p>
clrscr; p>
Window (20,10,66,15); (початкове вікно) b> p>
TextBackGround (blue); p>
clrscr; p>
TextColor (black); p>
Write ( 'зберегти файл як'); p>
Readln (a); (введення шляху створюваного файлу без розширення) b> p>
a: = a + '. ts'; b> (дописування розширення) b> p>
h1: = a; p>
Assign (c, a); b> (зв'язок змінної з файлом питань) b> p>
a: = a + 'o'; (зміна розширення) b> p>
Assign (u, a); b> (зв'язок змінної з файлом відповідей) b> p>
Rewrite (c); p>
Rewrite (u); p>
Window (20,10,66,15); b> (закриття вікна) b> p>
TextBackGround (black); p>
clrscr; p>
Window (30,5,50,10); b> (відкриття вікна характеристик) b> p>
TextBackGround (yellow); p>
clrscr; p>
GoToXY (30,6); p>
Write ( 'к-ть питань'); p>
Readln (d); b> (введення кількості питань) b> p>
Writeln (c, '', d); p>
GoToXY (30,8); p>
Writeln ( 'назва тесту'); b> (ввести назву тесту) b> p>
Readln (f); p>
Writeln (c, f); p>
Writeln ( 'пароль на захист'); p>
Readln (f); b> (введення пароля) b> p>
Writeln (u, f); p>
Window (30,5,50,10); p>
TextBackGround (black); p>
clrscr; p>
For i: = 1 to d do Begin p>
Writeln (c); p>
Window (10,10,53,20); b> (вікно питання) b> p>
TextBackGround (lightgray); p>
clrscr; p>
Writeln (i, '-е питання:'); p>
Readln (a); b> (введення питання) b> p>
Str (i, f); p>
f: = f +')';< b> b> (запис питання в файл) b> p>
Writeln (c, f); p>
Writeln (c, a); p>
Window (55,10,80,15); (вікно кількості відповідей) b> p>
TextBackGround (cyan); p>
clrscr; p>
Write ( 'кількість відповідей на', i, '-й питання'); p>
Readln (e); b> (введення кількості відповідей) b> p>
Window (10,10,53,20); b> (вікно відповідей) b> p>
TextBackGround (lightgray); p>
clrscr; p>
For j: = 1 to e do Begin p>
Write ( '', j ,')'); p>
Readln (a); b> (введення відповідей) b> p>
Str (j, f); p>
a: = '' + f +')'+ a; p>
Write (c, a); p>
End; p>
Write (c ,'&');< b> b> (запис у файл кінця введення) b> p>
Window (55,10,80,15); p>
TextBackGround (cyan); b> (вікно правильної відповіді) b> p>
clrscr; p>
Write ( 'Правильна відповідь:'); p>
Readln (b); b> (введення правильної відповіді) b> p>
Writeln (u, b); p>
End; p>
close (u); (закриття файлів і вікон) b> p>
Reset (u); p>
Readln (u); p>
close (c); p>
Window (55,10,80,15); p>
TextBackGround (black); p>
clrscr; p>
End; p>
У цій, як і в інших функціях, які працюють з файлами, я зіткнувся з проблемою
запису тестів у файлах. По-перше, я вирішив розділити сам тест і відповіді на нього. Тест знаходиться у файлі з розширенням qs b>, а відповіді на нього-у файлі з розширенням qso b>. Другою проблемою стала зупинка читання питання,
адже питання повинні виводитися не підряд, а по черзі. У зв'язку з цим я використав символ «&» в кінці кожного питання і
вказав програмі читати до цього символу, але сам символ не виводити. Можна було використовувати лічильник рядків, який зупиняє програму після прочитання
двох рядків (питання і варіанти відповідей), але у випадку збою тест приходить в непридатність. Далі було потрібно розмістити дані про назву тесту, кількості
питань, паролі і т. п. Я розмістив їх по цих двох файлів. Досвідчені програмісти помітять: навіщо було використовувати текстові файли, адже можна було застосувати
роботу з типом «запис» та зберігати дані у нетипізований файлах, і шіфровщік б не було потрібно. Дійсно, але використання типу «запис» не
дозволяє створювати тести з динамічним числом відповідей на запитання. Це можливо лише шляхом використання в записі динамічного масиву. Але це зробить роботу
з файлом дуже складною а сам файл буде займати багато місця на диску в порівнянні зі звичайним текстовим. p>
Природно, що при пошуку файлу програма може його не знайти, в цьому випадку видається
помилка пошуку. Потрібно було її обійти, видаючи власне повідомлення програми. Це здійснюється таким чином: задається директива компілятором на його
відключення $ I-, b> перевіряється нульовий результат IORESULT = 0, b> видається повідомлення
і компілятором включається знову $ I + b>. Я використав цю функцію компілятором там, де необхідно здійснити пошук
файлу. Така функція обходу компілятора називається обробкою повідомлень і є складовою об'єктного програмімірованія. P>
Функція відкриття тесту b> виглядає b> складніше. Вона відкриває вказаний файл, зчитує спочатку пароль входу і
запитує його, а потім приступає до виконання тесту. На екран виводиться питання і очікується введення цифри правильної відповіді. Причому включається таймер і по
завершення роботи з тістом або після закінчення часу програма виходить з даної функції і передає управління підпрограмі підрахунку результатів та реєстрації: p>
Procedure OpenF; p>
label l1; p>
Var f1: string; (оголошення локальних змінних) b> p>
Begin p>
p: = 0; p>
Window (10,10,53,15); p>
TextBackGround (black); p>
TextColor (black); p>
clrscr; p>
Window (20,10,66,15); (початкове вікно) b> p>
TextBackGround (blue); p>
clrscr; p>
Writeln ( 'який файл відкрити'); p>
Readln (a); (введення шляху до файлу без розширення) b> p>
a: = a + '. ts'; (додаток розширення) b> p>
Assign (c, a); (зв'язок змінної з файлом питань) b> p>
f1: = a; p>
a: = a + 'o'; (зміна розширення) b> p>
Assign (u, a); (зв'язок змінної з файлом відповідей) b> p>
delete (a, length (a), 1); p>
Assign (b1, 'c: pascalregistr.dat'); (зв'язок змінної з файлом звіту) b> p>
Append (b1); (відкриття файлу звіту для дозапису) b> p>
Reset (c); (відкриття файлу питань для читання) b> p>
Window (20,10,66,15); (закриття початкового вікна) b> p>
TextBackGround (black); p>
clrscr; p>
Reset (u); b> p>
Read (c, b); (зчитування пароля) b> p>
Readln (c, b); b> p>
z: = ord (b)-ord ('0 '); (вибрати час) b> p>
z1: = z; p>
Window (10,10,40,12); (вікно пароля) b> p>
TextBackGround (magenta); p>
clrscr; b> p>
Readln (u, a); p>
If length (a)> 2 Then Begin (перевірка наявності у файлі пароля) b> p>
Write ( 'введіть пароль'); p>
Readln (f); (введення пароля) b> p>
If a <> f Then Begin p>
Write ( 'пароль невірний'); p>
GoTo l1; (вихід з процедури) b> p>
End; p>
End p>
else Begin p>
close (u); p>
Reset (u); p>
End; p>
Readln (c, f); p>
Writeln ( 'тест за темою "', f ,'"');< b> (висновок теми тесту) b> p>
z2: = 60; p>
repeat p>
Window (60,20,70,21); (закриття вікна пароля) b> p>
TextBackGround (black); p>
clrscr; p>
TextColor (yellow); p>
z2: = z2-1; (включення таймера) b> p>
If z2 <0 Then Begin p>
z1: = z1-1; p>
z2: = 60; p>
End; p>
If (z1 = 0) and (z2 = 0) Then GoTo l1; p>
Writeln (z1 ,':', z2); p>
GetTime (g1, g2, g3, g4); (висновок поточного часу) b> p>
Write (g1 ,':', g2, '', g3); p>
Delay (1000); p>
TextColor (black); p>
Window (10,10,53,15); (висновок питання, очікування введення відповіді) b> p>
TextBackGround (cyan); p>
clrscr; p>
while not Eoln (c) or (b <>'&') do Begin p>
Read (c, b); p>
If b <>'&' Then Write (b); p>
End; p>
Writeln; p>
Window (55,10,80,15); (виведення повідомлення про введення відповіді) b> p>
TextBackGround (blue); p>
clrscr; p>
Write ( 'ваша відповідь'); p>
TextColor (yellow); p>
repeat (таймер) b> p>
Window (60,20,70,21); p>
TextBackGround (black); p>
clrscr; p>
z2: = z2-1; p>
If z2 <0 Then Begin p>
z1: = z1-1; p>
z2: = 60; p>
End; p>
If (z1 = 0) and (z2 = 0) Then GoTo l1; p>
GetTime (g1, g2, g3, g4); p>
Writeln (z1 ,':', z2); p>
Write (g1 ,':', g2, '', g3); p>
Delay (1000); p>
until keypressed; p>
Window (55,10,80,15); p>
TextBackGround (blue); p>
clrscr; p>
TextColor (yellow); p>
b: = readkey; (зчитування цифри відповіді) b> p>
Write (b); (зчитування правильної відповіді з файлу) b> p>
Readln (u, k); p>
Readln (c); p>
If k = b Then p: = p +1; (порівняння відповідей, нарахування балів) b> p>
Window (60,20,70,21); p>
TextBackGround (black); (закриття вікна отверов) b> p>
clrscr; p>
TextColor (black); p>
z2: = z2-1; (таймер) b> p>
If z2 <0 Then Begin p>
z1: = z1-1; p>
z2: = 60; p>
End; p>
If (z1 = 0) and (z2 = 0) Then GoTo l1; p>
GoToXY (70,15); p>
GetTime (g1, g2, g3, g4); (висновок поточного часу) b> p>
Writeln (z1 ,':', z2); p>
Write (g1 ,':', g2, '', g3); p>
Delay (1000); p>
until Eof (c); p>
l1: f1: = f1 + 'o'; p>
close (c); (закриття всіх файлів) b> p>
close (u); p>
Window (55,10,80,15); (закриття вікон) b> p>
TextBackGround (black); p>
clrscr; p>
Window (10,10,53,15); p>
TextBackGround (black); p>
clrscr; p>
Window (15,10,50,19); p>
TextBackGround (blue); p>
clrscr; p>
< b> підрахунок результату b> > b> p>
End; p>
Єдиною проблемою тут стало неправильне читання програмою вихідних даних.
Природно, розробляючи складні системи, з першого разу компілляція не вдається ніколи, але після коригування програми вона стала працювати як треба. P>
! Не забувайте закривати файли після використання і перезавантажувати їх після прочитання до кінця за потребою, інакше виникне помилка b> Disk Read Error !!! b> p>
Ця помилка може коштувати вам всього файлу. Дуже часто після збою при читанні файлу цей файл заново прочитати
вам не вдасться. p>
Функція редагування тесту. b> Чи є допоміжною функцією. Вона редагує питання зазначеного тесту.
Спочатку вводиться шлях до файлу тесту, потім він проглядається, вибирається питання для редагування, вводиться номер редагованого питання. Потім
зазначене питання стирається, а на його місце вписується новий. Весь процес супроводжується роботою з файлами, які спочатку створюються, відкриваються, потім
копіюються, коректуються. Старі варіанти файлів видаляються, а нові записуються під їх ім'ям: p>
Procedure RedactF; p>
Begin p>
Window (10,10,53,15); p>
TextBackGround (black); p>
TextColor (black); p>
clrscr; p>
Window (20,10,66,15); ( b> відкриття початкового вікна b> ) b> p>
TextBackGround (blue); p>
clrscr; p>
Writeln ( 'Який файл редагувати'); p>
Readln (a); (введення шляху до редагований файл) b> p>
a2: = a; p>
Window (20,10,66,15); (закриття початкового вікна) b> p>
TextBackGround (black); p>
clrscr; p>
Assign (c, a); (зв'язок змінної з файлом питань) b> p>
a: = a + 'o'; (зміна розширення) b> p>
Assign (u, a); (зв'язок змінної з файлом відповідей) b> p>
delete (a, length (a), 1); p>
a: = a + '1 '; (зміна розширення) b> p>
Assign (y, a); (створення нового файлу питань) b> p>
delete (a, length (a), 1); p>
a: = a + '2 '; (зміна розширення) b> p>
Assign (a1, a); (створення нового файлу відповідей) b> p>
Reset (c); (установка та завантаження файлів) b> p>
Reset (u); p>
Rewrite (y); p>
Rewrite (a1); p>
Window (5,5,50,20); (вікно перегляду файла) b> p>
TextBackGround (lightgray); p>
clrscr; p>
Writeln ( 'Висновок питань через Enter :'); p>
repeat p>
while not Eoln (c) or (b <>'&') do Begin (перегляд питань через Enter) b> p>
Read (c, b); p>
If b <>'&' Then Write (b); p>
End; p>
Readln (c); p>
Readln; p>
until EOF (c); p>
close (c); (перезапуск файлу питань) b> p>
Reset (c); p>
Window (5,5,50,20); (закриття вікна перегляду файла) b> p>
TextBackGround (black); p>
clrscr; p>
Window (30,5,58,10); (вікно кімнати редагованого питання) b> p>
TextBackGround (yellow); p>
clrscr; p>
Read (c, b); (зчитування кількості питань) b> p>
Readln (c, b); p>
d: = ord (b)-ord ('0'); p>
Write ( '№ редагованого питання:'); p>
repeat p>
Readln (z); (введення № питання) b> p>
If z> d Then Writeln ( 'номер перевищує число питань'); (перевірка
існування номера) b> p>
until z <= d; p>
Window (30,5,58,10); (закриття вікна номера редагованого питання) b> p>
TextBackGround (black); p>
clrscr; p>
Window (10,10,53,20); (вікно питань) b> p>
TextBackGround (lightgray); p>
clrscr; p>
close (c); (перезапуск файлу питань) b> p>
Reset (c); p>
p: = 0; p>
repeat p>
while not EOLN (c) do Begin (копіювання значень в інший файл) b> p>
Read (c, b); p>
Write (y, b); p>
End; p>
Readln (c); p>
Writeln (y); p>
p: = p +1; p>
until p = z * 3; (установка кількості копійованих рядків) b> p>
p: = 0; p>
while not (p = z-1) do Begin ( b> стирання непотрібного питання b> ) b> p>
p: = p +1; p>
Readln (u, b); p>
Writeln (a1, b); p>
End; p>
while not EOLN (c) do Begin (можна було застосувати і цикл з параметром від 0 до 2) b> p>
Read (c, b); p>
Write (b); p>
End; p>
Readln (c); p>
Writeln; p>
while not EOLN (c) do Begin (висновок редагованого питання на екран) b> p>
Read (c, b); p>
Write (b); p>
End; p>
Readln (c); p>
Writeln; p>
while not EOLN (c) do Begin p>
Read (c, b); p>
Write (b); p>
End; p>
Readln (c); p>
Writeln; p>
Writeln ( 'Замінити на :'); p>
Writeln (z ,')'); (введення нового запитання) b> p>
Writeln (y, z ,')'); p>
Readln (f); p>
Writeln (y, f); p>
Window (55,10,80,15); (вікно відповідей) b> p>
TextBackGround (cyan); p>
clrscr; p>
Write ( 'кількість відповідей на', z, '-й питання'); p>
Readln (e); (введення кількості відповідей) b> p>
Window (10,10,53,20); (вікно питань) b> p>
TextBackGround (lightgray); p>
clrscr; p>
For j: = 1 to e do Begin (введення відповідей на запитання) b> p>
Write ( '', j ,')'); p>
Readln (a); p>
Str (j, f); p>
a: = '' + f +')'+ a; p>
Write (y, a); p>
End; p>
Writeln (y ,'&'); p>
Window (55,10,80,15); (вікно відповідей) b> p>
TextBackGround (cyan); p>
clrscr; p>
Write ( 'Правильна відповідь:'); p>
Readln (b); (введення правильної відповіді) b> p>
Window (55,10,80,15); (закриття вікна відповідей) b> p>
TextBackGround (black); p>
clrscr; p>
Writeln (a1, b); p>
repeat p>
while not EOLN (c) do Begin (дозапісь значень) b> p>
Read (c, b); p>
Write (y, b); p>
End; p>
Readln (c); p>
Writeln (y); p>
until EOF (c); p>
Readln (u); p>
while not EOF (u) do Begin (дозапісь значень в копійований файл) b> p>
Readln (u, b); p>
Writeln (a1, b); p>
End; p>
Window (10,10,53,20); (закриття вікна питань) b> p>
TextBackGround (black); p>
clrscr; p>
close (c); (закриття файлів) b> p>
Erase (c); (стирання старого файлу питань) b> p>
close (u); p>
Erase (u); (стирання старого файлу відповідей) b> p>
close (y); p>
Rename (y, a2); (перейменування файлу питань) b> p>
a2: = a2 + 'o'; p>
close (a1); p>
Rename (a1, a2); (перейменування файлу відповідей) b> p>
End; p>
Для коректної роботи процедури потрібно реалізувати читання потрібного питання,
тут і стала в нагоді Порядкове читання, про які?? му розповідалося в попередньому розділі. Крім того, було потрібно скопіювати дані з одного файлу, виключаючи
потрібного питання з подальшим додаванням нового запитання. Я реалізував це в циклах, що ви можете бачити в програмному коді. P>
Функція перегляду результатів. b> Організовує перегляд результатів тестування. Просить ввести ваше прізвище. Якщо
вона є в списку, виводить повну інформацію про тест, про оцінку, про дату і т.д. Програма використовує файл registr.dat b> для внесення туди ваших результатів. При бажанні файл
також може бути роздрукувати. p>
Procedure SearchF; p>
Begin p>
Assign (b1, 'c: pascalregistr.dat'); (зв'язок змінної з файлом звіту) b> p>
Reset (b1); (відкриття файлу для читання) b> p>
Window (10,10,53,15); (закриття всіх вікон) b> p>
TextBackGround (black); p>
TextColor (black); p>
clrscr; p>
Window (5,10,70,13); (вікно пошуку) b> p>
TextBackGround (green); p>
clrscr; p>
Write ( 'Ваша Прізвище'); p>
Readln (a); (введення прізвища) b> p>
while not EOF (b1) do Begin (пошук прізвища) b> p>
Readln (b1, f); (зчитування рядка) b> p>
For i: = 1 to length (a) do f1: = f1 + f [i]; (виділення прізвища) b> p>
If a = f1 Then Begin (перевірка збігу) b> p>
Writeln (f); (вивід на екран) b> p>
c1: = true; (підтвердження запиту) p>
End; p>
f1 :=''; (обнулення рядка) b> p>
End; p>
If c1 = false Then Write ( 'Запит не знайдено. Пройдіть тест.'); p>
(в разі відсутності прізвища в списку) b> p>
Readln; p>
close (b1); (закриття файла) b> p>
Window (5,10,70,13); (закриття вікна) b> p>
TextBackGround (Black); p>
clrscr; p>
End; p>
Завдання: b> виділення прізвища з рядка шляхом пошуку пропуску, пошук відповідності прізвищ і виведення результатів
пошуку на екран. p>
Проблеми: b> ніяких p>
Функція друку даних. b> У Turbo Pascal є засоби для роботи з принтером. Це ключове
слово Lst b>, що вказують в операторі виведення Writeln b>. Дотримуючись цієї інструкції, компілятор посилає повідомлення не на екран, а на принтер. Цей
спосіб має істотний недолік: дані передаються дуже повільно. Також у мові немає певної команди для окочанія роботи принтера, тому папір
залишається всередині і доводиться використовувати зовнішні керуючі кнопки принтера. Програма просить вказати шлях до файлу, а потім роздруковує його. p>
Я знайшов інший алгоритм роботи з принтером, швидший, але він вимагає знань мови Assembler, вбудованого в Turbo Pascal: p>
Procedure PrintF; p>
Begin p>
TextColor (black); p>
Window (10,10,53,15); b> ( b> початкове вікно b> ) b> p>
TextBackGround (cyan); p>
clrscr; p>
Writeln ( 'Який файл роздрукувати ?');< b> b> (висновок запиту) b> p>
Window