Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] Помогите с прогой на TurboPascal, проверяющую является ли матрица А трёхдиагональной

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

Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


НУжно составить программу, проверяющую, является ли матрица А трёхдиагональной
Трёхдиагональная матрица выглидит как матрица три диагонали которой (средняя и две прилегающие) не равны нулю, а все остальные элементы, не входящие в эти диагонали, равны 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-элементы , не входящие в эти три диагонали равны нулю.

Отправлено: 15:33, 16-10-2010

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


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.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 16:19, 16-10-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


Второй код я вообще не поняла, столько непонятных строк...
Давайте лучше разберем мой код, что тут нужно дополнить для работоспособности
Цитата 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
Это случай когда элементы не входящие в эти три диагонали неравны нулю.

Отправлено: 07:51, 17-10-2010 | #3


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Что то сам себе огорчаюсь, теряю квалификацию прям на ходу :(
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

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:38, 17-10-2010 | #4


Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


Теперь проверяю этот код
Код: Выделить весь код
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

Отправлено: 12:11, 17-10-2010 | #5


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


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.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Последний раз редактировалось lxa85, 17-10-2010 в 12:19. Причина: add code

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:15, 17-10-2010 | #6


Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


Да, теперь работает)) и еще во втором условии не хватало "=" для проверки элементов первой и третьей диагоналей
А что это за закрытие такое интересное
Цитата lxa85:
end;//for j »
В первый раз такое вижу
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:27, 17-10-2010 | #7


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


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

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 13:17, 17-10-2010 | #8


Новый участник


Сообщения: 40
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

Отправлено: 19:27, 17-10-2010 | #9


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


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

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:17, 17-10-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] Помогите с прогой на TurboPascal, проверяющую является ли матрица А трёхдиагональной

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Вектор и матрица toy Программирование и базы данных 8 01-06-2010 19:15
Матрица ноутбука Vlademort Ноутбуки 2 26-10-2009 12:03
матрица - Windows belyinosorog Ноутбуки 5 05-05-2009 08:03
Rowerbooke512wh матрица Pasha_11 Ноутбуки 0 13-12-2008 11:48
Delphi - Помогите с прогой Forsberg Программирование и базы данных 2 30-05-2008 19:35




 
Переход