Привет всем:-) Помогите пожалуйста отредактировать программу...Она должна определять минимум среди сумм элементов,расположенных на линиях,параллельных побочной диагонали. Свои старания приложила :-) Ошибка: после условия в цикле while не заходит в цикл for.
Lapp
6.06.2009 0:34
Цитата(Svetlana @ 5.06.2009 20:59)
Ошибка: после условия в цикле while не заходит в цикл for.
Ошибка у тебя немного раньше на самом деле. В строке s[k]:=0 переменная k равна 0, а массив s определен, начиная с 1. Ты включи range check (по крайней мере на этапе отладки), иначе рискуешь потратить годы на отыскание ошибок. И разберись, что делать с s[0] - либо массив расширять, либо k начинать с 1.. Я немного причесал твою прогу. Было бы здорово, если бы ты продолжала держать ее правильно отформатированной..
program Project2;
{$APPTYPE CONSOLE}uses
SysUtils;
const
n=5;
var
matr:array [1..n,1..n] of integer;
s,c: array [1..n] of integer;
i,j,k,min1,min2:integer;
begin//randomize;
for i:=1to n dobeginfor j:=1to n dobegin
matr[i,j]:=random(100)-20;
write (matr[i,j]:3,' ')
end;
writeln;
end;
k:=0;
s[k]:=0;
while k<=n dobeginfor i:=1to n+1-i-k dobegin j:=n+1-i-k;
s[k]:=s[k]+matr[i,j];
end;
writeln('s[',k,']=',s[k]);
k:=k+1end;
k:=1;
c[k]:=0;
while k<=n-1dobeginfor i:=n downto n+1-i+k dobegin
j:=n+1-i+k;
c[k]:=c[k]+matr[i,j]
end;
writeln('c[',k,']=',c[k]);
k:=k+1end;
min1:=s[1]; for k:=1to n doif s[k]<min1 then min1:=s[k];
min2:=c[1]; for k:=2to n-1doif c[k]<min1 then min1:=c[k];
if min1<min2 then writeln ('min_summa=',min1)
else writeln ('min_summa=',min2);
readln
end.
И клади код прямо в мессадж - зачем прикреплять? Только тэги пользуй (меню CODE)
sheka
6.06.2009 0:37
что такое range check?
Lapp
6.06.2009 0:44
Цитата(sheka @ 5.06.2009 21:37)
что такое range check?
либо опция {$R+}, либо пункт в меню Options -> Compiler. Отслеживает выход переменных и индексов за границы диапазона.
2 Svetlana: Ой, а это как понимать?
for i:=1to n+1-i-k do
Ты используешь переменную цикла в границе. Что ты хотела этим сказать? Хорошо, сейчас попробую вникнуть в твой алгоритм..
Lapp
6.06.2009 1:05
Извини, запутался вконец.. Короче, вот тебе решение. Если неясно - спрашивай))
const
n=5;
var
matr:array [1..n,1..n] of integer;
s: array [2..2*n] of integer;
i,j,min: integer;
begin//randomize;
for i:=1to n dobeginfor j:=1to n dobegin
matr[i,j]:=random(100)-20;
write (matr[i,j]:3,' ')
end;
writeln;
end;
for i:=2to n*2do s[i]:=0;
for i:=1to n dofor j:=1to n do Inc(s[i+j],matr[i,j]);
min:=s[2];
for i:=2to n doif s[i]<min then min:=s[i];
writeln ('min_summa=',min);
readln
end.
volvo
6.06.2009 1:06
Цитата
Что ты хотела этим сказать?
Неважно, что хотела. Все равно это делать запрещено (после окончания предыдущего цикла переменная i может равняться всему, чему угодно, а не должна быть N, как многие думают, следовательно этот цикл, который процитировал Lapp, может даже не начаться...)
Даже если авторская программа и будет выдавать какие-то результаты - верить им уже нельзя...
Svetlana
6.06.2009 1:08
Цитата(Lapp @ 5.06.2009 20:44)
либо опция {$R+}, либо пункт в меню Options -> Compiler. Отслеживает выход переменных и индексов за границы диапазона.
2 Svetlana: Ой, а это как понимать?
for i:=1to n+1-i-k do
Ты используешь переменную цикла в границе. Что ты хотела этим сказать? Хорошо, сейчас попробую вникнуть в твой алгоритм..
Хорошо,в следующий раз сделаю как сказали ) Насчёт прикрепления
Добавлено через 8 мин. Спасибо
Добавлено через 14 мин. А ты не мог бы мне объяснить как действует оператор: Inc(s[i+j],matr[i,j]);?
Lapp
6.06.2009 1:47
Цитата(Svetlana @ 5.06.2009 22:08)
как действует оператор: Inc(s[i+j],matr[i,j]);?
Цитата
- Как работает трансформатор? - Уууууууууууууууууу..
Сорри за оффтоп))
В этом операторе вся соль. Ты заметь, что у каждой такой линии, о которых говорится в условии, своя постоянная сумма индексов. У каждой своя (одна), и у всех разные. Значит, их можно различать (читай: занумеровать) по этому параметру.
Готовим массив сумм (пределы определяются сложением минимальных индексов и максимальных) и заполняем его нулями. Потом проходим по всей матрице и на каждом элементе увеличиваем соответствующий элемент массива сумм на значение этого элемента матрицы. Таким образом суммируем все элементы, разложив по признаку сумм индексов. То есть, это и есть то, что нужно. Остается найти минимум.
Понятно?
Svetlana
6.06.2009 1:58
да,всё поняла ) спасибо за объяснение...жаль,что сама не смогла её решить...
Lapp
6.06.2009 2:02
Цитата(Svetlana @ 5.06.2009 22:58)
жаль,что сама не смогла её решить...
Бывает.. Сегодня не лучший твой день, и еще не вечер))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.