580 likes | 1.54k Views
Учебная с истема программирования Pascal ABC и возможность ее использования в учебном процессе. С.С. Михалкович Доклад 12.05.05. Причины создания. Необходима среда для обучения программированию Язык Паскаль – лучший язык для первоначального обучения
E N D
Учебная система программирования Pascal ABCи возможность ее использования в учебном процессе С.С.Михалкович Доклад 12.05.05
Причины создания • Необходима среда для обучения программированию • Язык Паскаль – лучший язык для первоначального обучения • Система Borland Pascal 7.0 (1993 г.) устарела • Система Borland Delphi сложна для первоначального обучения
Недостатки Borland Pascal • Устаревший интерфейс • Устаревшая графика • Неудобная объектная модель • Невозможность писать программы, управляемые событиями
Недостатки BorlandDelphi (1) • Насыщенный интерфейс
Недостатки BorlandDelphi (2) • Консольное приложение выглядит неуклюже. Его минимальный текст выглядит достаточно сложно • Поддержка русификации проблематична
Недостатки BorlandDelphi (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 • Тип string – максимум 255 символов • Оператор Gotoотсутствует • Двоичные нетипизированные файлы отсутствуют • Переменная Resultв функциях • Операции + и – с типизированными указателями • Тип complex • Структурная эквивалентность типов • Перегрузка имен – без слова overload
Переменная Result function MinElement(var a: array [1..100]of real;n: integer): real;var i: integer;beginResult:=a[1];for i:=1 to n doif a[i]<ResultthenResult:=a[i];end;function f(r,i: integer): record r,i:integer end;beginResult.r:=r;Result.i:=iend;
Структурная эквивалентность типов 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; begina:=b;// все в порядкеp1:=p2; // все в порядке r1:=r2; // ошибка! ... procedureforeach(var a: array [1..100] of real; n: integer; f: function(r: real): real);var i: integer;beginfor 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);beginend; procedure p(r: real);beginend; type A=classconstructor 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 type PNode = ^TNode; TNode = record Data: Integer; Next: PNode; Prev: PNode;end; uses PT4; var P1,P2: PNode; n: integer; begin Task('Pointer2'); read(P1); n:=0; while P1<>nil dobegin 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) • Примитивы, перья и кисти functionRGB(r,g,b: integer): integer; procedure SetPixel(x,y,color: integer);procedureLine(x1,y1,x2,y2: integer);procedure Circle(x,y,r: integer);procedureEllipse(x1,y1,x2,y2: integer);procedureRectangle(x1,y1,x2,y2: integer);procedure FloodFill(x,y,color: integer);procedurePie(x,y,r,a1,a2: integer);procedure Polygon(var a; n: integer);procedure Polyline(var a; n: integer);procedure SetPenColor(color: integer);function PenColor: integer;procedure SetPenWidth(w: integer);function PenWidth: integer;procedure SetPenStyle(ps: integer);function PenStyle: integer;procedure SetBrushColor(color: integer);function BrushColor: integer;procedure SetBrushStyle(bs: integer);function BrushStyle: integer;
Модуль GraphABC (2) • Текст и графическое окно procedureTextOut(x,y: integer; s: string);procedure SetFontColor(color: integer);functionFontColor: integer;procedure SetFontSize(sz: integer);functionFontSize: integer;procedure SetFontName(name: string);functionFontName: string;procedure SetFontStyle(fs: integer);functionFontStyle: integer;fsNormal fsBold fsItalic fsBoldItalic fsUnderlinefsBoldUnderline fsItalicUnderline fsBoldItalicUnderline procedure ClearWindow;procedure SetWindowWidth(w: integer);functionWindowWidth: integer;procedure SetWindowHeight(h: integer);functionWindowHeight: integer;procedure SetWindowCaption(s: string);functionWindowCaption: string;
Модуль GraphABC (3) • Рисунки: дескрипторная модель. Каждый рисунок имеет описатель – целое число function LoadPicture(fname: string): integer;procedure DrawPicture(n,x,y: integer);procedure DestroyPicture(n: integer);function PictureWidth(n: integer): integer;function PictureHeight(n: integer): integer;function CreatePicture: integer;procedure CopyToPicture(n: integer; r: Rect);procedure SavePicture(n: integer; fname: string); n:=LoadPicture('demo.bmp'); w:=PictureWidth(n); h:=PictureHeight(n); SetBrushColor(clWhite);for i:=0 to WindowWidth-w dobegin 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) doSleep(100); DestroySound(snd); end.
Модуль Events. Простейшие события OnMouseDown: procedure (x,y,mb: integer); OnMouseUp : procedure (x,y,mb: integer); OnMouseMove: procedure (x,y,mb: integer); OnKeyDown : procedure (key: integer); OnKeyUp: procedure (key: integer); OnKeyPress: procedure (ch: char); OnResize: procedure; OnClose: procedure;
События OnMouseDown и OnMouseMove uses GraphABC,Events; procedure MouseDown(x,y,mb: integer); begin MoveTo(x,y); end; procedure MouseMove(x,y,mb: integer); beginif mb=1 then LineTo(x,y); end; begin OnMouseDown:=MouseDown; OnMouseMove:=MouseMove end.
Событие OnKeyDown beginx:=WindowWidth div 2; y:=WindowHeight div 2;SetPenStyle(psClear);OnKeyDown:=KeyDown;SetBrushColor(clBlack); Ellipse(x-9,y-9,x+9,y+9); end. uses GraphABC,Events; var x,y: integer; procedure KeyDown(Key: integer); beginSetBrushColor(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;
Модуль 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 unitGraphLib; 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;beginfor 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; procedureExecute(n: integer; p: pointer);var pi: pinteger; a,b: pinteger;begincase n of1: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=classconstructor Create; destructor Destroy; function TypeName: string; function ToString: string; end;
Определение методов внутри класса RectG=class(Figure) privatew,h: integer; publicconstructor 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; beginClone:=RectG.Create(x,y,x+w,y+h); end; end; type Figure=class privatex,y: integer; publicconstructor Create(xx,yy:integer);begin x:=xx; y:=yy;end;procedure Draw; beginend;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;
Определение методов внутри и вне класса procedure AssocArray.setProp(ind:string; value: integer);var i: integer;begin i:=words.IndexOf(ind);if i<>0 then nums[i]:=valueelsebegin 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]elsebegin words.add(ind); nums.add(0); Result:=0;end;end; type AssocArray=classprivate words: StringArray; nums: IntArray;procedure setProp(ind: string; value: integer);function getProp(ind: string):integer;publicconstructor 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]:integerread getProp write setProp;property Keys: StringArray read words;property Values: IntArray read nums;end;
Модуль Containers • IntSetRealSetStringSetObjectSet • IntAssocArray RealAssocArray StringAssocArray ObjectAssocArray Классы контейнеров: • IntArray RealArray StringArray ObjectArray • IntStackRealStack StringStack ObjectStack • IntQueueRealQueue StringQueue ObjectQueue
Модуль Containers – интерфейсы классов StringStack=classconstructor Create;destructor Destroy;procedure Push(s: string);function Pop: string;function Top: string;function IsEmpty: boolean;end; RealQueue=classconstructor Create;destructor Destroy;procedure Push(r: real);function Pop: real;function First: real;function Last: real;function IsEmpty: boolean;end; IntArray=classconstructor 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;
Модуль Containers – интерфейсы классов IntAssocArray=classconstructor Create; destructor Destroy; procedure Clear; procedure Add(key: string; value: integer); function Find(key: string): boolean; procedure Delete(key: string); procedure Reset; procedure MoveFirst; procedure MoveLast; procedure Next; procedure Prev; function CurrentKey: string; function CurrentValue: integer; function EoA: boolean; procedure Put(key: string; value: integer);function Get(key: string): integer;property Items[key: string]: integerread get write put; function Count: integer; function IsEmpty: boolean; procedure Print; procedure Println;procedure Print(delim: string); procedure Println(delim: string); end; ObjectSet=class OwnsObjects: boolean;constructor Create;destructor Destroy;procedure Include(o: Object);procedure Exclude(o: Object);function Find(o: Object): boolean;procedure Delete(o: Object);procedure Reset;procedure MoveFirst;procedure MoveLast;procedure Next;procedure Prev;function Current: Object;function Eos: boolean;function First: Object;function Last: Object;procedure Clear;procedure Union(s1,s2: ObjectSet);procedure Intersect(s1,s2: ObjectSet);procedure Difference(s1,s2: ObjectSet);function Embed(s: ObjectSet): boolean;function Count: integer;function IsEmpty: boolean;procedure Print;procedure Println;procedure Print(delim: string);procedure Println(delim: string);end;
Пример 1:сортировка по критерию в динамических массивах объектов 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. uses Containers;typePupil=class age: integer; name: string;constructor Create(name: string; age: integer);beginSelf.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).ageend; function LessName(o1,o2: Object): boolean;begin Result:=Pupil(o1).name<Pupil(o2).name end;
Пример 2:ассоциативные массивы uses Containers; varZoo: IntAssocArray; begin Zoo:=IntAssocArray.Create;Zoo['бегемоты']:=8;Zoo['крокодилы']:=6;Zoo['жирафы']:=1;Zoo['страусы']:=Zoo['страусы']+1;Zoo.Println;Zoo.Reset;whilenotZoo.EoA dobegin writeln(Zoo.CurrentKey,' ',Zoo.CurrentValue);Zoo.Next;end;Zoo.Destroy;end.
Библиотека визуальных компонентов VCL. Основные требования • Простая иерархия компонентов • Обработчики событий – внешние процедуры, а не методы, как в Delphi • Два типа обработчиков – обычные и расширенные • Все компоненты создаются явно, двоичный файл формы .dfm отсутствует • Все компоненты автоматически разрушаются при завершении программы. Деструкторы компонентов вызывать необязательно
Пример 1 программы PABC Forms usesVCL; 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. Экран более сложной программы