М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
xAlonerx
xAlonerx
20.12.2022 21:40 •  Информатика

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

👇
Ответ:
кирилл22895
кирилл22895
20.12.2022
Кортеж (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 возвращает кортеж из двух элементов.
Благодаря кортежу она состоит из единственного оператора и это позволило записать её в одну строку. Содержимое кортежа определяется заданными выражениями, их тип - типом результата (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.
4,7(54 оценок)
Открыть все ответы
Ответ:
karuna4
karuna4
20.12.2022
//Pascal ABC.NET v3.1 сборка 1172

var
  ar: array of integer;
  n, k2, k3, k4, k5, i: integer;
  r: real;

begin
  write('Сколько учеников?');
  readln(n);
  setlength(ar, n);
  writeln('Введите оценки:');
  for i := 0 to n - 1 do
  begin
    readln(ar[i]);
    case ar[i] of
      2: inc(k2);
      3: inc(k3);
      4: inc(k4);
      5: inc(k5);
    else
      writeln('Не оценка');
      exit;
    end;
  end;
  writeln('2:', k2);
  writeln('3:', k3);
  writeln('4:', k4);
  writeln('5:', k5);
  write('Успеваемость=', (k3 + k4 + k5) / n * 100:0:1);
end.

Пример ввода:
Сколько учеников?6
Введите оценки:
2
2
3
4
5
5
Пример вывода:
2:2
3:1
4:1
5:2
Успеваемость=66.7
4,6(68 оценок)
Ответ:
angelochec1999
angelochec1999
20.12.2022
Uses
  Crt;
var
  i,n:integer;
  a,s:real;
begin
  Writeln('Вычисление среднего арифметического');
  Writeln('последовательности действительных чисел');
  Write('Введите количество чисел последовательности ->');
  Readln(n);
  Writeln('Введите последовательность. После ввода каждого числа нажмите Enter');
  s:=0;
  for i:=1 to n do
  begin
    Read(a);
    s:=s+a
  end;
  Writeln('Среднее арифметическое введенной последовательности: ',s/n);
  Write('Для завершения работы программы нажмите Enter');
  Readkey
end.

Тестовое решение:
Вычисление среднего арифметического
последовательности действительных чисел
Введите количество чисел последовательности ->5
Введите последовательность. После ввода каждого числа нажмите Enter
5.4
7.8
3.0
1.5
2.3
Среднее арифметическое введенной последовательности: 4
Для завершения работы программы нажмите Enter

Для версии Pascal.ABC.Net:
var
  i,n:integer;
  a,s:real;
begin
  Writeln('Вычисление среднего арифметического');
  Writeln('последовательности действительных чисел');
  Write('Введите количество чисел последовательности ->');
  Readln(n);
  Writeln('Введите последовательность. После ввода каждого числа нажмите Enter');
  s:=0;
  for i:=1 to n do
  begin
    Read(a);
    s:=s+a
  end;
  Writeln('Среднее арифметическое введенной последовательности: ',s/n)
end.
 
4,4(86 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ