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
Цитата
тока что читал
Плохо читал... Сделай отладку программы, может поймешь где ошибка
Круто, поотлаживал всё и заметил что после строчек с 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
Ага А еще можно убрать лишние "скобки" и получится чуть-чуть короче))
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
А возможно сделать так чтобы ввод матрицы был примерно такой:
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
Цитата
Оля, ввод, а не вывод...
Ой.. извиняюсь..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.