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


Ответы на вопрос

Важно, что кортеж создается на этапе компиляции, поэтому его структура неизменна. Данные в кортеже нельзя редактировать - они доступны только на чтение.
Внешне кортеж выглядит как список. Например, список аргументов у функции или процедуры. И запись (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 возвращает кортеж из двух элементов.
Благодаря кортежу она состоит из единственного оператора и это позволило записать её в одну строку. Содержимое кортежа определяется заданными выражениями, их тип - типом результата (integer).
ReadInteger2 - это функция, возвращающая кортеж из двух элементов типа integer, принятых с клавиатуры.
Левая часть оператора присваивания var (Делимое,Делитель):= реализует так называемое кортежное присваивание. (Делимое,Делитель) - это запись кортежа, поскольку перечисление находится в круглых скобках. Но именно в таком употреблении это одновременно две различные переменные, которым будет присвоено значение элементов кортежа. Кортеж в правой части "распаковывается" так, что значение первого элемента кортежа попадает в первую переменную, а второе - во вторую.
В результате оказалось достаточно одного оператора, заменяющего три:
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). Присваивание одного кортежа другому делается обычным способом. В обращении к элементам кортежа мы пользуемся синтаксисом, принятым для элементов массива, индексированных от нуля.
Понятно, что в кратком ответе невозможно описать все, что дают языку программирования кортежи. Закончить хочу примером того, как кортеж позволят обменять местами значения двух переменных:
(a,b):=(b,a);
И, поскольку Вы раньше задавали вопрос о лямбдах -вот она:
begin
var DivMod:(integer,integer)->(integer,integer):=(a,b)->(a div b,a mod b);
var (Делимое,Делитель):=ReadInteger2('Делимое и делитель:');
var t:=DivMod(Делимое,Делитель);
Writeln('Частное = ',t[0],', остаток = ',t[1])
end.



Кортежи (tuples) представляют собой структуру данных, которая позволяет объединять несколько значений различных типов в одно составное значение. Они являются неизменяемыми, что означает, что после создания кортежа его элементы нельзя изменить.
В PascalABC.NET кортежи введены с версии 3.6. Они предоставляют удобный способ объединения данных и передачи их между частями программы. Рассмотрим пример использования кортежей на языке PascalABC.NET.
```pascal program TuplesExample;
var person: tuple(string, integer, boolean); // Определение кортежа
begin // Инициализация кортежа person := ('Иван', 25, true);
// Вывод значений кортежа writeln('Имя: ', person.Item1); writeln('Возраст: ', person.Item2); writeln('Статус: ', person.Item3);
// Изменение значения возраста (невозможно, так как кортежи неизменяемы) // person.Item2 := 26; // Ошибка компиляции
// Пример использования кортежа в функции writeln('Сообщение: ', GetMessage(person));
end.
function GetMessage(p: tuple(string, integer, boolean)): string; begin if p.Item3 then Result := 'Привет, ' + p.Item1 + '! Тебе ' + IntToStr(p.Item2) + ' лет.' else Result := 'Привет, гость!'; end. ```
В этом примере создается кортеж `person`, содержащий строку (имя), целое число (возраст) и булево значение (статус). Кортеж затем используется для передачи информации между различными частями программы.


Топ вопросов за вчера в категории Информатика







Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili