Что такое кортежи и для чего они необходимы? Растолкуйте понятным языком
Что такое кортежи и для чего они необходимы? Растолкуйте понятным языком на образце 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.
Важно, что кортеж создается на этапе компиляции, потому его структура неизменна. Данные в кортеже нельзя редактировать - они доступны только на чтение.
Снаружи кортеж смотрится как список. Например, перечень аргументов у функции или процедуры. И запись (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.
Куливных
Есения
Спасибо
Есения Бурьянская
Да
, оставишь ответ?
Похожие вопросы
-
Вопросы ответы
Новое
NEW
Статьи
Информатика
Статьи
Последние вопросы
В сосуде 4целых одна пятая литр воды что бы заполнить сосуд
Математика.
Двум малярам Диме И Олегу поручили выкрасить фасад дома они разделили
Разные вопросы.
найти порядковый номер 41Э если в ядре 20 нейтронов
Разные вопросы.
в ряду натуральных чисел 3, 8, 10, 24, … 18 одно
Математика.
Предприятие по производству с/хоз продукции на производство затратило 3527000 руб Валовый
Разные вопросы.
Математика, задано на каникулы. ВАРИАНТ 1004
НОМЕР 1,2,3,4,5,6,7,8.
Математика.
Имеются три конденсатора емкостью С1=1мкФ, С2=2мкФ и С3=3мкФ. Какую наименьшую емкость
Физика.
Из точки м выходят 3 луча MP MN и MK причём
Геометрия.
выпиши в свою тетрадь те правила этикета которые тебе не были
Разные вопросы.
Анна хорошо учится у неё много подруг свободное от учёбы время
Обществознание.
Облако тегов