Времена старого и доброго Pascal закончились. Пришло время новых сред разработки под этот язык. Появилось множество диалектов этого языка. Хотя все они имели что-нибудь общее. Сегодня поговорим о диалекте PascalABC.Net и о том почему же стоит от него отказаться, если Вы всерьез хотите заняться программированием и считаете, что это Ваше будущее.
Первый взгляд
Представьте, что Вы новичок. Даже если это не так. Вообразите, что Вы первый раз пришли в мир программирования и первое что Вам дают изучить — язык Pascal. И говорят, конечно же, писать именно в среде PascalABC.Net. Хорошо, Вы садитесь и начинаете потихоньку изучать сам язык. Ваш скил поднимается и Вам все больше хочется узнать чего-то нового.
И вот Вы уже не тот новичок каким были в начале, а человек со средним уровнем знаний программирования. И начиная именно с этого момента — Вы начинаете ощущать некоторый дискомфорт при работе в PascalABC.Net. И чем дальше продвигается изучение языка, и платформы .Net, тем сильнее Вы чувствуйте, что писать то становится не очень удобно.
Паскаль с Нуля. Оператор вывода. Урок 1
Вы начинаете замечать некоторую нестабильность самой IDE. К слову, Вы уже, наверняка, столкнулись с проблемой при нажатии Ctrl+Z — вылетании ошибки в самой PascalABC.Net при попытке отмены какого-нибудь действия, после чего о редактировании кода и не могло быть и речи. Это только одна проблема из немногих, с которыми Вам предстоит познакомиться.
А что же дальше?
А дальше начинается самое интересное. Вы использовали когда-нибудь при работе обобщения? Если нет, то это стоит сделать, так как именно здесь Вы встретите много подводных камней, и, наверняка, это перевернет Ваше положительное мнение о PascalABC.Net на противоположное. Для примера:
type ft = () -> integer; begin var f: ft := () -> 0; var a := Arr(0).Select f); end.
Есть у нас тип функции ft, есть массив (из одного элемента — нуля). Здесь мы вызываем Select для преобразования каждого элемента массива в функцию. Однако, при наведении на a анализатор кода вместо того, чтобы показывать sequence of ft, показывает sequence of integer.
А при наведении на Select вместо того, чтобы показывать ft показывает нам загадочное TResult (которое ни о чём не говорит). И это в самой последней версии этой IDE. Почему? Дальше поймете по чему.
Не используйте обобщения
Да, именно так звучит этот заголовок. Не думайте, что я шучу. Я на полном серьезе. Если хотите использовать их — идите и пишите на C#, поскольку в PascalABC.Net они реализованы лишь для галочки (слишком некачественно). К примеру, есть у нас обобщенный тип (автокласс) TA, имеющий один шаблонный параметр T. От него наследуется другой класс — TB, добавляя еще один шаблонный параметр-тип T2.
type TA = auto class X: T; end; TB = class(TA) Y: T2; constructor Create(x: T; y: T2) := (self.X, self.Y) := (x, y); end; begin end.
И всего то. Но компиляцию это не проходит. Компилятор вылетает с ужасающей ошибкой:
Internal compiler error in module [pabcnetc.exe] :’System.Exception: System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в PascalABCCompiler.NETGenerator.ILConverter.ConvertCommonGenericInstanceTypeMembers(ICommonGenericTypeInstance value)
в PascalABCCompiler.NETGenerator.ILConverter.ConvertFromTree(IProgramNode p, String TargetFileName, String SourceFileName, CompilerOptions options, String[] ResourceFiles)
в PascalABCCompiler.Compiler.Compile()’
Нормально? Не думаю. А вот и ссылка на этот Issue. Сразу можно сделать два вывода: не надо использовать автоклассы в этом компиляторе с обобщениями.
Не используйте форматирование
Звучит забавно, но как можно не пользоваться форматированием кода при написании программ? И почему нет? Да, пожалуй звучит так, но помните, что мы пишем именно в PascalABC.Net. И сразу пример почему нет:
type TA = class property Prop1: real read 0 write begin end; end; begin end.
А теперь нажмите Ctrl+Shift+F (форматировать код) и на выходе будет красоваться это:
type TA = class property Prop1: real read function#GetGen2(real read 00write procedure#SetGen1(valuereal read 0 write begin endbegin endproperty Prop1: real read#GetGen2 0 write#SetGen1; end; TA = class property Prop1: real read 0 write begin end; end; begin end.
А теперь представьте, что этот проект — что то важное для Вас и Вы пользовались этими расширенными свойствами не один раз. А потом взяли все и отформатировали. Учтите, что не стоит забывать об ошибке с Ctrl+Z, поэтому может получиться так, что отменить Вы это уже не сможете.
Не самое лучшее отношение разработчиков к пользователям и их просьбам
Да-да, именно так. Вы когда нибудь общались с ними на форуме? Если нет, то попробовать стоит, зрелище это не из веселых. Например, сколько я не просил исправить баг с Ctrl+Z, ничего от этого не изменилось — было либо полное игнорирование, либо что-то наподобие:
Мы не можем это сделать. Это слишком трудно.
Я не цитировал. Но общий смысл таков, что делать им это лень. Извините меня, но вы же сами захотели эту среду сделать (хотя это не ваша основная работа), так будьте добры делать ее качественно. Такое отношение не только убивает желание помогать разработчикам исправлять баги в среде, но и писать вообще в ней.
А куда идти, если все так плохо?
Буду краток — на C#, ребята из Microsoft постарались и сделали язык намного качественнее, чем разработчики PascalABC.Net свой.
Заключение
Да, я осветил лишь малость тех проблем, которые есть в этой среде, но помните, что хоть PascalABC.Net и тянется к C# она никогда им не станет — проще будет написать среду заново, чем исправлять уже существующую (чего не хотят делать разработчики, хотя это их вина, что IDE в таком состоянии).
P.S. А вот и пример бага, который проявляется при написании простейших программ. И вот еще (с массивами).
Источник: habr.com
Принцип работы. Система Pascal ABC (или аналогичный вариант ‑ Pascal ABC.Net) ‑ современная бесплатная среда программирования
Система Pascal ABC (или аналогичный вариант ‑ Pascal ABC.Net) ‑ современная бесплатная среда программирования, предназначенная для обучения последнему на языке Паскаль и ориентированная на студентов младших курсов. Данная среда, не уступая по возможностям морально устаревшему Turbo Pascal’ю, вместе с тем обладает существенно более удобным интерфейсом и позволяет обучаемым осуществить переход от простейших программ к модульному, объектно-ориентированному, событийному и компонентному программированию. Многие концепции в Pascal ABC сознательно упрощены, что позволяет использовать их на более ранних этапах обучения. Например, модуль графики обходится без объектов, хотя его возможности практически совпадают с графическими возможностями Borland Delphi.
Рис. 2. Окно программы Pascal ABC
Pascal ABC ‑ программа, которая совмещает в себе полноценный курс заданий,[1] оказывающий существенную помощь в овладении данным языком программирования: курс заданий Pascal ABC обеспечивает легкий переход к модульному программированию, учит использовать переменные и составлять собственные задачи.
В программе имеется несколько модулей, с помощью которых пользователи смогут работать с векторной графикой, с растровыми изображениями. Имеются модули для создания таймеров со звуком. Имеется ряд модулей, с которыми можно легко создавать простые геометрические задачи, уравнения и решать их.
Имеется модуль для работы со структурными данными. Pascal ABC обладает указателями, которые необходимы для комплексных чисел и работы с ними. Имеются арифметические модули, которые помогут создавать логические задачи, программы и уравнения, основанные на геометрии, алгебре и высшей математике.
Рис. 3. Окно рабочей программы с использованием графики
Содержание работы
Работа предполагает базовые знания школьного курса языка программирования Turbo Pascal. Запустить программу Pascal ABC. Ознакомиться с работой программы, строкой меню, окном редактора кода и ввода-вывода команд. Воспроизвести примеры, приведенные ниже, используя, где необходимо, преобразование команд «школьного алгоритмического языка» в операторы паскаля. По указанию преподавателя выбрать вариант из Приложения В. По завершении работы результаты сохранить в файл.
Пример 1. Пешеход шел по пересеченной местности. Его скорость движения по равнине v1 км/ч, в гору – v2 км/ч и под гору – v3 км/ч. Время движения соответственно t1, t2 и t3 ч. Какой путь прошел пешеход?
1. Ввести v1, v2, v3, t1, t2, t3.
6. Вывести значение S.
Пример 2. Дано натуральное трехзначное число n, в записи которого нет нулей. Составить алгоритм, который возвращает значение истина, если верно утверждение: «число n кратно каждой своей цифре», и ложь – в противном случае.
1. Ввести число n
4. C:= n div 10 mod 10
5. L:= (n mod A=0) and (n mod B=0) and (n mod C=0)
На приведенной выше схеме div и mod соответственно операции деления нацело и получения остатка от целочисленного деления. В фигурных скобках записаны пояснения (комментарии) к операторам.
Для проверки работоспособности алгоритма необходимо задать значения входных переменных, вычислить конечный результат по алгоритму и сравнить с результатом ручного счета.
Пример 3. Составить алгоритм и программу, запрашивающую имя и затем приветствующую его обладателя.
Здесь последний оператор ReadLn позволяет видеть на экране результаты работы программы, пока не будет нажата клавиша < Enter >.
Пример 4. Определить объём и площадь боковой поверхности цилиндра с заданными радиусом основания R и высотой H.
Program Cylinder; Uses Crt; Crt> Var R, H, V, S: Real; BEGIN ClrScr; Write(‘Введите высоту цилиндра: ‘); ReadLn(H); Write(‘Введите радиус основания: ‘); ReadLn(R); V:= Pi * R * R * H; S:= 2 * Pi * R * H; WriteLn; WriteLn(‘Объем цилиндра = ‘, V: 5: 2); WriteLn(‘Площадь боковой поверхности = ‘, S: 5: 2); ReadLn END.
Воспользуйтесь поиском по сайту:
studopedia.org — Студопедия.Орг — 2014-2023 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с) .
Источник: studopedia.org
«Дистанционное обучение на языке программирования PascalABC.NET»
Дистанционное обучение на языке программирования PascalABC.NET. Фрактылы и их виды.
Вы уже знаете о суперспособностях современного учителя?
Тратить минимум сил на подготовку и проведение уроков.
Быстро и объективно проверять знания учащихся.
Сделать изучение нового материала максимально понятным.
Избавить себя от подбора заданий и их проверки после уроков.
Наладить дисциплину на своих уроках.
Получить возможность работать творчески.
Просмотр содержимого документа
«»Дистанционное обучение на языке программирования PascalABC.NET»»
Мараник Любовь Викторовна
учитель математики и информатики
ГКОУ «СОШ при УУИС»
«Дистанционное обучение на языке программирования Паскаль АВС.NET»
Актуальность: Данная работа возникла в связи с интересом к дисциплине Компьютерная графика, на которой мы узнали о таком новом для нас понятии «Фрактал». Тут же возникла попытка создать собственное самоподобное изображение. Что в дальнейшем привело к попыткам запрограммировать полученные изображения средствами изученного к тому времени языка программирования Pascal ABC.
Результатом данного исследования стали программы, позволяющие строить фракталы, написанные на языке Pascal ABC и мною были предприняты попытки менять программу так, чтобы можно было программировать фрактал посредством цикличного построения самоподобных форм с использованием рекурсивных и не рекурсивных алгоритмов.
Проблема: при исследовании существующих программ для построения фрактальных изображений возник вопрос о возможности написать программу таким образом, чтобы она позволяла строить фракталы через программирование самоподобных форм.
Изучив данную проблему мы пришли к выводу, что известные знания о фракталах, способах их построения, посредством программирования на языке Pascal, используются во всем мире. Мы лишь попробуем повторить программы, созданные посредством рекурсивных и не рекурсивных алгоритмов, которые позволят нам получить известные самоподобные формы.
2. ОСНОВНОЕ СОДЕРЖАНИЕ.
Цель: изучение возможностей применения рекурсивных и нерекурсивных алгоритмов при создании фрактальных изображений на языке программирования Pascal ABC.
— изучить понятия «фрактал», «самоподобие», «язык программирования», «рекурсия», «рекурсивный алгоритм», «рекурсивная программа»;
-выявить сущность рекурсивных и нерекурсивных алгоритмов, приемы и способы программирования фракталов;
— провести экспериментальное программирование — изменение глубины рекурсии и других параметров для построения собственных фракталов, используя изученные способы;
Зная способы программирования фракталов, разбираясь в сути рекурсивных алгоритмов можно построить собственное фрактальное изображение.
Методы исследования:
Анализ, синтез, сравнение, эксперимент, моделирование, программирование.
— изучены понятия «фрактал», «самоподобие», «язык программирования», «рекурсия», «рекурсивный алгоритм», «рекурсивная программа»;
— выявлены существующие приемы и способы программирования фракталов;
— реализованы существующие программы для построения собственных фракталов, с использованием рекурсивных и не рекурсивных алгоритмов;
При составлении программ по созданию фракталов, выяснилось, что знаний в программировании недостаточно, что бы строить сложные цепочки фракталов, поэтому работу по изучению способов программирования фракталов следует продолжить, изучая при этом и возможности других языков программирования.
Мною изучены понятия:
Фрактал – (лат. fractus — дроблёный, сломанный, разбитый) — математическое множество, обладающее свойством самоподобия, то есть однородности в различных шкалах измерения.
Самоподобие, самоподобный объект — объект, в точности или приближённо совпадающий с частью себя самого (то есть целое имеет ту же форму, что и одна или более частей). Самоподобие есть характеристическое свойство фрактала. Многие объекты реального мира обладают свойством самоподобия.
Язык программирования Паскаль — язык программирования общего назначения. Один из наиболее известных языков программирования, используется для обучения программированию в школах, ССУЗах, ВУЗах, в дальнейшем он служит базой для ряда других языков.
Рекурсия – в определении, описании, изображении какого-либо объекта или процесса внутри самого этого объекта или процесса, то есть ситуация, когда объект является частью самого себя.
Глубина рекурсии. В программировании рекурсия — вызов функции из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия), например, функция А вызывает функцию В , а функция В — функцию А. Количество вложенных вызовов функции или процедуры называется глубиной рекурсии.
Рекурсивный алгоритм. Рекурсивная программа. Рекурсивная программа позволяет описать повторяющееся или даже потенциально бесконечное вычисление, причём без явных повторений частей программы и использования циклов. Чтобы вычисления не происходили бесконечно, необходимо наличие условия завершения, позволяющее программе прекратить вызывать себя.
В программировании рекурсию можно определить как сведение какой-то задачи к такой же, но использующей более простые данные.
Вывод: таким образом, рекурсивная программа должна иметь как минимум два пути выполнения, один из которых предполагает рекурсивный вызов (случай «сложных» данных), а второй – без рекурсивного вызова (случай «простых» данных).
Рекурсивную программу всегда можно преобразовать в нерекурсивную (итеративную, использующую циклы), которая выполняет те же вычисления. И наоборот, используя рекурсию, любое вычисление, предполагающее использование циклов, можно реализовать, не прибегая к циклам.
Мною были построены и изучены следующие фрактальные объекты:
- Дерево Пифагора
- Ковер Серпинского
- Множество Мандельброта
- Треугольник Серпинского
- Фрактальное дерево
Рассмотрим их более подробно:
- Д
ерево Пифагора
Листинг программы: uses CRT, GraphABC; Procedure Rect(x1, y1, l: Integer; a1: Real); Begin MoveTo(x1, y1); LineTo(x1 + Round(l * cos(a1)), y1 — Round(l * sin(a1))); LineTo(x1 + Round(l * sqrt(2) * cos(a1 + pi/4)), y1 — Round(l * sqrt(2) * sin(a1 + pi/4))); LineTo(x1 + Round(l * cos(a1 + pi/2)), y1 — Round(l * sin(a1 + pi/2))); LineTo(x1, y1) End; Procedure Draw(x, y, l, a: Real); Begin If l 4 Then Begin Rect(Round(x), Round(y), Round(l), a); Draw(x — l*sin(a), y — l * cos(a), l / sqrt(2), a + pi / 4); Draw( x — l * sin(a) + l / sqrt(2) * cos(a + pi/4), y — l * cos(a) — l / sqrt(2) * sin(a + pi/4), l / sqrt(2), a — pi/4) End End; Begin SetWindowCaption(‘. . . ‘); SetWindowSize(730,500); ClearWindow; Draw(280, 460, 100, 0); Repeat Until KeyPressed End.
Это также дерево Пифагора: uses GraphABC; const max = 3; procedure LineTo1(x, y : Integer; l, u : Real); begin Line(x, y, Round(x + l * cos(u)), Round(y — l * sin(u))); end; procedure Draw(x, y : Integer; l, u : real); begin if l max then begin l := l * 0.7; LineTo1(x, y, l, u); x := Round(x + l * cos(u)); y := Round(y — l * sin(u)); Draw(x, y, l, u + pi / 4); Draw(x, y, l, u — pi / 6); end; end; begin SetWindowCaption(‘Фракталы: Дерево Пифагора’); SetWindowSize(730,500); ClearWindow; Draw(320, 460, 200, pi/2) end.
- Ковер Серпинского
Uses CRT, GraphABC; Const Z = 6; Var x1, y1, x2, y2, x3, y3: Real; Procedure Serp(x1, y1, x2, y2: Real; n: Integer); Var x1n, y1n, x2n, y2n: Real; Begin If n 0 Then Begin x1n := 2*x1/3 + x2 / 3; x2n := x1/3 + 2*x2 / 3; y1n := 2*y1/3 + y2 / 3; y2n := y1/3+2*y2 / 3; Rectangle(Round(x1n), Round(y1n), Round(x2n), Round(y2n)); Serp(x1, y1, x1n, y1n, n-1); Serp(x1n, y1, x2n, y1n, n-1); Serp(x2n, y1, x2, y1n, n-1); Serp(x1, y1n, x1n, y2n, n-1); Serp(x2n, y1n, x2, y2n, n-1); Serp(x1, y2n, x1n, y2, n-1); Serp(x1n, y2n, x2n, y2, n-1); Serp(x2n, y2n, x2, y2, n-1) End End; Begin SetWindowCaption(‘Ковер Серпинского’); SetWindowSize(500,500); ClearWindow; Rectangle(20, 20, 460, 460); Serp(20, 20, 460, 460, Z); Repeat Until Keypressed End.
- Множество Мандельброта
uses GraphABC; const n=255; max=10; var x,y,x1,y1,cx,cy: real; i,ix,iy: integer; // z=z^2+c begin SetWindowSize(1000,800); SetWindowCaption(‘Фрактал: множество Манлеььброта’); for ix:=0 to WindowWidth-1 do for iy:=0 to WindowHeight-1 do begin x:=0; y:=0; cx:=0.002*(ix-720); cy:=0.002*(iy-150); for i:=2 to n do begin x1:=x*x-y*y+cx; y1:=2*x*y+cy; if (x1max) or (y1max) then break; x:=x1; y:=y1; end; if i=n then SetPixel(ix,iy,clRed) else SetPixel(ix,iy,RGB(255,255-i,255-i)); end; end.
- Треугольник Серпинского
Uses CRT, GraphABC; Const Z = 7; Procedure tr(x1, y1, x2, y2, x3, y3: Real); Begin Line(Round(x1), Round(y1), Round(x2), Round(y2)); Line(Round(x2), Round(y2), Round(x3), Round(y3)); Line(Round(x3), Round(y3), Round(x1), Round(y1)); End; Procedure draw(x1, y1, x2, y2, x3, y3: Real; n: Integer); Var x1n, y1n, x2n, y2n, x3n, y3n : Real; Begin If n 0 Then Begin x1n := (x1 + x2) / 2; y1n := (y1 + y2) / 2; x2n := (x2 + x3) / 2; y2n := (y2 + y3) / 2; x3n := (x3 + x1) / 2; y3n := (y3 + y1) / 2; tr(x1n, y1n, x2n, y2n, x3n, y3n); draw(x1, y1, x1n, y1n, x3n, y3n, n — 1); draw(x2, y2, x1n, y1n, x2n, y2n, n — 1); draw(x3, y3, x2n, y2n, x3n, y3n, n — 1) End End; Begin SetWindowCaption(‘треугольник Серпинского’); SetWindowSize(650,500); ClearWindow; tr(320,10,600,470,40,470); draw(320,10,600,470,40,470,Z); Repeat Until KeyPressed End.
- Фрактальное дерево
Uses GraphABC; Procedure Tree(x, y: Integer; a: Real; l: Integer); Var x1, y1: Integer; p, s : Integer; i : Integer; a1 : Real; Begin If l x1 := Round(x + l*cos(a)); y1 := Round(y + l*sin(a)); If l 100 Then p := 100 Else p := l; If p Begin If Random 0.5 Then SetPenColor(clLime) Else SetPenColor(clGreen); For i := 0 To 3 Do Line(x + i, y, x1, y1) End Else Begin SetPenColor(clBrown); For i := 0 To (p div 6) Do Line(x + i — (p div 12), y, x1, y1) End; For i := 0 To 9 — Random(9) Do Begin s := Random(l — l div 6) + (l div 6); a1 := a + 1.6 * (0.5 — Random); x1 := Round(x + s * cos(a)); y1 := Round(y + s * sin(a)); Tree(x1, y1, a1, p — 5 — Random(30)) End End; Begin SetWindowCaption(‘Фрактальное дерево’); SetWindowSize(700,600); Randomize; Tree(350, 580, 3*pi/2, 200) End. Экспериментальное моделирование собственных фракталов В своих исследованиях я пытался, используя разработанные алгоритмы модифицировать фрактальные изображения и построить свои фракталы. В предложенной работе мной выполнено программирование своего изображения фрактала на языке программирования Pascal.
uses crt, graphABC; var n,i,x1,x2,x3,y1,y2,y3: integer; begin x1:=150;x2:=250;x3:=200;y1:=270;y2:=270;y3:=180; setpenwidth(5); for n:=1 to 16 do begin if (n mod 2 =0) then begin setpencolor(clred); moveto(x1,y1);lineto(x2,y2);lineto(x3,y3);lineto(x1,y1) end else begin setpencolor(clgreen); moveto(x1,y1);lineto(x2,y2);lineto(x3,y3);lineto(x1,y1); end; x1:=x1-8;x2:=x2+8;y1:=y1+4;y2:=y2+4;y3:=y3-8; end; end.
ЗАКЛЮЧЕНИЕ В процессе исследования проведена следующая работа: — изучены понятия, «фрактал», «самоподобие», «язык программирования», «рекурсия», «рекурсивный алгоритм», «рекурсивная программа»; — выявлены существующие приемы и способы программирования фракталов; — проанализированы программы для построения фракталов, с использованием изученных способов; Следует отметить, что при проведении эксперимента выяснилось, что зная способы программирования фракталов, разбираясь в сути рекурсивных алгоритмов можно создать программы для построения собственных геометрических фракталов, а затем и многомерных поверхностей. Именно поэтому работу по изучению способов программирования следует продолжить, изучая при этом возможности других языков программирования и попытаться составить программы для построения многомерных поверхностей. Практическое применение данного вопроса подразумевает возможность создания средствами программирования живых моделей любых фрактальных объектов на основе составления программ для самоподобных форм.
- Википедия. – (http://wikipedia.org/wiki )
- Способы построения фракталов. – ( http://sworm.narod.ru/ )
- Фракталы на языке PascalABC http://fraktalsworld.blogspot.ru/p/blog-page_25.htm
- Фракталы в программировании http://ru.wikipedia.org/wiki/
- Формулы построения фракталов http://pascal.proweb.kz/index.php?page=92
- Шредер М. Фракталы, хаос, степенные законы / Шредер М.- М., «Просвещение», 2001 г., 528с.
Источник: kopilkaurokov.ru