Учебная система программирования Pascal ABC и возможность

advertisement
Учебная система
программирования Pascal ABC
и возможность ее использования в учебном
процессе
С.С. Михалкович
Доклад 12.05.05
Причины создания
Необходима среда для обучения
программированию
Язык Паскаль – лучший язык для
первоначального обучения
Система Borland Pascal 7.0 (1993 г.)
устарела
Система Borland Delphi сложна для
первоначального обучения
Недостатки Borland Pascal
 Устаревший
интерфейс
 Устаревшая
графика
 Неудобная
объектная
модель
 Невозможность
писать
программы,
управляемые
событиями
Недостатки Borland Delphi (1)
 Насыщенный интерфейс
Недостатки Borland Delphi (2)
 Консольное приложение выглядит неуклюже. Его
минимальный текст выглядит достаточно сложно
 Поддержка русификации проблематична
Недостатки Borland Delphi (3)
 Минимальный текст Windows-приложения выглядит
абсолютно непонятным
 Программа не имеет ни начала ни конца
Требования к Pascal ABC
 Простая система для первоначального обучения
программированию. Является стартовой площадкой для
изучения профессиональных систем программирования.
 Содержит все основные элементы современного
программирования (богатая графика, классы, стандартные
контейнеры, богатые библиотеки).
 Позволяет осваивать технически сложные
понятия на более ранних этапах обучения
(модули, классы, сокеты, структуры данных).
 Содержит встроенный электронный задачник,
позволяющий генерировать задания и осуществлять их
автоматическую проверку.
Ограничения Pascal ABC
Компиляция в память с последующей
интерпретацией дерева программы,
отсутствие возможности создания .exe-файлов, выполнение
программ лишь в рамках интегрированной среды
Быстродействие в вычислительных
задачах примерно в 50 раз меньше, чем
в Borland Delphi, и в 20 раз меньше, чем
в Borland Pascal
Тест скорости Pascal ABC
проводился на следующей программе:
uses Utils;
var s: real;
i,j: integer;
begin
cls;
i:=1;
while i<=1000 do
begin
j:=1;
while j<=1000 do
begin
s:=s+1/i/j;
j:=j+1;
end;
i:=i+1;
end;
write(s,' ',Milliseconds/1000);
end.
Вид окна Pascal ABC
Особенности языка Pascal ABC
 Тип string – максимум 255 символов
 Оператор Goto отсутствует
 Двоичные нетипизированные файлы
отсутствуют
 Переменная Result в функциях
 Операции + и – с типизированными
указателями
 Тип complex
 Структурная эквивалентность типов
 Перегрузка имен – без слова overload
Переменная Result
function MinElement
(var a: array [1..100] of real; n: integer): real;
var i: integer;
begin
Result:=a[1];
for i:=1 to n do
if a[i]<Result then
Result:=a[i];
end;
function f(r,i: integer): record r,i: integer end;
begin
Result.r:=r;
Result.i:=i
end;
Структурная эквивалентность типов
var a: array [1..100] of integer;
b: array [1..100] of integer;
p1: procedure (i: integer);
p2: procedure (x: integer);
r1: record i,j: integer end;
r2: record x,y: integer end;
begin
a:=b;
// все в порядке
p1:=p2; // все в порядке
r1:=r2; // ошибка!
...
procedure foreach(var a: array [1..100] of real;
n: integer; f: function(r: real): real);
var i: integer;
begin
for i:=1 to n do
a[i]:=f(a[i]);
end;
Операции с указателями
const n=20;
type pinteger=^integer;
ArrN=^array [1..MaxInt] of integer;
var p,pi: ^integer;
pa: ArrN;
i: integer;
begin
GetMem(p,n*sizeof(integer));
pi:=p;
for i:=1 to n do
begin
pi^:=2*i;
pi:=pi+1;
end;
pa:=ArrN(p);
for i:=1 to n do
write(pa^[i]:3);
FreeMem(p);
end.
Тип complex
const ci=(0,1);
var c: complex;
begin
c:=(3,7);
c.Re:=2*c.Im;
c:=ci*c+(2*c.Im,c.Re);
writeln(c:10:2);
writeln(abs(c));
writeln(conj(c));
writeln(carg(c));
writeln(sin(c),' ',cos(c),' ',exp(c));
writeln(ln(c),' ',sqrt(c));
end.
Перегрузка имен – нет overload
procedure p(b: byte);
begin
end;
procedure p(r: real);
begin
end;
type A=class
constructor Create;
constructor Create(n: integer);
end;
...
p(2);
p(2.0);
Встроенные учебные модули
 Электронный задачник Programming Taskbook
(автор М.Э.Абрамян) – 1000 заданий от
простейших до заданий на файлы, рекурсию,
указатели и структуры данных.
 Исполнители Робот и Чертежник (для
школьников 7-9 классов)
 Позволяют автоматически ставить задания и
проверять правильность их выполнения
Электронный задачник – группы заданий
Begin — ввод и вывод данных, оператор присваивания (40),
Integer — целые числа (30),
For — цикл с параметром (40),
Boolean — логические выражения (40),
If — условный оператор (30),
Case — оператор выбора (20),
While — цикл с условием (30),
Series — последовательности (40),
Proc — процедуры и функции (60),
Minmax — минимумы и максимумы (30),
Array — одномерные массивы (140),
Matrix — двумерные массивы (матрицы) (100),
String — символы и строки (70),
File — типизированные файлы (90),
Text — текстовые файлы (60),
Param — составные типы данных в процедурах и функциях (70),
Recur — рекурсия (30),
Pointer — указатели и динамические структуры данных (80)
Окно задачника
Шаблон программы и процесс решения
uses PT4;
begin
Task('Begin3');
end.
uses PT4;
var a,b,S,P: real;
begin
Task('Begin3');
read(a,b);
S:=a*b;
P:=2*(a+b);
write(S,P)
end.
Перенаправление ввода-вывода – при подключении модуля
задачника PT4 ввод осуществляется из полей вода окна задачника,
а вывод - в соответствующие поля вывода окна задачника
Задание Pointer2
Решение задания Pointer2
type
uses PT4;
PNode = ^TNode;
var P1,P2: PNode;
TNode = record
n: integer;
Data: Integer;
begin
Next: PNode;
Task('Pointer2');
Prev: PNode;
read(P1);
end;
n:=0;
while P1<>nil do
begin
write(P1^.Data);
Inc(n);
P2:=P1; // сохраняем адрес текущего элемента
P1:=P1^.Next; // и переходим к следующему элементу
end;
write(n,P2);
end.
Просмотр результатов выполнения заданий
Другие возможности электронного
задачника
 Задачник реализован для следующих сред:
Borland Pascal 7.0, Borland Delphi 3.0–7.0,
Microsoft Visual Basic 5.0–6.0, Borland
C++Builder 4.0–5.0, Microsoft Visual C++ 6.0,
Microsoft Visual Studio .NET 2003 (языки Visual
C++ 7.0, Visual Basic .NET и Visual C# .NET)
 Имеется контрольный центр преподавателя
(не входит в дистрибутив Pascal ABC),
позволяющий управлять файлами
результатов учащихся, выводить сводную
информацию, создавать файлы вариантов
заданий
Модуль GraphABC – возможность быстрого
написания графических программ
Модуль GraphABC (1)
 Примитивы, перья и кисти
function
procedure
procedure
procedure
procedure
procedure
procedure
procedure
procedure
procedure
procedure
function
procedure
function
procedure
function
procedure
function
procedure
function
RGB(r,g,b: integer): integer;
SetPixel(x,y,color: integer);
Line(x1,y1,x2,y2: integer);
Circle(x,y,r: integer);
Ellipse(x1,y1,x2,y2: integer);
Rectangle(x1,y1,x2,y2: integer);
FloodFill(x,y,color: integer);
Pie(x,y,r,a1,a2: integer);
Polygon(var a; n: integer);
Polyline(var a; n: integer);
SetPenColor(color: integer);
PenColor: integer;
SetPenWidth(w: integer);
PenWidth: integer;
SetPenStyle(ps: integer);
PenStyle: integer;
SetBrushColor(color: integer);
BrushColor: integer;
SetBrushStyle(bs: integer);
BrushStyle: integer;
Модуль GraphABC (2)
 Текст и графическое окно
procedure
procedure
function
procedure
function
procedure
function
procedure
function
TextOut(x,y: integer; s: string);
SetFontColor(color: integer);
FontColor: integer;
SetFontSize(sz: integer);
FontSize: integer;
SetFontName(name: string);
FontName: string;
SetFontStyle(fs: integer);
FontStyle: integer;
fsNormal fsBold fsItalic fsBoldItalic fsUnderline
fsBoldUnderline fsItalicUnderline
fsBoldItalicUnderline
procedure
procedure
function
procedure
function
procedure
function
ClearWindow;
SetWindowWidth(w: integer);
WindowWidth: integer;
SetWindowHeight(h: integer);
WindowHeight: integer;
SetWindowCaption(s: string);
WindowCaption: string;
Модуль GraphABC (3)
 Рисунки: дескрипторная модель. Каждый рисунок имеет
описатель – целое число
function
procedure
procedure
function
function
function
procedure
procedure
LoadPicture(fname: string): integer;
DrawPicture(n,x,y: integer);
DestroyPicture(n: integer);
PictureWidth(n: integer): integer;
PictureHeight(n: integer): integer;
CreatePicture: integer;
CopyToPicture(n: integer; r: Rect);
SavePicture(n: integer; fname: string);
n:=LoadPicture('demo.bmp');
w:=PictureWidth(n); h:=PictureHeight(n);
SetBrushColor(clWhite);
for i:=0 to WindowWidth-w do
begin
DrawPicture(n,i,0);
Sleep(10);
FillRect(i,0,i+1,0+h);
end;
DestroyPicture(n);
Модуль Sounds
Звуки: дескрипторная модель
Интерфейс модуля
Пример
n:=LoadSound(fname);
PlaySound(n);
StopSound(n);
RewindSound(n);
DestroySound(n);
b:=SoundIsPlaying(n);
t:=SoundTime(n);
uses Sounds;
var snd: integer;
begin
snd:=LoadSound('kuku.wav');
PlaySound(snd);
while SoundIsPlaying(snd) do
Sleep(100);
DestroySound(snd);
end.
Модуль Events. Простейшие события
OnMouseDown:
OnMouseUp :
OnMouseMove:
OnKeyDown :
OnKeyUp
:
OnKeyPress :
OnResize
:
OnClose
:
procedure (x,y,mb: integer);
procedure (x,y,mb: integer);
procedure (x,y,mb: integer);
procedure (key: integer);
procedure (key: integer);
procedure (ch: char);
procedure;
procedure;
События OnMouseDown и OnMouseMove
uses GraphABC,Events;
procedure MouseDown(x,y,mb: integer);
begin
MoveTo(x,y);
end;
procedure MouseMove(x,y,mb: integer);
begin
if mb=1 then LineTo(x,y);
end;
begin
OnMouseDown:=MouseDown;
OnMouseMove:=MouseMove
end.
Событие OnKeyDown
uses GraphABC,Events;
var x,y: integer;
procedure KeyDown(Key:
integer);
begin
SetBrushColor(clWhite);
Ellipse(x-9,y-9,x+9,y+9);
case Key of
VK_Left: x:=x-5;
VK_Up: y:=y-5;
VK_Right: x:=x+5;
VK_Down: y:=y+5;
end;
SetBrushColor(clBlack);
Ellipse(x-9,y-9,x+9,y+9);
end;
begin
x:=WindowWidth div 2;
y:=WindowHeight div 2;
SetPenStyle(psClear);
OnKeyDown:=KeyDown;
SetBrushColor(clBlack);
Ellipse(x-9,y-9,x+9,y+9);
end.
Модуль Timers
Таймеры: дескрипторная модель
uses Timers, Events;
procedure p;
begin
write(1);
end;
var t: integer;
begin
t:=CreateTimer(500,p);
readln;
StopTimer(t);
readln;
StartTimer(t);
end.
Модуль Utils
type
DateTime=record
Day, Month, Year, Hour, Minute, Second, Milliseconds: integer;
end;
LongSize=record
Megabytes, Bytes: integer;
end;
function CreateDir(name: string): boolean;
function DeleteFile(name: string): boolean;
function DirectoryExists(name: string): boolean;
function GetCurrentDir: string;
function RemoveDir(name: string): boolean;
function RenameFile(OldName,NewName: string): boolean;
function SetCurrentDir(name: string): boolean;
function Trim(s: string): string;
function TrimLeft(s: string): string;
function TrimRight(s: string): string;
function Milliseconds: integer;
function CompileTime: integer;
function CurrentDateTime: DateTime;
procedure ShowMessage(s: string);
function CompareMem(p1,p2: pointer; len: integer): boolean;
function DiskSize(Drive: integer): LongSize;
function DiskFree(Drive: integer): LongSize;
Модуль Sockets
Сокеты: дескрипторная модель
Серверная программа
Клиентская программа
Структура модуля Pascal ABC
unit GraphLib;
uses GraphABC;
const Dim=5;
var Colors: array [1..Dim] of integer;
function RandomColor: integer;
begin
Result:=RGB(Random(255),Random(255),Random(255));
end;
procedure FillByRandomColor;
var i: integer;
begin
for i:=1 to Dim do
Colors[i]:=RandomColor;
end;
begin
FillByRandomColor;
end.
Модули должны находиться либо в папке основной
программы, либо в папке UNITS корневой папки Pascal ABC
Создание модулей во внешних DLL
Library Test;
procedure RegisterLib(s: string);
begin
s:='unit Test;'+
'procedure myInc(var i: integer; n: integer); external 1;'+
'function Sum(a,b: integer): integer;
external 2;'+
'end.';
end;
procedure Execute(n: integer; p: pointer);
var pi: pinteger; a,b: pinteger;
begin
case n of
1:begin // myInc
pi:=getpointer(p);
pi^:=pi^+pinteger(p)^;
end;
2:begin // Sum
a:=getinteger(p);
b:=getinteger(p);
pinteger(p)^:=a+b;
end;
end;
end;
Особенности классов в Pascal ABC
 Ссылочная объектная модель – как в Delphi
 Все методы – виртуальные
 Возможность определять тела методов как
внутри, так и вне тела класса
 Отсутствуют абстрактные классы,
интерфейсы и статические методы
 Имеются свойства и индексированные
свойства с одним индексом
 По умолчанию все поля и методы – public
Класс Object – неявный предок всех
классов
type Object=class
constructor Create;
destructor Destroy;
function TypeName: string;
function ToString: string;
end;
Определение методов внутри класса
type
Figure=class
private
x,y: integer;
public
constructor Create(xx,yy:integer);
begin
x:=xx; y:=yy;
end;
procedure Draw; begin end;
procedure Show;
begin
SetPenColor(clBlack); Draw;
end;
procedure Hide;
begin
SetPenColor(clWhite); Draw;
end;
procedure MoveTo(xx,yy: integer);
begin
Hide;
x:=xx; y:=yy;
Show;
end;
function Clone: Figure;
begin
Clone:=Figure.Create(x,y);
end;
end;
RectG=class(Figure)
private
w,h: integer;
public
constructor Create(x1,y1,x2,y2:
integer);
begin
inherited Create(x1,y1);
w:=x2-x1; h:=y2-y1;
end;
procedure Draw;
begin
Rectangle(x,y,x+w,y+h);
end;
function Clone: Figure;
begin
Clone:=RectG.Create(x,y,x+w,y+h);
end;
end;
Определение методов внутри и вне класса
type
AssocArray=class
private
words: StringArray;
nums: IntArray;
procedure setProp(ind: string;
value: integer);
function getProp(ind: string):integer;
public
constructor Create;
begin
words:=StringArray.Create;
nums:=IntArray.Create;
end;
function getSize: integer;
begin
Result:=words.Size;
end;
property Size: integer read getSize;
property Items[ind: string]:integer
read getProp write setProp;
property Keys: StringArray read words;
property Values: IntArray read nums;
end;
procedure AssocArray.setProp
(ind: string; value: integer);
var i: integer;
begin
i:=words.IndexOf(ind);
if i<>0 then
nums[i]:=value
else begin
words.add(ind);
nums.add(value);
end;
end;
function AssocArray.getProp
(ind:string): integer;
var i: integer;
begin
i:=words.IndexOf(ind);
if i<>0 then
Result:=nums[i]
else begin
words.add(ind);
nums.add(0);
Result:=0;
end;
end;
Модуль Containers
Классы контейнеров:
 IntArray
RealArray
StringArray
ObjectArray
 IntStack
RealStack
StringStack
ObjectStack
 IntQueue
RealQueue
StringQueue
ObjectQueue
 IntSet
RealSet
StringSet
ObjectSet
 IntAssocArray
RealAssocArray
StringAssocArray
ObjectAssocArray
Модуль Containers – интерфейсы классов
IntArray=class
constructor Create;
constructor Create(n: integer);
destructor Destroy;
procedure Put(ind,v: integer);
function Get(ind: integer): integer;
property Items[n: integer]: integer
read get write put;
function Size: integer;
function Count: integer;
procedure Resize(n: integer);
procedure Add(v: integer);
procedure Fill(v: integer);
procedure Clear;
procedure Insert(ind,v: integer);
procedure Delete(ind: integer);
procedure Remove(v: integer);
procedure Exchange(i1,i2: integer);
function IndexOf(v: integer): integer;
function LastIndexOf(v: integer): integer;
function Find(v: integer): boolean;
function MinElement: integer;
function MaxElement: integer;
function MinInd: integer;
function MaxInd: integer;
procedure Sort;
procedure Reverse;
function Sum: integer;
function Average: real;
procedure Print;
procedure Println;
end;
StringStack=class
constructor Create;
destructor Destroy;
procedure Push(s: string);
function Pop: string;
function Top: string;
function IsEmpty: boolean;
end;
RealQueue=class
constructor Create;
destructor Destroy;
procedure Push(r: real);
function Pop: real;
function First: real;
function Last: real;
function IsEmpty: boolean;
end;
Модуль Containers – интерфейсы классов
IntAssocArray=class
ObjectSet=class
constructor Create;
OwnsObjects: boolean;
destructor Destroy;
constructor Create;
procedure Clear;
destructor Destroy;
procedure Add(key: string;
procedure Include(o: Object);
value: integer);
procedure Exclude(o: Object);
function Find(key: string): boolean;
function Find(o: Object): boolean;
procedure Delete(key: string);
procedure Delete(o: Object);
procedure Reset;
procedure Reset;
procedure MoveFirst;
procedure MoveFirst;
procedure MoveLast;
procedure MoveLast;
procedure Next;
procedure Next;
procedure Prev;
procedure Prev;
function CurrentKey: string;
function Current: Object;
function CurrentValue: integer;
function Eos: boolean;
function EoA: boolean;
function First: Object;
procedure Put(key: string;
function Last: Object;
value: integer);
procedure Clear;
function
Get(key: string): integer;
procedure Union(s1,s2: ObjectSet);
property Items[key: string]: integer
procedure Intersect(s1,s2: ObjectSet);
read get write put;
procedure Difference(s1,s2: ObjectSet);
function
Count: integer;
function Embed(s: ObjectSet): boolean;
function IsEmpty: boolean;
function Count: integer;
procedure Print;
function IsEmpty: boolean;
procedure Println;
procedure Print;
procedure Print(delim: string);
procedure Println;
procedure Println(delim: string);
procedure Print(delim: string);
end;
procedure Println(delim: string);
end;
Пример 1: сортировка по критерию в
динамических массивах объектов
uses Containers;
type
Pupil=class
age: integer;
name: string;
constructor Create(name: string;
age: integer);
begin
Self.age:=age; Self.name:=name;
end;
function ToString: string;
begin
Result:=name+' '+IntToStr(age);
end;
end;
function LessAge(o1,o2: Object): boolean;
begin
Result:=Pupil(o1).age<Pupil(o2).age
end;
function LessName(o1,o2: Object): boolean;
begin
Result:=Pupil(o1).name<Pupil(o2).name
end;
var d: ObjectArray;
begin
cls;
d:=ObjectArray.Create;
d.Add(Pupil.Create('Иванов',15));
d.Add(Pupil.Create('Попов',14));
d.Add(Pupil.Create('Петров',12));
d.Add(Pupil.Create('Козлова',16));
d.Add(Pupil.Create('Кротова',12));
d.Add(Pupil.Create('Дурова',13));
d.Sort(LessName);
writeln('Сортировка по имени:');
d.Println(#10);
d.Sort(LessAge);
writeln('Сортировка по возрасту:');
d.Println(#10);
d.Destroy;
end.
Пример 2: ассоциативные массивы
uses Containers;
var Zoo: IntAssocArray;
begin
Zoo:=IntAssocArray.Create;
Zoo['бегемоты']:=8;
Zoo['крокодилы']:=6;
Zoo['жирафы']:=1;
Zoo['страусы']:=Zoo['страусы']+1;
Zoo.Println;
Zoo.Reset;
while not Zoo.EoA do
begin
writeln(Zoo.CurrentKey,' ',Zoo.CurrentValue);
Zoo.Next;
end;
Zoo.Destroy;
end.
Библиотека визуальных компонентов VCL.
Основные требования
 Простая иерархия компонентов
 Обработчики событий – внешние процедуры,
а не методы, как в Delphi
 Два типа обработчиков – обычные и
расширенные
 Все компоненты создаются явно, двоичный
файл формы .dfm отсутствует
 Все компоненты автоматически разрушаются
при завершении программы. Деструкторы
компонентов вызывать необязательно
Библиотека VCL. Иерархия классов
Пример 1 программы PABC Forms
uses VCL;
var MainForm: Form;
Label1: Label;
Edit1: Edit;
procedure SetFormCaption;
begin
MainForm.Caption:=Edit1.Text;
end;
begin
MainForm:=Form.Create(200,200,300,100);
Label1:=Label.Create(5,20,'Заголовок формы:');
Edit1:=Edit.Create(140,20);
Edit1.OnChange:=SetFormCaption;
end.
Пример 2. Экран более сложной
программы
Pascal ABC в сети Интернет
Систему Pascal ABC и HTML-версию
электронного задачника Programming
Taskbook можно загрузить с сайта
Компьютерной школы при механикоматематическом факультете РГУ
sunschool.math.rsu.ru
Что на повестке дня
Интерфейсы
Методы в записях (без наследования и
полиморфизма)
Исключения
Потоки, средства синхронизации потоков
Усовершенствование модуля Sockets – с
обработчиками событий
Долговременная цель (2 года) – создание
компилятора Pascal ABC для .NET
Как можно использовать Pascal ABC в
учебном процессе
 Использование электронного задачника. Разработка
новых заданий. Создание банка заданий для
студентов
 Создание банка решений типовых задач – обучение
на примерах
 Курсовые работы – создание модулей для Pascal
ABC
 Изменение акцентов – объектно-ориентированное
программирование можно начинать во втором
семестре, опираясь также на графическую
библиотеку; ознакомление с объектами можно
проводить, используя контейнерные классы и классы
визуальных компонентов
Download