Работа с кортежами
Содержание:
Объявление и инициализация кортежей
- Кортеж — набор из нескольких значений, возможно, разного типа.
- Кортежи состоят как минимум из двух элементов и максимум из семи.
- Значения кортежей доступны только на чтение.
Объявление кортежей может иметь вид:
var t: (string,integer); |
Пример работы с кортежами:
var st:=('Ivanov',35); print(st[0]); // Ivanov print(st[1]); // 35 print(st); // (Ivanov,35) st[1]:= 100; ///ошибка - нельзя изменять |
Менять значения нельзя; создали, вывели и всё.
Манипуляции с кортежами
Кортежное присваивание или распаковка кортежа в переменные
Нельзя менять значения кортежей, но можно кортежи распаковывать.
Пример: распаковать значения кортежа в переменные
var st:=('Ivanov',35); var name:string; var age:integer; (name,age):=st; // ~ name:=st[0]; age:=st[1]; |
Обмен
var a,b:integer; (a, b):=(1,2); (a,b):=(b,a); |
ИЛИ
var a,b:integer; (a, b):=(1,2); swap(a,b); |
Циклический сдвиг:
(a, b, c):=(c, b, a); |
Использование кортежей в алгоритмах
Для понимания материала необходимо рассмотреть тему «Процедуры и функции»
Пример: распечатать числа ряда Фибоначчи
Выполнение:
1 2 3 4 5 6 7 8 9 | begin var a,b:integer; (a, b):=(1,1); print(a,b); for var i:=3 to 10 do begin (a,b):=(b, a+b); print(b); end; end. |
Пример: вычислять корень квадратный из x. Использовать модуль и кортеж
Формула для вычисления квадратного корня:
a0=x
a n+1= 1/2 (an+x/an)
Порядок выполнения:
Для модуля создается отдельный файл, например, MyUnit.pas, в котором прописывается код функции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Unit MyInit; interface function MySQL(x:real):real; implementation function MySQL(x:real):real; begin var a,b:real; (a, b):=(x, real.MaxValue); var n:=0; while abs(b-a)>n do (a,b):=((a+x/a)/2,a); result:=b; end; end. |
В файле с основной программой:
1 2 3 4 | Uses MyUnit; begin print(MySQL(4.0)) end. |
Решение задач
Пример: Опишите в модуле функцию вычисления площади и периметра прямоугольника, заданного своими сторонами.
в разделе реализации используйте краткую форму.
function SP(a,b: real) :(real,real);
в разделе реализации используйте краткую форму.
Выполнение:
Листинг модуля pr1.pas:
1 2 3 4 5 6 7 8 9 | unit pr1; interface function SP(a,b: real) :(real,real); implementation function SP(a,b: real) :(real,real); begin result:=(a*b,2*(a+b)); end; end. |
Листинг основной программы:
1 2 3 4 5 6 | uses pr1; begin var S,P: real; (S,P) := SP(2,3); print(S,P); end. |
Задание 1: Описать функцию
Fib(N)
, которая принимает целое положительное значение N ≥ 1
и возвращает N
-ое число ФибоначчиФрагмент программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 | function Fib(var n:integer):integer; begin var f1:=1; var f2:=1; for ... (f1,f2):=...; result:=...; end; begin var n:=readinteger; ... print(...); end. |
Видеоразбор задания:
Задание 2: предыдущий пример выполнить в модуле
Пример: Дано целое число
A1=1, A2=2, A3=3, Ak=Ak−1+Ak−2−2⋅Ak−3,
N > 3
. Последовательность целых чисел Ak
определяется следующим образом:A1=1, A2=2, A3=3, Ak=Ak−1+Ak−2−2⋅Ak−3,
k
=4,5,… Вывести N
-ое числоВыполнение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function MakeSeq1(var n:integer):integer; begin var a1:=1; var a2:=2; var a3:=3; for var i:=3 to n do (a1,a2,a3):=(a2,a3,a3+a2-2*a1); result:=a3; end; begin var n:=readinteger; dec(n); var a:=MakeSeq1(n); print(a); end. |
Задание 3: Дано целое число
A1=2,Ak=2+1/Ak−1,
N > 2
. Последовательность вещественных чисел Ak
определяется следующим образом:A1=2,Ak=2+1/Ak−1,
k
=2,3,… Вывести N
-ое число.Фрагмент программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 | function MakeSeq(var n:integer):real; begin var a1:=2.0; var a2:real; for ... (a1,a2):=...; result:=...; end; begin ... ... print(a); end. |