Распрацоўваем убудаваныя заданні для камп’ютарнага выканаўцы Робат

У адпаведнасці з вучэбнай праграмай па інфарматыцы, сямікласнікі знаёмяцца з камп’ютарным выканаўцам Робат, які дапамагае хутчэй засвоіць асноўныя алгарытмічныя канструкцыі. Паскорыць навучанне і аблегчыць работу настаўніка дазваляюць правяраемыя заданні з электроннага задачніка, уключанага ў вучэбную сістэму праграмавання PascalABC.Net. Выкарыстанне гатовых заданняў не пазбаўляе педагога магчымасці самастойнай распрацоўкі ўласных заданняў. Прапаную азнаёміцца з працэсам іх распрацоўкі для выканаўцы Робат, які прадугледжвае пабудову модуля з групай (групамі) заданняў.

Такі модуль мае наступны выгляд:

Unit імя_модуля;

Interface

Uses RobotTaskMaker;

Implementation

Працэдуры заданняў

Begin

Працэдуры рэгістрацыі груп заданняў

Працэдуры рэгістрацыі заданняў у групах

End.

Пры распрацоўцы заданняў выкарыстоўваецца канструктар RobotTaskMaker, рэалізаваны ў аднайменным модулі. Разгледзім стандартныя працэдуры гэтага канструктара.

Фармулёўка тэксту задання ажыццяўляецца з дапамогай працэдуры TaskText (s), дзе s — радок з апісаннем задання.

Поле памерам m ´ n задаецца працэдурай Field (m, n), дзе m — колькасць клетак па гарызанталі, n — колькасць клетак па вертыкалі. Клеткі нумаруюцца па гарызанталі злева направа, пачынаючы з 1, і па вертыкалі — зверху ўніз, пачынаючы з 1.

Для задання пачатковага і канчатковага становішча Робата выкарыстоўваюцца працэдуры RobotBegin (x1, y1) і RobotEnd (x2, y2), дзе (x1, y1) і (x2, y2) — каардынаты клетак. Замест гэтых дзвюх працэдур можна прымяняць адну: RobotBeginEnd (x1, y1, x2, y2).

Пабудову гарызантальнай сцяны выконвае працэдура HorizontalWall (x, y, L), дзе (x, y) — левая кропка сцяны, а L — даўжыня сцяны. Працэдура VerticalWall (x, y, L) выкарыстоўваецца для пабудовы вертыкальнай сцяны, дзе x і y — верхнія кропкі сцяны, а L — яе даўжыня. Гарызантальныя лініі нумаруюцца зверху ад мяжы поля ўніз, пачынаючы з 0, а вертыкальныя — злева ад мяжы поля направа, пачынаючы з 0.

Працэдура Tag (x, y) памячае клетку (x, y), якую ў заданні неабходна замаляваць. Працэдура TagRect (x1, y1, x2, y2) памячае прамавугольнік з клетак, зададзены каардынатамі супрацьлеглых вяршынь (x1, y1) і (x2, y2), для замалёўвання ў заданні. Працэдура MarkPainted (x, y) стварае замаляваную клетку (x, y) — у заданні гэтая клетка будзе ўжо замалявана.

Пры распрацоўцы працэдур зручна карыстацца функцыяй выпадковых лікаў Random (a, b), якая фарміруе цэлы выпадковы лік у дыяпазоне ад a да b уключна. Гэта дазваляе атрымліваць розныя пачатковыя ўмовы выканаўцы пры кожным новым выкліку задання.

Усе групы і заданні павінны быць пэўным чынам зарэгістраваны. Для рэгістрацыі групы выкарыстоўваецца стандартная працэдура RegisterGroup (ig, og, im, kz), дзе ig — імя групы, og — апісанне групы, im — імя модуля, у якім апісана група, kz — колькасць заданняў у групе. Яе імя павінна ўтрымліваць не больш за 7 сімвалаў (лічбаў і лацінскіх літар) і не завяршацца лічбай. Колькасць заданняў — не больш за 999.

Для рэгістрацыі задання выкарыстоўваецца стандартная працэдура RegisterTask (iz, ip), дзе iz — імя задання, ip — імя працэдуры, у якой рэалізавана заданне. Імя задання з групы павінна складацца з імені гэтай групы і ліку. Гэтую працэдуру варта выклі­каць для кожнага задання. 

Працэдуры RegisterGroup і RegisterTask прапісваюцца з секцыі ініцыялізацыі модуля, які ўтрымлівае рэалізацыю новай групы заданняў для Робата.

Прыклад. Створым модуль RobotTasks.pas, які ўтрымлівае групу Rob з трох заданняў Rob1, Rob2 і Rob3.

Заданне 1. Поле Робата мае квадратную форму адвольнага памеру. Робат знаходзіцца ў левай ніжняй клетцы. Скласці праграму замалёўвання Робатам усіх клетак па дыяганалі ад левай ніжняй клеткі да правай верхняй клеткі.

Заданне 2. Поле Робата мае форму квадрата адвольнага памеру. Зыходнае становішча Робата — левая верхняя клетка. Дзесьці на полі знаходзіцца адзіная замаляваная клетка. Робату неабходна зайсці ў гэтую клетку.

Заданне 3. Поле Робата мае форму квадрата 10 ´ 10. Зыходнае становішча Робата — левая верхняя клетка. Дзесьці справа ад Робата знаходзіцца вертыкальная сцяна з адзіным праходам (праход можа быць у любой клетцы, акрамя верхняй і ніжняй). Робату неабходна перайсці ў супрацьлеглы вугал поля, замаляваўшы дзве клеткі насу­праць праходу ў сцяне.

Запусцім асяроддзе праграмавання PascalABC.Net і набяром наступны тэкст:

Unit RobotTasks;

Interface

Uses RobotTaskMaker;

Implementation

// Працэдура стварэння задання 1

procedure Robot¬_1;

var n: integer;

begin

TaskText (‘Заданне Rob1. Замаляваць клеткі па дыяганалі квадрата’);

n:=Random (3, 20);

Field (n, n);

RobotBegin (1, n);

RobotEnd (n, 1);

For var i:=1 to n do Tag (i, n+1–i);

end;

// Працэдура стварэння задання 2

procedure Robot_2;

var n, k, m: integer;

begin

TaskText (‘Заданне Rob2. Зайсці ў замаляваную клетку’);

n:=Random (3, 20);

Field (n, n);

k:=Random (1, n);

m:=Random (1, n);

MarkPainted (k, m);

RobotBeginEnd (1, 1, k, m);

end;

// Працэдура стварэння задання 3

procedure Robot_3;

var k, m: integer;

begin

TaskText (‘Заданне Rob3. Зайсці ў супрацьлеглы вугал і замаляваць дзве клеткі насупраць праходу ў сцяне’);

Field (10, 10);

k:=Random (1, 9);

m:=Random (1, 8);

VerticalWall (k, 0, m);

VerticalWall (k, m+1, 9–m);

Tag (k, m+1);

Tag (k+1, m+1);

RobotBeginEnd (1, 1, 10, 10);

end; 

begin

// Працэдура рэгістрацыі групы

RegisterGroup (‘rob’, ‘Заданні для Робата’, ‘RobotTasks’, 3);

// Працэдуры рэгістрацыі заданняў 1, 2, 3

RegisterTask (‘rob1’, Robot_1);

RegisterTask (‘rob2’, Robot_2);

RegisterTask (‘rob3’, Robot_3);

end.

Захаваем тэкст у файле RobotTasks.pas (імя файла павінна супадаць з іменем модуля).

Усё гатова. Можна карыстацца створанымі заданнямі. Так, для складання праграмы рашэння першага задання з іменем ‘rob1’ набіраем шаблон (у радку падключэння модуляў пасля стандартнага модуля Robot пазначаем таксама імя створанага модуля — RobotTasks):

Uses Robot, RobotTasks;

Begin

Task (‘rob1’);

End.

Калі запусціць праграму для выканання, то будзе выведзена адпаведнае заданне для Робата. Засталося дапісаць праграму да канца і праверыць яе працаздольнасць. Аналагічна і для іншых заданняў.

На гэтым працэс распрацоўкі правяраемых заданняў можна завяршыць. Але для таго каб нашы заданні з’яўляліся ў акне рэдактара па камандзе “модулі ® стварыць шаблон праграмы”, ці Ctrl+Shift+L, неабходна выканаць дадатковую работу. Так, пасля захавання файла з модулем зробім кампіляцыю: праграма ® кампіляваць (у папцы Output, якая знаходзіцца ў папцы PABCWork.Net, будзе створаны файл RobotTasks.pcu). Створаны модуль (файл з пашырэннем .pcu) перанясём з папкі, дзе ён быў створаны, у папку Lib: Program Files (´86) ® PascalABC.Net ® Lib. Унясём змены ў файл loadpabc.dat, адкрыўшы яго з дапамогай Блакнота (Program Files (´86) ® PascalABC.Net ® PT4 ® loadpabc.dat). У канцы спіса набораў заданняў для Робата дабавім радок са зместам: ==rob|заданні для Робата|3. Захаваем змены.

Для стварэння шаблону задання 1 у новым акне рэдактара ўвядзём тэкст:

Uses Robot, RobotTasks;

Begin

Task (‘rob1’);

End.

Запусцім праграму для выканання. Бу­дзе выведзена адпаведнае заданне для Робата. Захоўваць праграму-шаблон у пэўным файле не трэба. Аналагічна робім з шаблонамі для заданняў 2 і 3.

Пры першым запуску праграмы з падключаным модулем RobotTasks створаная група rob аўтаматычна зарэгіструецца ў майстры па стварэнні праграм-загатовак PT4Load. Калі цяпер націснуць кнопку   “Стварыць шаблон праграмы” і ў акне PT4Load увесці прэфікс RB у полі “Заданне”, то акно прыме наступны выгляд: 

Мы бачым, што група заданняў rob з’явілася ў спісе даступных груп для выканаўцы Робат. Калі прыпісаць імя аднаго са створаных заданняў (напрыклад, rob2), то пасля націскання Enter у рабочым каталогу будзе створаны новы файл RBrob2.pas з наступным зместам:

Uses Robot, RobotTasks;

Begin

Task (‘rob2’);

End.

Такім чынам, цяпер замест ручнога набору шаблону праграмы можна выклікаць гатовы шаблон з дапамогай адпаведнай каманды акна рэдактара. Створаны модуль можна абнаўляць, дабаўляючы ў яго новыя заданні.

Выкарыстанне ўласных правяраемых заданняў дазваляе разнастаіць заняткі, зрабіць іх больш цікавымі, далучыць дзяцей да праектнай дзейнасці.

Аляксандр ЗАНЬКО,
настаўнік інфарматыкі Люсінскага дзіцячага сада — сярэдняй школы імя Якуба Коласа Ганцавіцкага раёна.