Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Матрица. Суммы диоганалей паралельных главной и побочной

Автор: Евгений 4.12.2010 8:08

С заданием в принципе справился, но терзают меня смутные сомненья, что ее можно сделать и покороче заменив два цикла подсчета сумм паралельнных Главной(Побочной), на один , например через 2*М-1, но не как не могу справиться с агоритмом изменения индексов матрицы. Может есть у кого какие мысли на этот счет?


Program Massiv;
uses crt;
const M=3;
var
a: Array [1..M,1..M] of Integer;
sum: Integer;
j,I: Byte;
begin
textbackground(white);
clrscr;
textcolor(black);
Writeln('Введите ');
For I := 1 to M do
For j := 1 to M do
begin
Write(i,'-',j,' ');
Readln(a[i,j]);
end;
for i:= 1 to M do
begin
sum:=0;
for j:= 1 to i do
sum:= sum + a[j,M-i+j];
writeln(sum);
end;
for i:= 1 to M-1 do
begin
sum:=0;
for j:= 1 to M-i do
sum:= sum + a[i+j,j];
writeln(sum);
end;
for i:= 1 to M do
begin
sum:=0;
for j:= 1 to i do
sum:= sum + a[I+1-j,j];
writeln(sum);
end;
for i:= 1 to M-1 do
begin
sum:=0;
for j:= 1 to M-i do
sum:= sum + a[j+i,M+1-j];
writeln(sum);
end;
readln;
end.


Автор: Lapp 4.12.2010 18:28

Цитата(Евгений @ 4.12.2010 4:08) *
С заданием в принципе справился, но терзают меня смутные сомненья, что ее можно сделать и покороче заменив два цикла подсчета сумм паралельнных Главной(Побочной), на один , например через 2*М-1, но не как не могу справиться с агоритмом изменения индексов матрицы. Может есть у кого какие мысли на этот счет?
Конечно, можно покороче )). И в первую очередь - за счет выбрасывания на фиг НЕНУЖНОЙ И ВРЕДНОЙ CRT со всеми ее процедурами и функциями (а САМАЯ вредная - ClrScr, брр..)

Про замену циклов говорить не буду. Мысли на этот счет - все поменять в корне и сделать НАМНОГО ПРОЩЕ. Весь подсчет умещается в три строки. Я вижу, что ты работаешь, поэтому даю тебе полное готовое решение. Разбирайся с ним и задавай вопросы, что неясно - ладно?
const
m=3;
n=2*m-1;
var
a: array [1..m,1..m] of integer;
b,c: array [1..n] of integer;
s1,s2,i,j: integer;

begin
// filling up the matrix
for i:=1 to m do for j:=1 to m do a[i,j]:=Random(10);
// show the matrix
for i:=1 to m do begin
for j:=1 to m do Write(a[i,j]:4);
WriteLn
end;
WriteLn;
// counting the sums
for i:=1 to m do for j:=1 to m do begin
Inc(b[j-i+m],a[i,j]);
Inc(c[i+j-1],a[i,j])
end;
// output the result
WriteLn('Main Diagonals Sums:');
for i:=1 to n do Write(b[i]:4);
WriteLn;
WriteLn('Side diagonals Sums:');
for i:=1 to n do Write(c[i]:4);
ReadLn
end.

Надеюсь, ты скачал и установил FreePascal. Если нет - давай, скачивай, или убери/переделай комментарии.
Успехов тебе.

P.S.
А от CRT - отвыкай. Это хуже, чем маленькие колесики сбоку у детского велосипеда. Когда действительно НУЖНО - тогда пользуй. А без дела менять цвет и чистить экран - это вызывает длинную тираду нехороших слов у тех, кто твою программу запускает.. ))

Автор: Евгений 5.12.2010 3:19

Спасибо за помощь! Не все мне в этой программе понятно, но постараюсь разобраться, если что не пойму, надеюсь разъясните)).
Прошу строго меня не судить, если вопросы в вашем понимании покажутся глупыми. От получения задания до сессии, мне отведен месяц с небольшим и в голове каша из дискретной математики, алгебры логики, программирования и т.д., если что то не получается откладываю, занимаюсь другим, затем возращаюсь.
По поводу CRT , в задание есть условие об использовании очистки экрана и т.д., просто в каком виде ее написал в том и выложил, но на будующее учту.

Автор: Lapp 5.12.2010 3:46

Цитата(Евгений @ 4.12.2010 23:19) *
в задание есть условие об использовании очистки экрана и т.д., просто в каком виде ее написал в том и выложил, но на будующее учту.
Ну, что сказать.. Мне жаль, что у тебя такие учителя. Очистку экрана нужно использовать только в тех задачах, где она необходима (например, там есть меню, управление курсором..) В консольных задачах свой стиль. Ты можешь себе представить, что ты печатаешь команду dir или cd - а она тебе бах и очистила все результаты твоей предыдущей работы? ))

Давай, разбирайся. Там все тривиально просто, только нужно мозги переключить с одного образа мышления на другой. Надо будет - объясню подробно, нет проблем )).

Автор: Credo 5.12.2010 19:24

Цитата
А от CRT - отвыкай

Нужно пользовотся со всеми модулями что облегчает жизнь которые когда то написали умненькие дяденьки smile.gif

Автор: volvo 5.12.2010 19:33

CRT усложняет жизнь пользователю. Видеть не могу, когда начинающие программисты
1) раскрашивают свои программы, как елки, всеми цветами радуги
2) убирают с экрана то, что было на нем ДО запуска их супер-пупер-нужной (как им кажется) программы. МНЕ, пользователю, решать, какая программа нужная, а какая - нет. Та, которая считает себя важнее других (и убирает с экрана то, что было до ее запуска) сразу летит в мусорку. Умные дяденьки написали достаточно модулей, чтобы при старте программы сохранить содержимое экрана, а при финише - восстановить его, если уж на то пошло. А еще лучше - не трогать чужое. Вывел свои результаты и угомонись. Не надо убирать ЧУЖИЕ.

Автор: Lapp 6.12.2010 5:32

volvo, извини, в чем-то я повторю твои слова..

Цитата(Credo @ 5.12.2010 15:24) *
Нужно пользовотся со всеми модулями что облегчает жизнь которые когда то написали умненькие дяденьки smile.gif

Я не стану говорить, что не нужно пользоваться спичками или ножами. Но детям давать их все равно не буду. Потому что пользоваться нужно умеючи.

Если тебе НУЖНА эта функциональность - пожалуйста, используй. Если же ты просто прибалдел от розового цвета и все теперь раскрашиваешь - то ПТНФ (пошел ты на фиг). А когда ты делаешь ClrScr - ты стираешь ВСЕ (не только свое). А ты сотри все с диска, прежде чем записать туда свой файл - флаг тебе в руки. Во, крастота-то будет! Все чистенько, все в порядочке!

Кроме того, CRT нарушает стандартную модель доступа к файлам (что не написано в ее описании) и приводит к многим осложнениям при работе с диском.

Умные дяденьки придумали ядерную бомбу. Иди, используй..