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

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

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

 
 Ответить  Открыть новую тему 
> Одномерный массив., Немного подкорректировать программу
**star**
сообщение 4.11.2009 17:51
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.11.2009 18:01
Сообщение #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...
 К началу страницы 
+ Ответить 
**star**
сообщение 4.11.2009 18:38
Сообщение #3





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

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


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

Сообщение отредактировано: **star** - 4.11.2009 19:10
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 5.11.2009 3:07
Сообщение #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

 



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