Содержание:
Пример работы с последовательностью
Последовательности — это абстрактный набор данных, которые можно перебирать.
Последовательностью может быть, например, последовательность чисел:
арифметическая прогрессия: 1 3 5 7 9
или
геометрическая прогрессия: 1 2 4 8 16
Тип последовательности: Sequence of Real
, Sequence of Integer
Наиболее близким типом данных к последовательности является массив.
Рассмотрим стандартный пример работы с числовым рядом, БЕЗ использования последовательности:
Без использования последовательности:
1 2 3 4 5 6 7 8 9 | begin var s:=0.0; for var i:=1 to 10 do begin var x:=ReadReal; s+=x; end; print(s) end. |
Данный стиль написания программы считается плохим, т.к. основной алгоритм смешивается с вводом (ReadReal
).
Ввод данных необходимо отсоединить от основного алгоритма. Для этого используем последовательность:
// накапливаем последовательность, переменная q хранит ее var q:=ReadSeqReal(10); var s:=0.0; foreach var x in q do s+=x; print(s) end. |
Теперь алгоритм находится отдельно от ввода, программа стала более модифицируема.
Остается оформить основной алгоритм в виде функции:
1 2 3 4 5 6 7 8 9 10 | function Sum(q: sequence of real):real; begin var s:=0.0; foreach var x in q do s+=x; result:=s end; begin print(Sum(ReadSeqReal(10))) end. |
Генерация и формирование последовательностей
Итак, мы рассмотрели, как сформировать последовательность через ввод с клавиатуры:
ReadSeqInteger
ReadSeqReal
var q:=ReadSeqReal(10); |
Теперь рассмотрим, как генерируются последовательности.
Генераторы последовательностей:
Range(a,b: integer)
: sequence of integer
print(Range(1,10)); // [1,2,3,4,5,6,7,8,9,10] |
Range(a,b,step: integer)
: sequence of integer
print(Range(1,10,2)); // [1,3,5,7,9] |
Range(c1,c2: char)
: sequence of char
print(Range('a','k')); // [a,b,c,d,e,f,g,h,i,j,k] |
Partition(a,b: real; n: integer)
: sequence of real
print(Partition(0.0, 6.0, 4)); // делим поровну на 4 части [0, 1.5, 3, 4.5, 6] |
SeqRandomInteger(n: integer[; a,b: integer])
: sequence of integer;
var q:=SeqRandomInteger(5,10,20); print(q); // [12,18,16,14,16] |
SeqRandomReal(n: integer[; a,b: real])
: sequence of real;
var q:=SeqRandomReal(3, 1.0, 5.0); print(q); // [4.98996168374548,2.22339218166815,2.81110574389394] |
Seq(params a: array of T)
: sequence of T;
foreach var x in Seq (1,3,8) do print(x*x); // 1 9 64 |
SeqFill(count: integer; x: T)
: sequence of T;
begin var q:=SeqFill(7,5); print(q); // [5,5,5,5,5,5,5] end. |
Следует учесть, что последовательности формируются каждый раз, как только с ними организовывается цикл или работает метод:
Вывод последовательностей
Print(delim: string := ' ')
: sequence of T;
var q:=SeqRandomInteger(5,10,20); q.Print('/'); // 16/11/13/10/13 |
Println(delim: string := ' ')
: sequence of T;
Решение задач
Создание и вывод
Range
).
Пример вывода:
[-20,-17,-14,-11,-8,-5,-2,1,4,7,10,13,16,19,22,25,28]
[файл: seq01.pas
]
Range
)
[файл: seq02.pas
]
100
(SeqRandom
)
Пример вывода:
введите n >>15 [-23,13,-27,2,46,-26,10,92,60,-9,75,28,85,7,18]
[файл: seq03.pas
]
N
чисел последовательности, заполненные 5 (SeqFill
)
[файл: seq04.pas
]
N
чисел последовательности c вводом
[файл: seq05.pas
]
Выполнение:
1 2 3 4 5 6 7 8 9 10 11 | function findCountMax(a: sequence of integer):integer; begin var k:=a.Max(); foreach var i in a do if i=k then result+=1; end; begin var c:=Seq(1,5,2,10,1,10); println('кол-во макс ',findCountMax(c)); c.Print(); end. |
Пример вывода:
1 5 2 10 1 сумма 19
[файл: seq06.pas
]
Пример вывода:
1 6 2 -10 1 18 среднее арифметическое = 3
[файл: seq07.pas
]