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

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

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

Автор: Legolas 17.05.2005 13:14

Всем привет!
Вот решаю такую задачу:

Дана действительная квадратная матрица порядка п. найти наибольшее из значений элементов, расположенных в заштрихованной области матрицы.
(см. присоединенное изображение)

Вот что я сделал:

Код

program matrix;
uses crt;
var a: array[1..10,1..10] of integer;
s,r: integer;
i,j,n: integer;
begin clrscr; textcolor(lightgreen);  randomize;
write(' Input razmer matrix> ');
readln(n);
for i:=1 to n do
begin
for j:=1 to n do begin
a[i,j]:=random(10);
write(a[i,j]:5,' ');
end;
writeln;

end;
write(' A: ');
s:=0;
for i:=1 to n do
for j:=1 to n do s:=s+a[i,j];
writeln(s);

write(' B: ');
s:=0;
for i:=1 to n do
for j:=1 to i do s:=s+a[i,j];
writeln(s);

write(' V: ');
s:=0;
for i:=1 to n div 2 + n mod 2 do
for j:=1 to n-i+1 do s:=s+a[i,j];
writeln(s);

write(' G: ');
s:=0;
for i:=n mod 2 + n div 2 to n do
for j:=n-i+1 to i do s:=s+a[i,j];
writeln(s);

write(' D: ');

write(' E:');

write(' J:');
s:=0;
for i:=1 to n div 2 + n mod 2 do
for j:=i to n-j+1 do s:=s+a[i,j];
writeln(s);

write(' Z: ');
s:=0;
for i:=1 to n div 2 + n mod 2 do
for j:=1 to n-j+1 do s:=s+a[i,j];
writeln(s);

write(' I: ');
s:=0;
for i:=1 to n do
for j:=1 to n-i+1 do s:=s+a[i,j];
writeln(s);

write(' K: ');
s:=0;
for i:=1 to n do
for i:=n-i+1 to n do s:=s+a[i,j];
writeln(s);

readln;
end.



У меня тут работает только B, G и I, в остальном баги….Помогите пожалуйста их исправить, а также дописать D и E.
Всем заранее благодарен. Goodbye;-)


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: klem4 17.05.2005 15:20

опять же... посмотри сюда http://forum.pascal.net.ru/index.php?showtopic=2694
тут как минимум половина, чтож за такое нежелание ничего делать <_<

Автор: hiv 17.05.2005 16:09

Цитата(Legolas @ 17.05.05 9:14)
найти наибольшее из значений элементов, расположенных в заштрихованной области матрицы.

А зачем вы суммируете элементы массива в программе?
s:=0;
for i:=1 to n do
for j:=1 to n do s:=s+a[i,j];

Максимальный элемент в матрице находится так:

max:=a[1,1];
for i:=1 to n do
for j:=1 to n do
if a[i,j]>max then max:=a[i,j];

Автор: volvo 17.05.2005 19:40

Legolas, ты долго будешь темы дублировать? Или по-хорошему ты не понимаешь?

Автор: Guest 18.05.2005 5:16

Цитата(hiv @ 17.05.05 12:09)
А зачем вы суммируете элементы массива в программе?
s:=0;
for i:=1 to n do
for j:=1 to n do s:=s+a[i,j];

Максимальный элемент в матрице находится так:

max:=a[1,1];
for i:=1 to n do
  for j:=1 to n do
    if a[i,j]>max then max:=a[i,j];


О, чёрт не внимательно задачу прочитал, а всё-таки как найти наибольший элемент из заштрихованной области???

Автор: Legolas 18.05.2005 5:19

Цитата(volvo @ 17.05.05 23:40)
Legolas, ты долго будешь темы дублировать? Или по-хорошему ты не понимаешь?

Нет, не буду дублировать я темы, буду развивать старые...;-)
А вы все-таки не поскажете как найти наибольшее из значений элементов в заштрихованной области????

Автор: hiv 18.05.2005 12:08

Готового решения тебе здесь никто не даст. Хау! Я все сказал.

Автор: Legolas 19.05.2005 11:47

Вот решенная задача, может что-нибудь не верно, или всё o'key? smile.gif

Код

program z19;
uses crt;
var n,i,j,max:integer;
a:array [1..7,1..7] of integer;
z:byte;
begin
clrscr; textcolor(lightgreen); randomize;
repeat
write(' Vvedite razmernost(nechetnoe chislo)> ');
readln(n)
until odd(n)=true;
{writeln('vvedite elementi');}
for i:=1 to n do begin
for j:=1 to n do begin{read(a[i,j]);}
a[i,j]:=random(9);
write(a[i,j]:3,' ');
end;
writeln;
end;

writeln(' Menu (vibor cifry):');
repeat
writeln('1-a, 2-b, 3-c, 4-d, 5-e, 6-f, 7-g, 8-h, 9-i, 10-j');
readln(z);
case z of
1:begin
 for i:=1 to n do
 for j:=i to n do if a[i,j]>max then max:=a[i,j];
 writeln('max=',max);max:=0;
 end;
2:begin
 for i:=1 to n do
 for j:=1 to i do if a[i,j]>max then max:=a[i,j];
 writeln('max=',max);max:=0;
 end;
3:begin
 for i:=1 to ((n div 2)+1) do
 for j:=i to (n-i+1) do if a[i,j]>max then max:=a[i,j];
 writeln('max=',max);max:=0;
 end;
4:begin
 for i:=n downto ((n div 2)+1) do
 for j:=(n-i+1) to i do if a[i,j]>max then max:=a[i,j];
 writeln('max=',max);max:=0;
 end;
5:begin
 for i:=1 to ((n div 2)+1) do
 for j:=i to (n-i+1) do if a[i,j]>max then max:=a[i,j];
 for i:=n downto ((n div 2)+1) do
 for j:=(n-i+1) to i do if a[i,j]>max then max:=a[i,j];
 writeln('max=',max);max:=0;
 end;
6:begin
 for j:=1 to ((n div 2)+1) do
 for i:=j to (n-j+1) do if a[i,j]>max then max:=a[i,j];
 for j:=n downto ((n div 2)+1) do
 for i:=(n-j+1) to j do if a[i,j]>max then max:=a[i,j];
 writeln('max=',max);max:=0;
 end;
7:begin
 for j:=1 to ((n div 2)+1) do
 for i:=j to (n-j+1) do if a[i,j]>max then max:=a[i,j];
 writeln('max=',max);max:=0;
 end;
8:begin
 for j:=n downto ((n div 2)+1) do
 for i:=(n-j+1) to j do if a[i,j]>max then max:=a[i,j];
 writeln('max=',max);max:=0;
 end;
9:begin
 for j:=1 to n do
 for i:=1 to (n-j+1) do if a[i,j]>max then max:=a[i,j];
 writeln('max=',max);max:=0;
 end;
10:begin
 for j:=1 to n do
 for i:=n downto (n-j+1) do if a[i,j]>max then max:=a[i,j];
 writeln('max=',max);max:=0;
 end;

end;

until readkey=#13;
readkey
end.

Автор: volvo 19.05.2005 12:03

Ну так прогони ее и посмотри, все ли верно... Или даже это нужно сделать ЗА ТЕБЯ?

Автор: Legolas 19.05.2005 13:33

Цитата(volvo @ 19.05.05 16:03)
Ну так прогони ее и посмотри, все ли верно... Или даже это нужно сделать ЗА ТЕБЯ?

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

Автор: klem4 19.05.2005 13:40

Цитата(Legolas @ 19.05.05 9:33)
А зачем мне ее прогонять, я ее сам сделал, и не вижу никаких ошибок smile.gif


Наивный ты ;)

Прогнать значит нарисовать матрицу на бумажке, посчетать все самому тамже, потом ввести туже матрицу в программу и сравнить результаты, ну и повторить это несколько раз =)

ручной рассчет называется...

Автор: volvo 19.05.2005 14:02

Ну, это может и не ошибка, но недочет по крайней мере:

a:array [1..7,1..7] of integer;
...
repeat
write(' Vvedite razmernost(nechetnoe chislo)> ');
readln(n)
until odd(n)=true;

Смотри, что ты делаешь: на нечетность ты проверяешь (хотя зачем = True добавлено, я так и не пойму, вполне можно обойтись и без него), а вот если я введу n = 9? Число нечетное, все по условию, но вот тут:
a[i,j]:=random(9);
могут быть проблемы...

Автор: hiv 19.05.2005 14:44

Если программа работает - это не значит что у тебя нет ошибок!
У тебя не проинициализировано значение переменной max!
Что это значит? - это значит, что в первой же строке

for j:=i to n do if a[i,j]>max then max:=a[i,j];
у тебя значение переменной max может быть какое угодно! Это не БЕЙСИК. В Паскале переменные не инициализируются нулями по умолчанию.
Это РАЗ.
ДВА: После нахождения максимального значения и его распечатки ты обнуляешь переменную max. Если в будущем элементы твоей матрицы будут ВСЕ отрицательными, то твоя программа по всем пунктам выдаст, что максимальный элемент равен нулую, а его в твоей матрице просто нет!!! Надо инициализировать переменную max только значением какого-либо элемента матрицы. Я уже показывал в своем 3 посте как.
max:=a[1,1];

Автор: Legolas 20.05.2005 7:39

Цитата(volvo @ 19.05.05 18:02)
а вот если я введу n = 9? Число нечетное, все по условию, но вот тут:
a[i,j]:=random(9);
могут быть проблемы...

Это генерация случайных чисел от 0 до 9. Не буду же я вместо 9 вводить 100, на бумажке считать долго...

Автор: volvo 20.05.2005 12:04

Цитата(Legolas @ 20.05.05 3:39)
Это генерация случайных чисел от 0 до 9.

Спасибо за информацию, я как-то этого не знал angry.gif
Неужели ты не понял смысл поста? Если ты опишешь
var a: array[1..7, 1..7] of integer;

и обратишься к a[9, 9], что будет? Думать начни !!!

Автор: Legolas 20.05.2005 12:18

Цитата(volvo @ 20.05.05 16:04)
Спасибо за информацию, я как-то этого не знал  angry.gif
Неужели ты не понял смысл поста? Если ты опишешь
var a: array[1..7, 1..7] of integer;

и обратишься к a[9, 9], что будет? Думать начни !!!

то есть лучше написать random(7)?

Автор: hiv 20.05.2005 12:34

Цитата(Legolas @ 20.05.05 8:18)
то есть лучше написать random(7)?

Мдаааа.... По моему твой язык работает в десятки раз быстрее, чем мозги! При чем здесь функция random? Речь идет о возможности выхода индекса массива а за рамки размерности этого массива. Раз задан массив от 1 до 7, то при обращении к его 8-му, 9-му и т.д. элементу (а также к 0-му, -1-му и т.д.) происходит ошибка на этапе исполнения программы Range error.

Автор: Legolas 20.05.2005 12:38

Цитата(hiv @ 20.05.05 16:34)
Мдаааа.... По моему твой язык работает в десятки раз быстрее, чем мозги! При чем здесь функция random? Речь идет о возможности выхода индекса массива а за рамки  размерности этого массива. Раз задан массив от 1 до 7, то при обращении к его 8-му, 9-му и т.д. элементу (а также к 0-му, -1-му и т.д.) происходит ошибка на этапе исполнения программы Range error.

Мне функция random нужна для ввода массива, просто самому надоедает постоянно вводить элементы, вот и пусть за меня эту работу комп выполняет smile.gif

Автор: hiv 20.05.2005 12:44

По моему это издевательство! Ты перечитывать посты и думать умеешь? Да пиши что хочешь в переменной передаваемой ф-ции random. Она ВООБЩЕ ЗДЕСЬ НЕ ПРИЧЕМ!!! ОШИБКА НЕ В НЕЙ!!!

Автор: volvo 20.05.2005 12:47

По-моему, пора закрывать тему. Человек не хочет понимать простейших вещей, ну, а о том, чтобы про массивы и матрицы прочитать - вообще речи нет.
Legolas, ты программу написал? Она работает? Тебя ее работа устраивает? В чем проблема? Придешь сдавать, все твои ошибки найдутся, чего ты волнуешься раньше времени? lol.gif

Автор: lasix for dog without prescripti 21.09.2021 16:29

Viagra And Dapoxetine

Автор: where to buy cialis online safel 10.12.2021 8:37

Viagra Paypal Payment Accepted

Автор: what happens if a woman takes pr 19.12.2021 21:50

Nemazole Without Prescription

Автор: price of viagra at shoppers drug 21.12.2021 6:21

Venta Cialis Espana