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

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

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

 
 Ответить  Открыть новую тему 
> Ошибка в работе с массивами
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

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


Программа должна удалять элементы кратные семи в массиве и оставшиеся сдвигать на место удаленных влево. Работает (удаляет и сдвигает) только первый найденный элемент, остальные элементы кратные семи почему-то не трогает. Я так понимаю напутал где-то с внешним циклом. Покажите ошибку, пожалуйста.

var
a:array[1..20] of integer;
i,e:integer;
begin

randomize;
for i:=1 to 20 do
a[i]:=random(95)-50;

writeln('massiv: ');
for i:=1 to 20 do
write(a[i],' ');

writeln;

for i:=1 to 20 do
begin
if a[i] mod 7=0 then inc(e);
if a[i] mod 7=0 then
for i:=i to 20 do a[i]:=a[i+1];
end;

writeln('novyi massiv: ');
for i:=1 to 20-e do
write(a[i],' ');

writeln;

end.


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


Гость






Цитата
for i:=1 to 20 do
begin
if a[i] mod 7=0 then inc(e);
if a[i] mod 7=0 then
for i:=i to 20 do a[i]:=a[i+1]; { <--- }
end;
Как минимум в этом месте программа перестает работать правильно. Нельзя делать несколько циклов по одной и той же переменной, сделай второй цикл по J, например... Это первое. Второе - здесь внешний цикл желательно делать не For, а While, потому что у тебя сдвигаются элементы массива, так какой смысл идти по ВСЕМ элементам, до 20? Надо идти только до (20 - e), а это нереализуемо в For-е. Опять же, почему E не инициализировано? Проблем ищешь? Хочешь расскажу, что ты скажешь через некоторое время? Когда попытаешься сделать это задание отдельной процедурой? smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

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


Цитата
Второе - здесь внешний цикл желательно делать не For, а While, потому что у тебя сдвигаются элементы массива, так какой смысл идти по ВСЕМ элементам, до 20? Надо идти только до (20 - e), а это нереализуемо в For-е.
Напиши конкретней, пожалуйста. Ты предлагаешь мне заменить вот этот цикл на while, и изменить условие на 20-e?
for i:=1 to 20 do (строка 16ая)
Я вроде попробовал так, ничего не изменилось.

Цитата
Опять же, почему E не инициализировано?
Что это значит?


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


Ночной волк
**

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

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


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:=1 to n do
   write(a[i],' ');
 writeln;
{Инициализация}
 e:=0;
 i:=1;
while (i<n-e+1) do
 begin
  if a[i] mod 7=0 then
   begin
    for j:=i to n-e do
     a[j]:=a[j+1];
     inc(e);
   end
  else
   inc(i);
 end;

 writeln('novyi massiv: ');
  for i:=1 to n-e do
   write(a[i],' ');

writeln;
readkey;
end.



Цикл while в этом случае позволяет уменьшить число итераций - отсекаются лишние.
Инициализация - это когда переменной задают начальное значение. В Паскале инициализация происходит автоматически, но к этому лучше не привыкать. Например в коде сверху обнулять i обязательно.


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 227
Пол: Мужской
Реальное имя: Вячеслав

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


Спасибо, с циклами разобрался, программа работает.

2 ammaximus: спасибо за лаконичное объяснение, буду иметь в виду.


--------------------
Само знание есть сила
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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