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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2008, 13:03   #1
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию Повторяющиеся элементы массива

Здравствуйте!

у меня есть вопрос по поводу массива не могу разобраться..

имеется динамический массив, в котором хранятся фамилии студентов,
вся проблема в том, что эти фамилии могут повторяться.
Как очистить массив от повторяющихся элементов?

Заранее благодарен.
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 22.05.2008, 13:09   #2
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

Берёшь первую фамилию (i) и перебираешь список от i+1 до конца, встретил одинаковую, удалил... И так далее... Это самый простой способ.
Сложнее: отсортировать (одним из алгоритмов сортировки), потом таким же способом проверять, равер или нет i+1, равен удалил неравен берм следуещий елемент массива, и так до конца.
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 22.05.2008, 13:26   #3
AlexandrSid
Форумчанин
 
Регистрация: 31.10.2007
Сообщений: 103
По умолчанию

А почему нельзя проверять на совпадения при добавлении элемента?
AlexandrSid вне форума Ответить с цитированием
Старый 22.05.2008, 13:27   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
имеется динамический массив, в котором хранятся фамилии студентов,
Не надо ничего сортировать, при добавлении в массив проверяй есть ли такая фамилия, если есть то не вноси. Только я не могу понять как этот подход будет действовать в случаях однофамильцев...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2008, 14:55   #5
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не надо ничего сортировать, при добавлении в массив проверяй есть ли такая фамилия, если есть то не вноси. Только я не могу понять как этот подход будет действовать в случаях однофамильцев...

я понимаю о чем вы говорите привиду пример как делал потом вывел и все равно получил одинаковые элементы:

Здесь читаю файл пока не достигнут конец
begin
kolmas:=kolmas+1;
Выбираю из строки фамилию // Дело в том что строка имеет вид
Иванов/Иван/Иванович
После парсинга заношу в переменную fam фамилию Иванов

После чего проверяю элементы массива
for i:=0 to higth(mas) do begin
if mas[i] <> fam then begin
mas[kolmas] : = fam;
end;
end;

Только после этого в массиве все равно есть одинаковые фамилии
Подскажите как это исправить

Спасибо.
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 22.05.2008, 15:06   #6
AlexandrSid
Форумчанин
 
Регистрация: 31.10.2007
Сообщений: 103
По умолчанию

У тебя проверка сводится только к сравнению первого элемента массива с добавляемым элементом.

Код:
var b:boolean;

b:= True;
for i:=0 to higth(mas) do begin 
  if mas[i] = fam then begin 
    b:=False;   
    Break;
  end;
end; 
if b then mas[kolmas] : = fam;

Последний раз редактировалось AlexandrSid; 22.05.2008 в 15:49. Причина: Намудрил с переменными
AlexandrSid вне форума Ответить с цитированием
Старый 22.05.2008, 15:21   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
 i:=0;b:false;
while (i<=higth(mas))and(not b) do begin
 if mas[i] = fam then b:=true;
 inc(i);
end;
if b then // такой уже есть
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2008, 16:22   #8
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от AlexandrSid Посмотреть сообщение
У тебя проверка сводится только к сравнению первого элемента массива с добавляемым элементом.

Код:
var b:boolean;

b:= True;
for i:=0 to higth(mas) do begin 
  if mas[i] = fam then begin 
    b:=False;   
    Break;
  end;
end; 
if b then mas[kolmas] : = fam;

Спасибо за ответы но для полной ясности объясните пожайлусто почему проверка сводиться к сравнению первого элемента массива с добавляемым элементом ... для будущего

ведь я же запустил цикл от 0 до higth(mas) он же должен перебрать все элементы.
Может вопрос дурацкий но что-то я не понимаю

Спасибо еще раз.
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 22.05.2008, 16:30   #9
AlexandrSid
Форумчанин
 
Регистрация: 31.10.2007
Сообщений: 103
По умолчанию

Смотри ты присваиваешь переменной fram фамилию (Например 'Иванов')

Допустим твой массив mas = ('Петров','Иванов','Сидоров')

запускаешь цикл

for i:=0 to higth(mas) do begin
if mas[i] <> fam then begin 'сравниваешь mas[i] (т.е. mas[0]) которое равно 'Петров' и fam который равен 'Иванов', соответственно они не равны и твоя процедура добавляет fam в массив' mas[kolmas] : = fam 'Но это еще не самое страшно, после этого ты продолжаешь цикл и получается что процедура добавить фалмилию (higth(mas)-количество совпадений) раз.
Т.е. фамилию можно добавить только после того как ты проверил все элементы массива на совпадения, если же обнаружено совпадение то цикл необходимо прервать т.к. нет смысла сравнивать остальные элементы массива.

if mas[i] = fam then begin
b:=False;
Break;
end;

Переменная b в данном случаи служит для определения добавления элемента в массив, если есть совпадения она равна False и элемент не добавляется.

Лучше используй код Stilet он более правильно написан, но смысл тот же думаю сам разберешся.

Последний раз редактировалось AlexandrSid; 22.05.2008 в 16:37.
AlexandrSid вне форума Ответить с цитированием
Старый 22.05.2008, 16:43   #10
Dimoney
Пользователь
 
Регистрация: 14.12.2007
Сообщений: 34
По умолчанию

Код:
for i:=0 to higth(mas) do begin 
  if mas[i] <> fam then begin 
    mas[kolmas] : = fam;
  end;
end;
Первая фамилия "Иванов". Проверяешь "Петров". i=0, "Иванов" <> "Петров". "Иванов" заносится в базу.

Надо сначала проверить вхождение, если нашел, то флаг "найдено":=true. Выход из цикла. Если не нашел, то флаг "найдено":=false. Проверяешь флаг, true = > не заносишь, false = > заносишь.

PS. Опоздал, блин

Последний раз редактировалось Dimoney; 22.05.2008 в 16:50.
Dimoney вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Элементы массива и старшие цифры logistics Помощь студентам 4 22.04.2008 00:12
Именовать элементы массива не цифрами, а словами. Air Общие вопросы Delphi 15 07.03.2008 18:49
переписать из массива в линейный двунаправленный список чётные элементы массива Black_Ak24 Помощь студентам 12 08.01.2008 00:44
Как удалять элементы массива в Паскале? Антонова Анна Помощь студентам 2 08.12.2007 17:01
Удалить из массива(одномерного) все повторяющиеся числа(Delphi) Махор Помощь студентам 4 29.11.2007 23:25