Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Помогите с прогой на TurboPascal, проверяющую является ли матрица А трёхдиагональной (http://forum.oszone.net/showthread.php?t=188504)

dasha131 16-10-2010 15:33 1520129

Помогите с прогой на TurboPascal, проверяющую является ли матрица А трёхдиагональной
 
НУжно составить программу, проверяющую, является ли матрица А трёхдиагональной
Трёхдиагональная матрица выглидит как матрица три диагонали которой (средняя и две прилегающие) не равны нулю, а все остальные элементы, не входящие в эти диагонали, равны 0.
Вот тут код есть один, не могу найти ошибку
Код:

program diagonal;
const
    n=8;
var
  a:array[1..n,1..n]of integer;
  f:boolean;
  l,i,j:integer;
begin
  l:=1;
    for i:=1 to n do
    for j:=1 to n do
      begin
        write('Enter A[',i,',',j,']:=');readln(a[i,j]);
      end;
    f:=true;
    for i:=1 to n do
    for j:=1 to n do
            if (abs(i-j)>l)and(a[i,j]<>0)then f:=false;
    write('matrix band:',f:7);
  readln;
end.

Я же правильно поняла, нужно чтобы выполнялось два условия??
1-элементы, входящие в эти три диагонали не равны нулю.
2-элементы , не входящие в эти три диагонали равны нулю.

lxa85 16-10-2010 16:19 1520148

dasha131, у тебя вполне рабочий код.
Собственно он же с "диагностическими" дополнениями.


Код:

program diagonal;
const
    n=8;
var
  a:array[1..n,1..n]of integer;
  f:boolean;
  l,i,j:integer;
begin
  l:=1;
// поставил автоматический ввод матрицы, чтобы не руками
    for i:=1 to n do
    for j:=1 to n do
      begin
        a[i,j]:=abs(i-j);
//if здесь для красоты, т.к. мне лень придумывать как убрать все лишнее с ненужных диагоналей. Ради практического интереса его можно закомментировать
        if a[i,j]<=1 then a[i,j]:=1
                                        else a[i,j]:=0;
        // write('Enter A[',i,',',j,']:=');readln(a[i,j]);
      end;

    for i:=1 to n do
    for j:=1 to n do
            if (abs(i-j)>l)and(a[i,j]<>0)then begin
//повторяет обнуление не главных диагоналей, служит для проверки правильности условия. Писал раньше чем тот if сверху, стирать не стал
//            a[i,j]:=0;
            //writeln(i,' ',j);
            //f:=false;
            end;


    f:=true;

    for i:=1 to n do
    for j:=1 to n do
            if (abs(i-j)>l)and(a[i,j]<>0)then begin
            writeln(i,' ',j); // посмотреть, на какой элемент вызвал "падение" флага
            f:=false;
            end;
    write('matrix band:',f:7);
       
        writeln;

//распечатка матрицы для наглядного поиска
    for i:=1 to n do begin
    for j:=1 to n do
                write(a[i,j], ' ');
        writeln;
        end;       
   
  readln;
end.


dasha131 17-10-2010 07:51 1520525

Второй код я вообще не поняла, столько непонятных строк...
Давайте лучше разберем мой код, что тут нужно дополнить для работоспособности
Цитата:

Цитата lxa85
у тебя вполне рабочий код. »

когда ввожу
1 1 0 0
1 1 1 0
0 1 1 1
0 0 1 1 matrix band: true (согласна)

затем вводилась матрица
1 1 0 0
1 0 1 0
0 1 1 1
0 0 1 1 тоесть а[2,2] = 0 это уже не ленточная матрица, но код опять же выводит matrix band: true

Дак в чем же ошибка?

Нашелся вариант когда программа выводит False
Это случай когда элементы не входящие в эти три диагонали неравны нулю.

lxa85 17-10-2010 10:38 1520588

Что то сам себе огорчаюсь, теряю квалификацию прям на ходу :(
dasha131, добавь в цикл еще одно условие. Т.е. мы проверяем чтобы все что за 3мя было нулевым, а что внутри - нет.
Код:

   
    for i:=1 to n do
    for j:=1 to n do begin
            if (abs(i-j)>l)and(a[i,j]<>0)then f:=false;

            if (abs(i-j)<l)and(a[i,j]=0)then f:=false;
    end; //for j


dasha131 17-10-2010 12:11 1520637

Теперь проверяю этот код
Код:

program asdf;
const
    n=4;
var
  a:array[1..n,1..n]of integer;
  f:boolean;
  l,i,j:integer;
begin
  l:=1;
    for i:=1 to n do
    for j:=1 to n do
      begin
        write('Enter A[',i,',',j,']:=');
        readln(a[i,j]);
      end;
    f:=true;
    for i:=1 to n do
    for j:=1 to n do
    begin
            if (abs(i-j)>l)and(a[i,j]<>0)then f:=false;

      if (abs(i-j)<l)and(a[i,j]=0)then f:=false;
    write('matrix band:',f:7);
  readln;
end;
end.

С появлением второго условия прога стала контролировать элемент a[1,1], если он равен нулю тогда фалс, если нет тогда тру, то есть для матрицы
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0 matrix band: true

lxa85 17-10-2010 12:15 1520640

dasha131, где у тебя end; // for j ?
цикл
Код:

    for j:=1 to n do
    begin
            if (abs(i-j)>l)and(a[i,j]<>0)then f:=false;
            if (abs(i-j)<l)and(a[i,j]=0)then f:=false;
    end;

не закрыт.

А верней закрыт, но не там.
Код:

program asdf;
const
    n=4;
var
  a:array[1..n,1..n]of integer;
  f:boolean;
  l,i,j:integer;
begin
  l:=1;
    for i:=1 to n do
    for j:=1 to n do
      begin
        write('Enter A[',i,',',j,']:=');
        readln(a[i,j]);
      end;
    f:=true;
    for i:=1 to n do
    for j:=1 to n do
    begin
            if (abs(i-j)>l)and(a[i,j]<>0)then f:=false;
            if (abs(i-j)<l)and(a[i,j]=0)then f:=false;
    end;//for j
   
    write('matrix band:',f:7);
  readln;

end.


dasha131 17-10-2010 12:27 1520649

Да, теперь работает)) и еще во втором условии не хватало "=" для проверки элементов первой и третьей диагоналей
А что это за закрытие такое интересное
Цитата:

Цитата lxa85
end;//for j »

В первый раз такое вижу

lxa85 17-10-2010 13:17 1520684

Цитата:

Цитата dasha131
А что это за закрытие такое интересное »

когда большое кол-во вложенных циклов или сами циклы довольно объёмны, такая подпись помогает сориентироваться в 5-6 end`ах.
Показывает принадлежность к for, while, case и т.д.

dasha131 17-10-2010 19:27 1520999

А без нее можно код как то записать?

lxa85 17-10-2010 20:17 1521050

:) Ой рассмешила.
Конечно можно!
//for j - это комментарий. Он на работу программы никак не влияет :)
Вообще, все что за двойным слешем - // это строчный комментарий.
Все что между фигурных скобок
{многострочный
комментарий}

dasha131 18-10-2010 15:50 1521555

С многострочным встречалась частенько, а строчный впервый раз вижу =)))


Время: 01:56.

Время: 01:56.
© OSzone.net 2001-