Что такое кортежи и для чего они необходимы? Растолкуйте понятным языком

Что такое кортежи и для чего они необходимы? Растолкуйте понятным языком на образце PascalABC.NET

Задать свой вопрос
1 ответ
Кортеж (tuple) - поочередный набор данных фиксированной длины. Данные в кортеже могут быть различного типа, их количество обычно невелико (в Pascal ABC.NET 3 - максимум 7).
Важно, что кортеж создается на этапе компиляции, потому его структура неизменна. Данные в кортеже нельзя редактировать - они доступны только на чтение.
Снаружи кортеж смотрится как список. Например, перечень аргументов у функции или процедуры. И запись (record) в Паскале - тоже своего рода кортеж.

Кортежи могут быть весьма полезны.
К примеру, в Паскале обычно функция отдаёт некоторое значение. А если надобно, к примеру, два? Функцию делать? Кортеж решает эту проблему.
Ниже приведен пример работающей программки на PascalABC.NET 3.3.
Напомню, что идентификаторы в программке могут содержать знаки Unicode из всех алфавитных комплектов, потому имена переменных написаны кириллицей.

function DivMod(a,b:integer):=(a div b,a mod b);

begin
  var (Разделяемое,Делитель):=ReadInteger2('Делимое и делитель:');
  var (Частное,Остаток):=Divmod(Разделяемое,Делитель);
  Writeln('Приватное = ',Приватное,', остаток = ',Остаток)
end.

Пример
Разделяемое и делитель: 356432 242
Частное = 1472, остаток = 208

Пример показывает способности, которые раскрывают кортежи.

Функция DivMod отдаёт кортеж из 2-ух частей.
Благодаря кортежу она состоит из единственного оператора и это позволило записать её в одну строку. Содержимое кортежа определяется данными выражениями, их тип - типом результата (integer).

ReadInteger2 - это функция, отдающая кортеж из 2-ух частей типа integer, принятых с клавиатуры.

Левая часть оператора присваивания var (Разделяемое,Делитель):= реализует так нарекаемое кортежное присваивание. (Разделяемое,Делитель) - это запись кортежа, так как перечисление находится в круглых скобках. Но конкретно в таком употреблении это сразу две различные переменные, которым будет присвоено значение частей кортежа. Кортеж в правой части "распаковывается" так, что значение первого элемента кортежа попадает в первую переменную, а 2-ое - во вторую.
В итоге оказалось достаточно одного оператора, сменяющего три:
var Разделяемое,Делитель:integer;
Write('Разделяемое и делитель: ');
Read(Разделяемое,Делитель);

Еще одно кортежное присваивание
var (Приватное,Остаток):=Divmod(Делимое,Делитель);
делает две переменные типа integer и распаковывает в их кортеж, возвращаемый функцией DivMod.

И только процедура вывода Writeln() написана без кортежа.
Чтобы показать, как можно использовать элементы кортежа без распаковки, вышеприведенный пример запишем иначе.

function DivMod(a,b:integer):=(a div b,a mod b);

begin
  var (Разделяемое,Делитель):=ReadInteger2('Делимое и делитель:');
  var t:=Divmod(Разделяемое,Делитель);
  Writeln('Приватное = ',t[0],', остаток = ',t[1])
end.

Тут t - кортеж типа (integer,integer). Присваивание 1-го кортежа другому делается обыденным методом. В воззвании к элементам кортежа мы пользуемся синтаксисом, принятым для частей массива, индексированных от нуля.

Понятно, что в коротком ответе невозможно обрисовать все, что дают языку программирования кортежи. Закончить желаю образцом того, как кортеж позволят поменять местами значения 2-ух переменных:
(a,b):=(b,a);

И, так как Вы ранее задавали вопрос о лямбдах -вот она:

begin
  var DivMod:(integer,integer)-gt;(integer,integer):=(a,b)-gt;(a div b,a mod b);
  var (Разделяемое,Делитель):=ReadInteger2('Разделяемое и делитель:');
  var t:=DivMod(Делимое,Делитель);
  Writeln('Приватное = ',t[0],', остаток = ',t[1])
end.
Куливных Есения
Спасибо
Есения Бурьянская
Да
, оставишь ответ?
Имя:*
E-Mail:


Добро пожаловать!

Для того чтобы стать полноценным пользователем нашего портала, вам необходимо пройти регистрацию.
Зарегистрироваться
Создайте собственную учетную запить!

Пройти регистрацию
Авторизоваться
Уже зарегистрированны? А ну-ка живо авторизуйтесь!

Войти на сайт