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

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

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

Автор: 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.




А если отрицательных элементов в массиве не будет?


И ВАМ Спасибо огромное за отзывчивость yes2.gif

Автор: 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 на единицу.