Pascal
- Русское название:
- Паскаль
- Дата создания:
- 1970
- Создан под влиянием:
- Повлиял на:
- Парадигма:
- Типизация:
- Принятые расширения файлов:
- .pas
- Диалекты:
- Реализации и версии (свернуть все | развернуть все):
-
- Borland Delphi
- Borland Pascal
- Free Pascal
- GNU Pascal
- HP Pascal
- HiSoft Pascal
- IP Pascal
- Irie Pascal
-
Pascal ABC
- Pascal ABC 1.7
- Pascal ABC 1.8
- Pascal ABC 1.9
- Pascal ABC 2.0
- Pascal ABC 2.1
- Pascal ABC 2.2
- Pascal ABC 2.3
- Pascal ABC 2.4
- Pascal ABC 2.5
- Pascal ABC 2.5.3
- Pascal ABC 2.6
- Pascal ABC 2.6.2
- Pascal ABC 2.6.3
- Pascal ABC 2.6.4
- Pascal ABC 2.6.5
- Pascal ABC 2.7
- Pascal ABC 2.7.2
- Pascal ABC 2.7.3
- Pascal ABC 2.7.4
- Pascal ABC 3.0
- Pascal-XT
- PascalABC.NET
- Prospero Extended Pascal
- Turbo Pascal
- UCSD Pascal
- Virtual Pascal
Pascal (назван в честь Блеза Паскаля) — это чисто процедурный язык программирования, часто использующийся для обучения структурному программированию.
Pascal был разработан Никлаусом Виртом в 1970; вопреки расхожему мнению, он не был исключительно учебным языком, а предназначался для практического применения. Прототипом послужил Algol. Первоначально язык компилировался в байт-код, подобно языку Java.
В 1983 году был принят первый стандарт языка, ISO 7185:1983, который также называют Standard Pascal. Этот стандарт не добавлял в язык новые элементы, а только формально описывал существующие особенности языка. В 1990 году был принят стандарт ISO/IEC 10206, определяющий так называемый Extended Pascal. Основным изменением стало добавление модульности.
Особенностями языка являются строгая типизация и наличие средств структурного (процедурного) программирования. Pascal был одним из первых таких языков. По мнению Н. Вирта, язык должен был способствовать дисциплинированию программирования, поэтому, наряду со строгой типизацией, в Pascal сведены к минимуму возможные синтаксические неоднозначности, а сам синтаксис интуитивно понятен даже при первом знакомстве с языком. Это упрощает написание компиляторов языка.
Кроме того, язык предоставлял ряд встроенных структур данных: записи, массивы, файлы, множества и указатели.
Тем не менее, первоначально язык обладал множеством недостатков: невозможность передачи функциям массивов переменной длины, отсутствие нормальных средств работы с динамической памятью, ограниченная библиотека ввода-вывода, отсутствие средств для подключения функций написанных на других языках, отсутствие средств раздельной компиляции и т. п.
Диалект Object Pascal, разработанный в 1985 году, поддерживает объектно-ориентированное программирование. Существует ряд современных компиляторов, и в настоящее время язык достаточно популярен.
Элементы синтаксиса:
Комментарий до конца строки | нет |
---|---|
Комментарии, которые могут быть вложенными | (*...*) или {...} или (*...} или {...*) |
Регистрозависимость | нет |
Регулярное выражение идентификатора переменной | [A-Za-z_][A-Za-z0-9_]* |
Регулярное выражение идентификатора функции | [A-Za-z_][A-Za-z0-9_]* |
Присваивание значения переменной | varname := value |
Объявление переменной | varname: type |
Объявление переменной с присваиванием значения | varname: type = value |
Группировка выражений | ( ... ) |
Блок | begin ... end |
Тождественное равенство | = |
Тождественное неравенство | <> |
Сравнение | < > <= >= |
Определение функции | function f(p1: type1; p2: type2; ...): returntype; |
Вызов функции | f(a, b, ...) |
Вызов функции без параметров | f |
Последовательность | ; |
Если - то | if condition then trueBlock |
Если - то - иначе | if condition then trueBlock else falseBlock |
Бесконечный цикл | while true do loopBody |
Цикл с предусловием | while condition do loopBody |
Цикл с постусловием | repeat loopBody until condition |
Цикл for - next для диапазона целых чисел с инкрементом на 1 | for i := first to last do loopBody |
Цикл for - next для диапазона целых чисел с декрементом на 1 | for i := last downto first do loopBody |
IDE/Редакторы:
Примеры:
Факториал:
Пример для версий Free Pascal 1.0.6, Free Pascal 2.0.4, Free Pascal 2.2.0, Free Pascal 2.2.4, PascalABC.NET 1.8, Turbo Pascal 4.0, Turbo Pascal 5.0, Turbo Pascal 5.5, Turbo Pascal 6.0, Turbo Pascal 7.0, gpc 20070904Используется рекурсивное определение факториала.
Этот пример работает во всех перечисленных компиляторах, но с несколько разным результатом. В Turbo Pascal, Free Pascal и PascalABC.NET возникает арифметическое переполнение при вычислении факториалов 13-16, но Free Pascal сообщает об ошибке:
13! = Runtime error 215 at $004013C7
$004013C7
$00401449
$004063E0
в то время как Turbo Pascal и PascalABC.NET не обнаруживают ошибку и просто выводят неправильные значения:
13! = 1932053504
14! = 1278945280
15! = 2004310016
16! = 2004189184
Следует отметить, что в версиях Turbo Pascal 3.0 и младше этот пример не работает вообще из-за отсутствия типа данных longint
.
В GNU Pascal пример работает без переполнения.
program factorial;
function fact(n: integer): longint;
begin
if (n = 0) then
fact := 1
else
fact := n * fact(n - 1);
end;
var
n: integer;
begin
for n := 0 to 16 do
writeln(n, '! = ', fact(n));
end.
Числа Фибоначчи:
Пример для версий Free Pascal 2.2.0, Free Pascal 2.2.4, PascalABC.NET 1.8, Turbo Pascal 1.0, Turbo Pascal 2.0, Turbo Pascal 3.0, Turbo Pascal 4.0, Turbo Pascal 5.0, Turbo Pascal 5.5, Turbo Pascal 6.0, Turbo Pascal 7.0, gpc 20070904Этот пример использует рекурсивное определение чисел Фибоначчи.
program fibonacci;
function fib(n:integer): integer;
begin
if (n <= 2) then
fib := 1
else
fib := fib(n-1) + fib(n-2);
end;
var
i:integer;
begin
for i := 1 to 16 do
write(fib(i), ', ');
writeln('...');
end.
Hello, World!:
Пример для версий Free Pascal 2.2.0, Free Pascal 2.2.4, PascalABC.NET 1.8, Turbo Pascal 1.0, Turbo Pascal 2.0, Turbo Pascal 3.0, Turbo Pascal 4.0, Turbo Pascal 5.0, Turbo Pascal 5.5, Turbo Pascal 6.0, Turbo Pascal 7.0, gpc 20070904program helloworld;
begin
writeln('Hello, World!');
end.
Факториал:
Пример для версий Free Pascal 2.0.4, Free Pascal 2.2.0, PascalABC.NET 1.8, Turbo Pascal 1.0, Turbo Pascal 2.0, Turbo Pascal 3.0, Turbo Pascal 4.0, Turbo Pascal 5.0, Turbo Pascal 5.5, Turbo Pascal 6.0, Turbo Pascal 7.0, gpc 20070904Этот пример работает точно так же, как основной рекурсивный пример для Pascal, но использует тип real
для хранения значений факториала. Команда writeln(f:-1:0)
выводит дробное число f
с 0 цифр после десятичной запятой и выравнивает его по левому краю.
program factorial;
function fact(n: integer): real;
begin
if (n = 0) then
fact := 1
else
fact := n * fact(n - 1);
end;
var
n: integer;
begin
for n := 0 to 16 do
writeln(n, '! = ', fact(n):-1:0);
end.
Квадратное уравнение:
Пример для версий Free Pascal 2.2.0, PascalABC.NET 1.8, Turbo Pascal 1.0, Turbo Pascal 2.0, Turbo Pascal 3.0, Turbo Pascal 4.0, Turbo Pascal 5.0, Turbo Pascal 6.0, gpc 20070904В Pascal есть встроенный комплексный тип данных complex
, но команда writeln
не работает с ним напрямую (только через функции Re
и Im
), поэтому существенного удобства от его использования нет. Вычисления проводятся в типе real
. Библиотечная функция halt
, введенная в Extended Pascal, позволяет выйти из текущего блока (в более поздних версиях заменена на exit
).
program Quadratic;
var
A,B,C,D: integer;
begin
write('A = ');
readln(A);
if (A=0) then
begin
writeln('Not a quadratic equation.');
halt;
end;
write('B = ');
readln(B);
write('C = ');
readln(C);
D := B*B-4*A*C;
if (D=0) then
begin
writeln('x = ',-B/2.0/A);
halt;
end;
if (D>0) then
begin
writeln('x1 = ',(-B+Sqrt(D))/2.0/A);
writeln('x2 = ',(-B-Sqrt(D))/2.0/A);
end
else
begin
writeln('x1 = (',-B/2.0/A,',',Sqrt(-D)/2.0/A,')');
writeln('x2 = (',-B/2.0/A,',',-Sqrt(-D)/2.0/A,')');
end;
end.
CamelCase:
Пример для версий Free Pascal 2.2.0, Free Pascal 2.2.4, Turbo Pascal 4.0, Turbo Pascal 5.0, Turbo Pascal 5.5, Turbo Pascal 6.0, gpc 20070904Программа обрабатывает строку посимвольно. Для определения того, является ли символ буквой, и если является, то в каком он регистре, используются ASCII-коды символов. Функция ord
возвращает ASCII-код данного символа, а chr
— символ по его коду. Размерность строк не задана и по умолчанию принимается равной 255.
Отметим, что в Turbo Pascal программа работает только начиная с версии 4.0; в более ранних версиях не было типа данных char
.
program Camelcase;
var
text, cc: string;
c: char;
i: integer;
lastSpace: boolean;
begin
readln(text);
lastSpace := true;
cc := '';
for i := 1 to Length(text) do
begin
c := text[i];
if ((c >= #65) and (c <= #90)) or ((c >= #97) and (c <= #122)) then
begin
if (lastSpace) then
begin
if ((c >= #97) and (c <= #122)) then
c := chr(ord(c) - 32);
end
else
if ((c >= #65) and (c <= #90)) then
c := chr(ord(c) + 32);
cc := cc + c;
lastSpace := false;
end
else
lastSpace := true;
end;
writeln(cc);
end.
CamelCase:
Пример для версий Free Pascal 2.2.0, Free Pascal 2.2.4, Turbo Pascal 4.0, Turbo Pascal 5.0, Turbo Pascal 5.5, Turbo Pascal 6.0, gpc 20070904Пример использует такую же логику, как и предыдущий, но для проверки того, является ли символ буквой, используются множества символов lower
и upper
. Это делает код более читабельным.
Отметим, что в Turbo Pascal программа работает, начиная с версии Turbo Pascal 4.0, в которой впервые появляется тип данных char
.
program Camelcase;
var
text, cc: string[100];
c: char;
i: integer;
lastSpace: boolean;
upper, lower: set of char;
begin
upper := ['A'..'Z'];
lower := ['a'..'z'];
readln(text);
lastSpace := true;
cc := '';
for i := 1 to Length(text) do
begin
c := text[i];
if (c in lower) or (c in upper) then
begin
if (lastSpace) then { convert to uppercase }
begin
if (c in lower) then
c := chr(ord(c) - 32);
end
else { convert to lowercase }
if (c in upper) then
c := chr(ord(c) + 32);
cc := cc + c;
lastSpace := false;
end
else
lastSpace := true;
end;
writeln(cc);
end.
Факториал:
Пример для версий Borland Delphi 2.0Этот пример практически полностью повторяет пример для Turbo Pascal, единственное изменение — добавление строк
{$APPTYPE CONSOLE}
uses SysUtils;
Для компиляции примера в среде Delphi 2 нужно выполнить следующие действия:
- File -> New Application
- Project -> Remove from Project -> удалить Unit1 (Form1)
- View -> Project Source -> заменить весь текст файла проекта на текст примера
- File -> Save Project As -> “factorial.dpr”
- Project -> Compile
Скомпилированный файл factorial.exe нужно запустить из командного интерпретатора Windows.
При запуске непосредственно из среды Delphi нужно добавить строчку readln;
перед последней строкой (end.
): таким образом программа будет ожидать нажатия “ENTER” до закрытия консольного окна.
Как и в Turbo Pascal, из-за переполнения данный пример выводит неверные значения для факториала 13 и больше:
13! = 1932053504
14! = 1278945280
15! = 2004310016
16! = 2004189184
program factorial;
{$APPTYPE CONSOLE}
uses SysUtils;
function fact(n: integer): longint;
begin
if (n = 0) then
fact := 1
else
fact := n * fact(n - 1);
end;
var
n: integer;
begin
for n := 0 to 16 do
writeln(n, '! = ', fact(n));
end.
Комментарии
]]>blog comments powered by Disqus
]]>