PDA

Показать полную графическую версию : [решено] Помогите с прогой на TurboPascal, проверяющую является ли матрица А трёхдиагональной


dasha131
16-10-2010, 15:33
НУжно составить программу, проверяющую, является ли матрица А трёхдиагональной
Трёхдиагональная матрица выглидит как матрица три диагонали которой (средняя и две прилегающие) не равны нулю, а все остальные элементы, не входящие в эти диагонали, равны 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
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
Второй код я вообще не поняла, столько непонятных строк...
Давайте лучше разберем мой код, что тут нужно дополнить для работоспособности
у тебя вполне рабочий код. »
когда ввожу
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
Что то сам себе огорчаюсь, теряю квалификацию прям на ходу :(
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
Теперь проверяю этот код
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
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
Да, теперь работает)) и еще во втором условии не хватало "=" для проверки элементов первой и третьей диагоналей
А что это за закрытие такое интересное
end;//for j »
В первый раз такое вижу

lxa85
17-10-2010, 13:17
А что это за закрытие такое интересное »
когда большое кол-во вложенных циклов или сами циклы довольно объёмны, такая подпись помогает сориентироваться в 5-6 end`ах.
Показывает принадлежность к for, while, case и т.д.

dasha131
17-10-2010, 19:27
А без нее можно код как то записать?

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

dasha131
18-10-2010, 15:50
С многострочным встречалась частенько, а строчный впервый раз вижу =)))




© OSzone.net 2001-2012