Помощь - Поиск - Пользователи - Календарь
Полная версия: Матрица
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Invisible
Привет. Помогите решить задачу.
Дана матрица размером 5*4. Поменять местами первую строку и строчку, в которой находится первый нулевой элемент.
Заранее спасибо!
klem4
Читайте правила !

Первым дело FAQ и поиск ! Таких задача решено уйма и в FAQ они тоже есть !

FAQ : Массивы, матрицы, типичные задачи.
Invisible
Да, читал и пробовал. Программа работает, но что-то не то... Не правильно получается.
klem4
И вот это читал ? Как поменять в матрице строки или столбцы ? dry.gif
Invisible
Ну, вот допустим программа после использования вашего FAQ:
Код
uses crt;
const
size_row = 5;
size_col = 4;

type
tvector = array[1 .. size_col] of integer;
tmatrix = array[1 .. size_row] of tvector;
procedure swap_rows(var mx: tmatrix;
        const i, j: integer);
var T: tvector;
begin
  T := mx[i]; mx[i] := mx[j]; mx[j] := T
end;

procedure print(var mx: tmatrix);
var i, j: integer;
begin
  for i := 1 to size_row do
    begin
      for j := 1 to size_col do
        write(mx[i][j]:4);
      writeln
    end;
end;

var
mx: tmatrix;
x, i, j: integer;

begin
clrscr;
for i := 1 to size_row do
  for j := 1 to size_col do
    mx[i][j] := random(20);
writeln('before:'); print(mx);
swap_rows(mx, 1, 5);
writeln('after:'); print(mx);
readln;
end.

Мне нужно поменять местами первую строку и строчку, в которой находится первый нулевой элемент. Так как мне найти этот первый нулевой элемент?
Пробовал добавить строчку
if mx[i][1]:=0 then i:=x;
И изменить
swap_rows(mx, 1, x);
Но получил ошибку с boolean. Подскажите как можно это реализовать?
klem4
Найти первую строку, в которой находится 0 :

i := 1; pos := 0;
while (i<=n) and (pos=0) do begin
j := 1;
while(j<=n) and (x[i,j]<>0) do inc(j);
if j<=n then pos := i;
inc(i);
end;



Можно так :

i := 1; j := 1;
while(i<=n) and (x[i,j]<>0) do begin
j := 1;
while(j<=m) and (x[i,j] <> 0) do
inc(j);
if x[i,j] <> 0 then
inc(i);
end;

pos := 0;
if i<=n then
pos := i;


только переменную лучьше pos не называть, зарезервированное слово всетаки ... нехорошо это
volvo
Invisible, как вариант:
function contains_zero(var mx: tmatrix; row: integer): boolean;
var
j: integer;
found: boolean;
begin
j := 1; found := false;
while (j <= size_col) and (not found) do begin
found := (mx[row][j] = 0); inc(j)
end;
contains_zero := found;
end;

...
{ Заполнение матрицы }
i := 1;
while (i <= size_row) do
if contains_zero(mx, i) then begin
swap_rows(mx, 1, i);
i := succ(size_row);
end
else inc(i);
{ вывод результата }
...
Guest
Хм.... Спасибо. Но что-то результат не тот:

before:
3 10 7 12
14 5 8 14
3 6 0 13
3 1 10 14
0 6 3 9
after:
3 6 0 13
14 5 8 14
3 10 7 12
3 1 10 14
0 6 3 9

Что-то тут все в перемешку.
Вот сама программа:

program seven_two;
uses crt;
const
size_row = 5;
size_col = 4;

type
tvector = array[1 .. size_col] of integer;
tmatrix = array[1 .. size_row] of tvector;
procedure swap_rows(var mx: tmatrix;
const i, j: integer);
var T: tvector;
begin
T := mx[i]; mx[i] := mx[j]; mx[j] := T
end;

procedure print(var mx: tmatrix);
var i, j: integer;
begin
for i := 1 to size_row do
begin
for j := 1 to size_col do
write(mx[i][j]:4);
writeln
end;
end;

function contains_zero(var mx: tmatrix; row: integer): boolean;
var
j:integer;
found: boolean;
begin
j:=1; found:=false;
while (j<=size_col) and (not found) do begin
found:= (mx[row][j]=0); inc(j);
end;
contains_zero:=found;
end;

var
mx: tmatrix;
i, j: integer;

begin
clrscr;
for i := 1 to size_row do
for j := 1 to size_col do
mx[i][j] := random(15);
writeln('before:'); print(mx);
i:=1;
while (i <= size_row) do
if contains_zero(mx, i) then begin
swap_rows(mx, 1, i);
i := succ(size_row);
end
else inc(i);
writeln('after:'); print(mx);
readln;
end.


Это я попробовал способом volvo. Способами klem4 тоже не получилось. Может я что-то не то делаю? Так ткните носом пожалуйста.
volvo
Guest, а что собственно в результате не нравится? По-моему все верно: первый раз ноль встречается в 3-ей строке, она и меняется местами с первой...

Или тебе нужен первый ноль в каком-то определенном столбце?
Invisible
О, извините. Все правильно. Меня просто зациклило в одном месте.
"поменять местами первую строку и строчку, в которой находится первый нулевой элемент". Я думал, что 0 - это первый элемент строки, а это не обязательно так, дошло.
То есть я думал, что менять должна строка, где 0 певрый стоит. Всем огромное спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.