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

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

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

Автор: kvadrat 17.05.2008 21:56

Условие:
Прикрепленное изображение
Проверьте плиз, правильно ли я решил?

program qwesadf;
uses crt;
var p:array[1..7,1..7] of real;i,j:integer;s1,s2:real;
begin
clrscr;
s1:=0;
s2:=0;
writeln('vvedite elementi matrici');
for i:=1 to 7 do
for j:=1 to 7 do
begin
readln(p[i,j]);
s1:=p[1,1]+p[2,2]+p[3,3]+p[4,4]+p[5,5]+p[6,6]+p[7,7];
s2:=p[1,7]+p[2,6]+p[3,5]+p[4,4]+p[5,3]+p[6,2]+p[7,1];
end;
writeln('summa elementov glavnoi diagonali ',s1:2:2);
writeln('summa elementov diagonali simetrichnoi glavnoi ',s2:2:2);
end.

Автор: Bo2nik 17.05.2008 23:12

У тебя если семь элементов в матрице. А если n? Тогда условие меняется на:


readln(n); {у тебя n=7}
for i:=1 to n do
for j:=1 to n do begin
if i=j then s1:=s1+p[i,j]; {это для главной диагонали}



P.S. Ты решил правильно, но как-то всё это просто.

Автор: Client 17.05.2008 23:46

Ну тогда проще так

s:=0;
For i:=1 To n Do s:=s+a[i,i];
kvadrat почитай FAQ - поможет

Автор: kvadrat 18.05.2008 1:40

Кстати да, FAQ отличная вещь, тока что читал, вот получилось такое решение, но оно выводит неправельный результат. Например в матрице 2х2 с элементами 1,1,1,1 основная диагональ должна быть равна 2, и побочная тоже 2. А это решение утверждает что и то и то равно 3. Помогите исправить ошибки плиз?.

program qwesadf;
uses crt;
var p:array[1..10,1..10] of real;i,n,j:integer;s1,s2:real;
begin
clrscr;
writeln('vvedite razmer matrici');
readln(n);
writeln('vvedite elementi matrici');
s1:=0;
s2:=0;
for i:=1 to n do
for j:=1 to n do
begin
readln(p[i,j]);
s1:=s1+p[i,i];
s2:=s2+p[i,n+1-i];
end;
writeln('summa elementov glavnoi diagonali ',s1:2:2);
writeln('summa elementov diagonali simetrichnoi glavnoi ',s2:2:2);
end.

Автор: Client 18.05.2008 1:47

Цитата
тока что читал
Плохо читал... Сделай отладку программы, может поймешь где ошибка

Автор: kvadrat 18.05.2008 1:53

Что такое отладка?? blink.gif

Автор: volvo 18.05.2008 2:09

http://volvo71.narod.ru/full_debug.htm

Автор: kvadrat 18.05.2008 2:31

Круто, поотлаживал всё и заметил что после строчек с for он пропрыгивает begin, пробовал ставить 2 бегина и энда всё равно также, также пропобал после первой фор ставить бегин и после второй, но всё равно внаглую просткакивает их. И разультат попрежнему неверен. Незнаю чё делать. =(

Автор: andriano 18.05.2008 2:42

begin - это не выполняемый оператор, а операторная скобка. Ка по-твоему должна выполняться скобка?

Цитата
Незнаю чё делать. =(
Ошибку искать, а не лишних скобок наставлять.

Автор: kvadrat 18.05.2008 18:18

Сижу вот с самого утра в этой проге на F7 тычю и ваще неодупляю где ошибка, тыкните пальцем хотябы, мой мозг на гране взрыва.

Автор: Айра 18.05.2008 18:44

Смотри: (при n=3)

for i:=1 to n do 
for j:=1 to n do
begin
readln(p[i,j]);
s1:=s1+p[i,i]; // пока у тебя j изменится от 1 до 3-х сколько раз ты прибавишь один и тот же элемент диагонали? 3 (:
s2:=s2+p[i,n+1-i];
end;

Вот в этом и ошибка..
Сумму лучше считать отдельно..

Автор: Айра 18.05.2008 19:12

Сейчас подумала, что можно и в этом цикле, но несколько в другом месте.. попробуй переделать))

Автор: kvadrat 18.05.2008 22:17

Ееее получилось, вот так работает правильно:

for i := 1 to n do
begin
for j := 1 to n do
begin
readln(p[i,j]);
end;
s1:=s1+p[i,i];
s2:=s2+p[i,n-i+1];
end;

Автор: Айра 18.05.2008 22:37

Ага yes2.gif
А еще можно убрать лишние "скобки" и получится чуть-чуть короче))

for i:=1 to n do
begin
for j:=1 to n do readln(p[i,j]);
s1:=s1+p[i,i];
s2:=s2+p[i,n+1-i];
end;

Автор: kvadrat 19.05.2008 16:50

Скажите как называется способ введения элементов матрицы в этом решении?

program werqwrsdfgse;
uses crt;
const n=2;
var
p:array [1..n,1..n] of real;i,j:integer;s1,s2:real;
begin
clrscr;
s1 := 0;
s2 := 0;
writeln('vvedite elementi matrici');
for i:=1 to n do
begin
for j:=1 to n do readln(p[i,j]);
s1:=s1+p[i,i];
s2:=s2+p[i,n+1-i];
end;
Writeln('summa elementov glavnoi diagonali ',s1:2:2);
Writeln('summa elementov diagonali simetrichnoi glavnoi ',s2:2:2);
end.


Как я понял это постолбцам. Учитель сказала исправить задачу так чтоб ввод был построчным, я и исправил
readln(p[j,i]);
, но задача стала выводить неправильный ответ, она говорит мол нужно ещё begin end кудато впихнуть. Я так и непонял чё она от меня ваще хатела и чё это за способы ввода матрицы, и как надо их вводить, в строчку все элементы через пробел или через запятую? или как?

Автор: volvo 19.05.2008 17:02

Цитата
Как я понял это постолбцам. Учитель сказала исправить задачу так чтоб ввод был построчным
Это и есть по строкам... Смотри, у тебя матрица - значит, 2 индекса... Первый - номер строки, второй - номер столбца (тут уж ничего не поделаешь, так в Паскале принято, что матрица хранится построчно)... Смотрим на твой цикл:

for i:=1 to n do begin
for j:=1 to n do readln(p[i,j]); { <--- по J - внутренний цикл, J меняется быстрее, чем I !!! }
s1:=s1+p[i,i];
s2:=s2+p[i,n+1-i];
end;


Если первый индекс меняется быстрее второго - значит, матрица заполняется по столбцам (пока номер строки меняется, номер столбца остается неизменным)... У тебя этого не происходит, у тебя второй индекс меняется быстрее первого, значит, пока номер строки стоит на месте, меняется номер столбца => заполнение идет построчно...

Автор: kvadrat 19.05.2008 21:27

Чёто я совсем запутался, если у меня ввод построчный то зачем учитель сказала мне исправить задание так чтоб ввод был построчный? Говорит 2 действия тебе надо сделать: Поменять i и j местами гдето и куда нужно вставить begin end, как выполнить её задание?

program werqwrsdfgse;
uses crt;
const n=2;
var
p:array [1..n,1..n] of real;i,j:integer;s1,s2:real;
begin
clrscr;
s1 := 0;
s2 := 0;
writeln('vvedite elementi matrici');
for i:=1 to n do
begin
for j:=1 to n do readln(p[i,j]);
s1:=s1+p[i,i];
s2:=s2+p[i,n+1-i];
end;
Writeln('summa elementov glavnoi diagonali ',s1:2:2);
Writeln('summa elementov diagonali simetrichnoi glavnoi ',s2:2:2);
end.

Автор: volvo 19.05.2008 22:07

Цитата
если у меня ввод построчный то зачем учитель сказала мне исправить задание так чтоб ввод был построчный?

Это ты у нее спрашивай, зачем она тебя "на испуг берет"... Не можешь объяснить - значит, не понимаешь, как это работает... А ты объясни... Хотя бы то, что я написал. И не надо никакие Begin/End просто так добавлять. Программа работает? Работает. Чего ей не нравится??? Ей надо, чтоб она НЕ работала, что-ли?

Кстати, я бы на твоем месте сделал вещь, которая поставит твою "учительницу" (чему она научить может - непонятно) на место:

program werqwrsdfgse;
uses crt;
const n=2;
var
p: array[1..n, 1..n] of real;
i,j:integer;
s1,s2:real;
begin
clrscr;
s1 := 0;
s2 := 0;
writeln('vvedite elementi matrici');
for i:=1 to n do begin
for j:=1 to n do readln(p[i,j]);
s1:=s1+p[i,i];
s2:=s2+p[i,n+1-i];
end;

writeln('matrix:');
for i := 1 to n do begin
for j := 1 to n do write(p[i, j]:5:2);
writeln;
end;

Writeln('summa elementov glavnoi diagonali ',s1:2:2);
Writeln('summa elementov diagonali simetrichnoi glavnoi ',s2:2:2);
end.

Результат выполнения:
Цитата(Console)
vvedite elementi matrici
1
3
4
5
matrix:
1.00 3.00
4.00 5.00
summa elementov glavnoi diagonali 6.00
summa elementov diagonali simetrichnoi glavnoi 7.00
Так как вводится матрица?

Автор: kvadrat 19.05.2008 23:43

А возможно сделать так чтобы ввод матрицы был примерно такой:

Цитата
vvedite elementi matrici
1 1 1 {первая строка}
2 2 2 {вторая строка}
3 3 3 {третья строка}

Автор: Айра 19.05.2008 23:56

Можно:

  for i := 1 to n do 
begin
for j := 1 to n do write(p[i, j]:5:2);
write(' ',i,'-я строка');
writeln;
end;


Автор: volvo 20.05.2008 0:43

Оля, ввод, а не вывод...

...
writeln('vvedite elementi matrici');
for i:=1 to n do begin
write(i:2, '-я строка: ');
for j:=1 to n do read(p[i,j]);
readln;
s1:=s1+p[i,i];
s2:=s2+p[i,n+1-i];
end;
...
Всю строку вводишь через пробелы, после этого нажимаешь Enter...

Автор: Айра 20.05.2008 1:57

Цитата
Оля, ввод, а не вывод...

Ой.. извиняюсь.. wink.gif