Національний Університет «Києво - Могилянська Академія»
Департамент комп’ютерних технологій
Кафедра інформатики
РОЗРОБКА КОМП`ЮТЕРНИХ НАВЧАЛЬНИХ ЗАСОБІВ З ОБРАНОЇ ПРЕДМЕТНОЇ ОБЛАСТІ
Курсова робота
студента II курсу
Підгорного Свєтослава та студентки II курсу
Фіялко Світлани
Науковий керівник:
кандидат технічних наук
Олецький Олексій Віталійович
Київ. 1997.
В наш час багато спеціалістів вважають, що тільки комп`ютер зможе здійснити якісний ривок в системі освіти, процес комп`ютеризації якої відображає загальні тенденції автоматизації, передачі різних функцій людської діяльності комп`ютеру. Звичайно, ЕОМ не може вирішити всі проблеми освіти, більшість яких є не тільки педагогічними, але й соціальними. Разом з тим не слід недооцінювати можливості комп`ютера: ще ніколи педагог не отримував настільки сильного засобу навчання; жоден технічний засіб, який застосовувався раніше, за своїми дидактичними можливостями не може з ним зрівнятися.
Теоретичну основу перших систем комп`ютерного навчання склали принципи програмованого навчання (так званих "паперових машин"). Комп`ютер використовувався переважно як швидкодіючий обчислювач.
По мірі зростання можливостей комп`ютера його почали використовувати для навчання великої кількості учнів та студентів. За його допомогою вдалося здійснити реалізацію нового способу керування навчальною діяльністю. Нові програмні засоби дали змогу налагодити навчання не тільки з математики, фізики і т.д., але й з таких, здавалось, далеких від комп`ютера предметів, як музика, малювання. Найголовніше, що дає комп`ютер, - це можливість діалогового навчання. При цьому не тільки він задає питання, а й дозволяє це робити користувачам. Успішно може бути використана в процесі навчання і можливість комп`ютера моделювати різні явища. Мова йде про задачі, в яких людина своїми діями сама може змінити ситуацію, вона немов є її активним учасником.
Насьогодні багато існуючих навчальних систем реалізує не індивідуалізоване, а скоріше індивідуальне навчання, тобто навчання за формою: один, хто навчає - один, хто навчається. Інколи індивідуалізоване навчання порівнюється з адаптивним, яке має більш широкий спектр застосувань, оскільки адаптація може базуватися на інформації, зібраною системою в процесі навчання з урахуванням історії навчання кожного учня, запрограмованої раніше. Адаптивна система реалізує навчання за розгалудженою програмою, де вже відомо, яка допомога буде надаватися користувачу. Адаптивне навчання тільки тоді стає індивідуалізованим, коли воно спирається на модель учня. В наш час з`являються три шляхи індивідуалізації навчання. Перший з них характеризується тим, що вибір навчальних засобів повністю визначається комп`ютером. Другий передбачає, що ті, хто навчається, самі й керують процесом навчання. Третій шлях реалізує змішане керування.
Таким чином, створення програмних педагогічних засобів - це складний творчий процес, який істотно відрізняється від педагогічної діяльності, як практичної, так і наукової.
Можна виділити два основні напрямки створення педагогічних програмних засобів. Перший напрямок розробляється найбільшою кількістю авторів, що працюють для комерційних компаній, які випускають вже завершені навчальні програми. Використання цих програм орієнтовано на закріплення тих навичок, які вже певною мірою були сформовані. Як правило, це пов`язано з механічним повторенням вже вивченого матеріалу. В наш час існує багато програм такого типу для навчання, наприклад, англійській мові, математиці, біології. Наприклад, існує такий пакет, як "Юніор-1", для IBM PC - сумісних комп`ютерів, який створений для індивідуального знайомства початківця з комп`ютером. Цей пакет призначений не стільки для навчання, скільки для самостійного опанування діями, необхідними користувачу ЕОМ.
Велику цікавість мають навчальні програми, що використовують обєктно-орієнтовний підхід, основу якого складає наступна система вимог:
користувач повинен працювати з реальними об`єктами предметної області (рівняннями, матрицями тощо), а не з текстами і запитаннями.
користувач повинен працювати в реальному операційному середовищі, яке однозначно визначається предметною областю (наприклад, для матриць: скласти два рядки, помножити рядок на число).
інтерфейс користувача не повинен суттєво відрізнятися від традиційного (аркуш паперу перетворюється на екран)
користувач повинен мати свободу, обмежену тільки рамками предметної області, тобто користувач не повинен знаходитись під пресом алгоритму розв`язку, визначеного на стадії написання програми.
Прикладом програмного засобу, в основі якого лежить цей підхід, може слугувати програма ФОРМУЛА, яка розроблена як математичне середовищє для школярів та студентів.
Широке розповсядження комп`ютерних технологій привело до появи великої кількості професійних пакетів (MathCAD, MathLab). Намагання включити такі засоби в навчальний процес призвели до необхідності розробляти спеціальні навчальні курси для опанування тим чи іншим пакетом.
Інший напрямок розробки комп`ютерних програм пов`язаний з використанням ЕОМ в спеціально створеному середовищі. Головним аспектом навчання тут є не вивчення правил, а сам процес мислення. Значний вклад в розвиток цього напрямку внесли технічні педагогічні дослідницькі центри - TERC. В них були розроблені і широко використовуються програмні середовища: система LOGO і її подальший розвиток LOGOWriter; лабораторії, засновані на мікрокомп`ютерах, де користувачі самі стають дослідниками, які відкривають закони математики, біології, фізики.
Особливу цікавість має інструментальна система IBM LinkWay. Система LinkWay є гіпертекстовою системою. Роботу з гіпертекстовою системою можна порівняти з читанням енциклопедії. На відміну від статті, яку, звичайно, читають послідовно, з енциклопедією працюють по іншому: зустрівши в тексті вказівник на якесь поняття, читач або переходить на сторінку, де пояснюється це поняття, або продовжує читати далі.
Система LinkWay може бути застосованя для:
розробки демонстраційних "роликів" з різних тем.
побудови занять в гіпертекстовому середовищі.
організації персональних баз данних.
керування зовнішніми пристроями.
побудови оболонки операційної системи чи пакетів прикладних програм.
В процесі розвитку програмного забезпечення для навчання сформувався і напрямок, орієнтований на використання експертних систем при навчанні різним предметам. Експертні системи є, по суті, моделлю експерта дуже високої кваліфікації в певній предметній області. Узагальнена експертна система містить базу знань з фактами та правилами конкретної предметної області, механізм виведення, блок набуття знань та блок пояснень.
Існує багато різних застосувань експертних систем, а саме: складання прогнозу, постановка діагнозу, задачі управління, планування, начання тощо.
В наш час існує два підходи для проектування навчальних програм: емпіричний та теоретичний. Перший підхід базується на здоровому глузді та досвіді розробки навчальних програм і нерідко нехтуються теоретичні основи складання навчальних програм. Проте, основний напрямок проектування повинен спиратися на теоретичний фундамент програмованого навчання. В принципі, можна створити декілька ефективних навчальних програм і емпірично без теорії навчання, але масову розробку навчальних програм, не маючи теоретичної бази, навряд чи можна зробити.
Проектування навчальних програм - це багаторівневий процес. В ньому можна виділити такі рівні: концептуальний, технологічний, операціональний та рівень реалізації.
На концептуальному рівні задається модель навчання: навчання описується як система, яка складається з двох підсистем - діяльності викладача та діяльності тих, хто буде навчатися. Тут описується принцип навчання, основні компоненти учбової діяльності і того рівня який повинен бути сформований в процесі навчання. На технологічному рівні проект навчальної програми описується у вигляді способу керування учбовою діяльністю на мікрорівні. На операціональному рівні порцес навчання описується як розв`язок дидактичної задачі. Вказується, які функції несе комп`ютер, а також основні шляхи управління учбовою діяльністю.
Рівень реалізації містить два підрівня: педагогічної реалізації та прграмної. Проект навчальної програми на рівні педагогічної реалізациї може бути описаний у вигляді сценарія, який визначає як діє навчальна програма в кожний момент навчання. На рівні програмної реалізації сценарій перекладається в програму для комп`ютера.
Основи реалізації програми CURSOVA
Програма написана на мові Паскаль з використанням компілятора Turbo Pascal 7.0 та Turbo Assembler фірми Borland International, Inc. Програма працює в текстовому режимі. Керування відбувається за допомогою системи меню. Саму програму за внутрішньою побудовою можна поділити на три такі частини:
Система меню
Система просмотру інформаційних файлів та запуску демонстраційних програм
Система перетворення текстових файлів на файли, що розпізнаються ограмою CURSOVA.
Система меню
Як вже було сказано, система меню забезпечує керування програмою. Це звичайне випадаюче (pop-up) меню. Зовнішній вигляд його зображений на малюнку 1.
Малюнок 1
Перший пункт меню, як ви бачите, виділений. Тобто, при натиснені кнопки Enter, з'явиться підменю з списком можливих дій. Керувати виділеним пунктом можна за допомогою клавіш стрілочок.
Малюнок 2
Як видно, система меню зроблена досить схожою на меню більшості професійних програм і є досить інтуїтивною.
Внутрішньо система меню реалізована у вигляді окремого модуля з назвою SMENU.TPU. Там знаходяться такі костанти, змінні, процедури та функції:
procedure menu_init(var m: menu);
Процедура ініціалізує всі необхідні змінні і взагалі приводить систему меню в стан готовності до роботи. Змінна m є складною змінною в якій саме і знаходиться данні для меню.
procedure menu_insert_main(var m: menu; s: string; c: char);
Процедура вставляє в основне меню ще один пункт в меню m з написом s та гарячою літерою c.
procedure menu_insert_sub(var m: menu; n: integer; s: string; c: char);
Процедура вставляє в підменю з номером n основного меню ще один пункт, з написом s та гарячою літерою c.
function menu_run(m: menu; c1, c2, c3, c4, c5, c6, c7, c8: byte):word;
Це є основна функція, що і виконує сновну функцію всього модуля. Змінні c1, c2, c3, c4, c5, c6, c7, c8 слугують для передачі кодів кольорів меню. Всередині функції використовуються процедури:
procedure screen_save; assembler;
procedure screen_restore; assembler;,
друкування підменю тощо. Основний алгоритм такий: намалювати пункти меню, прочитати клавішу з клавіатури і в залежності від клавіші пересунути вказівник вліво, вправо, вгору чи вниз відповідно. Кожен раз при перемальовці екрану, викликається функція screen_restore для того щоб підпункти меню не накладалися один на одного. Для забезпечення швидкості перемальування екрану, функції зберження та відновлення екрану написані на асемблері. Результат, що видається має тип word. В старшому байті знаходиться номер пункту основного меню, а в молодшому - номер його підпункту. Перевірку в основній програмі можна, наприклад, зробити так:
run:=menu_run(m, 0, 3, 15, 0, 0, 3, 15, 0);
case hi(run) of
1: case lo(run) of
1: ... Дії до пункту 1 підменю 1
2: ...Дії до пункту 2 підменю 1
2: case lo(run) of
1: ...Дії до пункту 1 підменю 2
2: ...Дії до пункту 2 підменю 2
end;
end;
procedure menu_done(m: menu);
Функція деініціалізації, що закінчує роботу меню. Після виклику цієї функції неможна користуватись змінною m.
Сама змінна mмає таку структуру:
const
max_of_main = 10; максимальна кількість пунктів основного меню
max_of_item = 30; максимальна довжина тексту назви пункта
type
menu = record
mains: integer; кількість пунктів основного меню
current: integer; поточний виділений пункт
item1: array [1..max_of_main] of record масив інформації про кожен з пунктів
text: string[max_of_item]; напис
letter: char; гаряча клавіша
items: integer; кількість підпунктів
current: integer; поточний підпункт
item2: array [1..10] of record інформація про підпункти
text: string[max_of_item]; напис
letter: char; гаряча клавіша
able: boolean; можливість вибирати
end;
end;
end;
Як видно структура меню досить складна, але в ній одній компактно записана інформація про все меню.
Система перегляду інформаційних файлів та запуску демонстраційних програм
Ця система забезпечує перегляд в текстовому режимі файлів з текстовими данними (самі файли текстовими назвати не можна). Вона реалізована однією процедурою
procedure showtext(fname: string);, яка, як параметр приймає ім'я файлу з вихідним текстом і зображує його на екрані. Якщо файл не вміщається на екран, то за допомогою клавіш стрілочок можна прокрутити текст по екрану. Для зручності в програмуванні, вхідні файли мають скаладну структуру. Вони є масивом радків довжини 80:
type
str80 = string[80];
var
f: file of str80;
Непер ми можемо організувати прямий доступ до будь-якої компоненти цього файлу і нам не потрібно виділяти пам’ять на збереження текстової інформації. Ми по одному рядку зчитуємо з файлу і виводимо на екран.
for i:=0 to PSIZE-1 do begin
if eof(f) then str:=''
else read(f, str);
gotoxy(1, i+2);
textattr:=11+16*1;
write(str); clreol;
end;
Система перетворення текстових файлів на файли, що розпізнаються ограмою CURSOVA.
Маю сказати, що не дуже зручно редагувати файли у форматі прийнятному програмі CURSOVA. Тому тексти набираються в звичайному текстовому редакторі і за допомогою програми TEXT2STR перетворюються на файли STR. Як параметри програмі TEXT2STR необхідно задати ім’я файлу TXT та ім’я файлу STR. Всю іншу роботу вона зробить сама.
Тема "Пpогpамування вiдеоадаптеpiв" дуже актуальна в наш час, оскiльки вiдеоадаптеp - складова частина вiдеопiдсистеми будь-якого комп`ютеpа. Розpобка пpогpам, що iлюстpують деякi можливостi вiдеоадаптеpiв, а саме:
виведення символiв, змiна палiтpи та шpифтiв, надають всiм бажаючим змогу детальнiше ознайомитися з цими пpоцесами, а виконання пpогpам на тpьох piвнях: високому (мова пpогpамування Паскаль), сеpедньому (асемблеp з викоpистанням пеpеpивань BIOS/DOS) та низькому (асемблеp без викоpистання пеpеpивань) ще й має за мету поглибити знання студентiв з цих мов пpогpамування. Отже, пiсля
повного ознайомлення з даною навчальною пpогpамою, студент набуває досвiду в пpогpамуваннi вiдеоадаптеpiв i вже може спpобувати свої сили на цьому попpищi. Hа закiнчення не завадить сказати ще декiлька слiв пpо комп`ютеpнi
навчальнi засоби взагалi. Застосування нових iнфоpмацiйних технологiй в сфеpi освiти - один з засобiв пiдготовки кадpiв в сучасних умовах вpаховуючi задачi майбутнього. Розв`язок цiєї задачi потpебує пеpегляду всiєї системи освiти, пpи цьому особливу увагу слiд звеpтати на pозвиток фоpм пpедставлення знань, фоpмування iнтелектуальних вмiнь, набуття пpактичних навичкiв в областi застосування новiтнiх засобiв обчислювальної технiки. Пpи цьому повинна змiнитися сама технологiя навчання, бiльше уваги слiд пpидiляти виpобленню умiння самостiйно набувати знання в пpоцесi дослiдницької дiяльностi. Застосування новiтнiх iнфоpмацiйних технологiй дозволить також збiльшити зв`язки мiж пpедметами, що в подальшому може слугувати основою для ствоpення нових iнтегpованих куpсiв навчання. Разом з тим слiд зазначити, що комп`ютеpiзацiя навчання не вiдмiняє i не замiняє пpоцес спiлкування педагога зi студентом, а лише допомагає i тому, i iншому бiльш ефективно пpиймати участь в пpоцесi навчання i пpидiляти бiльше уваги елементам твоpчостi, на якi pанiше не вистачало часу (це стає можливим завдяки бiльш ефективній самостiйній пpацi студента i бiльш наочного пpедставлення нового матеpiалу).
Використана літератури
Р. Джордейн. Справочник програмиста персональних компьютеров типа IBM PC, XT и AT.
П. Абель. Язык ассемблера для IBM PC и программирования.
А. Епанешников, В. Епанешников. Программирование в среде Turbo Pascal 7.0.
Г. Шилдт. Язык Си для профессионалов.
Інфоpмацiйнi технологiї в сучаснiй школi. А.Ф.Веpлань, Л.О.Твеpезовська, В.А.Федоpчук.
Пpогpамиpование в сpеде Туpбо Паскаль. Д.Б.Поляков, И.Ю.Кpуглов
Пpогpамиpование видеоадаптеpов. А.В.Фpолов, Л.В.Фpолов
Додатки
CURSOVA.PAS
{$M $8000,0,0 }
uses crt, smenu, dos;
procedure Print(x, y, c1: byte; S: string);
begin
GotoXY(x, y);
textattr:=c1;
Write(S);
end;
procedure Frame(x1, y1, x2, y2: byte; S: string; c1, c2: byte; Double: boolean);
var i, k, Leng, High: byte;
begin
Leng:=x2-x1;
High:=y2-y1;
Window(x1, y1, x1+Leng, y1+High);
textattr:=c1;
ClrScr;
Window(1, 1, 80, 25);
if Double=True then Print(x1, y1, c1, 'Й') else Print(x1, y1, c1, 'Ъ');
for i:=1 to Leng do
if Double=True then Print(x1+i, y1, c1, 'Н') else Print(x1+i, y1, c1, 'Д');
if Double=True then Print(x2+1, y1, c1, '»') else Print(x2+1, y1, c1, 'ї');
for i:=1 to High do begin
if Double=True then Print(x1, y1+i, c1, 'є') else Print(x1, y1+i, c1, 'і');
if Double=True then Print(x2+1, y1+i, c1, 'є') else Print(x2+1, y1+i, c1, 'і');
end;
if Double=True then Print(x1, y2, c1, 'И') else Print(x1, y2, c1, 'А');
for i:=1 to Leng do
if Double=True then Print(x1+i, y2, c1, 'Н') else Print(x1+i, y2, c1, 'Д');
if Double=True then Print(x2+1, y2, c1, 'ј') else Print(x2+1, y2, c1, 'Щ');
if S<>'' then Print(x1+(Leng div 2)-(Length(S) div 2), y1, c2, ' '+S+' ');
end;
procedure Cursor(x1, x2: byte);
var
Reg: Registers;
begin
Reg.AH:=1;
Reg.CH:=x1;
Reg.CL:=x2;
Intr($10, Reg);
end;
function UpCasing(S1: string): string;
var
s: string;
b: byte;
begin
S:='';
for B:=1 to Length(S1) do
S:=S+UpCase(S1[B]);
UpCasing:=S;
end;
function Strg(W: LongInt): string;
var
s: string;
begin
Str(W, S);
Strg:=S;
end;
procedure KeyBar(w1, w2, w3, w4, w5, w6, w7, w8, w9, w10: string);
var
k1, k2, k3, k4, k5, k6, k7, k8, k9, k10: string;
begin
k1:=' ';
k2:=' ';
k3:=' ';
k4:=' ';
k5:=' ';
k6:=' ';
k7:=' ';
k8:=' ';
k9:=' ';
k10:=' ';
k1:=w1;
k2:=w2;
k3:=w3;
k4:=w4;
k5:=w5;
k6:=w6;
k7:=w7;
k8:=w8;
k9:=w9;
k10:=w10;
k1[0]:=chr(6);
k2[0]:=chr(6);
k3[0]:=chr(6);
k4[0]:=chr(6);
k5[0]:=chr(6);
k6[0]:=chr(6);
k7[0]:=chr(6);
k8[0]:=chr(6);
k9[0]:=chr(6);
k10[0]:=chr(5);
Print(1, 25, 7+16*0, '1');
Print(2, 25, 0+16*3, k1);
Print(8, 25, 7+16*0, ' 2');
Print(10, 25, 0+16*3, k2);
Print(16, 25, 7+16*0, ' 3');
Print(18, 25, 0+16*3, k3);
Print(24, 25, 7+16*0, ' 4');
Print(26, 25, 0+16*3, k4);
Print(32, 25, 7+16*0, ' 5');
Print(34, 25, 0+16*3, k5);
Print(40, 25, 7+16*0, ' 6');
Print(42, 25, 0+16*3, k6);
Print(48, 25, 7+16*0, ' 7');
Print(50, 25, 0+16*3, k7);
Print(56, 25, 7+16*0, ' 8');
Print(58, 25, 0+16*3, k8);
Print(64, 25, 7+16*0, ' 9');
Print(66, 25, 0+16*3, k9);
Print(72, 25, 7+16*0, ' 10');
Print(75, 25, 0+16*3, k10);
GotoXY(79, 25);
TextBackground(3);
ClrEol;
end;
procedure showtext(fname: string);
const
PSIZE = 23;
type
str80 = string[80];
var
f: file of str80;
str: str80;
pos, MPOS: integer;
ch: char;
procedure opening;
begin
assign(f, fname);
{$I-}
reset(f);
{$I+}
if ioresult<>0 then begin
textattr:=7; clrscr;
writeln('Error in opening file: ', fname);
halt;
end;
end;
procedure showfrom(n: integer);
var
i: integer;
begin
seek(f, n);
for i:=0 to PSIZE-1 do begin
if eof(f) then str:=''
else read(f, str);
gotoxy(1, i+2);
textattr:=11+16*1;
write(str); clreol;
end;
end;
procedure showhead;
begin
gotoxy(1, 1);
textattr:=16*3;
write('File: ', fname, ' ', pos, '/', MPOS,
' ', pos*100 div MPOS, '%');
clreol;
end;
procedure help;
begin
frame(10, 5, 70, 22, 'Help', 16*3, 16*3, true);
print(13, 7, 16*3, 'Slawa Pidgorny & Sveta Fialka proudly presents:');
print(13, 9, 16*3, 'CURSOVA 1.1');
print(13, 11, 16*3, 'Copycenter (C) 1997 UKMA');
print(13, 12, 16*3, 'University of "Kiev-Mohyla Academy"');
print(13, 13, 16*3, 'Department of Computer && System Sciences');
print(13, 15, 16*3, 'Director of the project: Oletsky Oleksiy Vitaliyevich');
print(13, 17, 16*3, 'Fullfilled by:');
print(13, 19, 16*3, ' * Slawa Pidgorny. <slawa@queen.ukma.kiev.ua>');
print(13, 18, 16*3, ' * Sveta Fiyalka. <svetaflk@queen.ukma.kiev.ua>');
print(13, 21, 16*3, 'Written on Turbo Pascal++ 7.0');
readkey;
end;
begin
opening;
cursor($20, $20);
pos:=0;
MPOS:=filesize(f);
repeat
showfrom(pos);
showhead;
ch:=readkey;
if ch=#27 then break;
if ch=#0 then begin
ch:=readkey;
if (ch=#59) then help;
if (ch=#68) then break;
if (ch=#80) and (pos<MPOS) then inc(pos);
if (ch=#72) and (pos>0) then dec(pos);
if (ch=#73) then if (pos>PSIZE) then dec(pos, PSIZE) else pos:=0;
if (ch=#81) then if (pos<MPOS-PSIZE) then inc(pos, PSIZE) else pos:=MPOS;
end;
until false;
cursor(6, 7);
end;
procedure error(str: string);
begin
writeln(str);
halt;
end;
var
fmen: array [1..10, 1..10] of string[80];
m: menu;
procedure fillmenu;
var
f: text;
mm: boolean;
str: string;
p1, p2, i, j: integer;
begin
assign(f, 'cursova.dat');
reset(f);
mm:=true;
p1:=1;
p2:=1;
while (not eof(f)) do begin
readln(f, str);
if mm then begin
menu_insert_main(m, str, ' ');
mm:=false;
end else if str='' then begin
mm:=true;
inc(p1); if (p1>10) then error('max no of submenus: 10');
p2:=1;
end else begin
fmen[p1, p2]:=copy(str, 1, pos(' ', str)-1);
inc(p2); if (p2>10) then error('max no of items in submenu: 10');
menu_insert_sub(m, p1+1, copy(str, pos(' ', str)+1, 255), ' ');
end;
end;
end;
var
run: word;
extt: string;
begin
textattr:=7; clrscr;
menu_init(m);
menu_insert_main(m, 'ю', '‚');
menu_insert_sub(m, 1, 'Exit', 'x');
fillmenu;
repeat
keybar('Help', '', '', '', '', '', '', '', '', 'Menu');
run:=menu_run(m, 0, 3, 15, 0, 0, 3, 15, 0);
case hi(run) of
1: break;
2..10: begin
extt:=upcasing(copy(fmen[hi(run)-1, lo(run)],
pos('.', fmen[hi(run)-1, lo(run)])+1, 255));
if extt='STR' then showtext(fmen[hi(run)-1, lo(run)]);
if extt='EXE' then begin
textattr:=7;
clrscr;
SwapVectors;
Exec(fmen[hi(run)-1, lo(run)], '');
SwapVectors;
if DosError <> 0 then error('Dos error #'+strg(DosError));
readkey;
end;
end;
end;
until false;
menu_done(m);
textattr:=7; clrscr;
writeln('Program created as a cursova by');
writeln(' * Slawa Pidgorny. <slawa@queen.ukma.kiev.ua>');
writeln(' * Sveta Fiyalka. <svetaflk@queen.ukma.kiev.ua>');
writeln('using Turbo Pascal 7.0.');
end.
SMENU.PAS
unit smenu;
interface
const
max_of_main = 10;
max_of_item = 30;
type
menu = record
mains: integer;
current: integer;
item1: array [1..max_of_main] of record
text: string[max_of_item];
letter: char;
items: integer;
current: integer;
item2: array [1..10] of record
text: string[max_of_item];
letter: char;
able: boolean;
end;
end;
end;
procedure menu_init(var m: menu);
procedure menu_insert_main(var m: menu; s: string; c: char);
procedure menu_insert_sub(var m: menu; n: integer; s: string; c: char);
function menu_run(m: menu; c1, c2, c3, c4, c5, c6, c7, c8: byte): word;
procedure menu_done(m: menu);
implementation
uses
crt;
procedure Cursor(x1, x2: byte); assembler;
asm
mov ah, 1
mov ch, x1
mov cl, x2
int 10h
end;
function strings(a: integer): string;
var
s: string;
i: integer;
begin
s:='';
for i:=1 to a do begin
s:=s+' ';
end;
strings:=s;
end;
procedure colors(a, b: byte);
begin
textcolor(a); textbackground(b);
end;
procedure colour(a: byte);
begin
textattr:=a;
end;
procedure print(x, y: integer; c: byte; s: string);
begin
gotoxy(x, y);
colour(c);
write(s);
end;
procedure frame(x1, y1, x2, y2: byte; S: string; c1, c2: byte; Double: boolean);
var
i, k, Leng, High: byte;
begin
Leng:=x2-x1;
High:=y2-y1;
Window(x1, y1, x1+Leng, y1+High);
Colour(c1);
ClrScr;
Window(1, 1, 80, 25);
if Double=True then Print(x1, y1, c1, 'Й') else Print(x1, y1, c1, 'Ъ');
for i:=1 to Leng do
if Double=True then Print(x1+i, y1, c1, 'Н') else Print(x1+i, y1, c1, 'Д');
if Double=True then Print(x2+1, y1, c1, '»') else Print(x2+1, y1, c1, 'ї');
for i:=1 to High do begin
if Double=True then Print(x1, y1+i, c1, 'є') else Print(x1, y1+i, c1, 'і');
if Double=True then Print(x2+1, y1+i, c1, 'є') else Print(x2+1, y1+i, c1, 'і');
end;
if Double=True then Print(x1, y2, c1, 'И') else Print(x1, y2, c1, 'А');
for i:=1 to Leng do
if Double=True then Print(x1+i, y2, c1, 'Н') else Print(x1+i, y2, c1, 'Д');
if Double=True then Print(x2+1, y2, c1, 'ј') else Print(x2+1, y2, c1, 'Щ');
if S<>'' then Print(x1+(Leng div 2)-(Length(S) div 2), y1, c2, ' '+S+' ');
end;
procedure menu_init(var m: menu);
begin
m.mains:=0;
m.current:=1;
end;
procedure menu_insert_main(var m: menu; s: string; c: char);
begin
inc(m.mains);
m.item1[m.mains].text:=s;
m.item1[m.mains].letter:=c;
m.item1[m.mains].current:=1;
end;
procedure menu_insert_sub(var m: menu; n: integer; s: string; c: char);
begin
inc(m.item1[n].items);
m.item1[n].item2[m.item1[n].items].text:=s;
m.item1[n].item2[m.item1[n].items].letter:=c;
end;
function menu_run(m: menu; c1, c2, c3, c4, c5, c6, c7, c8: byte): word;
var
pos_tab: array[1..max_of_main] of record
x, l: integer;
end;
scr1: array[0..3999] of byte;
procedure screen_save; assembler;
asm
push ds
mov ax, 0B800h
mov ds, ax
xor si, si
mov ax, seg scr1
mov es, ax
mov di, offset scr1
mov cx, 1000
cld
db $66; rep movsw
pop ds
end;
procedure screen_restore; assembler;
asm
push ds
mov ax, seg scr1
mov ds, ax
mov si, offset scr1
mov ax, 0B800h
mov es, ax
xor di, di
mov cx, 1000
cld
db $66; rep movsw
pop ds
end;
procedure create_pos_tab;
var
i, p: integer;
begin
p:=2;
for i:=1 to m.mains do begin
pos_tab[i].x:=p;
inc(p, length(m.item1[i].text)+2);
end;
end;
procedure main_show(m: menu; sel: integer);
var
i: integer;
begin
gotoxy(1, 1);
colors(c1, c2);
clreol;
for i:=1 to m.mains do begin
if i=sel then begin
colors(c3, c4);
end else begin
colors(c1, c2);
end;
gotoxy(pos_tab[i].x, 1);
write(' '+m.item1[i].text+' ');
end;
end;
function sub_menu_max_len(m: menu; n: integer): integer;
var
i, max: integer;
begin
max:=0;
for i:=1 to m.item1[n].items do begin
if max<length(m.item1[n].item2[i].text) then begin
max:=length(m.item1[n].item2[i].text);
end;
end;
sub_menu_max_len:=max;
end;
procedure sub_show(m: menu; sel1, sel2: integer);
var
i: integer;
begin
frame(pos_tab[sel1].x, 2, 1+pos_tab[sel1].x+sub_menu_max_len(m, sel1)+1,
m.item1[sel1].items+3, '', c5+16*c6, c7+16*c8, false);
for i:=1 to m.item1[sel1].items do begin
if i=sel2 then begin
colors(c3, c4);
end else begin
colors(c1, c2);
end;
gotoxy(pos_tab[sel1].x+1, 2+i);
write(' '+m.item1[sel1].item2[i].text+' '+strings(
sub_menu_max_len(m, sel1)-length(m.item1[sel1].item2[i].text)));
end;
end;
var
main_menu_position: integer;
sub_menu_position: integer;
sub_menu_open: boolean;
ch: char;
saved_x, saved_y: byte;
saved_colors: byte;
begin
cursor($20, $20);
saved_colors:=textattr;
saved_x:=wherex;
saved_y:=wherey;
main_menu_position:=m.current;
sub_menu_open:=false;
create_pos_tab;
screen_save;
repeat
screen_restore;
main_show(m, main_menu_position);
if sub_menu_open then begin
sub_show(m, main_menu_position, sub_menu_position);
end;
ch:=readkey;
if ch=#0 then begin
ch:=readkey;
if ch=#75{Left} then begin
if main_menu_position>1 then begin
m.item1[main_menu_position].current:=sub_menu_position;
dec(main_menu_position);
sub_menu_position:=m.item1[main_menu_position].current;
end;
end;
if ch=#77{Right} then begin
if main_menu_position<m.mains then begin
m.item1[main_menu_position].current:=sub_menu_position;
inc(main_menu_position);
sub_menu_position:=m.item1[main_menu_position].current;
end;
end;
if sub_menu_open then begin
if ch=#72{Up} then begin
if sub_menu_position>1 then begin
dec(sub_menu_position);
end;
end;
if ch=#80{Down} then begin
if sub_menu_position<m.item1[main_menu_position].items then begin
inc(sub_menu_position);
end;
end;
end; {sub_menu_open}
end; {ch=#0}
if ch=#13{Enter} then begin
if not sub_menu_open then begin
sub_menu_open:=true;
sub_menu_position:=m.item1[main_menu_position].current;
end else begin
menu_run:=main_menu_position*256+sub_menu_position;
break;
end;
end;
if ch=#27{Esc} then begin
menu_run:=0;
break;
end;
until false;
screen_restore;
textattr:=saved_colors;
gotoxy(saved_x, saved_y);
cursor(6, 7);
end;
procedure menu_done(m: menu);
begin
end;
end.
TEXT2STR.PAS
type
str80 = string[80];
var
f1: text;
f2: file of str80;
str: string;
str2: str80;
begin
if paramcount<>2 then exit;
assign(f1, paramstr(1));
reset(f1);
assign(f2, paramstr(2));
rewrite(f2);
write('Processing');
while not eof(f1) do begin
readln(f1, str);
str2:=copy(str, 1, 80);
write(f2, str2);
write('.');
end;
writeln;
close(f2);
close(f1);
end.
CURSOV16.PAS
uses
crt;
procedure a1;
begin
textColor(14);
textBackground(3);
write('Slawa');
textAttr:=7;
writeLn;
end;
procedure a31; assembler;
asm
mov ah, 9 {function 9}
mov al, 'a' {char 'a'}
xor bh, bh {video page 0}
mov bl, 16*3+14 {color}
mov cx, 5 {print 5 times}
int 10h {printing}
end;
procedure a32;
const
str: array [0..6] of char ='slawa'+#13+#10;
begin
asm
push bp {push used registers to stack}
push es
mov ax, seg str {es is a segment register of text}
mov es, ax
mov bp, offset str {es:bp is an actual string location}
mov ah, 13h {funtion 13h}
mov al, 1 {only text}
mov bh, 0 {video page}
mov bl, 16*3+14 {color}
mov cx, 7 {chars' counter}
mov dh, 10 {coordinates}
mov dl, 10
int 10h {printing}
pop es {restore registers}
pop bp
end;
end;
procedure a4; assembler;
const
color: byte = 16*3+14; {color}
str: array [0..4] of char
= 'slawa'; {string to print}
strlen: word = 5; {length of that string}
asm
mov ax, 0B800h {mov es, 0B800h}
mov es, ax
mov cx, strlen {cx - counter of chars}
mov si, offset str {ds:si - text}
xor di, di {es:di - video memory}
@a:
lodsb {load byte from ds:si}
stosb {store byte to es:di}
mov al, color
stosb {store color to es:di}
loop @a {while there is more chars to print}
end;
begin
textattr:=7; clrscr; a1; readkey;
textattr:=7; clrscr; a31; writeln; textattr:=7; clreol; readkey;
textattr:=7; clrscr; a32; readkey;
textattr:=7; clrscr; a4; readkey;
end.
CURSOV26.PAS
uses crt, graph;
procedure a5;
var
aVGA, aVGALO: integer;
begin
aVGA:=VGA; aVGALO:=VGAHI;
initGraph(aVGA, aVGALO, ''); {entering video mode 640x480x16}
setFillStyle(1, 13);
bar(10, 10, 100, 100); {making a filled rectangle}
readkey; {press any key}
setPalette(13, 3); {palette changing}
end;
procedure a6; assembler;
asm
{palette changing}
mov ah, 10h {function 10h for palette operations}
mov al, ah {subfunct 10h for changin 1 palette color}
mov bx, 14 {14 color number}
mov bh, 10 {red 10}
mov ch, 40 {green 40}
mov cl, 30 {blue 30}
int 10h {changing}
end;
procedure a7; assembler;
const
n: byte = 14; {color}
r: byte = 63; {red}
g: byte = 23; {green}
b: byte = 25; {blue}
asm
mov dx, 3C8h {port #3C8h}
mov al, n {outing color number}
out dx, al
inc dx {port #3C9h}
mov al, r {outing red}
out dx, al
mov al, g {outing green}
out dx, al
mov al, b {outing blue}
out dx, al
end;
procedure tograph(a: word); assembler;
asm
{entering mode13h - 320x200x256}
mov ax, 13h
int 10h
{filling all the screen with 14th color}
mov ax, 0A000h
mov es, ax {mov es, 0A000h}
mov cx, 64000/2 {cx - counter}
xor di, di {begin of video memory is at 0A000:0}
cld {move forward}
mov ax, a {color to put}
rep stosw {filling}
end;
procedure totext; assembler;
asm
mov ax, 3 {changing video mode to text one}
int 10h
end;
begin
textattr:=7; clrscr; a5; readkey;
tograph(14+256*14);
readkey;
a6;
readkey;
a7;
readkey;
totext;
end.
CURSOV33.PAS
uses
crt;
procedure a8; assembler;
asm
mov ah, 11h {function 11h - bios font operations}
mov al, 11h {8x14}
mov bl, 0 {font plane}
int 10h {changing}
call readkey; {let you see the changes}
mov ah, 11h {function 11h - bios font operations}
mov al, 12h {8x8}
mov bl, 0 {font plane}
int 10h {changing}
call readkey; {let you see the changes}
mov ah, 11h {function 11h - bios font operations}
mov al, 14h {8x16}
mov bl, 0 {font plane}
int 10h {changing}
call readkey; {let you see the changes}
end;
begin
writeln('That''s a text mode font changing demonstration');
a8;
end.
! |
Как писать рефераты Практические рекомендации по написанию студенческих рефератов. |
! | План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом. |
! | Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач. |
! | Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты. |
! | Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ. |
→ | Виды рефератов Какими бывают рефераты по своему назначению и структуре. |