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

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

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

> Сочетание массивов и условия
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Новичок
*

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

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


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



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



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


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

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

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


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

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

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


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

Сообщений в этой теме


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

 





- Текстовая версия 10.09.2025 3:38
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name