• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Нужна помощь со второй половиной задачи на матрицы

  • Автор темы Автор темы TIMERA
  • Дата начала Дата начала

TIMERA

Ученик
Регистрация
16 Июн 2012
Сообщения
3
Реакции
0
Баллы
0
Нужна помощь со второй половиной задачи на матрицы

Уважаемые программисты! Помогите с задачкой, очень нужно: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;
 
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;
Насчет Шелла - посмотрю, но это, скорее всего, завтра.
 
Да, и еще вопрос: как нумеровать элементы побочной диагонали - от правого верхнего угла в левый нижний или наоборот? Я так вот не знаю.
 
Да, и еще вопрос: как нумеровать элементы побочной диагонали - от правого верхнего угла в левый нижний или наоборот? Я так вот не знаю.

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

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

мне бы отсортировать этот массив методом Шелла...
 
кажется получилось...))

вторая часть:
for i:=1 to n do
begin
masp:=a[i,n-i+1];
end;
writeln;
writeln('pobochnaya diagonal');
for i:=1 to n do
write(masp: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>masp[i+k] then begin
c:=masp;
masp:=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:4);
end;
readln;
end.
 
Получиться-то получилось, но это пол дела. Беда в том, что алгоритм Шелла в общем случае не доводит упорядочение до конца, а осуществляет лишь предварительную сортировку. Далее, после того, как стало k=1, необходимо применить сортировку пузырьком или вставкой.
 
Назад
Сверху