Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент - Turbo Pascal
Формулировка задачи:
Ребятки всем привет. Помогите пожалуйста,я конечно новенький на форуме,и не очень соображаю в паскале а тут вообще затруднение. Буду развиваться.
Дана целочисленная прямоугольная матрица.
1. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент.
2. Характеристикой строки целочисленной матрицы назовем сумму ее отрицательных четных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с убыванием характеристик.
Решение задачи: «Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент»
textual
Листинг программы
type
TLine = Array[Byte] Of Integer;
TArray = Array[Byte] Of TLine;
procedure PrintArray(const ar: TArray; const n, m: Byte);
var
i, j: Byte;
begin
for i := 0 to n - 1 do
begin
for j := 0 to m - 1 do
Write(ar[i, j]:4);
WriteLn;
end;
WriteLn;
end;
procedure GenerateArray(var ar: TArray; var n, m: Byte);
var
i, j: Byte;
begin
repeat
Write('Input n (>0)=');
ReadLn(n);
until (n > 0);
repeat
Write('Input m (>0)=');
ReadLn(m);
until (m > 0);
for i := 0 to n - 1 do
for j := 0 to m - 1 do
ar[i, j] := Random(199) - 99;
PrintArray(ar, n, m);
end;
function FindColumnWithZero(const ar: TArray; const n, m: Byte): Integer;
var
Result: Integer; //удалить строку при ошибке повторного объявления
i, j: Byte;
begin
Result := -1;
j := 0; i := 0;
while ((j < m) And (Result = -1)) do
begin
while ((i < n) And (Result = -1)) do
begin
if (ar[i, j] = 0)
then
Result := j
else
Inc(i);
end;
Inc(j);
end;
FindColumnWithZero := Result;
end;
function SumNegative(const l: TLine; const m: Byte): Integer;
var
Result: Integer; //удалить строку при ошибке повторного объявления
j: Byte;
begin
Result := 0;
for j := 0 to m - 1 do
if (l[j] < 0)
then
Inc(Result, l[j]);
SumNegative := Result;
end;
procedure Sort(var ar: TArray; const n, m: Byte);
var
i, j: Byte;
sums: TLine;
procedure SwapLines(var x, y: TLine; var xx, yy: Integer);
var
z: TLine;
zz: Integer;
begin
z := x; zz := xx;
x := y; xx := yy;
y := z; yy := zz;
end;
begin
for i := 0 to n - 1 do
sums[i] := SumNegative(ar[i], m);
for i := 0 to n - 2 do
for j := i + 1 to n - 1 do
if (sums[i] < sums[j])
then
SwapLines(ar[i], ar[j], sums[i], sums[j]);
PrintArray(ar, n, m);
end;
var
ar: TArray;
n, m: Byte;
ans: Integer;
begin
Randomize();
GenerateArray(ar, n, m);
ans := FindColumnWithZero(ar, n, m);
if (ans <> -1)
then
WriteLn('First column with zero: ', ans)
else
WriteLn('No one zero element!');
Sort(ar, n, m);
end.
Объяснение кода листинга программы
Этот код написан на Turbo Pascal и решает задачу определения номера первого столбца, содержащего хотя бы один нулевой элемент в массиве. Вот список действий, представленный в виде циклов и функций:
- В функции
GenerateArrayсоздается массивar, заполненный случайными числами от 0 до 99. Затем вызывается функцияPrintArray, которая печатает содержимое массива. - Функция
FindColumnWithZeroищет первый столбец с хотя бы одним нулевым элементом. Она возвращает номер этого столбца, если такой столбец найден, и -1, если нет. - Функция
SumNegativeсуммирует все отрицательные элементы в заданном столбце. - В функции
Sortвызывается функцияSwapLines, которая меняет местами элементы двух строк. Затем массивarсортируется по возрастанию. - В основной части кода сначала генерируется случайный массив, затем находится первый столбец с хотя бы одним нулевым элементом, затем этот столбец сортируется, и наконец выводится результат.