CONST max = 11; TYPE vector = array[1..max]of integer; VAR M, I, K:vector; j:byte;
{ Массивы I,K предварительно реорганизовать следующим образом: на первом месте, в данных массивах должен стоять элемент с минимальным значением} procedure reorganize_vector(var vt:vector); var i, j:byte; min, tmp:integer;
begin // вначале ищем минимальный элемент и запоминаем его место в массиве j:=1;// min:=vt[1];//назначаем наименьшим - первый элемент for i:=2 to max do if (min>vt[i]) then begin min:=vt[i]; j:=i;//индекс наименьшего числа end;
// теперь меняем местами первый элемент массива с наименьшим числом tmp := vt[1];//запоминаем значение первого элемента vt[1] := min;//меняем его на наименьший элемент vt[j] := tmp;//на место наименьшего ставим значение из первого элемента end;
// процедура для вывода массива на экран procedure print_vector(var vt:vector); var j:byte; begin for j:=1 to max do write(vt[j]:6); writeln(' '); end;
BEGIN writeln('Дано:');
//заполняем массивы случаынйми данными randomize; for j:=1 to max do begin I[j]:=random(-128,127); K[j]:=random(-128,127); end;
//выводим их на экран write('массив I[',max,']: '); print_vector(I); write('массив K[',max,']: '); print_vector(K);
writeln(' '); writeln('Реорганизовать массивы так, чтобы на первом месте '); writeln('должен стоять элемент с минимальным значением');
Кортеж (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.
3971₁₀⇒111341₅