Примеры правлю

This commit is contained in:
Mikhalkovich Stanislav 2025-11-05 12:17:39 +03:00
parent e0a2854a8e
commit 444637a9a5
21 changed files with 143 additions and 233 deletions

View file

@ -0,0 +1,12 @@
// Функция, возвращающая кортеж
function DivMod(a,b: integer): (integer,integer) := (a div b, a mod b);
begin
var (a,b) := (7,3);
var (d,m) := DivMod(a,b);
Println($'{a} div {b} = {d}; {a} mod {b} = {m}');
(a,b) := (23,5);
(d,m) := DivMod(a,b);
Println($'{a} div {b} = {d}; {a} mod {b} = {m}');
end.

View file

@ -1,14 +1,14 @@
// Использование динамического массива.
// Использование динамического массива.
// Процедура SetLength выделения памяти под динамический массив
// Оператор foreach (массив доступен только на чтение)
var a: array of integer;
begin
var n := 20;
var a: array of integer;
SetLength(a,n);
for var i:=0 to a.Length-1 do
a[i] := Random(1,99);
writeln('Содержимое случайного динамического массива целых: ');
Println('Содержимое случайного динамического массива целых: ');
foreach var x in a do
Print(x);
end.

View file

@ -1,17 +1,16 @@
// Использование динамического массива.
var a: array of integer;
// Использование динамического массива
begin
writeln('При присваивании динамических массивов две переменные начинают указывать на одну память:');
Println('При присваивании динамических массивов две переменные начинают указывать на одну память:');
var n := 20;
a := new integer[n]; // Другой способ выделения памяти
var a := new integer[n]; // Другой способ выделения памяти
for var i:=0 to a.Length-1 do
a[i] := i;
writeln('До присваивания b[5]: a[5]=',a[5]);
Println('До присваивания b[5]: a[5]=',a[5]);
var b: array of integer;
b := a;
b[5] := 666;
writeln('После присваивания b[5]: a[5]=',a[5]);
Println('После присваивания b[5]: a[5]=',a[5]);
end.

View file

@ -1,8 +1,8 @@
// Использование динамического массива.
var a: array of integer;
// Использование динамического массива
begin
writeln('SetLength при повторном вызове не портит старые элементы:');
Println('SetLength при повторном вызове не портит старые элементы:');
var a: array of integer;
SetLength(a,5);
for var i:=0 to a.Length-1 do
a[i] := i+1;

View file

@ -1,23 +1,24 @@
// Передача динамического массива в качестве параметра
// Передача динамического массива в качестве параметра
procedure WriteArr(a: array of integer); // var указывать не нужно, т.к. динамический массив является ссылкой на реальный объект
procedure WriteArr(a: array of integer);
// var указывать не нужно, т.к. динамический массив является ссылкой на реальный объект
begin
foreach x: integer in a do
write(x,' ');
writeln;
foreach var x in a do
Print(x);
Println;
end;
procedure CreateRandomArr(var a: array of integer; n: integer); // var указывать нужно, т.к. в процедуре создается новый динамический массив
procedure CreateRandomArr(var a: array of integer; n: integer);
// var указывать нужно, т.к. в процедуре создается новый динамический массив
begin
a := new integer[n];
for var i:=0 to a.Length-1 do
a[i] := Random(10);
end;
var a: array of integer;
begin
writeln('Случайный целый массив: ');
Println('Случайный целый массив: ');
var a: array of integer;
CreateRandomArr(a,30);
WriteArr(a);
end.

View file

@ -1,6 +1,6 @@
// Ошибка невыделения памяти для динамического массива
var a: array of integer;
// Ошибка невыделения памяти для динамического массива
begin
var a: array of integer;
a[0] := 666;
end.

View file

@ -1,7 +1,7 @@
// Ошибка выхода за границы диапазона для динамического массива
var a: array of integer;
// Ошибка выхода за границы диапазона для динамического массива
begin
var a: array of integer;
SetLength(a,10);
a[10] := 666;
end.

View file

@ -1,42 +1,22 @@
// Сортировка выбором
// Сортировка выбором
procedure SortByChoice(a: array of real);
begin
for var i:=0 to a.Length-2 do
begin
var min := a[i];
var ind := i;
var (min,ind) := (a[i],i);
for var j:=i+1 to a.Length-1 do
if a[j]<min then
begin
min := a[j];
ind := j;
end;
(min,ind) := (a[j],j);
a[ind] := a[i];
a[i] := min;
end;
end;
procedure WriteArr(a: array of real);
begin
foreach x: real in a do
write(x,' ');
writeln;
end;
function CreateRandomArr(n: integer): array of real;
begin
Result := new real[n];
for var i:=0 to Result.Length-1 do
Result[i] := Random(100);
end;
var a: array of real;
begin
a := CreateRandomArr(20);
writeln('Содержимое массива: ');
WriteArr(a);
var a := ArrRandomReal(20);
Println('Содержимое массива: ');
a.Println;
SortByChoice(a);
writeln('После сортировки выбором: ');
WriteArr(a);
Println('После сортировки выбором: ');
a.Println;
end.

View file

@ -1,12 +0,0 @@
// Использование массива
const n=10;
var a: array [1..n] of real;
begin
for var i:=1 to n do
a[i] := Random*10;
writeln('Содержимое случайного массива вещественных: ');
foreach x: real in a do
write(x:4:2,' ');
end.

View file

@ -1,24 +0,0 @@
// Передача массива как параметра подпрограмм
const n=10;
type RealArr = array [1..n] of real;
procedure FillArrByRandom(var a: RealArr; n: integer);
begin
for var i:=1 to n do
a[i] := Random*10;
end;
procedure PrintArr(const a: RealArr; n: integer);
begin
foreach x: real in a do
write(x:4:2,' ');
end;
var a: RealArr;
begin
FillArrByRandom(a,n);
writeln('Содержимое случайного массива вещественных: ');
PrintArr(a,n);
end.

View file

@ -1,41 +0,0 @@
// Процедура exit выхода из подпрограммы
const n=10;
type IntArr = array [1..n] of integer;
procedure FillArrByRandom(var a: IntArr; n: integer);
begin
for var i:=1 to n do
a[i] := Random(10);
end;
procedure PrintArr(const a: IntArr; n: integer);
begin
foreach x: integer in a do
write(x,' ');
writeln;
end;
function IndexOf(const a: IntArr; n: integer; k: integer): integer;
begin
Result := 0;
for var i := 1 to n do
if a[i]=k then
begin
Result := i;
exit; // выход из процедуры
end;
end;
var a: IntArr;
begin
FillArrByRandom(a,n);
writeln('Случайный массив целых: ');
PrintArr(a,n);
var ind := IndexOf(a,n,7);
if ind>0 then
writeln('Индекс первого элемента 7 равен ', ind)
else writeln('Элемент 7 отсутствует');
end.

View file

@ -1,7 +1,7 @@
// Демонстрация секций инициализации и финализации модулей
// Демонстрация секций инициализации и финализации модулей
// Откройте модуль MyUnit, нажав на имени модуля правой мышью и выбрав пункт "Перейти к определению"
uses MyUnit;
begin
writeln('Основная программа')
Println('Основная программа')
end.

View file

@ -1,7 +1,7 @@
unit MyUnit;
unit MyUnit;
initialization
writeln('Секция инициализации. Выполняется до начала основной программы')
Println('Секция инициализации. Выполняется до начала основной программы')
finalization
writeln('Секция финализации. Выполняется после окончания основной программы')
Println('Секция финализации. Выполняется после окончания основной программы')
end.

View file

@ -1,8 +1,8 @@
unit MyA;
unit MyA;
procedure p;
begin
writeln('MyA.p');
Println('MyA.p');
end;
begin

View file

@ -1,8 +1,8 @@
unit MyB;
unit MyB;
procedure p;
begin
writeln('MyB.p');
Println('MyB.p');
end;
begin

View file

@ -1,13 +1,10 @@
uses MyUnit; // подключили модуль
uses MyUnit; // подключили модуль
const Sz = 10;
var a: IntArr;
begin
Assert(sz<=Size,'Размер массива должен быть <='+Size.ToString);
FillArr(a,Sz);
writeln('Содержимое массива: ');
WriteArr(a,Sz);
writeln('Минимальный элемент: ',Min(a,Sz));
var a: IntArr := FillArr(Sz);
Println('Содержимое массива:');
a.Println;
Println('Минимальный элемент:',Min(a));
end.

View file

@ -1,33 +1,26 @@
/// Модуль упрощенной структуры
/// Модуль упрощенной структуры
unit MyUnit; // имя модуля должно совпадать с именем файла
const Size = 100;
type IntArr = array [1..Size] of integer;
type IntArr = array of integer;
var Delimiter: string := ' ';
// Документирующие комментарии отображаются при наведении на имя курсора мыши
/// Заполняет массив случайными числами
procedure FillArr(var a: IntArr; n: integer);
function FillArr(n: integer): IntArr;
begin
for var i:=1 to n do
a[i] := Random(100);
end;
/// Выводит массив
procedure WriteArr(const a: IntArr; n: integer);
begin
for var i:=1 to n do
write(a[i],Delimiter);
writeln;
Result := new integer[n];
for var i:=0 to Result.Length-1 do
Result[i] := Random(100);
end;
/// Возвращает минимальный элемент в массиве
function Min(const a: IntArr; n: integer): integer;
function Min(a: IntArr): integer;
begin
Result := a[1];
for var i:=1 to n do
Result := a[0];
for var i:=1 to a.Length-1 do
if Result > a[i] then
Result := a[i];
end;

View file

@ -1,40 +1,20 @@
// Поиск значения в случайной матрице. Использование оператора goto
const
sz = 10;
m = 4;
n = 5;
type Matrix = array [1..sz,1..sz] of integer;
label 1;
var matr: Matrix;
// Заполнение и вывод случайной матрицы
begin
// Заполнение матрицы m x n случайными числами
for var i := 1 to m do
for var j := 1 to n do
matr[i,j] := Random(100);
var a := new integer[3,4];
// Вывод матрицы
for var i := 1 to m do
begin
for var j := 1 to n do
write(matr[i,j]:3);
writeln;
end;
for var i:=0 to a.RowCount-1 do
for var j:=0 to a.ColCount-1 do
a[i,j] := i + j;
// Есть ли в матрице элемент 5?
var found5 := False;
for var i := 1 to m do
for var j := 1 to n do
if matr[i,j]=5 then
begin
found5 := True;
goto 1; // Ай как нехорошо! Но это лучший способ выхода из двух вложенных циклов сразу
end;
1:
if found5 then
writeln('Элемент 5 найден')
else writeln('Элемент 5 не найден')
a.Println;
Println(a);
// 3 позиции под каждое значение
a.Println(3);
var mr := MatrRandomReal(3,4);
mr.Println;
Println(mr);
// 6 позиций под каждое значение и 1 под дробную часть
mr.Println(6,1);
end.

View file

@ -1,37 +1,12 @@
// Матрица как динамический массив массивов
type Matrix = array of array of integer;
function CreateMatrix(m,n: integer): Matrix;
begin
SetLength(Result,m);
for var i:=0 to m-1 do
SetLength(Result[i],n);
end;
procedure FillMatrByRandom(matr: Matrix);
begin
for var i:=0 to matr.Length-1 do
for var j:=0 to matr[0].Length-1 do
matr[i][j] := Random(100);
end;
procedure WriteMatrix(matr: Matrix);
begin
for var i := 0 to matr.Length-1 do
begin
for var j := 0 to matr[0].Length-1 do
write(matr[i,j]:3);
writeln;
end;
end;
var matr: Matrix;
// Заполнение матрицы
begin
var m := 5;
var n := 7;
matr := CreateMatrix(m,n);
// Создающая функция Matr
var a := Matr([1,2,3,4],[5,6,7,8],[9,10,11,12]);
a.Println(3);
Println;
FillMatrByRandom(matr);
WriteMatrix(matr);
// Создающая функция MatrGen
var a1 := MatrGen(3,4,(i,j)->i+j+0.5);
a1.Println(5,1);
end.

View file

@ -0,0 +1,25 @@
// Строки и столбцы
begin
var a := MatrRandomInteger(3,4);
a.Println;
Println;
// Цикл для вывода k-той строки
var k := 1;
for var j:=0 to a.ColCount-1 do // foreach var x in a.Row(k) do Print(x);
Print(a[k,j]);
Println;
// a.Row(k) возвращает одномерный массив - k-тую строку
a.Row(k).Println;
// Цикл для вывода k-того столбца
k := 2;
for var i:=0 to a.RowCount-1 do
Print(a[i,k]);
Println;
// a.Col(k) возвращает одномерный массив - k-тый столбец
a.Col(k).Println;
end.

View file

@ -0,0 +1,25 @@
// Строки и столбцы
begin
var a := MatrRandomInteger(3,4);
a.Println;
Println;
// Цикл для вывода k-той строки
var k := 1;
for var j:=0 to a.ColCount-1 do // foreach var x in a.Row(k) do Print(x);
Print(a[k,j]);
Println;
// Срез a[k,:] возвращает одномерный массив - k-тую строку
a[k,:].Println;
// Цикл для вывода k-того столбца
k := 2;
for var i:=0 to a.RowCount-1 do
Print(a[i,k]);
Println;
// Срез a[:,k] возвращает одномерный массив - k-тый столбец
a[:,k].Println;
end.