Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с задачей (массивы) 
:(
    Опции темы
floopless
Дата 24.11.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 18.10.2008

Репутация: нет
Всего: нет



Дано два массива. Найти наименьшее среди тех элементов первого массива, которые не входят во второй массив.

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

Стопорюсь на сравнении - подскажите как правильно сделать..

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

Подскажите вообщем.. и вообще, какой способ лучше, оптимальнее..?

PM MAIL   Вверх
Уттара
Дата 24.11.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.12.2008

Репутация: нет
Всего: 1



Сравниваешь два массива если элемент из первого массива не найден во втором массиве то записать его в третий массив, потом третий массив сортируешь и самое первое число смотришь.
PM MAIL   Вверх
Демо
Дата 24.11.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 7
Всего: 50



Простейший и железный алгоритм:

A,B - массивы
C - пустой массив

Пробегаем в цикле по A, каждый элемент ищем в B.
Если находим A[n], отсутствующий в B элемент, добавляем этот элемент A[n] в C.
Пробегаем один раз C и находим минимальный элемент.


--------------------
    
PM MAIL ICQ Skype   Вверх
Frees
Дата 24.11.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



A,B - массивы

перебегаем массив А для каждого элемента -  ищем в В если не наши сравниваем элимент с мин. если меньше то это новый мин

Добавлено через 1 минуту и 1 секунду
или 

перебегаем массив А для каждого элемента -  если он меньше мин то ищем его в В если не наши то это новый мин


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
floopless
Дата 24.11.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 18.10.2008

Репутация: нет
Всего: нет



А как быть с третьим массивом? Сколько выделить под него места? Естли ведь выделить больше, остальные элементы будут нули..и как тогда определить минимальный..
PM MAIL   Вверх
Демо
Дата 24.11.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 7
Всего: 50



Цитата(floopless @  24.11.2009,  15:10 Найти цитируемый пост)
А как быть с третьим массивом? Сколько выделить под него места? Естли ведь выделить больше, остальные элементы будут нули..и как тогда определить минимальный..


А третий динамическим сделать.


--------------------
    
PM MAIL ICQ Skype   Вверх
Уттара
Дата 24.11.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.12.2008

Репутация: нет
Всего: 1



Цитата(Демо @  24.11.2009,  15:14 Найти цитируемый пост)
А третий динамическим сделать. 

Функцией SetLength в цикле изменяешь размеры
А класс TList тут не поможет?, хотя придется преобразовывать числа в указатели.
PM MAIL   Вверх
floopless
Дата 24.11.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 18.10.2008

Репутация: нет
Всего: нет



У меня массивы указателей.. напиши как использовать TList..
PM MAIL   Вверх
Frees
Дата 24.11.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



Код

with TList.Create do
begin
 Add(p);//добавление
 IndexOf(p);//вернет индекс если p уже есть
 items[i];//доступ к элементу
 count;//кол-во элементов
end;


Добавлено через 3 минуты и 26 секунд
и не забыть free когда список станет не нужен


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
floopless
Дата 25.11.2009, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 18.10.2008

Репутация: нет
Всего: нет



Вообщем вот что получилось  -  (Дано два массива. Найти наименьшее среди тех элементов первого массива, которые не входят во второй массив)
Вроде все работает..но посмотрите на код плз..не нагородил ли я там глупых конструкций.. smile 
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, Buttons, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  const N = 9; // Максимальное кол-во элементов (в таблицах)
  type
  Arr1 = array of integer;
  Arr2 = array of integer;
  Arr3 = array of integer;

var
  Form1: TForm1;
  a: Arr1;
  b: Arr2;
  c: Arr3;
  i,j,k,temp,count: integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
// Заполняем таблицы случайными значениями
Randomize;
for i:=0 to N do
begin
StringGrid1.Cells[i,0]:=IntToStr(Random(100));
StringGrid2.Cells[i,0]:=IntToStr(Random(100));
end;

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
// Устанавливаем длину массивов a и b
SetLength (a,10);
SetLength (b,10);
// Считываем в массивы значения с обеих таблиц
for i:=0 to N do
begin
a[i]:=StrToInt(StringGrid1.Cells[i,0]);
b[i]:=StrToInt(StringGrid2.Cells[i,0]);
end;
// Проверяем каждый элемент массива a на 'присутствие' в массиве b
//Если элемент из массива a отсутствует во втором массиве - копируем его в третьий массив
k:=0;
count:=0;
for i := 0 to N do
  for j := 0 to N do
  begin
    if a[i]=b[j] then Break;

    if (a[i]<>b[j]) and (j=9) then
    begin
    SetLength (c,k+1);
    c[k]:= a[i];
    inc(k);
    inc(count);
    end;
    end;
    a:=nil;
    b:=nil;


// Сортируем по возрастанию третий массив и выводим первый (наименьший) элемент
    for i:= 1 to count do
      for j:= count  downto i do
      if c[j-1]>c[j] then
      begin
       temp:=c[j];
       c[j]:=c[j-1];
       c[j-1]:=temp;
      end;
      Edit1.Text:=IntToStr(c[0]);
      c:=nil;
end;

end.


Это сообщение отредактировал(а) floopless - 25.11.2009, 00:32
PM MAIL   Вверх
Демо
Дата 25.11.2009, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 7
Всего: 50



Я бы, честно говоря, вынес отдельные участки кода в доп. функции.


--------------------
    
PM MAIL ICQ Skype   Вверх
Демо
Дата 25.11.2009, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 7
Всего: 50



Раз уж ты всё сделал, вот посмотри на короткий вариант:

Код

type
  TArray=array of Integer;

var
  A: TArray;
  B: TArray;
...

function isElementInArray(El: Integer; B: TArray): BOolean;
var
   i: integer;
begin
   Result := True;
   for i := Low(B) to High(B) do
   begin
     if El=B[i] then Exit;
   end;
   Result := False;
end;

var
   i: Integer;
   MinEl: Integer;
   A,B: TArray;
begin
   MinEl := MaxInt-1;
   for i := Low(A) to High(A) do
   begin
     if not isElementInArray(A[i],B) then
     begin
       if A[i]<MinEl then MinEl := A[i];
     end;
   end;
  ShowMessage('Min element='+IntToStr(MinEl));




--------------------
    
PM MAIL ICQ Skype   Вверх
Frees
Дата 25.11.2009, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



Демо

Код

     if  A[i]<MinEl then
     begin
       if not isElementInArray(A[i],B) then MinEl := A[i];
     end;


так ведь оптимальнее


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Демо
Дата 25.11.2009, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 7
Всего: 50



Цитата(Frees @  25.11.2009,  07:29 Найти цитируемый пост)
так ведь оптимальнее


Может быть;)


--------------------
    
PM MAIL ICQ Skype   Вверх
amsoft
Дата 25.11.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



Код

if  ((A[i]<MinEl) and (not isElementInArray(A[i],B)))  then MinEl := A[i];


Это сообщение отредактировал(а) amsoft - 25.11.2009, 10:23
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1321 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.