--- filename: learnpascal-ru.pas contributors: - ["Ganesha Danu", "http://github.com/blinfoldking"] - ["Keith Miyake", "https://github.com/kaymmm"] translators: - ["Anton 'Dart' Nikolaev", "https://github.com/dartfnm"] --- >Pascal - это процедурный язык программирования, который Никлаус Вирт разработал в 1968–69 годах и опубликовал в 1970 году как небольшой эффективный язык, предназначенный для поощрения хороших методов программирования с использованием структурированного программирования и структурирования данных. Он назван в честь французского математика, философа и физика Блеза Паскаля. > >source : [wikipedia](https://ru.wikipedia.org/wiki/Паскаль_(язык_программирования))) Для компиляции и запуска программы на языке Паскаль вы можете использовать бесплатный компилятор FreePascal. [Скачать здесь](https://www.freepascal.org/) Либо современный бесплатный компилятор Паскаля нового поколения под платформу .Net [PascalABC.NET](http://pascalabc.net) ```pascal // это комментарий { а вот это: - комментарий на несколько строк } //объявляем имя программы program learn_pascal; //<-- не забываем ставить точку с запятой (;) const { это секция в которой вы должны объявлять константы } type { здесь вы можете объявлять собственные типы данных } var { секция для объявления переменных } begin //начало основной программы { тело вашей программы } end. // В конце основной программы обязательно должна стоять точка "." ``` ```pascal //объявление переменных //вы можете сделать так var a:integer; var b:integer; //или так var a : integer; b : integer; //или даже так var a,b : integer; ``` ```pascal program Learn_More; // Познакомимся с типами данных и с их операциями const PI = 3.141592654; GNU = 'GNU''s Not Unix'; // имена константам принято давать ЗАГЛАВНЫМИ_БУКВАМИ (в верхнем регистре) // их значения фиксированны т.е никогда не меняются во время выполнения программы // содержат любой стандартный тип данных (integer, real, boolean, char, string) type ch_array : array [0..255] of char; // массивы - это составной тип данных // мы указываем индекс первого и последнего элемента массива ([0..255]) // здесь мы объявили новый тип данных содержащий 255 символов 'char' // (по сути, это просто строка - string[256]) md_array : array of array of integer; // массив в массиве - по сути является двумерным массивом // можно задать массив нулевой (0) длины, а потом динамически расширить его // это двумерный массив целых чисел //Объявление переменных var int, c, d : integer; // три переменные, которые содержат целые числа // Тип "integer" это 16-битное число в диапазоне [-32,768..32,767] r : real; // переменная типа "real" принимает вещественные (дробные) значения // в диапазоне [3.4E-38..3.4E38] bool : boolean; // переменная логического типа, принимающая булевы-значения: True/False (Правда/Ложь) ch : char; // эта переменная содержит значение кода одного символа // тип 'char' это 8-битное число (1 байт), так что никакого Юникода str : string; // это переменная составного типа, являющееся строкой // по сути, строка это массив в 255 символов длиною, по умолчанию s : string[50]; // эта строка может содержать максимум 50 символов // вы можете сами указать длину строки, чтобы минимизировать использование памяти my_str: ch_array; // вы можете объявлять переменные собственных типов my_2d : md_array; // динамически расширяемые массивы требуют указания длины перед их использованием. // дополнительные целочисленные типы данных b : byte; // диапазон [0..255] shi : shortint; // диапазон [-128..127] smi : smallint; // диапазон [-32,768..32,767] (стандартный Integer) w : word; // диапазон [0..65,535] li : longint; // диапазон [-2,147,483,648..2,147,483,647] lw : longword; // диапазон [0..4,294,967,295] c : cardinal; // тоже что и longword i64 : int64; // диапазон [-9223372036854775808..9223372036854775807] qw : qword; // диапазон [0..18,446,744,073,709,551,615] // дополнительные вещественные типы данных (дробные) rr : real; // диапазон зависит от платформы (т.е. 8-бит, 16-бит и т.д.) rs : single; // диапазон [1.5E-45..3.4E38] rd : double; // диапазон [5.0E-324 .. 1.7E308] re : extended; // диапазон [1.9E-4932..1.1E4932] rc : comp; // диапазон [-2E64+1 .. 2E63-1] Begin int := 1; // так мы присваиваем значение переменной r := 3.14; ch := 'a'; str := 'apple'; bool := true; // Паскаль не чувствителен к регистру // арифметические операции int := 1 + 1; // int = 2; заменяет предыдущее значение int := int + 1; // int = 2 + 1 = 3; int := 4 div 2; //int = 2; 'div' операция деления, с отбрасыванием дробной части int := 3 div 2; //int = 1; int := 1 div 2; //int = 0; bool := true or false; // bool = true bool := false and true; // bool = false bool := true xor true; // bool = false r := 3 / 2; // деления вещественных чисел с дробной частью r := int; // вещественной переменной можно присвоить целочисленное значение, но не наоборот my_str[0] := 'a'; // для доступа к элементу массива нужно указать его индекс в квадратных скобках ([0]) c := str[1]; // первая буква во всех Строках находится по индексу [1] str := 'hello' + 'world'; //объединяем 2 строки в одну SetLength(my_2d,10,10); // инициализируем динамически расширяемый массив // задаём размер 2х-мерного массива 10×10 // первый элемент массива лежит в индексе [0], последний [длина_массива-1] for c := 0 to 9 do for d := 0 to 9 do // переменные для счетчиков циклов должны быть объявлены my_2d[c,d] := c * d; // обращаться к многомерным массивам нужно с помощью одного набора скобок End. ``` ```pascal program Functional_Programming; Var i, dummy : integer; function factorial_recursion(const a: integer) : integer; { Функция расчёта Факториала целочисленного параметра 'a', рекурсивно. Возвращает целое значение } // Мы можем объявлять локальные переменные внутри своей функции: // Var // local_a : integer; Begin If a >= 1 Then factorial_recursion := a * factorial_recursion(a-1) // возвращаем результат, присваивая найденное значение переменной с тем же именем, как у функции Else factorial_recursion := 1; End; // Для завершения функции, используется символ ";" после оператора "End;" procedure get_integer( var i : integer; dummy : integer ); { Эта процедура ждёт от пользователя ввода целого числа и возвращает его значение через параметр i. Если параметр функции начинается с 'var', это означает, что его значение было передано, по ссылке, то есть, оно может использоваться не только как входное значение, но и для возвращения дополнительных результатов работы функции. Параметры функции (без 'var'), (такие как "dummy" (пустышка)), передаются по значению, и по сути являются - локальными переменными, таким образом изменения, внесенные внутри функции/процедуры, не влияют на значение переменной за её пределами. } Begin // начало процедуры write('Введите целое число: '); readln(i); // число, введённое пользователем, сохранится в переменной i // и её значение будет доступно вызывающей подпрограмме dummy := 4; // значение 'dummy' не будет влиять на значения переменной вне процедуры End; // конец процедуры Begin // главный блок программы dummy := 3; get_integer(i, dummy); // вызываем процедуру получения числа от пользователя writeln(i, '! = ', factorial_recursion(i)); // ввыводим значение факториала от i writeln('dummy = ', dummy); // всегда выводит "3", поскольку фиктивная переменная не изменяется. End. // конец программы ```