Коротко о главном
Данный текст содержит краткий обзор особенностей PascalABC.NET.
- PascalABC.NET – легковесная и мощная среда разработки программ с подробной справочной системой, средствами подсказки по коду, автоформатированием, встроенным отладчиком и встроенным дизайнером форм. Интегрированная среда разработки PascalABC.NET ориентирована на создание проектов малой и средней сложности, а также на обучение современному программированию.
- PascalABC.NET – мощный и современный язык программирования. По предоставляемым возможностям он превосходит язык Delphi и содержит практически все возможности языка C#.
- PascalABC.NET опирается на платформу Microsoft .NET — её языковые возможности и библиотеки, что делает его гибким, эффективным, постоянно развивающимся. Кроме того, можно легко сочетать библиотеки , разработанные на PascalABC.NET и других .NET-языках.
- Компилятор PascalABC.NET генерирует код, выполняющийся так же быстро, как и код на C#, и несколько медленнее, чем код на C++ и Delphi.
- PascalABC.NET является представителем линейки современных языков Паскаль вместе с Delphi XE и Oxygene.
- Мнение, что язык Паскаль устарел и утрачивает свои позиции, основано на представлении о старом Паскале и старых средах программирования (например, Free Pascal с его несовременной консольной оболочкой и языком Delphi образца 2002 года). К сожалению, масса отечественной учебной литературы с упорством, достойным лучшего применения, ориентируется на отживший Turbo Pascal с древней консольной оболочкой, бедной графической библиотекой и устаревшими средствами объектно-ориентированного программирования, развивая у обучающихся стойкое отвращение к языку Паскаль вообще.
- PascalABC.NET расширен современными языковыми возможностями для легкого, компактного и понятного програмирования.
- PascalABC.NET – достаточно зрелая среда. Ее прототип – учебная система Pascal ABC – появилась в 2002 году. PascalABC.NET – развивающаяся среда. Ведутся разработки новых языковых возможностей, новых библиотек.
Далее приводится ряд программ с короткими комментариями, раскрывающих возможности и особенности языка PascalABC.NET.
Тексты программ располагаются в рабочей папке (по умолчанию C:\PABCWork.NET) в подпапке Samples\!MainFeatures.
Для запуска программ данное окно должно быть открыто через пункт меню «Помощь/Коротко о главном» так, чтобы оно не полностью закрывало окно оболочки PascalABC.NET.
- AssignExt.pas. Данный пример иллюстрирует использование расширенных операторов присваивания += -= *= /= для целых и вещественных. Оператор /= для целых, разумеется, запрещен.
- BlockVar.pas. Переменные могут описываться внутри блока begin-end и инициализироваться при описании. Это крайне удобно для промежуточных переменных, а в PascalABC.NET в силу особенностей реализации еще и ускоряет доступ к переменным процентов на 30.
- AutoVars.pas. Если переменная инициализируется при описании, то ее тип можно не указывать: он определяется по типу правой части (автоопределение типа). Переменную — параметр цикла for можно описывать прямо в заголовке цикла, сочетая это с автоопределением типа.
- SimpleNewFeatures.pas. Пример, объединяющий возможности из предыдущих трех примеров.
- WriteAll.pas. Процедура write выводит любой тип. В частности, она выводит все элементы множества. Если тип ей неизвестен, то она выводит имя типа.
- WriteFormat.pas. Стандартная процедура WriteFormat позволяет осуществлять форматированный вывод. Вид форматной строки заимствуется из .NET.
- StandardTypes.pas. В этой программе приведены все стандартные целые и вещественные типы. Программа выводит их размеры.
- RandomDiap.pas. К функциям генерации случайных чисел добавилась Random(a,b), возвращающая случайное целое в диапазоне [a,b]. Процедуру Randomize в начале программы вызывать не надо.
- RealExtNums.pas. Действия с вещественными значениями не могут в .NET привести к переполнению. При некорректных операциях (деление на 0, переполнение или взятие логарифма отрицательного числа) мы получим либо значение «бесконечность», либо значение «NaN» (не число).
- Foreach.pas. Оператор foreach предназначен для цикла по контейнерам, таким как массивы, множества и контейнеры стандартной библиотеки (например, List). Элементы контейнера доступны только на чтение.
- Amp.pas. Ключевые слова могут использоваться в качестве имен, в этом случае перед ними следует ставить значок & снятия атрибута ключевого слова. Кроме того, ключевые слова могут использоваться в качестве полей. Например, &Type или System.Type.
- CharFunc.pas. Символы Char хранят Unicode и поэтому занимают 2 байта. Функции Ord и Chr работают именно с Unicode. Для совместимости функции OrdAnsi и ChrAnsi работают в однобайтовой кодировке Windows.
- StringTypes.pas. Строки string занимают память переменной длины и проецируются на .NET-тип System.String. Однако, в отличие от NET-строк они изменяемы и индексируются с 1. Для работы со строками фиксированной длины следует использовать тип string[n] или shortstring=string[255]. В частности, типизированные файлы допустимы только для коротких строк.
- StringMethods.pas. Строки string имеют ряд методов как .NET-классы. В этих методах предполагается, что строки индексируются с нуля.
- StringInteger.pas. Все типы — классы. Простые типы тоже. Поэтому преобразование строки в целое и вещественное проще выполнять с помощью статических методов Parse соответствующего класса (например, integer.Parse(s)). Преобразование целого или вещественного в строку удобнее выполнять с помощью экземплярного метода ToString (например, r.ToString).
- Enum.pas. Перечислимый тип позволяет обращаться к его константам не только непосредственно, но и используя запись вида ИмяТипа.ИмяКонстанты. Нелишне отметить, что все перечислимые типы — производные от System.Enum.
- Sets.pas. Множества могут иметь произвольный базовый тип. Внутри множество хранится как хеш-таблица, однако при выводе множества в процедуре write его элементы упорядочиваются.
- DynArray.pas. Динамические массивы array of T представляют собой ссылки. Память под них должна выделяться либо вызовом стандартной процедуры SetLength, либо использованием инициализатора вида new T[n]. Процедура SetLength сохраняет старое содержимое массива. Динамические массивы являются классом, производным от класса System.Array, имеющего достаточно богатый интерфейс. Следует упомянуть прежде всего статические методы &Array.Sort и &Array.Resize.
- InitRecords.pas. В записях допустимы инициализаторы полей. Поля записи инициализируются при создании переменной-записи.
- UntypedFile.pas. Бестиповые файлы file изменены по сравнению с Delphi. Отсутствуют процедуры BlockRead и BlockWrite, но в бестиповой файл можно непосредственно записывать данные разных типов. Лишь бы считывание производилось в том же порядке.
- PointerToRef.pas. Имеют место некоторые ограничения для указателей на управляемую память. Так, указатель не может прямо или косвенно указывать на объект класса, память для которого выделена вызовом конструктора.
- Pointers.pas и References.pas. Указатели утрачивают свои позиции. Вместо них мы рекомендуем активно использовать ссылки.
- StructTypeEquiv.pas. В отличие от Delphi, для некоторых типов имеет место структурная, а не именная эквивалентность типов. Так, структурная эквивалентность имеет место для динамических массивов, указателей, множеств и процедурных типов.
Подпрограммы
- FuncParams.pas. Подпрограммы с переменным числом параметров делаются легко добавлением ключевого слова params перед параметром — динамическим массивом. Такой параметр должен быть последним в списке.
- Overload.pas. Перегрузка имен подпрограмм осуществляется без ключевого слова overload.
- ProcVars.pas. Процедурные переменные могут «накапливать» действия при помощи оператора +=. Эти действия можно отключать при помощи оператора -=. Процедурные переменные могут инициализироваться не только обычными подпрограммами, но и статическими и экземплярными методами класса.
- SwapT.pas. Обобщенные подпрограммы имеют простой синтаксис и используются сразу наряду с обычными: procedure Swap(var x,y: T);
- SystemUnitTest.pas. Системный модуль имеет название PABCSystem, а не System, как в Delphi, и подключается неявно первым в списке uses. Причина такого именования состоит в том, что важнейшее пространство имен .NET имеет имя System. Системный модуль объединяет многие подпрограммы модулей System, Math и Utils языка Delphi. Данная программа иллюстрирует пересечение имен во модуле PABCSystem и пространстве имен System.
- MainProgram.pas и MyUnit.pas. Модуль может иметь упрощенный синтаксис (без деления на раздел интерфейса и раздел реализации), что удобно для начального обучения. В этом случае все описанные имена попадают в раздел интерфейса модуля.
- SystemUnitTest.pas. Для использования пространств имен .NET применяется тот же синтаксис, что и при подключении модулей: пространства имен .NET указываются в списке uses. Порядок поиска имен такой же, как и в Delphi — справа налево в списке uses, модуль PABCSystem просматривается последним.
- Main.pas и MyDll.pas. В PascalABC.NET легко создать и использовать dll. Библиотека dll по-существу представляет собой модуль, где вместо ключевого слова unit используется слово library. Для подключения dll к другой программе используется директива компилятора reference.
- CallCS.pas. PascalABC.NET — полноценный .NET-язык, легко совмещаемый с другими .NET-языками. В данном примере показывается, как в программе на PascalABC.NET вызвать функцию из dll, созданной на C#.
- CallNative.pas. PascalABC.NET позволяет легко вызывать функции из обычных dll.
Стандартные графические библиотеки
- GraphABCTest.pas. Графическая библиотека GraphABC заточена под легкое обучение программированию графики. Она скрывает большинство сложностей программирования графики: сама осуществляет перерисовку графического окна в нужный момент и заботится о синхронизации рисования в нескольких обработчиках. Кроме того, графические примитивы — процедурные, а значит, не надо создавать многочисленные классы, как в NET. И еще можно писать графические команды сразу после begin основной программы, то есть использовать графику в несобытийных приложениях.
- MouseEvents.pas. Для графических приложений можно использовать простейшие события мыши и клавиатуры, реализованные как глобальные процедурные переменные.
- ABC.pas. Библиотека векторных графических объектов ABCObjects используется нами для раннего обучения школьников основам объектно-ориентированного программирования. Однако, ее вполне можно использовать для написания несложных графических обучающе-игровых приложений.
- AllFromObject.pas. Все классы — наследники Object, все типы — классы. У каждой переменной можно узнать тип, вызвав метод GetType. Операция typeof для типа возвращает System.Type.
- WriteRecord.pas. Переопределив метод ToString в классе или записи, мы получаем возможность выводить их значения в процедуре writeln
- ClassConstructor.pas. Для статических методов и полей используется ключевое слово class. Статические конструкторы используются для нетривиальной инициализации статических полей.
- PersonInternal.pas. Новый синтаксис конструкторов использует ключевое слово new и является предпочтительным. По этой причине все конструкторы, определенные в старом стиле, должны иметь имя Create. Описание методов может производиться непосредственно внутри классов и записей (как в C++, C# и Java)
- Records.pas. Методы и конструкторы в записях можно использовать так же, как и в классах. От записей нельзя наследовать и записи нельзя наследовать.
- Boxing.pas. При присваивании размерного типа объекту типа Object происходит упаковка. Для распаковки следует использовать явное приведение типа.
- GarbageCollection.pas. Деструкторы отсутствуют. Автоматическая сборка мусора для возврата памяти, распределенной объектной переменной, требует, чтобы на эту память никто более не ссылался, прямо или косвенно. Поэтому для освобождения памяти обычно достаточно присвоить объектной переменной nil.
- OperatorOverloading.pas. Как и в C++ и C#, в PascalABC.NET можно перегружать знаки операций для записей и классов.
- Interf.pas. Интерфейсы семантически совпадают с интерфейсами в C# и Java. Сложная реализация интерфейсов Delphi на основе COM отвергнута.
- Stack.pas. Обобщенные классы (generics) позволяют создавать классы, параметризованные одним или несколькими типами.
- Where.pas. Можно задавать ограничения на типы параметров обобщенных классов. Ограничения бывают трех сортов: наличие у типа-параметра конструктора по умолчанию, наследование его от конкретного класса или реализация интерфейса.
Стандартная библиотека .NET
- DateTime.pas. Данный пример иллюстрирует применение класса DateTime из стандартной библиотеки .NET.
- LinkedList.pas. Данный пример иллюстрирует использование контейнерных классов из стандартной библиотеки .NET.
- WinFormWithButton.pas. Данный пример иллюстрирует создание оконного приложения.
Версия 3.7
Чтобы его набрать в редакторе, следует нажать Alt и набрать 26 на дополнительной клавиатуре.
Программы с лямбда-выражениями благодаря этому становятся более читабельными:
begin ArrGen(10,i → i*i).Print end.
Массивы-значения
Для формирования массива из значений используется конструкция
begin var a := |1,3,5,7,9|; a.Println; var aa := ||1,2,3|,|4,5,6|,|7,8,9||; // массив массивов var aa1 := ||1,2|,|4|*3,|0|*0|; // последний массив - пустой! var b := 10 * |0|; // массив из 10 нулей var m := Matr(|1,2,3|,|4,5,6|,|7,8,9,10|); // матрица. Недостающие элементы заполняются нулями end.
В массивах-значениях допускается использование различных типов: при использовании целых и вещественных типов результат приводится к вещественному, при использовании символов и строк результат приводится к строковому, при использовании объектов базового и производного классов результат приводится к базовому:
## var a := |1,2.5,3|; var b := |'z','sss','q'|; var c := |new Person, new Student|;
Распаковка в переменные из последовательности
Можно распаковвывать значения в переменные из последовательности так, как это сейчас осуществляется для кортежей. Несовпадение размеров при этом проверяется на этапе выполнения, а не на этапе компиляции.
begin var a := Arr(1..3); var (x,y,z) := a; (x,y,z) := a; var aa := ArrRandomInteger(10); var (min,min2) := aa.Order.Distinct; Print(min,min2); (min,min2) := SSet(aa); Print(min,min2); end.
Запись программ без внешнего begin-end
Для записи программ без внешнего begin-end используется префикс ##
При этом способе записи невозможно использовать описание констант, типов (в т.ч. классов), процедур и функций
Область использования данного способа записи — короткие программы, состоящие из нескольких команд:
## var a := ArrRandomInteger; a.Println; a := a[1:] + |a[0]|;
При использовании префикса ### дополнительно подключается модуль SF:
### Pr(RI+RI)
Лямбда-выражение с явно указанными типами может присваиваться переменной без явного указания типа
Раньше лямбда-выражение можно было присвоить только переменной, у которой тип явно определён:
var p: procedure := procedure -> begin Print(1); end; var f: (integer,integer)->integer := function(a,b: integer): integer -> a + b;
Теперь тип переменной в этих случаях можно не указывать:
var p := procedure -> begin Print(1); end; var f := function(a,b: integer): integer -> a + b;
Заметим, что эта возможность работает только с лямбда-выражениями, начинающимися с procedure или function .
Уточнения в языке
Символы в case по строкам
В case по строкам теперь в качестве констант выбора допустимы символы:
var s := ReadString; case s of '1': Print(1); '2': Print(2); end;
Дополнения и изменения в стандартных библиотеках
Модуль Controls
Модуль Controls полностью переработан, включает набор основных элементов управления WPF и может сочетаться с модулями GraphWPF, WPFObjects и Graph3D
В папке PABCWork.NET/Samples/Graph/Controls — более 20 новых примеров.
Пример программы с Controls:
uses GraphWPF,Controls; begin Window.Title := 'Цвета'; Font.Size := 40; LeftPanel(150); var r := Slider('Красный: ',0,255,255,16); var g := Slider('Зеленый: ',0,255,255,16); var b := Slider('Синий: ',0,255,255,16); Button('Выход').Click := procedure → Window.Close; var p: procedure := () → begin var c := RGB(r.Value,g.Value,b.Value); Window.Clear(c); DrawText(GraphWindow.ClientRect,$'R=, G=, B='); end; r.ValueChanged := p; g.ValueChanged := p; b.ValueChanged := p; p; end.
Стандартные функции SeekEof SeekEoln Eoln
Добавлены стандартные функции SeekEof и SeekEoln для совместимости с Delphi
Исправлено поведение стандартной Eoln — теперь на конце файла она возвращает True
Стандартные функции и операции для матриц и одномерных массивов
Для массивов и матриц добавлены новые операции и методы
x in matr MatrEqual(m,m1) m.MatrEqual(m1) ArrEqual(a,a1) a.ArrEqual(a1) MatrByRow, MatrByCol - создают матрицу из последовательности
Изменено поведение методов a.Rows и a.Cols — теперь они возвращают массив массивов
Это позволяет просто решать задачи с матрицами, где надо выполнить какие-то операции со строками-столбцами. Для этого мы вначале расщепляем матрицу на строки (столбцы), делаем с ними нужные преобразования и потом снова собираем матрицу.
Пример. Упорядочить все столбцы матрицы по сумме столбца
## var a := MatrRandom(3,4); a.Println; a := MatrByCol(a.Cols.OrderBy(col->col.Sum)); a.Println;
Тип RealRange
Добавлен стандартный тип RealRange
if x in 2.5..3.4 then Print(1);
Стандартные функции DictStr и DictStrInt
DictStr и DictStrInt генерируют Dictionary и Dictionary соответственно. Могут вызываться с пустым списком параметров
Изменения в GraphWPF
При вызове DrawGraph теперь рисуется сетка, оси, заголовок и значения на осях (автоматически)
Имя типа FontType заменено на FontOptions
DrawText и TextOut могут вызываться с дополнительным параметром FontOptions
Методы Font.WithSize , Font.WithStyle , Font.WithColor , Font.WithName возвращают изменённый шрифт
Добавлен класс Vector и операции над ним и точкой, а также создающая функция Vect
Метод Line можно вызывать в виде Line(p1,p2)
Функции RandomPoint и RandomPoints(n) , возвращающие случайную точку и набор n случайных точек
IDE
В IDE интегрирована библиотека NUnit
Простейшее unit-тестирование можно осуществить если набрать, например, программу
uses NUnitABC; [Test] procedure Test1; begin Assert.AreEqual(3,3); end; [Test] procedure Test2; begin Assert.Contains(2.5,Arr(1,2,3)); end; function IsPrime(n: integer) := (2..n-1).All(i -> n mod i <> 0); [TestCase(2)] [TestCase(3)] [TestCase(5)] procedure Test3(value: integer); begin Assert.IsTrue(IsPrime(value)); end; begin end.
и выбрать из меню “Запустить модульные тесты”
Улучшена подсветка форматных строк (реализовано @Kotov)
В заголовке IDE отображается версия компилятора
Заголовок IDE теперь имеет вид
PascalABC.NET 3.7
Другое
Определён глобальный символ PASCALABC
Это позволяет писать программы, ориентированные на различные компиляторы:
begin Print(1); fpc specific end.
Оптимизирована распаковка из кортежа констант в переменные
begin var (a,b) := (1,2); var c: integer; var d: char; (c,d) := (3,'4'); end.
begin var a := 1; var b := 2; var c,d: integer; c := 3; d := '4'; end.
©2023 PascalABCNET Team. All rights reserved.
Page last updated: 24.08.20
Site last generated: Jul 31, 2023
Программа не может получить доступ к файлу
При завершении программы PascalABC.Net она не выгружается (т.е. процесс написанной программы в диспетчере задач не исчезает) что делает невозможным запуски других програм на паскале, т.к. возникает ошибка «не могу получить доступ к файлу . «.
Как от этого избавиться?
Вот как получается подробно(эта же последовательность на картинках):
Открывю программу в паскале, запускаюю ее
Соответственно появляется процесс в диспетчере задач
Паскаль зависает, я его закрываю,
процессс в диспетчере остается
если заново открыть эту программу в паскале, то возникает ошибка «не могу получить доступ к файлу . «.
папка C:\PABCWork.NET\Output есть, в настройках/опциях компелирования паскля сказано выходные данные генерировать в эту папку и удалять после выполнения
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Процесс не может получить доступ к файлу
Выдает ошибку "method_secant.pas(25) : Ошибка времени выполнения: Процесс не может получить доступ.
48 строка: Ошибка времени выполнения: Процесс не может получить доступ к файлу
program labka; var f:text; procedure rFile (f:text); var str:string; begin reset(f);
Процесс не может получить доступ к файлу, так как этот файл используется другим процессом
Все работает, кроме записи результатов в файл. В разделе описания с файла все норм считывается, а.
Процесс не может получить доступ к файлу, так как этот файл используется другом процессом
По заданию в курсовой необходимо написать программу шифрования двойной табличной перестановкой с.
Pabcwork net что это за папка
Быстрый переход в группу «Пользователи», без надобности написания постов и ожидания.
Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info
Маппинг для сервера
Если вы хотите обновить Ваш сервер новыми доработками — то зайдите в наш раздел. Большой выбор готовых решений от наших пользователей
Моды для сервера
Огромный выбор различных модификаций для Вашего сервера. Пролистайте эти темы! Возможно именно там Вы найдете то, что искали уже давно.
Программы для скриптера
Подборка удобных программ для скриптера
- Форумы
- Языки программирования
- Delphi, Pascal, Python
- Готовые решения
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.
#Azamat
Изучающий
Пользователь
Регистрация 18 Ноя 2015 Сообщения 675 Лучшие ответы 0 Репутация 86 Адрес г.Уфа
Всем привет. Сегодня я расскажу вам, как записывать данные в файл и сохранять через Pascal.
В обычной версии Pascal ABC нет некоторых функций для работы со входными и выходными файлами, поэтому рекомендую скачивать указанную версию (PascalABC.NET)
Для начала скачайте и установите —
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Ссылка на VirusTotal —
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
После установки, открываем программу и создаем файл(вручную) для чтения, например: input.txt в папке PABCWork.NET (Расположение папки у меня: C:\PABCWork.NET), далее пишем любой текст в этом файле и сохраняем.
Теперь начинаем писать саму программу.
var a:string; // Объявление переменной для хранения текста begin // Начало программы assign(input,'input.txt'); // Связывание имени файла с переменной input. Input и output автоматически создаются, и для них не обязательно объявлять переменную. reset(input); // Открываем файл input.txt на чтение. assign(output,'output.txt'); // Связывание имени файла с переменной output. Вместо output.txt вы можете написать любое другое название и расширение. Аналогично со входным файлом. rewrite(output); // Создание файла output.txt если его нету, если он есть, то он открывается и очищается для записи данных в него. read(a); // Чтение текста из файла input.txt Тут не как в обычных программах, у нас открыт файл input.txt для чтения, и поэтому мы не вводим данные с клавиатуры, а берем текст из файла. write(length(a)); // Тут также, если у нас открыт файл для записи, то в экран не выводит, а записывает в наш выходной файл. Вы можете выполнять другие операции или действия. А в этой программе, мы будем записывать в выходной файл длину нашего текста. Это функция - lenght close(input); // Закрываем input.txt close(output); // Закрываем output.txt end. // Конец программы
Теперь можете проверить наш выходной файл. Там должно записаться длина нашего текста.
С вами был #Azamat , это мой первый урок, если где-то допустил ошибки, пишите, исправлю.