Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Нужна помощь со второй половиной задачи на матрицы (http://www.tehnari.ru/f41/t75035/)

TIMERA 16.06.2012 20:42

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

Дан двумерный массив А(М,М) в виде квадратной матрицы. Составьте программу, обнуляющую главную диагональ матрицы, если в ней найдется хотя бы один отрицательный элемент. Из элементов побочной диагонали сформируйте одномерный массив и отсортируйте его по возрастанию методом Шелла (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;

Vladimir_S 16.06.2012 21:06

Цитата:

Сообщение от TIMERA (Сообщение 750294)
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

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

TIMERA 16.06.2012 22:12

Цитата:

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

да без разницы...
добавить в переменные массив, а ему присвоить элементы побочной

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

мне бы отсортировать этот массив методом Шелла...

TIMERA 16.06.2012 23:00

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

вторая часть:
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.

Vladimir_S 17.06.2012 11:58

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


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

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.