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

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

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

 
 Ответить  Открыть новую тему 
> Одномерный массив., Немного подкорректировать программу
сообщение
Сообщение #1





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

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


В массивее А = ( а1, а2, . . . аn ) все положительные элементы ,
начиная со второго положительного, отправить в хвост массива .
( Новый массив не создавать ).

Есть программа,но почему-то не всегда работает правильно...
Program Lab;
Uses crt;

type arr=array[1..15] of integer;
var a:arr;
p,k,i,j,n:integer;

begin
clrscr;
writeln;
writeln('Dan odnomernij massiv celih chisel');
writeln('W massiwe wse pologitelnie element,nachinaja so wtorogo, otprawit w hwost massiwa');
writeln;
{$R+}
n:=15;
randomize;
writeln('Ishodnij massiv:');
for i:=1 to n do
begin
a[i]:=-20+random(41);
write(a[i]:4);
end;
writeln;
k:=0;
p:=0;
for i:=1 to n do
begin
if a[i]>=0 then
begin
k:=k+1;
if k>1 then
begin
p:=a[i];
for j:=i to n do
if j<>n then
a[j]:=a[j+1]
else
a[j]:=p;
i:=i-1;
end;
end;
end;
Writeln('Resultat obrabotki');
for i:=1 to n do
write(a[i]:4);
readln;
{$R-}
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
for i:=1 to n do
begin
if a[i]>=0 then
begin
k:=k+1;
if k>1 then
begin
p:=a[i];
for j:=i to n do
if j<>n then
a[j]:=a[j+1]
else
a[j]:=p;
i:=i-1; { <------ !!! Вот на эту строку посмотри !!! }
end;
end;
end;
, и больше никогда так не делай. Нельзя менять переменную I внутри цикла. Это делает сам компилятор. Если тебе обязательно надо контролировать i самостоятельно - есть другие циклы: while и repeat...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





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

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


Посмотрела еще раз, но не очень поняла в чем ошибка...

Сообщение отредактировано: **star** -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


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

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

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


Цитата(**star** @ 4.11.2009 18:38) *
Посмотрела еще раз, но не очень поняла в чем ошибка...
Тебе же сказали.. )) Никогда не изменяй переменную цикла for внутри цикла!
Вообще, в ТР в большинстве случаев (хотя это крайне не рекомендуется и результат не гарантируется) это все же проходит (в отличие от более новых компиляторов, например FPC, который тебе просто не пропустит компиляцию в этом случае). Но, как правило, это усложняет логику настолько, что очень легко запутаться. Именно это и произошло в твоем случае. Если возникает желание изменить параметр цикла - значит, нужно ввести еще одну переменную и работать с ней (я ввел переменную m). Либо заменить цикл на repeat or while (см. ответ volvo), но в этом случае максимум внимания нужно уделить отслеживанию границ (в чем ты и прокололась).
{$R+}
type
arr=array[1..15] of integer;

var
a:arr;
p,k,i,j,m,n:integer;

begin
writeln;
writeln('Dan odnomernij massiv celih chisel');
writeln('W massiwe wse pologitelnie element,nachinaja so wtorogo, otprawit w hwost massiwa');
writeln;
n:=15;
randomize;
writeln('Ishodnij massiv:');
for i:=1 to n do begin
a[i]:=-20+random(41);
write(a[i]:4)
end;
writeln;
k:=0;
p:=0;
m:=1;
for i:=1 to n do begin
if a[m]>0 then begin
k:=k+1;
if k>1 then begin
p:=a[m];
for j:=m to n-1 do a[j]:=a[j+1];
a[n]:=p
end
else Inc(m)
end
else Inc(m)
end;
Writeln('Resultat obrabotki');
for i:=1 to n do write(a[i]:4);
readln
end.

Совет на другую тему: отключи использование символов табуляции в опциях редактора - экономия на этом копеечная, а вреда (при попытке редактирования в другом редакторе) достаточно. Заботься о тех, кто тебе помогает)).

Еще я выкинул всякую дрянь, типа clrscr. Сохраниение результатов предыдушего запуска программы при отладке - очень полезная штука. И вообще непонятно, зачем его чистить. Это имеет смысл делать, если только твой вывод позиционный и использует весь экран.

И еще непонятно, зачем ты отключала range check в конце. При отладке лучше либо включить опцию проверки в меню среды, либо иметь ее в начале программы. Отключать же проверку можно только на окончательно проверенном варианте, если время исполнения существенно.


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

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

 





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