Разделы презентаций


Сис т е ма программирования P as c alAB C. NE T : Ма с сивы, посл е д ов а т е

Содержание

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Массивы – только динамические!В PascalABC.NET в первую очередь следует использовать динамические массивы.Они содержат большое число методов.По ним можно выполнять цикл foreach (при доступе

Слайды и текст этой презентации

Слайд 1Система программирования
PascalABC.NET: Массивы, последовательности и лямбды как базовые примитивы
Михалкович С.С.
Южный

федеральный университет,
факультет математики, механики и компьютерных наук
miks@math.sfedu.ru
Доклад на учебно-методической конференции
«Использование

системы программирования Pascal​ABC​.NET и электронного задачника Programming Taskbook в обучении программированию»
(Ростов-на-Дону, 28-29 октября 2019 г.)
Система программированияPascalABC.NET: Массивы, последовательности и лямбды как базовые примитивыМихалкович С.С.Южный федеральный университет,факультет математики, механики и компьютерных наукmiks@math.sfedu.ruДоклад

Слайд 2PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Массивы –

только динамические!
В PascalABC.NET в первую очередь следует использовать динамические массивы.
Они

содержат большое число методов.
По ним можно выполнять цикл foreach (при доступе к элементам на чтение).

Циклы for и foreach по массивам

begin
var a: array of integer := 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.

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Массивы – только динамические!В PascalABC.NET в первую очередь следует

Слайд 3Ввод-вывод массивов
Ввод-вывод массива осуществляется одной строкой
Ввод-вывод массива
begin
var a := ReadArrInteger(10);

Println(a);
a.Println;
end.
6 5 4 3 2 1 0 9 8 7
[6,5,4,3,2,1,0,9,8,7]
6

5 4 3 2 1 0 9 8 7

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы

Слайд

Ввод-вывод массивовВвод-вывод массива осуществляется одной строкойВвод-вывод массиваbeginvar a := ReadArrInteger(10); Println(a);a.Println;end.6 5 4 3 2 1 0

Слайд 4PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
procedure Transform(a:

array of real);
begin
for var i:=0 to a.Length-1 do
a[i] := a[i]

* a[i]
end;

begin
var a := Arr(1.0,2.0,3.0);
Transform(a); Print(a);
end.

Преобразование элементов массива

Требуется возвести все элементы массива в квадрат

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд procedure Transform(a: array of real);beginfor var i:=0 to a.Length-1

Слайд 5PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
procedure Transform(a:

array of real);
begin
for var i:=0 to a.Length-1 do
a[i] := a[i]

* a[i] * a[i]
end;

begin
var a := Arr(1.0,2.0,3.0);
Transform(a); Print(a);
end.

Преобразование элементов массива

А если в куб?

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд procedure Transform(a: array of real);beginfor var i:=0 to a.Length-1

Слайд 6PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
procedure Transform(a:

array of real; f: ???); begin
for var i:=0 to a.Length-1

do
a[i] := f(a[i])
end;

begin
var a := Arr(1.0,2.0,3.0);
Transform(a); Print(a);
end.

Преобразование элементов массива

А нельзя ли один код на всех?

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд procedure Transform(a: array of real; f: ???); beginfor var

Слайд 7PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
procedure Корова

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

begin
var

Звук: procedure := Корова;
Звук;
Звук := Собака; Звук;
Звук := Кошка + Корова * 2; Звук;
end.

Переменной можно присвоить действие. Такая переменная называется процедурной. Она хранит отложенное действие. Это действие можно вызвать, указав процедурную переменную вместо имени процедуры или функции
Процедурная переменная

Процедурные переменные (напоминание)

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд procedure Корова := Println('Му-у'); procedure Собака := Println('Гав!'); procedure

Слайд 8function function function
f1(x:
f2(x:
f3(x:
real) real) real)
:= x*x;
:= x*x*x;
:= 2*x - 1;
begin
var

f:
real -> real := f1;
Print(f(2)); f := f2; Print(f(2)); f

:= f3; Print(f(2));
end.

Процедурной переменной можно присвоить функцию. Функция хранит отображение.
Это отображение можно вызвать впоследствии через процедурную переменную
Переменная, хранящая функцию

Процедурные переменные - функции

4 8 3

Тип переменной, хранящей функцию

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы

Слайд

function function functionf1(x:f2(x:f3(x:real) real) real):= x*x;:= x*x*x;:= 2*x - 1;beginvar f:real -> real := f1;Print(f(2)); f :=

Слайд 9function function function
f1(x:
f2(x:
f3(x:
real) real) real)
:= x*x;
:= x*x*x;
:= 2*x - 1;
procedure

Transform(a: array of real;
begin
for var i:=0 to a.Length-1 do
a[i] :=

f(a[i])
end;

f: real

-> real);

begin
var a := Arr(1.0,2.0,3.0);
Transform(a,f1);
Print(a);
end.

Преобразование элементов массива

А нельзя ли один код на всех? Можно!

Ой как далеко определена функция!
А нельзя ли ближе? Можно!

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы

Слайд

function function functionf1(x:f2(x:f3(x:real) real) real):= x*x;:= x*x*x;:= 2*x - 1;procedure Transform(a: array of real;beginfor var i:=0 to

Слайд 10procedure Transform(a: array begin
for var i:=0 to a.Length-1 a[i] :=

f(a[i])
end;
of real; f: real -> real);

do
begin
var a := Arr(1.0,2.0,3.0);
Transform(a, a.Println;

Transform(a, a.Println; Transform(a, a.Println;
end.

x -> x*x);

x -> x*x*x);

x -> 2*x-1);

Преобразование элементов массива

Возводим все элементы в квадрат с помощью x -> x*x

x -> x*x - лямбда-функция. Её нужно рассматривать как отображение x в x*x
Лямбда-функция – это безымянная функция, позволяющая определить функцию в тот самый момент и в том самом месте когда она впервые понадобится.
Вместо x -> x*x можно использовать y -> y*y или z -> z*z

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы

Слайд 10

Лямбда-выражение (лямбда-функция)

procedure Transform(a: array beginfor var i:=0 to a.Length-1 a[i] := f(a[i])end;of real; f: real -> real);dobeginvar a

Слайд 11procedure Transform(a: array begin
for var i:=0 to a.Length-1 a[i] :=

f(a[i])
end;
of real; f: real -> real);

do
begin
var a := Arr(1.0,2.0,3.0);
Transform(a, a.Println;

Transform(a, a.Println; Transform(a, a.Println;
end.

x -> x*x);

x -> x*x*x);

x -> 2*x-1);

Генерация массива по заданному алгоритму

Возводим все элементы в квадрат с помощью x -> x*x

x -> x*x - лямбда-функция. Её нужно рассматривать как отображение x в x*x
Лямбда-функция – это безымянная функция, позволяющая определить функцию в тот самый момент и в том самом месте когда она впервые понадобится.
Вместо x -> x*x можно использовать y -> y*y или z -> z*z

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы

Слайд

Лямбда-выражение (лямбда-функция)

procedure Transform(a: array beginfor var i:=0 to a.Length-1 a[i] := f(a[i])end;of real; f: real -> real);dobeginvar a

Слайд 12PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Теперь у

нас развязаны руки

Далее лямбда-выражения будут везде

Лямбда-выражения – базовый примитив программирования

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Теперь у нас развязаны рукиДалее лямбда-выражения будут вездеЛямбда-выражения –

Слайд 13Заполнение
var a := Arr(1,3,5,7,9);
var a := Arr(55)*10; // 55 55

55
55 55 55 55 55 55 55

3 3 3 3

5 5 5 5

2 3 4 5 6 7

1 3 5

var a := Arr(3)*4 + Arr(5)*4; //

var a := ArrGen(10,i->i+1); // 1

8 9 10

var a := ArrGen(10,1,x->x+2); //

7 9 11 13 15 17 19

var a := ArrGen(10,1,x->x*2); // 1 2 4

var a := ArrGen(10,1,1,(x,y)->x+y); //

8 16 32 64 128 256 512

1 1 2 3 5 8 13 21 34 55 89

Отображение индекса в элемент

Отображение предыдущего

элемента в следующий

Отображение двух предыдущих элементов в следующий

Первый элемент

Первые 2
элемента

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы

Слайд

Заполнениеvar a := Arr(1,3,5,7,9);var a := Arr(55)*10; // 55 55 5555 55 55 55 55 55 553

Слайд 14PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Заполнение массива

случайными
var a := ArrRandomInteger(10,2,5);

var r := ArrRandomReal(10,1.0,2.0);

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Заполнение массива случайнымиvar a := ArrRandomInteger(10,2,5);var r := ArrRandomReal(10,1.0,2.0);

Слайд 15PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Простейшие методы

массивов
var a := Arr(7,3,6,2,5);

Println(a.Min, a.Max, a.IndexMin, a.IndexMax);

Println(a.Sum, a.Average, a.Product);

Println(a.Length, a.First,

A.Last);
PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Простейшие методы массивовvar a := Arr(7,3,6,2,5);Println(a.Min, a.Max, a.IndexMin, a.IndexMax);Println(a.Sum,

Слайд 16PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Методы массивов

с лямбдами
var a := Arr(7,3,6,2,5);

Println(a.Any(x->x.IsEven)); // True

Println(a.All(x->x.InRange(2,7)); // True

Println(a.Count(x->x mod

2 <> 0)); // 2

Println(a.Sum(x->x-2)); // 13
PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Методы массивов с лямбдамиvar a := Arr(7,3,6,2,5);Println(a.Any(x->x.IsEven)); // TruePrintln(a.All(x->x.InRange(2,7));

Слайд 17Последовательности
Последовательность – обобщение массива, списка, связного списка, строки
PascalABC.NET. Массивы, последовательности

и лямбды как базовые примитивы
Слайд

ПоследовательностиПоследовательность – обобщение массива, списка, связного списка, строкиPascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд

Слайд 18Последовательности
Последовательность – обобщение массива, списка, связного списка, строки
Описание последовательности
var sq:

sequence of integer;
PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд


ПоследовательностиПоследовательность – обобщение массива, списка, связного списка, строкиОписание последовательностиvar sq: sequence of integer;PascalABC.NET. Массивы, последовательности и лямбды

Слайд 19Последовательности
Последовательность – обобщение массива, списка, связного списка, строки
Описание последовательности
var sq:

sequence of integer;
Создание последовательности
sq := Seq(1,5,3,7,4,9,8);
PascalABC.NET. Массивы, последовательности и лямбды

как базовые примитивы

Слайд

ПоследовательностиПоследовательность – обобщение массива, списка, связного списка, строкиОписание последовательностиvar sq: sequence of integer;Создание последовательностиsq := Seq(1,5,3,7,4,9,8);PascalABC.NET. Массивы,

Слайд 20Последовательности
Последовательность – обобщение массива, списка, связного списка, строки
Описание последовательности
var sq:

sequence of integer;
Создание последовательности
sq := Seq(1,5,3,7,4,9,8);
Цикл по последовательности
foreach var x

in sq do
Print(x);

1 5 3 7 4 9 8

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы

Слайд 20

ПоследовательностиПоследовательность – обобщение массива, списка, связного списка, строкиОписание последовательностиvar sq: sequence of integer;Создание последовательностиsq := Seq(1,5,3,7,4,9,8);Цикл по

Слайд 21PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Поговорим о

последовательностях
Последовательность – это набор элементов, получаемых последовательно один за другим
Для

перебора элементов последовательности используется цикл foreach
Для вывода последовательности используется метод Print
Последовательность имеет тип sequence of T
Массив – это последовательность, но последовательность – это не массив!
Последовательность вообще говоря не хранится в памяти.
Последовательность – это алгоритм получения элементов, а не сами элементы
Для получения элементов последовательности используются генераторы
последовательностей
PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Поговорим о последовательностяхПоследовательность – это набор элементов, получаемых последовательно

Слайд 22PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Генераторы последовательностей
Генератор

последовательности – функция, возвращающая последовательность
Range(a,b) – генератор, возвращающий числа от

a до b. Числа не
хранятся в памяти, а возвращаются одно за другим!

var seq: sequence of integer := Range(1,10);

foreach var x in seq do
Print(x);

foreach var x in Range(1,10) do // Прямо как в этом вашем Питоне!
Print(x);

seq не хранится в памяти
foreach просит у seq элемент за элементом
В каждый момент времени в памяти хранится один элемент

seq.Println; // еще проще

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Генераторы последовательностейГенератор последовательности – функция, возвращающая последовательностьRange(a,b) – генератор,

Слайд 23PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Генераторы последовательностей
foreach

var x in ReadSeqInteger(10) do
Print(x);
Генератор последовательности ввода с клавиатуры ReadSeqInteger
Последовательность

не хранится в памяти вся!!!

Генератор последовательности случайных SeqRandomInteger
Последовательность не хранится в памяти вся!!!

foreach var x in SeqRandomInteger(10) do
Print(x);

Генератор последовательности, определяемой алгоритмом

foreach var x in SeqGen(10,i->i*i) do if Odd(x) then
Print(x);

SeqGen(20,1,1,(x,y)->x+y).Println;

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Генераторы последовательностейforeach var x in ReadSeqInteger(10) doPrint(x);Генератор последовательности ввода

Слайд 24PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Использование последовательностей

вместо циклов
SeqGen(10,1,x->x+2).Sum.Println;

SeqGen(10,1.0,x->x/2).Sum.Println;
Сумма первых N членов арифметической и геометрической прогрессии
Сумма первых

10 чисел Фибоначчи

SeqGen(10,1,1,(x,y)->x+y).Sum.Println;

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Использование последовательностей вместо цикловSeqGen(10,1,x->x+2).Sum.Println;SeqGen(10,1.0,x->x/2).Sum.Println;Сумма первых N членов арифметической и

Слайд 25PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Методы последовательностей
Методы

последовательностей можно применять к массивам
Пример. В массиве целых выбрать значения

x>5, преобразовать эти значения в квадраты, отсортировать и вывести получившуюся последовательность

var a := Arr(1,5,3,7,4,9,8);
a.Where(x->x>5).Select(x->x*x).Order.Println;

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Методы последовательностейМетоды последовательностей можно применять к массивамПример. В массиве

Слайд 26PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Методы последовательностей
Методы

последовательностей можно применять к массивам
Пример. В массиве целых выбрать значения

x>5, преобразовать эти значения в квадраты, отсортировать и вывести получившуюся последовательность

var a := Arr(1,5,3,7,4,9,8);
a.Where(x->x>5).Select(x->x*x).Order.Println;

Теперь то же на русском:

массив.Выбрать(x->x>5).Преобразовать(x->x*x).Отсортировать.Вывести;

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Методы последовательностейМетоды последовательностей можно применять к массивамПример. В массиве

Слайд 27PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Методы последовательностей
Методы

последовательностей можно применять к массивам
Пример. В массиве целых выбрать значения

x>5, преобразовать эти значения в квадраты, отсортировать и вывести получившуюся последовательность

var a := Arr(1,5,3,7,4,9,8);
a.Where(x->x>5).Select(x->x*x).Order.Println;

Теперь то же на русском:

массив.Выбрать(x->x>5).Преобразовать(x->x*x).Отсортировать.Вывести;

Важно! Метод последовательности возвращает последовательность, а не массив!!! a.Where(x->x>5) не является массивом!

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Методы последовательностейМетоды последовательностей можно применять к массивамПример. В массиве

Слайд 28PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Преобразование последовательности

в массив
var a := Arr(1,5,3,7,4,9,8);
a := a.Where(x->x>5).Select(x->x*x).ToArray;
Чтобы назад преобразовать последовательность

в массив, следует
использовать метод ToArray:

Метод ToArray приводит к тому, что последовательность начинает
ВСЯ храниться в памяти

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Преобразование последовательности в массивvar a := Arr(1,5,3,7,4,9,8);a := a.Where(x->x>5).Select(x->x*x).ToArray;Чтобы

Слайд 29PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд
Просто пример
begin
ReadLines('Война

и мир.txt')
.Where(s -> 'безухов' in s.ToLower)
.PrintLines;
end.
Давайте расшифруем ☺

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд Просто примерbeginReadLines('Война и мир.txt').Where(s -> 'безухов' in s.ToLower).PrintLines;end.Давайте расшифруем

Слайд 30PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд 30
Просто пример
begin
ЧитатьИзФайла('Война

и мир.txt')
.Где(строка -> 'безухов' in строка.КНижнемуРегистру)
.ПечататьСтроки;
end.

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд 30Просто примерbeginЧитатьИзФайла('Война и мир.txt').Где(строка -> 'безухов' in строка.КНижнемуРегистру).ПечататьСтроки;end.☺

Слайд 31PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивы
Слайд 31

PascalABC.NET. Массивы, последовательности и лямбды как базовые примитивыСлайд 31☺

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика