Помощь - Поиск - Пользователи - Календарь
Полная версия: Вычислить сумму элементов главной диагонали...
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
kvadrat
Условие:
Нажмите для просмотра прикрепленного файла
Проверьте плиз, правильно ли я решил?
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
У тебя если семь элементов в матрице. А если 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
Ну тогда проще так
s:=0;
For i:=1 To n Do s:=s+a[i,i];
kvadrat почитай FAQ - поможет
kvadrat
Кстати да, 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
Цитата
тока что читал
Плохо читал... Сделай отладку программы, может поймешь где ошибка
kvadrat
Что такое отладка?? blink.gif
volvo
Отладка программ
kvadrat
Круто, поотлаживал всё и заметил что после строчек с for он пропрыгивает begin, пробовал ставить 2 бегина и энда всё равно также, также пропобал после первой фор ставить бегин и после второй, но всё равно внаглую просткакивает их. И разультат попрежнему неверен. Незнаю чё делать. =(
andriano
begin - это не выполняемый оператор, а операторная скобка. Ка по-твоему должна выполняться скобка?
Цитата
Незнаю чё делать. =(
Ошибку искать, а не лишних скобок наставлять.
kvadrat
Сижу вот с самого утра в этой проге на F7 тычю и ваще неодупляю где ошибка, тыкните пальцем хотябы, мой мозг на гране взрыва.
Айра
Смотри: (при 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;

Вот в этом и ошибка..
Сумму лучше считать отдельно..
Айра
Сейчас подумала, что можно и в этом цикле, но несколько в другом месте.. попробуй переделать))
kvadrat
Ееее получилось, вот так работает правильно:
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;
Айра
Ага 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
Скажите как называется способ введения элементов матрицы в этом решении?

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
Цитата
Как я понял это постолбцам. Учитель сказала исправить задачу так чтоб ввод был построчным
Это и есть по строкам... Смотри, у тебя матрица - значит, 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
Чёто я совсем запутался, если у меня ввод построчный то зачем учитель сказала мне исправить задание так чтоб ввод был построчный? Говорит 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
Цитата
если у меня ввод построчный то зачем учитель сказала мне исправить задание так чтоб ввод был построчный?

Это ты у нее спрашивай, зачем она тебя "на испуг берет"... Не можешь объяснить - значит, не понимаешь, как это работает... А ты объясни... Хотя бы то, что я написал. И не надо никакие 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
А возможно сделать так чтобы ввод матрицы был примерно такой:

Цитата
vvedite elementi matrici
1 1 1 {первая строка}
2 2 2 {вторая строка}
3 3 3 {третья строка}
Айра
Можно:
  for i := 1 to n do 
begin
for j := 1 to n do write(p[i, j]:5:2);
write(' ',i,'-я строка');
writeln;
end;

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

...
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...
Айра
Цитата
Оля, ввод, а не вывод...

Ой.. извиняюсь.. wink.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.