Ребята, привет! Писал я задачу вот по такому условию:
Даны натуральное число n и целые числа q, a1,…,an, где n≤1000. Если в последовательности a1,…,an есть хотя бы один член, равный q, то получить сумму всех членов, следующих за первым таким членом; в противном случае ответом должно служить количество отрицательных элементов.
Написал программулину, вроде все верно считает, даже не вроде, а точно верно! Но сегодня при защите получилось вот как интересно.
Преподаватель взглянув на эту программу:
program antipov;
var a: array [1..1000] of integer;
var q,n,k,i,b,s:integer;
begin
writeln('vvedi kolvo elementov posledovatelnosty');
readln(n);
writeln('vvedi chislo Q');
readln(q);
k:=0;
s:=0;
writeln('vvode elementy posledovatelnosty');
for i:=1 to n do begin
read(a[i]);
end;
for i:=1 to n do begin
if a[i]=q then begin b:=i+1; for i:=b to n do begin s:=s+a[i];
end;
writeln('summa elementov posle chisla Q=',s);
end;
end;
for i:=1 to n do
begin if a[i]<0 then k:=k+1;
end;
if s=0 then
writeln('kolvo otric.chisel=',k);
end.
program antipov;
var a: array [1..1000] of integer;
var q,n,k,i,b,j,s:integer;
begin
writeln('vvedi kolvo elementov posledovatelnosty');
readln(n);
writeln('vvedi chislo Q');
readln(q);
k:=0;
s:=0;
writeln('vvode elementy posledovatelnosty');
for i:=1 to n do begin
read(a[i]);
end;
for i:=1 to n do begin
if a[i]=q then begin b:=i+1; for j:=b to n do begin s:=s+a[j]; <===============
end;
writeln('summa elementov posle chisla Q=',s);
end;
end;
for i:=1 to n do
begin if a[i]<0 then k:=k+1;
end;
if s=0 then
writeln('kolvo otric.chisel=',k);
end.
Во-первых, преподаватель совершенно прав. Попробуй откомпилировать свою первую программу на современном компиляторе (FPC/Delphi) - получишь ошибку, нельзя делать 2 вложенных цикла по одной переменной. Кстати, никто не гарантирует, что после окончания For переменная i будет равна последнему значению, так что тебе, можно сказать, повезло, что программа работала, да еще и работала правильно.
Я бы решал задачу вот так:
i := 0;, здесь не надо вводить новую переменную, поскольку используется не цикл For, а циклы While/Repeat. А в твоем случае... Хм. Ну, надо наверное выходить из внешнего цикла сразу после того, как найден первый элемент, равный Q, и сумма элементов, стоящих после него. Break в помощь...
repeat
inc(i);
if a[i] < 0 then k := k + 1
else
if a[i] = q then begin
inc(i);
while i <= n do begin
s := s + a[i]; inc(i);
end;
end;
until i > n;
if s = 0 then
writeln('kolvo otric.chisel=',k)
else
writeln('summa elementov posle chisla Q=',s);
Большое спасибо! Очень помогло!
Там правда с break не получится, ибо
if a[i]=q then brake;
b:=i+1
Кстати, в моем фрагменте кода есть небольшая ошибка, которая может привести к аварийному завершению программы (правда это практически нереально при заданных автором вопроса условиях). Вчера не заметил, потому как набирал программу прямо здесь. Сегодня - заметил...
smith, покажешь мне, где я накосячил, при каких условиях это проявится, и (главное) как это исправить?