Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 16.06.2012, 20:42   #1 (permalink)
TIMERA
Новичок
 
Регистрация: 16.06.2012
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Нужна помощь со второй половиной задачи на матрицы

Уважаемые программисты! Помогите с задачкой, очень нужно

Дан двумерный массив А(М,М) в виде квадратной матрицы. Составьте программу, обнуляющую главную диагональ матрицы, если в ней найдется хотя бы один отрицательный элемент. Из элементов побочной диагонали сформируйте одномерный массив и отсортируйте его по возрастанию методом Шелла (Shell Sort). Выведите на экран исходную и преобразованную матрицы и отсортированный массив.

первую часть программы написала(до красного шрифта):
Код Pascal

const n=5;
var
a:array[1..n,1..n] of longint;
i,j:integer;
begin
writeln('Заполните матрицу ');
for i:=1 to n do
for j:=1 to n do
begin
read(a[i,j]);
end;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:5);
writeln;
end;
for i:=1 to n do
for j:=1 to n do
if i=j then
if a[i,j]<0 then
if i=j then
a[i,j]:=0;
writeln;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:5);
writeln;
end;
end;
TIMERA вне форума   Ответить с цитированием

Старый 16.06.2012, 20:42
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Аналогичное уже было создано ранее, можете почитать

Задачи на матрицы. Паскаль
нужна помощь
Нужна помощь
Задачи на матрицы
Нужна помощь в решении задачи
Нужна помощь в решении задачи

Старый 16.06.2012, 21:06   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от TIMERA Посмотреть сообщение
for i:=1 to n do
for j:=1 to n do
if i=j then
if a[i,j]<0 then
if i=j then
a[i,j]:=0;
Нет-нет, сударыня - не пойдет! Громоздко и неправильно. Это делается так:
В список переменных добавляем "флажок", лучше всего булевский, например b:boolean;
Дальше:
Код:
b:=false;
for i:=1 to n do
 if a[i,i]<0 then b:=true;
if b then
 for i:=1 to n do a[i,i]:=0;
Насчет Шелла - посмотрю, но это, скорее всего, завтра.
Vladimir_S вне форума   Ответить с цитированием
Старый 16.06.2012, 21:43   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Да, и еще вопрос: как нумеровать элементы побочной диагонали - от правого верхнего угла в левый нижний или наоборот? Я так вот не знаю.
Vladimir_S вне форума   Ответить с цитированием
Старый 16.06.2012, 22:12   #4 (permalink)
TIMERA
Новичок
 
Регистрация: 16.06.2012
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Да, и еще вопрос: как нумеровать элементы побочной диагонали - от правого верхнего угла в левый нижний или наоборот? Я так вот не знаю.
да без разницы...
добавить в переменные массив, а ему присвоить элементы побочной

masp[i]:=a[i,n-i+1]

мне бы отсортировать этот массив методом Шелла...
TIMERA вне форума   Ответить с цитированием
Старый 16.06.2012, 23:00   #5 (permalink)
TIMERA
Новичок
 
Регистрация: 16.06.2012
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

кажется получилось...))

вторая часть:
for i:=1 to n do
begin
masp[i]:=a[i,n-i+1];
end;
writeln;
writeln('pobochnaya diagonal');
for i:=1 to n do
write(masp[i]:3);
readln;
begin
k:=n div 2;
while k>0 do begin
for j:=n-k downto 1 do begin
i:=j;
while i<=n-k do begin
if masp[i]>masp[i+k] then begin
c:=masp[i];
masp[i]:=masp[i+k];
masp[i+k]:=c;
end;
i:=i+k;
end;
end;
k:=k div 2;
end;
writeln;
for i:=1 to n do
write(masp[i]:4);
end;
readln;
end.
TIMERA вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 17.06.2012, 11:58   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Получиться-то получилось, но это пол дела. Беда в том, что алгоритм Шелла в общем случае не доводит упорядочение до конца, а осуществляет лишь предварительную сортировку. Далее, после того, как стало k=1, необходимо применить сортировку пузырьком или вставкой.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 13:31.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.