---
language: Pascal
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. // конец программы

```

