IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> матрица nXn, сумма
Svetlana
сообщение 5.06.2009 19:59
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Привет всем:-) Помогите пожалуйста отредактировать программу...Она должна определять минимум среди сумм элементов,расположенных на линиях,параллельных побочной диагонали. Свои старания приложила :-)
Ошибка: после условия в цикле while не заходит в цикл for.


Прикрепленные файлы
Прикрепленный файл  код.txt ( 917 байт ) Кол-во скачиваний: 209
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 5.06.2009 20:34
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Svetlana @ 5.06.2009 20:59) *
Ошибка: после условия в цикле while не заходит в цикл for.
Ошибка у тебя немного раньше на самом деле. В строке s[k]:=0 переменная k равна 0, а массив s определен, начиная с 1. Ты включи range check (по крайней мере на этапе отладки), иначе рискуешь потратить годы на отыскание ошибок. И разберись, что делать с s[0] - либо массив расширять, либо k начинать с 1..
Я немного причесал твою прогу. Было бы здорово, если бы ты продолжала держать ее правильно отформатированной.. smile.gif

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:=1 to n do begin
for j:=1 to n do begin
matr[i,j]:=random(100)-20;
write (matr[i,j]:3,' ')
end;
writeln;
end;

k:=0;
s[k]:=0;
while k<=n do begin
for i:=1 to n+1-i-k do begin j:=n+1-i-k;
s[k]:=s[k]+matr[i,j];
end;
writeln('s[',k,']=',s[k]);
k:=k+1
end;

k:=1;
c[k]:=0;
while k<=n-1 do begin
for i:=n downto n+1-i+k do begin
j:=n+1-i+k;
c[k]:=c[k]+matr[i,j]
end;
writeln('c[',k,']=',c[k]);
k:=k+1
end;

min1:=s[1]; for k:=1 to n do if s[k]<min1 then min1:=s[k];
min2:=c[1]; for k:=2 to n-1 do if c[k]<min1 then min1:=c[k];
if min1<min2 then writeln ('min_summa=',min1)
else writeln ('min_summa=',min2);
readln
end.


И клади код прямо в мессадж - зачем прикреплять? Только тэги пользуй (меню CODE)


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sheka
сообщение 5.06.2009 20:37
Сообщение #3


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


что такое range check?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 5.06.2009 20:44
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(sheka @ 5.06.2009 21:37) *
что такое range check?

либо опция {$R+}, либо пункт в меню Options -> Compiler.
Отслеживает выход переменных и индексов за границы диапазона.

2 Svetlana:
Ой, а это как понимать?
    for i:=1 to n+1-i-k do

Ты используешь переменную цикла в границе. Что ты хотела этим сказать?
Хорошо, сейчас попробую вникнуть в твой алгоритм..




--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 5.06.2009 21:05
Сообщение #5


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Извини, запутался вконец..
Короче, вот тебе решение. Если неясно - спрашивай))
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:=1 to n do begin
for j:=1 to n do begin
matr[i,j]:=random(100)-20;
write (matr[i,j]:3,' ')
end;
writeln;
end;

for i:=2 to n*2 do s[i]:=0;
for i:=1 to n do for j:=1 to n do Inc(s[i+j],matr[i,j]);

min:=s[2];
for i:=2 to n do if s[i]<min then min:=s[i];
writeln ('min_summa=',min);
readln
end.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.06.2009 21:06
Сообщение #6


Гость






Цитата
Что ты хотела этим сказать?
Неважно, что хотела. Все равно это делать запрещено (после окончания предыдущего цикла переменная i может равняться всему, чему угодно, а не должна быть N, как многие думают, следовательно этот цикл, который процитировал Lapp, может даже не начаться...)

Даже если авторская программа и будет выдавать какие-то результаты - верить им уже нельзя... no1.gif
 К началу страницы 
+ Ответить 
Svetlana
сообщение 5.06.2009 21:08
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Цитата(Lapp @ 5.06.2009 20:44) *

либо опция {$R+}, либо пункт в меню Options -> Compiler.
Отслеживает выход переменных и индексов за границы диапазона.

2 Svetlana:
Ой, а это как понимать?
    for i:=1 to n+1-i-k do

Ты используешь переменную цикла в границе. Что ты хотела этим сказать?
Хорошо, сейчас попробую вникнуть в твой алгоритм..


Хорошо,в следующий раз сделаю как сказали ) Насчёт прикрепления

Добавлено через 8 мин.
Спасибо good.gif

Добавлено через 14 мин.
А ты не мог бы мне объяснить как действует оператор: Inc(s[i+j],matr[i,j]);? blush.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 5.06.2009 21:47
Сообщение #8


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Svetlana @ 5.06.2009 22:08) *
как действует оператор: Inc(s[i+j],matr[i,j]);?

Цитата
- Как работает трансформатор?
- Уууууууууууууууууу..
Сорри за оффтоп))

В этом операторе вся соль. Ты заметь, что у каждой такой линии, о которых говорится в условии, своя постоянная сумма индексов. У каждой своя (одна), и у всех разные. Значит, их можно различать (читай: занумеровать) по этому параметру.

Готовим массив сумм (пределы определяются сложением минимальных индексов и максимальных) и заполняем его нулями. Потом проходим по всей матрице и на каждом элементе увеличиваем соответствующий элемент массива сумм на значение этого элемента матрицы. Таким образом суммируем все элементы, разложив по признаку сумм индексов. То есть, это и есть то, что нужно. Остается найти минимум.

Понятно?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Svetlana
сообщение 5.06.2009 21:58
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


да,всё поняла ) спасибо за объяснение...жаль,что сама не смогла её решить...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 5.06.2009 22:02
Сообщение #10


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Svetlana @ 5.06.2009 22:58) *
жаль,что сама не смогла её решить...
Бывает.. Сегодня не лучший твой день, и еще не вечер))


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 3:07
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"