Форум «Всё о Паскале» _ Задачи _ расчета элементов.
Автор: Konsuela 2.12.2006 1:12
Задание такое: Составить подпрограмму для определения числа элементов одномерного массива, предшествующих его первому отрицательному элементу. Пишу программу, а после набора массива она зависает... может проблема в самой функции?
function kol (A: mass; n: integer ):integer; var i, j:integer; k:integer; begin k:=0; for i:= 1 to n do begin repeat k:=k+1; until A[i]<0; end;
kol:=k;
end;
Автор: мисс_граффити 2.12.2006 1:21
у тебя конструкция из циклов странная. она и зацикливается. сначала должен отработать внутренний цикл, и только потом произойдет смена i. то есть на первом же положительном элементе цикл
repeat k:=k+1; until A[i]<0;
превратится в вечный. смотри: если у тебя отрицательный на пятой позиции - можешь сказать, сколько перед ним положительных? а если на восьмой?
то есть тебе достаточно найти его индекс - отдельно считать не нужно. убери цикл for, а в repeat работай с i
а вообще - не забывай пользоваться тэгами.
Автор: Konsuela 2.12.2006 1:51
begin
repeat z:=i; until A[i]<0;
kol:=z;
end;
Вот так??? а у меня всё равно виснет.... я что-то недопонимаю видно...
Автор: Bokul 2.12.2006 2:02
const n=5; mas:array[1..n] of integer=(1,2,3,-4,2); var i:byte; b:boolean; begin i:=0; b:=false; repeat inc(i); if mas[i]<0 then b:=true; until (i=n) or (b=true); if b then writeln(i-1) else writeln('All elements are positive'); readln; end.
Автор: Гость 2.12.2006 2:09
или так
Код
i:=1; while (i<=n) and (A[i]>=0) do inc(i);
Автор: Konsuela 2.12.2006 2:09
Я искренне благодарна за помощь, но я пока новичок и нам даже не давали программки с True и False...
Автор: Bokul 2.12.2006 2:14
Цитата
Я искренне благодарна за помощь, но я пока новичок и нам даже не давали программки с True и False...
const n=5; mas:array[1..n] of integer=(1,2,3,4,2); var i:byte; b:byte; begin i:=0; b:=0; repeat inc(i); if mas[i]<0 then b:=1; until (i=n) or (b=1); if b=1 then writeln(i-1) else writeln('All elements are positive'); readln; end.
Цитата
или так
i:=1; while (i<=n) and (A[i]>=0) do inc(i);
А если отрицательных элементов в массиве не будет?
Автор: Konsuela 2.12.2006 2:19
Цитата(Гость @ 1.12.2006 22:09)
или так
Код
i:=1; while (i<=n) and (A[i]>=0) do inc(i);
Ой, спасибо большое! Заработало наконец-то. И последний (наверное глупый) вопрос- что значит inc(i)?
Цитата(Bokul @ 1.12.2006 22:14)
const n=5; mas:array[1..n] of integer=(1,2,3,4,2); var i:byte; b:byte; begin i:=0; b:=0; repeat inc(i); if mas[i]<0 then b:=1; until (i=n) or (b=1); if b=1 then writeln(i-1) else writeln('All elements are positive'); readln; end.
А если отрицательных элементов в массиве не будет?
И ВАМ Спасибо огромное за отзывчивость
Автор: Bokul 2.12.2006 2:22
Цитата
И последний (наверное глупый) вопрос- что значит inc(i)?
Глупых вопросов не бывает, но зато бывает лень заглянуть в справку. Набери в Паскале inc, выдели его и нажми Ctrl+F1.
Ой, спасибо большое! Заработало наконец-то.
Выделенной код (не мой) не обрабатывает всех ситуаций...
Автор: Konsuela 2.12.2006 2:32
Цитата(Bokul @ 1.12.2006 22:22)
Глупых вопросов не бывает, но зато бывает лень заглянуть в справку. Набери в Паскале inc, выдели его и нажми Ctrl+F1.
Ой, спасибо большое! Заработало наконец-то.
Выделенной код (не мой) не обрабатывает всех ситуаций...
Это приняла во внимание... А всё-таки вот эта inc(i)- перебирает мой массив?
Автор: Bokul 2.12.2006 2:34
Цитата
А всё-таки вот эта inc(i)- перебирает мой массив?
Это равнозначно i:=i+1. Т.е. мы увеличиваем i на единицу.