Система программирования PascalABC.NET. Простейшие новые возможности

Содержание

Слайд 2

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения» Слайд Русские идентификаторы В PascalABC.NET можно

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Русские идентификаторы

В PascalABC.NET можно использовать русские

идентификаторы. После
небольших переопределений программа преображается.
Использовать – дело вкуса
Русские идентификаторы

procedure Вывод(число: вещ) := Println(число);
type
цел = integer;
вещ = real;
begin
var количество: цел := 10;
var сумма: вещ := 0.0;
for var i:=1 to количество do
сумма += 1/i;
Вывод(сумма);
end.

К оглавлен ию

Слайд 3

Описание переменных Переменные обычно описываются в блоке begin – end При

Описание переменных

Переменные обычно описываются в блоке begin – end
При описании переменную

можно инициализировать выражением
Если при описании переменную инициализировать выражением, то тип можно не писать – он автоматически выводится по типу выражения

var x: real; // В PascalABC.NET глобальные переменные описываются редко

begin
var a1: integer; var a2 := 555; var r := 3.14; var

// a2 получает тип integer по типу значения 555
// r получает тип real по типу значения 3.14
// s получает тип string

s := 'PascalABC.NET';

var r1 := r + a2;
var m := Min(2,3);
var d := DateTime.Now;
end.

// r1 получает тот
// m получает тип,
// d получает тип,

же тип, что и выражение r + a2 возвращаемый функцией Min возвращаемый DateTime.Now

Код

Нагромождение глобальных переменных – признак стиля старого Паскаля

В PascalABC.NET переменные описываются по мере необходимости

Тип переменной автовыводится. Его надо указывать только в редких случаях для лучшей читаемости. Но в отличие от Python тип здесь – статический, не меняется по ходу программы

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Слайд 4

begin var (a,b,c) := (4,5,3); var min3 := Min(Min(a,b),c); // Пузырьковая

begin
var (a,b,c) := (4,5,3);
var min3 := Min(Min(a,b),c);
// Пузырьковая сортировка

Презентация «PascalABC.NET. Процедуры,

функции, лямбда-выражения»

Слайд

var a := ArrRandomInteger(10);
for
for

var i var j if a[j]

:= 0 to a.High-1 do
:= a.High downto i+1 do
< a[j-1] then

Swap(a[j], a[j-1]);
end.

Стандартные функции Min, Max и стандартную процедуру Swap
удобно использовать в различных алгоритмах
Код

Стандартные функции

Слайд 5

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения» Слайд begin var i: integer :=

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

begin
var i: integer := 56;
var s:

string := i.ToString; // преобразование в строку
if i.IsEven and i.InRange(10,99) then
Println('Нечётное двузначное');
i := integer.MaxValue; // максимальная константа целого типа
end.

Стандартные типы integer, real и т.д. содержат большое количество стандартных методов и констант
Код

Методы стандартных типов

Слайд 6

Цикл loop Цикл loop используется в случаях, когда номер повторения цикла

Цикл loop

Цикл loop используется в случаях, когда номер повторения цикла не

важен

begin
var s := 0; var x := 11; loop 45 do begin
s := s + x; x := x + 2
end; s.Print;
end.

Пример 2. Сумма квадратов
нечетных двузначных

2475

begin
var n := 11; var a := 1; var q := 2;

loop n do
begin
Print(a);

a := a * q
end; end.

Пример 1. Геометрическая прогрессия

1 2 4 8 16

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

32 64

128 256 512 1024

Слайд 7

Можно присваивать сразу нескольким переменным Переменные из левой части получают значения

Можно присваивать сразу нескольким переменным
Переменные из левой части получают значения из

правой части
одновременно
Можно инициализировать сразу несколько переменных при описании. Их типы выводятся автоматически по типам инициализирующих выражений
Код
begin
var (a,b,c) := (3,5,4);
var (имя, возраст) := ('Петя', 10);
(a,b) := (b,a); // перемена значений местами
(a,b,c) := (b,c,a); // циклический сдвиг значений: 5 4 3
end.

Множественное присваивание

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Слайд 8

Примеры использования множественного присваивания begin var (a, b) := (126, 72);

Примеры использования множественного присваивания

begin
var (a, b) := (126, 72);

while b>0 do
(a,

b) := (b,
Println(a);
end.

a mod b);

18

Множественное присваивание радикально меняет стиль решения ряда задач
Нахождение НОД Кролики Фибоначчи

begin
var n := 15;

var (a, b) := (1, 1);
loop n do begin
Print(a);
(a,b) := (b, a + b);
end; end.

1 1 2 3 5 8 13 21 34 55 89 144

233 377

К оглавлен ию

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Слайд 9

Вывод Предпочтительные процедуры вывода – Print и Println. Они разделяют элементы

Вывод

Предпочтительные процедуры вывода – Print и Println. Они разделяют элементы вывода

пробелами. Print удобно использовать в цикле для вывода серии значений
Вывод по интерполированной строке позволяет обойтись одной строкой в случае сложного форматного вывода
Print
begin
for var i:=1 to 10 do
Print(i);
Println;

var (x,y) := (3,5);
Println($'Сумма {x} и
end.

{y} равна {x+y}');

1 2 3 4 5 6 7 8 9 10
Сумма 3 и 5 равна 8

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Слайд 10

Ввод Для ввода предпочтительно использовать функции ReadInteger, ReadReal и т.д. Они

Ввод

Для ввода предпочтительно использовать функции ReadInteger, ReadReal и т.д.
Они позволяют описать

переменную и инициализировать её одной строкой
Функции ReadInteger2, ReadReal2 и т.д. позволяют вводить сразу от 2 до 4
переменных одного типа
Пример. ReadReal, ReadReal2

begin
var x := ReadReal('Введите x:'); var y := ReadReal('Введите y:'); Println('Сумма =',x+y);

var (a,b) := ReadReal2('Введите var c := Sqrt(a*a + b*b); Println('Гипотенуза =',c);
end.

катеты:');

Введите Введите Сумма = Введите

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд 10

x: 1
y: 2
3
катеты: 3 4

Гипотенуза = 5

Слайд 11

Цикл for Счётчик цикла for рекомендуется описывать непосредственно в заголовке цикла:

Цикл for

Счётчик цикла for рекомендуется описывать непосредственно в заголовке цикла:
for var

i. В этом случае счётчик цикла for недоступен после цикла
Если использовать старый синтаксис, то выдаётся предупреждение
«Параметр цикла for в PascalABC.NET должен описываться в заголовке цикла»
Пример 1. Два последовательных цикла for

begin
for var i:=0 to 9 do
Print(1+2*i);
Println;
// Переменная i for var i:=0 to Print(5+5*i);
end.

здесь недоступна
9 do

1 3 5 7 9 11 13 15 17 19
5 10 15 20 25 30 35 40 45 50

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Слайд 12

Расширенные операторы присваивания Print('10! =', p); end. 10! = 3628800 Расширенные

Расширенные операторы присваивания

Print('10! =', p);
end.

10! = 3628800

Расширенные операторы присваивания +=, -=,

*= и /= встречаются во многих языках программирования
«+=» читается как «увеличить на», а «*=» читается как «увеличить в»
a += 1 и a *= 2 воспринимается лучше чем a := a + 1 и a := a * 2
Пример 1. Сумма квадратов Пример 2. 10!

begin
var n := 10;
var p := 1;
for var i:=2 to n do
p *= i;

begin
var n := ReadInteger;
var sum := 0;
for var i:=1 to n do

sum += i*i;
Print($'Сумма
end.

квадратов

первых

{n} чисел

={sum}');

10
Сумма квадратов

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

первых 10

чисел = 385

Слайд 13

Тип BigInteger Тип BigInteger предназначен для вычислений с длинными целыми function

Тип BigInteger

Тип BigInteger предназначен для вычислений с длинными целыми

function Fib(n: integer):

BigInteger;
begin

var a,b: (a,b) :=
loop n-1 (a, b)

BigInteger; (1,1);
do
:= (b, a + b);

Result := a
end;
begin
Print(Fib(1000));
end.

begin
var n := 100;
var p: BigInteger := 1;
for var i:=2 to n do
p *= i;

Write(n,'! = ', p);
end.

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Пример 2. Тысячное число Фибоначчи

Пример 1. 100!

Слайд 14

Возведение в степень Для возведения в степень используется операция **, которая

Возведение в степень

Для возведения в степень используется операция **, которая реализована
предельно

эффективно
Пример. Вычисление 2 ** 1000
begin
var b: BigInteger := 2;
Println(b ** 1000);
end.

107150860718626732094842504906000181056140481170553360744375038837035105112
493612249319837881569585812759467291755314682518714528569231404359845775746
985748039345677748242309854210746050623711418779541821530464749835819412673
987675591655439460770629145711964776865421676604298316526243868372056680693
76

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Слайд 15

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения» Слайд Case по строкам В PascalABC.NET

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Case по строкам

В PascalABC.NET можно делать

case по строкам. Это значительно удобнее старого стиля со вложенными if
Старый Паскаль PascalABC.NET

var Country: string;
begin
read(Country); write('Столица: ');
if Country = 'Россия' then
writeln('Москва')
else if Country = 'Франция' then
writeln('Париж')
else if Country = 'Италия' then
writeln('Рим')
else if Country = 'Германия' then
writeln('Берлин')
else writeln('Нет в базе данных');
end.

begin
var Country := ReadString;
write('Столица: ');
case Country of
'Россия': writeln('Москва'); 'Франция': writeln('Париж'); 'Италия': writeln('Рим'); 'Германия': writeln('Берлин'); else writeln('Нет в базе данных');
end;
end.

Слайд 16

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения» Слайд Result в функции Для возвращения

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Result в функции

Для возвращения значения из

функции следует использовать переменную
Result, а не устаревший синтаксис, связанный с присваиванием имени функции.
Переменная Result появилась в Delphi и используется во Free Pascal.
PascalABC.NET

function Fact(n: integer): integer;
begin
Result := 1;
for var i:=1 to n do
Result *= i;
end;
begin
var n := ReadInteger('Введите n:'); Println('n!=',Fact(n));
end.

Слайд 17

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения» Слайд Короткие определения функций и процедур

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Короткие определения функций и процедур

В PascalABC.NET

допускаются короткие определения для функций, задаваемых одним выражением. Тип возвращаемого значения выводится автоматически.
Также допускаются короткие определения процедур, задаваемых одним оператором
Коллекция коротких определений подпрограмм

function ДлинаОкружности(r: real) := 2 * Pi * r;
function Гипотенуза(a,b: real) := Sqrt(a*a + b*b);
function Расстояние(x1,y1,x2,y2: real) := Гипотенуза(x2-x1,y2-y1);
function Минимум(a,b,c: real): real := Min(Min(a,b),c);
procedure Вывод(x: integer) := Println(x);
begin
Println(ДлинаОкружности(1)); Println(Гипотенуза(3,4),Расстояние(1,1,3,4)); Вывод(Минимум(5,3,8));
end.

К оглавлен ию

Слайд 18

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения» Слайд Упрощённый синтаксис модулей В PascalABC.NET

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

Упрощённый синтаксис модулей

В PascalABC.NET допускаются модули

с упрощённым синтаксисом. В них можно описывать часто встречающиеся подпрограммы. Затем эти модули можно подключать к своим программам
Упрощённый синтаксис модуля Основная программа

uses My;
function ДлинаОкружности(r: real) := 2 * Pi * r; function Гипотенуза(a,b: real) := Sqrt(a*a + b*b); function Расстояние(x1,y1,x2,y2: real) :=
Гипотенуза(x2-x1,y2-y1);
function Минимум(a,b,c: real): real :=
Min(Min(a,b),c);
procedure Вывод(x: integer) := Println(x);
end.

К оглавлен ию

uses My;
begin
Вывод(ДлинаОкружности(1)); Вывод(Гипотенуза(3,4)); Вывод(Минимум(5,3,8));
end.

Слайд 19

procedure Корова := Println('Му-у'); procedure Собака := Println('Гав!'); procedure Кошка :=

procedure Корова := Println('Му-у'); procedure Собака := Println('Гав!'); procedure Кошка :=

Println('Мяу!');
begin
var Звук: procedure := Корова; Звук;
Звук := Собака; Звук;
Звук := Кошка + Корова * 2;
Звук;
end.

Переменной можно присвоить действие. Такая переменная называется процедурной. Она хранит отложенное действие. Это действие можно вызвать, указав процедурную переменную вместо имени процедуры или функции
Действие можно передать в подпрограмму как параметр. Вызов этого действия в этой подпрограмме называется обратным вызовом (callback)
Процедурная переменная Callback-вызов

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд

procedure Корова := Println('Му-у'); procedure Собака := Println('Гав!'); procedure Кошка := Println('Мяу!');

procedure begin
p1; p2;
end;

ИздатьЗвуки(p1,p2: procedure);

// callback-вызовы

begin
ИздатьЗвуки(Корова, Собака);
ИздатьЗвуки(Кошка, Корова);
end.

Процедурные переменные

Слайд 20

Операции + и * для процедур без параметров Для процедур без

Операции + и * для процедур без параметров

Для процедур без параметров

эффективно использовать операции + (последовательное выполнение) и *n (повторение n раз). Они позволяют получить комбинированное действие, которое можно вызвать как обычную процедуру без параметров.
Применение этой техники иллюстрируется на примере решения задачи для Робота

uses Robot;
begin
var d := Right*3 + Up*9 + Paint + Down*9;
var d1 := (d + Right)*4 + d;
d1;
end.

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд 20

Слайд 21

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения» Слайд 21 Массивы – только динамические!

Презентация «PascalABC.NET. Процедуры, функции, лямбда-выражения»

Слайд 21

Массивы – только динамические!

В PascalABC.NET в

первую очередь следует использовать динамические массивы. Они содержат большое число методов
По ним можно выполнять цикл foreach
Циклы for и foreach по массивам

begin
var a := Arr(1,3,5,7,9);
foreach var x in a do
Print(x);
for var i:=0 to a.Length – 1 do
a[i] += 1;
end.

К оглавлен ию