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

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

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

 
 Ответить  Открыть новую тему 
> Сочетание массивов и условия
smith
сообщение 24.12.2009 22:55
Сообщение #1


Новичок
*

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

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


Ребята, привет! Писал я задачу вот по такому условию:
Даны натуральное число 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.




Сказал, чтобы я изменил БУКВУ СЧЕТЧИКА ЦИКЛА. Что я и сделал, изменив программу до такого вида, естественно добавив в блок описаний новую переменную J(в строке, где заменена буква счетчика я поставил стрелки справа):

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.





Казалось бы, что изменилось? А изменилось. Вот последовательность, которую дал преподаватель:

Кол-во элементов : 7.
Число q, с которым сравниваем = 15
а вот сама последовательность:
a[1]=8
a[2]=12
a[3]=15
a[4]=4
a[5]=15
a[6]=2
a[7]=1

и вместо положенных 22, программа выдала 2 ответа: 22 и 25. При чем в первом варианте программы ответ был один и верный - 22!!!!!
Я начал подробно смотреть решение. Разбивал эти циклы на два отдельных цикла - выдает ошибку.
Перемещал end'ы - безрезультатно.
Подскажите, что делать?
При чем, программу я писал сам, и при написании даже не думал, почему НЕ нужно менять букву счетчика. А препод заставил задуматься. Поможете?

Заранее спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.12.2009 23:31
Сообщение #2


Гость






Во-первых, преподаватель совершенно прав. Попробуй откомпилировать свою первую программу на современном компиляторе (FPC/Delphi) - получишь ошибку, нельзя делать 2 вложенных цикла по одной переменной. Кстати, никто не гарантирует, что после окончания For переменная i будет равна последнему значению, так что тебе, можно сказать, повезло, что программа работала, да еще и работала правильно.

Я бы решал задачу вот так:
  i := 0;
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);
, здесь не надо вводить новую переменную, поскольку используется не цикл For, а циклы While/Repeat. А в твоем случае... Хм. Ну, надо наверное выходить из внешнего цикла сразу после того, как найден первый элемент, равный Q, и сумма элементов, стоящих после него. Break в помощь...
 К началу страницы 
+ Ответить 
smith
сообщение 25.12.2009 1:03
Сообщение #3


Новичок
*

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

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


Большое спасибо! Очень помогло!
Там правда с break не получится, ибо



if a[i]=q then brake;
b:=i+1



ошибка (выходит за границы массива).
Ну, в общем разобрался. Просто зациклился я на цикле for to=)
Спасибо что помогли разобраться.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 25.12.2009 6:41
Сообщение #4


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

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

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


Цитата(smith @ 25.12.2009 1:03) *
Просто зациклился я на цикле for to=)
smith, нет. Не просто зациклился. Перечитай слова volvo.

Если бы у тебя был бы цикл wile или repeat, и ты бы там как-то использовал собственным образом инкрименируемую переменную i с условиями - вот тогда ты может быть бы и просто зациклился. Тут же ошибка более грубая.

Никогда и ни при каких обстоятельствах не используй параметр цикла вторично внутри цикла! Табу.


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


Гость






Кстати, в моем фрагменте кода есть небольшая ошибка, которая может привести к аварийному завершению программы (правда это практически нереально при заданных автором вопроса условиях). Вчера не заметил, потому как набирал программу прямо здесь. Сегодня - заметил...

smith, покажешь мне, где я накосячил, при каких условиях это проявится, и (главное) как это исправить? smile.gif
 К началу страницы 
+ Ответить 

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

 



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