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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2011, 00:02   #1
Cody M.
Пользователь
 
Регистрация: 13.03.2009
Сообщений: 14
По умолчанию Pascal: Из массива A записать данные в массив B без повтора (вкратце)

Есть список книг. Книги находятся в массиве записей.

Код:
const
  N = 6; 
type

  book   =  record 
    author: string; 
    count: integer; 
  end; 
  Arr = array[1..N] of book;
var
  List: Arr;
Вывести на экран двух авторов, чьих книг больше всего.

Пример:
Код:
| Номер книги |  Автор  | Количество
 1             Иванов    10
 2             Иванов    5
 3             Петров    1
 4             Петров    5
 5             Петров    1
 6             Петров    1
 7             Сидоров   10
Программа должна вывести на экран:
Код:
Иванов
Сидоров
Как я думаю, нужно завести ещё один массив записей (record - uniq_author, count).
В него записать все существующие фамилии ['Иванов','Петров','Сидоров'].
После чего вписывать количество книг. И далее уже поиск максимального элеменета.
Но вот как реализовать это, я не пойму.
Заранее благодарен.

Последний раз редактировалось Serge_Bliznykov; 17.02.2011 в 09:17.
Cody M. вне форума Ответить с цитированием
Старый 17.02.2011, 09:30   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

Возьмём конкретно Вашу задачу. И рассмотрим алгоритм, который Вы сами и предложили.

У Вас количество книг задано N = 6.
Значит, уникальных авторов явно не может быть больше 6. Так?
Значит создаём массивчик UAthorArr : array[1..N] of uniq_author_record;
Заводим счётчик, сколько уже уникальных авторов в данном массиве: var UAthorCount;

дальше примерно так (пишу прямо здесь, без проверок, идея будет Вам ясна, а дальше Вы сами заточите под себя):
Код:
  UAthorCount := 0;
  for i:= 1 to N do begin
      uAthorIndex := 0;
      for j:=1 to UAthorCount do
          if  UAthorArr[j].uniq_author = List[i].author then  uAthorIndex := j;

      if (uAthorIndex = 0 ) then begin {не нашли автора ещё в списке} 
         inc(UAthorCount);
         UAthorArr[UAthorCount].uniq_author := List[i].author;
         UAthorArr[UAthorCount].Count := 1;      
      end
      else  {нашли уже такого автора - увеличим ему счётчик на 1} 
         UAthorArr[UAthorCount].Count := UAthorArr[UAthorCount].Count + 1;
  end;
ну, собственно, и всё. осталось отсортировать в убывающем порядке массив записей UAthorArr по полю Count и вывести первые две записи на экран.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.02.2011, 10:19   #3
CepbIu
Пользователь
 
Регистрация: 12.02.2011
Сообщений: 91
По умолчанию

вот как вариант сортировка методом пузырька
Код:
for i:=1 to N-1 do
for j:=i+1 to N do
if m[i]<m[j] then
begin
a:=m[i];
m[i]:=m[j];
m[j]:=a;
end;

Последний раз редактировалось CepbIu; 17.02.2011 в 11:16.
CepbIu вне форума Ответить с цитированием
Старый 17.02.2011, 10:46   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

мне лично больше такой вариант нравится:
Код:
  {сортировка массива методом простых обменов ("пузырька") }
  for i:=1 to RazmerMassiva-1 do
    for j:=i+1 to RazmerMassiva do
      if Massiv[i] > Massiv[j]then
        begin
          msX:=Massiv[i];
          Massiv[i]:=Massiv[j];
          Massiv[j]:=msX
        end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.02.2011, 02:31   #5
Cody M.
Пользователь
 
Регистрация: 13.03.2009
Сообщений: 14
По умолчанию

Ребят, вы одну и ту же сортировку предложили, только знаки разные. Есть ещё сортировка выбором, но она мне не нравится)
Serge_Bliznykov, спасибо, да я что-то зациклился, не мог сообразить как проверить, есть ли определённый элемент в массиве или нет.
Cody M. вне форума Ответить с цитированием
Старый 18.02.2011, 08:51   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Ребят, вы одну и ту же сортировку предложили, только знаки разные.
угу. сортировка одна и та же, но методы реализации были разные. У CepbIu первоначальный вариант был прикольный. мне даже сначала показалось, что он ошибочный, о чём я автору и сообщил. Он исправил код на "классический", но, оказалось, что первоначальный вариант был немножко необычный, но АБСОЛЮТНО рабочий!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать в массив Z подряд семь нулевых элементов массива R,состоящего из N элементов.(Язык QBasic) Лиза) Помощь студентам 0 11.01.2011 16:02
Как соеденить два файла, без повтора слов!! Окоча Юра Microsoft Office Word 3 07.03.2009 02:17
Прочитать файл и записать данные в массив ChukCha Общие вопросы C/C++ 6 22.02.2009 19:56
Из Access записать данные в файл Ecxel roland_12 Microsoft Office Access 1 09.09.2008 05:51
Генерировать массив без повтора значений элементов. На (С.) Raptor Помощь студентам 5 17.12.2007 14:42