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

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

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

> убираем дубликаты после сортировки в одномерном массиве
сообщение
Сообщение #1


Профи
****

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

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


uses crt;
const n=10;
type
vect=array[1..n] of integer;
var
a:=vect;
i,j,t:integer;
begin
clrscr;
writeln (‘vvedite elementy massiva’);
for i:=1 to n do read (a[i]);
writeln (‘sortirovka’);
for j:=1 to n do
begin
for i:=n downto j+1 do
begin
if a[i]<a[i-1] then
begin
t:=a[i];
a[i]:=a[i-1];
a[i-1]:=t;
end;
end;
for i:=1 to n do write (a[i], ‘ ‘);
writeln;
end;
writeln;
writeln (‘massiv otsortirovan’);
(***** *****)
i:=0;
j:=1;
repeat
while (j<=n)and(a[j-1]=a[j]) do
j:=j+1;
if j<=n then
begin
i:=i+1;
a[i]:=a[j];
j:=j+1;
end;
until j>n;
(***** *****)
for j:=1 to n i do write (a[j],’ ‘);
readkey;
end.


объясните пожалуйста как можно подробнее суть выделенной части программы (в этой части убираются числа с одним и тем же значением)
если нужно, напоминаю задание (дан массив целых чисел размера n=10. получить упорядоченный по возрастанию массив, содержащий все различные числа данного массива)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


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

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

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


Суть в том, что, поскольку к этому моменту массив уже отсортирован, то если есть два или более одинаковых элементов, они все будут стоять рядом. Мы проходим по массиву с начала до конца, увеличивая счетчик j. Другой счетчик, i, служит для подсчета различных элементов.

i:=0;                                     { Подготавливаем счетчик различных элементов}
j:=1; { Подготавливаем счетчик всех элементов }
repeat { Цикл по всем элементам (главный) }
while (j<=n)and(a[j-1]=a[j]) do j:=j+1; { Пропуск одинаковых элементов. j увеличивается, i - нет}
if j<=n then begin { Проверка, что счетчик не вышел за границы массива }
i:=i+1; { Увеличиваем счетчик различных элементов }
a[i]:=a[j]; { Перекладываем элемент со старого места j на новое i }
j:=j+1; { Увеличиваем счетчик главного цикла}
end;
until j>n; { Условие остановки процесса по достижении границы массива}

Я честно разобрал работу фрагмента, но только все же хочу сказать, что он весьма неоптимален (вложено два цикла, что влечет увеличение числа проверок..). Буде мне пришлось бы делать нечто подобное, я сделал бы примерно так:
  i:=1;                        { Подготавливаем счетчик различных элементов}
for j:=2 to n do begin { Цикл по всем элементам, кроме первого }
if a[j]>a[i] then begin { Если следующий элемент не равен предыдущему, ..}
i:=i+1; { .. то увеличиваем счетчик различных элементов и ..}
a[i]:=a[j] { .. перекладываем элемент со старого места j на новое i }
end
end; { Закрываем тело цикла }


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

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


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

 





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