Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2018, 22:54   #1
Kolgute
 
Регистрация: 09.06.2018
Сообщений: 3
По умолчанию Избавление массива от одинаковых элементов

Нужно массив из чисел избавить от повторяющихся элементов

Код:
procedure Check1(b:array of integer);
var i,j:Integer;
begin
  Randomize;
  for i:=1 to 5 do
  begin
    for j:=1 to 5 do
    if i <> j then
      if b[i] = b[j] then b[i]:=Random(9)+3;
  end;
end;

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор



Но после прохода массива через эту процедуру в нём всё ещё остаются одинаковые значения, помогите разобраться

Последний раз редактировалось Serge_Bliznykov; 09.06.2018 в 23:03.
Kolgute вне форума Ответить с цитированием
Старый 09.06.2018, 23:11   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Kolgute Посмотреть сообщение
Нужно массив из чисел избавить от повторяющихся элементов

Код:
procedure Check1(b:array of integer);
var i,j:Integer;
begin
  Randomize;
  for i:=1 to 5 do
  begin
    for j:=1 to 5 do
    if i <> j then
      if b[i] = b[j] then b[i]:=Random(9)+3;
  end;
end;
Но после прохода массива через эту процедуру в нём всё ещё остаются одинаковые значения, помогите разобраться
Че тут разбиратся - эта процедура их СОЗДАЕТ случайные, она не от чего не избавляется. Точнее....если там что-то одинаково, то она меняет его на случайное, что опять может дать такое же...
alexzk вне форума Ответить с цитированием
Старый 09.06.2018, 23:13   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, код с ошибкой. Массив b - у Вас это массив открытого типа (open array).
Они всегда нумеруются от нуля.
ну и насчёт 5 - это очень смелое допущение.
почитайте, например, статью GunSmoker'а - Параметры типа открытый массив и "array of const"

возможно, Вам будет удобнее объявить свой тип массива и его передавать в процедуру.

например,
Код:
const n = 5;
type myarray = array[1..n] of integer;
....
procedure Check1(b:myarray);
var i,j:Integer;
begin
  for i:=1 to n do
  begin
    for j:=1 to n do
...
во-вторых,
randomize не желательно вызывать многократно.
лучше это делать один раз в главном тебе программы (после главного Begin или в процедуре иницилизации).

в-третьих,
вы найденные повторы заменяете на случайные числа.
ну, разумеется, они могут совпасть с теми числами, которые есть в массиве.
Какова вообще изначальная цель? Чем и как заполняется массив изначально?
Может быть, проще сразу заполнить массив без повторов?

ну, или попробуйте такой код:
Код:
procedure Check1(b:myarray);
var i,j,k,tmp, isfound:Integer;
begin
  for i:=1 to n do
  begin
    for j:=1 to n do
    if i <> j then
        if b[i] = b[j] then begin
            repeat
              tmp := Random(9)+3;
              isfound := 0;
              for k:=1 to n do
                 if b[k]=tmp then begin isfound := 1; break end;
            until isfound = 0;
            b[j]:=tmp;
        end;
  end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.06.2018, 23:26   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Немного не по теме, но по коду.
Код:
procedure Check1(b:array of integer);
я один думаю, что нельзя так объявлять формальные параметры-массивы? array of integer должен быть объявлен как отдельный тип, то есть
Код:
type TArray = array of integer;
...
procedure Check1(b: TArray);
Вадим Мошев вне форума Ответить с цитированием
Старый 09.06.2018, 23:26   #5
Kolgute
 
Регистрация: 09.06.2018
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
во-первых, код с ошибкой. Массив b - у Вас это массив открытого типа (open array).
Они всегда нумеруются от нуля.
ну и насчёт 5 - это очень смелое допущение.
почитайте, например, статью GunSmoker'а - Параметры типа открытый массив и "array of const"

возможно, Вам будет удобнее объявить свой тип массива и его передавать в процедуру.

например,
Код:
const n = 5;
type myarray = array[1..n] of integer;
....
procedure Check1(b:myarray);
var i,j:Integer;
begin
  for i:=1 to n do
  begin
    for j:=1 to n do
...
во-вторых,
randomize не желательно вызывать многократно.
лучше это делать один раз в главном тебе программы (после главного Begin или в процедуре иницилизации).

в-третьих,
вы найденные повторы заменяете на случайные числа.
ну, разумеется, они могут совпасть с теми числами, которые есть в массиве.
Какова вообще изначальная цель? Чем и как заполняется массив изначально?
Может быть, проще сразу заполнить массив без повторов?

ну, или попробуйте такой код:
Код:
procedure Check1(b:myarray);
var i,j,k,tmp, isfound:Integer;
begin
  for i:=1 to n do
  begin
    for j:=1 to n do
    if i <> j then
        if b[i] = b[j] then begin
            repeat
              tmp := Random(9)+3;
              isfound := 0;
              for k:=1 to n do
                 if b[k]=tmp then begin isfound := 1; break end;
            until isfound = 0;
            b[j]:=tmp;
        end;
  end;
end;
Во первых, извините , я не указал что работаю в делфи а там какой отправил массив в процедуру,с таким работать и будешь(динамический или статический и т.д)
Во вторых мне для одной программы нужно что бы в массиве были не совпадающие элементы а массив изначально заполняется случайно.
В третьих почему-то код не работает, бывают пробеги когда есть одинаковые числа

Последний раз редактировалось Kolgute; 09.06.2018 в 23:38.
Kolgute вне форума Ответить с цитированием
Старый 10.06.2018, 09:49   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
я один думаю, что нельзя так объявлять формальные параметры-массивы?
ошибаетесь. Вадим, Вы не увидели ссылки в моём сообщении на статью об открытом типе массива ?
Тогда просто загуглите - Open Array Pascal
Это совсем не то же самое, что динамические массивы.


Цитата:
Сообщение от Kolgute Посмотреть сообщение
Во первых, извините , я не указал что работаю в делфи а там какой отправил массив в процедуру,с таким работать и будешь(динамический или статический и т.д)
вот я и говорю Вам - Вы с ним работаете НЕПРАВИЛЬНО!
пропускаете первый элемент массива и совершенно самонадеянно считаете, что массив ровно на 6 элементов. Если Вам реально нужен массив открытого типа, то будьте добры с ним работать так, как положено:
Код:
procedure Check1(b:array of integer);
var i,j:Integer;
begin
  Randomize;
  for i:=Low(b) to High(b) do
  begin
    for j:=Low(b) to High(b) do
....

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


Цитата:
Сообщение от Kolgute Посмотреть сообщение
В третьих почему-то код не работает, бывают пробеги когда есть одинаковые числа
чей код не работает? Мой?
Или Ваш?
Если Ваш - то я Вам объяснил почему он не работает. Потому что, когда Вы нашли два одинаковых числа, вы генерите новое случайное число. Оно легко может совпасть с числом, которое уже есть (и на практике - совпадает).
В результате Вы заменяете на число, которое является повтором.

Ещё есть вопросы?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.06.2018, 13:41   #7
Kolgute
 
Регистрация: 09.06.2018
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ошибаетесь. Вадим, Вы не увидели ссылки в моём сообщении на статью об открытом типе массива ?
Тогда просто загуглите - Open Array Pascal
Это совсем не то же самое, что динамические массивы.



вот я и говорю Вам - Вы с ним работаете НЕПРАВИЛЬНО!
пропускаете первый элемент массива и совершенно самонадеянно считаете, что массив ровно на 6 элементов. Если Вам реально нужен массив открытого типа, то будьте добры с ним работать так, как положено:
Код:
procedure Check1(b:array of integer);
var i,j:Integer;
begin
  Randomize;
  for i:=Low(b) to High(b) do
  begin
    for j:=Low(b) to High(b) do
....


так при заполнении и проверяйте - есть ли уже такая величина в массиве и повторяте цикл получения нового случайного числа, пока есть. Это проще, чем проверять ВСЕ элементы, а потом заменять совпавшие.



чей код не работает? Мой?
Или Ваш?
Если Ваш - то я Вам объяснил почему он не работает. Потому что, когда Вы нашли два одинаковых числа, вы генерите новое случайное число. Оно легко может совпасть с числом, которое уже есть (и на практике - совпадает).
В результате Вы заменяете на число, которое является повтором.

Ещё есть вопросы?
Да, мне важно что бы массив с начало генерировался, а потом уже чистился от одинаковых, требование преподавателя.
А если взять массив случайно сгенерированный, потом 1 число сравнить со всеми и если совпадает то рандомить заного и так пока не будет повтора, так со 2 , 3 и т.д то сработает?
Kolgute вне форума Ответить с цитированием
Старый 11.06.2018, 21:03   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Kolgute Посмотреть сообщение
А если взять массив случайно сгенерированный, потом 1 число сравнить со всеми и если совпадает то рандомить заного и так пока не будет повтора, так со 2 , 3 и т.д то сработает?
да. именно так

я и написал в своём примере.
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну, или попробуйте такой код:
но код не проверял.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача с обнулением одинаковых элементов массива MarkAfe Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 28.09.2017 19:05
C++ Cумма одинаковых отрицательных элементов массива SilentPerson Помощь студентам 0 08.05.2017 01:06
Дан целочисленный массив размера N, содержащий ровно два одинаковых элемента. Найти номера одинаковых элементов и вывести эти номе Alexar Makken Паскаль, Turbo Pascal, PascalABC.NET 1 23.12.2011 22:07
удаление одинаковых элементов из массива sauron99 Общие вопросы Delphi 6 15.04.2009 21:27
поиск одинаковых элементов одномерного массива и их количества MyQwErTy Помощь студентам 2 28.02.2009 17:17