Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal]Посчитать сумму элементов каждой диагонали


Автор: Kuperus 7.5.2007, 22:40
Приветик всем!
Помогите кто может? Проблема состоит в следующем. Не могу понять smile ,как можно посчитать сумму элементов каждой диагонали(диагонали слева направо, снизу вверх).
Заранее спасибо за ответы. 

Автор: sergejzr 7.5.2007, 23:16
Для домашних заданий, курсовых, существует "Центр Помощи"

Тема перенесена! 

Автор: Klin 8.5.2007, 00:57
Это просто (но долго оформлять, перебираются нужные элементы и  складываются. Вот решение на скорую руку:
Код

var n: array[1..4,1..4] of integer;
     xLine, yLine: array[1..4] of integer;
     x,y: integer;
begin

 randomize;
 for y:=1 to 4 do
  for x:=1 to 4 do n[x,y]:=random(10);
 { заполнения матрицы }

 for y:=1 to 4 do begin
  xLine[x]:=0;
  for x:=1 to 4 do
    begin
     yLine[x]:=yLine[x]+n[x,y];
     xLine[y]:=xLine[y] + n[x,y];
    end;
 end;
 { подсчет сумм }

 writeln; writeln; write('  ');

 for x:=1 to 4 do write(' ',yLine[x]);
 writeln; writeln;
 for y:=1 to 4 do begin
  write(xLine[y],'  ');
  for x:=1 to 4 do write(n[x,y],' ');
  writeln;
 end;
 { вывод на экран }
end.


p.s. можно покороче, если не горит, будет время напишу

Автор: Kuperus 9.5.2007, 22:28
Нехочу огорчать, но походу прога не работает. Может неправильно понята задача. Вот она вполном оригинале: в прямоугольной матрице выявить все димагонали, сумма элементов которых равна заданному числу m (m-вводится, диагонали слева- направо, снизу- вверх. 

Автор: Klin 9.5.2007, 23:07
Цитата(Kuperus @  9.5.2007,  23:28 Найти цитируемый пост)
Нехочу огорчать, но походу прога не работает

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

Добавлено через 47 секунд
а может и седня smile

Автор: Kuperus 10.5.2007, 00:33
Спасибо! Буду очень благодарен за помощь.

Автор: Klin 10.5.2007, 01:54
Собственно готово smile Программа вызывает процедуру, в которой находит сумму каждой диагонали и выводит на экран, при совпадении с заданным числом.
Код

uses CRT; { библиотека для использования функции очистки экрана }
{--------------------------------------------------------------}
const nx = 4; ny = nx;
var n: array[1..nx,1..ny] of integer;
    x,y,_x,_y,m,sum: integer;
{--------------------------------------------------------------}
{ *** проверка суммы диагоналей и вывод на экран нужных значений *** }
procedure ShowSum (mysum: integer);
begin
 for x:=1 to nx do begin
  _y:=1; sum:=0;
  for _x:=x to nx do begin
    sum:=sum+n[_x,_y]; _y:=_y+1
  end;
 if (sum = mysum) then writeln('Диагональ: ',x,':',1);
 end;
 { проверка диагоналей по оси x }

 for y:=2 to nx do begin
  _x:=1; sum:=0;
  for _y:=y to nx do begin
    sum:=sum+n[_x,_y]; _x:=_x+1
  end;
 if (sum = mysum) then writeln('Диагональ: ',1,':',y);
 end;
 { проверка диагоналей по оси y, за исключением общей с осью x }
end;
{--------------------------------------------------------------}
begin
 clrscr; { очистка экрана }
 randomize; { если убрать, то случайность не зависит от времени }
 for y:=1 to 4 do begin writeln;
  for x:=1 to 4 do begin [x,y]:=random(9); write(n[x,y],' '); end;
 end;
 { заполняем массив случайным образом }

 m:=10; { задаваемое число }

 writeln; writeln;
 writeln(' - Диагонали, сумма которых равна ',m,' -');
 writeln;
 { лирическое отступление ;) }

 ShowSum(m); { вызов процедуры проверки суммы диагоналей }
end.


На всякий случай, напомню, что количество диагоналей равно сумме длинн матрицы - 1.

Автор: Kuperus 12.5.2007, 23:48
Извени, но чё-то опять не работает. Где-то вроде ошибка, но немогу понять где. Просит поставить к самому последнему end вместо точти, точку с запято, а когда ставлю выдаёт ошибку:  Unexpected and of file. Если нетрудно посмотри ещё разок прогу.

Автор: Klin 12.5.2007, 23:53
не отключайтесь, проверяю

Добавлено @ 23:55
странно, но нашел ошибку smile Там в строке 33, названия массива не хватает. Вот исправленное:
Код

uses CRT; { библиотека для использования функции очистки экрана }
{--------------------------------------------------------------}
const nx = 4; ny = nx;
var n: array[1..nx,1..ny] of integer;
    x,y,_x,_y,m,sum: integer;
{--------------------------------------------------------------}
{ *** проверка суммы диагоналей и вывод на экран нужных значений *** }
procedure ShowSum (mysum: integer);
begin
 for x:=1 to nx do begin
  _y:=1; sum:=0;
  for _x:=x to nx do begin
    sum:=sum+n[_x,_y]; _y:=_y+1
  end;
 if (sum = mysum) then writeln('Диагональ: ',x,':',1);
 end;
 { проверка диагоналей по оси x }

 for y:=2 to nx do begin
  _x:=1; sum:=0;
  for _y:=y to nx do begin
    sum:=sum+n[_x,_y]; _x:=_x+1
  end;
 if (sum = mysum) then writeln('Диагональ: ',1,':',y);
 end;
 { проверка диагоналей по оси y, за исключением общей с осью x }
end;
{--------------------------------------------------------------}
begin
 clrscr; { очистка экрана }
 randomize; { если убрать, то случайность не зависит от времени }
 for y:=1 to 4 do begin writeln;
  for x:=1 to 4 do begin n[x,y]:=random(9); write(n[x,y],' '); end;
 end;
 { заполняем массив случайным образом }

 m:=10; { задаваемое число }

 writeln; writeln;
 writeln(' - Диагонали, сумма которых равна ',m,' -');
 writeln;
 { лирическое отступление ;) }

 ShowSum(m); { вызов процедуры проверки суммы диагоналей }
end.

Автор: Kuperus 13.5.2007, 00:09
Это я уже исправил. Где- то в др. месте.

Автор: Klin 13.5.2007, 02:02
странно, у меня ошибок больше нет (Turbo 7.0), да и на WinPascal проверил (хотя это бессмысленно smile ). 
Kuperus, точно скопируйте код.

Добавлено через 1 минуту и 33 секунды
возможно вы не закрыли процедуру

Автор: Kuperus 15.5.2007, 12:06
Всё большое спасибо! Прога работает. Это у меня была проблема с Паскалем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)