Помощь - Поиск - Пользователи - Календарь
Полная версия: Матрица
Форум «Всё о Паскале» > 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 певрый стоит. Всем огромное спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.