1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Программа должна удалять элементы кратные семи в массиве и оставшиеся сдвигать на место удаленных влево. Работает (удаляет и сдвигает) только первый найденный элемент, остальные элементы кратные семи почему-то не трогает. Я так понимаю напутал где-то с внешним циклом. Покажите ошибку, пожалуйста.
var
a:array[1..20] of integer;
i,e:integer;
begin
randomize;
for i:=1to20do
a[i]:=random(95)-50;
writeln('massiv: ');
for i:=1to20do
write(a[i],' ');
writeln;
for i:=1to20dobeginif a[i] mod7=0then inc(e);
if a[i] mod7=0thenfor i:=i to20do a[i]:=a[i+1];
end;
writeln('novyi massiv: ');
for i:=1to20-e do
write(a[i],' ');
writeln;
end.
for i:=1to20dobeginif a[i] mod7=0then inc(e);
if a[i] mod7=0thenfor i:=i to20do a[i]:=a[i+1]; { <--- }end;
Как минимум в этом месте программа перестает работать правильно. Нельзя делать несколько циклов по одной и той же переменной, сделай второй цикл по J, например... Это первое. Второе - здесь внешний цикл желательно делать не For, а While, потому что у тебя сдвигаются элементы массива, так какой смысл идти по ВСЕМ элементам, до 20? Надо идти только до (20 - e), а это нереализуемо в For-е. Опять же, почему E не инициализировано? Проблем ищешь? Хочешь расскажу, что ты скажешь через некоторое время? Когда попытаешься сделать это задание отдельной процедурой?
Второе - здесь внешний цикл желательно делать не For, а While, потому что у тебя сдвигаются элементы массива, так какой смысл идти по ВСЕМ элементам, до 20? Надо идти только до (20 - e), а это нереализуемо в For-е.
Напиши конкретней, пожалуйста. Ты предлагаешь мне заменить вот этот цикл на while, и изменить условие на 20-e?
uses crt;
const n=8;
a:array[1..n] of integer =(7,7,3,4,7,7,5,7);
var
i,j,e:integer;
begin
clrscr;
{randomize;
for i:=1 to 20 do
a[i]:=random(95)-50;}
writeln('massiv: ');
for i:=1to n do
write(a[i],' ');
writeln;
{Инициализация}
e:=0;
i:=1;
while (i<n-e+1) dobeginif a[i] mod7=0thenbeginfor j:=i to n-e do
a[j]:=a[j+1];
inc(e);
endelse
inc(i);
end;
writeln('novyi massiv: ');
for i:=1to n-e do
write(a[i],' ');
writeln;
readkey;
end.
Цикл while в этом случае позволяет уменьшить число итераций - отсекаются лишние. Инициализация - это когда переменной задают начальное значение. В Паскале инициализация происходит автоматически, но к этому лучше не привыкать. Например в коде сверху обнулять i обязательно.