Показать сообщение отдельно

  #5133  
Старый 09.12.2009, 15:47
StealthMaster
Познающий
Регистрация: 03.12.2008
Сообщений: 56
С нами: 9176827

Репутация: 29
По умолчанию

Цитата:
Сообщение от Sin3v  
Решите плиз) (Паскаль)
в каждом столбце и каждой строк матрицы самодержица строго по одному не левому элементу. Перестановкой строк добиться расположение всех нулей по главной диагонали. В программе должна присутствовать проверка чтоб в строке был строго один ноль, в противном случае цикл не выполняться.
Код:
PROGRAM PMatrix;
uses
    Crt;

const
     N = 3;

Var
   Matrix:      Array [1..N,1..N] of byte;
   Indexes:     set of byte;
   counter:     byte;

function CheckLine(LineIndex: byte): boolean;
var
   i, j:        byte;
begin
     counter := 0;
     CheckLine := false;
     for i := 1 to N do
         if (Matrix[LineIndex,i] = 0) then
            begin
                 inc(counter);
                 if counter > 1 then
                    begin
                         CheckLine := false;
                         exit;
                    end;
                 if (i in Indexes) then
                    begin
                         CheckLine := false;
                         exit;
                    end;
            end;
    CheckLine := true;
end;


procedure GenerateMatrix;
var
   tmpindex:    byte;
   i, j:        byte;
begin
     Indexes := [];
     randomize;

     for i := 1 to N do
         begin
              repeat
                    tmpindex := random(N)+1;
                    for j := 1 to N do
                        if j = tmpindex then
                           Matrix[i,j] := 0
                        else
                           Matrix[i,j] := random(99)+1;
              until (CheckLine(i));

              Indexes := Indexes + [tmpindex];
         end;
end;


procedure ChangeLines(index1, index2: byte);
var
   tmp:         byte;
   i:           byte;
begin
     for i := 1 to N do
         begin
              tmp := Matrix[index1,i];
              Matrix[index1,i] := Matrix[index2,i];
              Matrix[index2,i] := tmp;
         end;

end;


procedure SortMatrix;
var
   i, j:        byte;
begin
     for i := 1 to N do
         begin
              if not(CheckLine(i)) then
                 exit;
              for j := 1 to N do
                  if (Matrix[i,j] = 0) then
                     ChangeLines(i,j);
         end;
end;


procedure ShowMatrix;
var
   i, j:        byte;
begin
     for i := 1 to N do
         begin
              for j := 1 to N do
                  if (Matrix[i,j] < 10) then
                     write(' ', Matrix[i,j], ' ')
                  else
                      write(Matrix[i,j], ' ');
              writeln
         end;
end;


var
   i, j:        byte;
   choice:      char;
begin
     clrscr;
     write('Would you like to generate the matrix automatically? (y/n)');
     readln(choice);
     if (choice = 'y') then
        GenerateMatrix
     else
         for i := 1 to N do
             for j := 1 to N do
                 begin
                 write('Matrix[',i,',',j,'] = ');

                 readln(Matrix[i,j]);
                 if (Matrix[i,j] = 0) then
                    Indexes := Indexes + [j];
                 end;

     writeln;
     ShowMatrix;
     writeln;
     SortMatrix;
     ShowMatrix;
     readln;
end.

Небольшой комментарий:
  • размер матрицы задается с помощью константы N. Поскольку есть возможность ручного ввода матрицы, то значение по умолчанию у N небольшое.
  • GenerateMatrix - заполняет матрицу правильным образом
  • ChangeLines - меняет 2 строки местами
  • SortMatrix - упорядочивает строки согласно заданию
  • ShowMatrix - выводит матрицу на экран
  • CheckLine - проверяет, нет ли в какой-либо строке или столбце более 1 нуля.

Последний раз редактировалось StealthMaster; 09.12.2009 в 19:06..
 
Ответить с цитированием