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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2015, 18:47   #1
MiaKotova
 
Регистрация: 23.05.2015
Сообщений: 7
По умолчанию Массивы.

Дано два массива. Найти наименьшее среди тех элементов первого массива, не входящих во второй массив. Помогите!
MiaKotova вне форума Ответить с цитированием
Старый 10.07.2015, 19:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Показать ввод массива сможешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.07.2015, 20:13   #3
MiaKotova
 
Регистрация: 23.05.2015
Сообщений: 7
По умолчанию

Не могу, в том то и дело.
MiaKotova вне форума Ответить с цитированием
Старый 11.07.2015, 05:08   #4
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Задание вроде и легкое, а кода как-то много вышло:

Код:
procedure main;
const array1Length = 5;
      array2Length = 10;
      randomGen = 5;

var array1 : array[1..array1Length] of integer;
    array2 : array[1..array2Length] of integer;
    i,j,min: integer;
    haveMin: boolean;
begin

  Randomize;

  Write('Array1: ');
  for i:=1 to array1Length do
  begin
    array1[i]:=Random(randomGen*2+1)-randomGen;
    Write(array1[i]:4);
  end;
  Writeln;
  Write('Array2: ');
  for i:=1 to array2Length do
  begin
    array2[i]:=Random(randomGen*2+1)-randomGen;
    Write(array2[i]:4);
  end;
  Writeln;
  //  first min value element
  haveMin:=false;
  for i:=1 to array1Length do
  begin
    for j:=1 to array2Length do
    begin
      if array1[i]=array2[j] then break;
    end;
    if j = array2Length+1 then
    begin
      min := array1[i];
      haveMin:=true;
      break;
    end;
  end;

  if not haveMin then
  begin
    Writeln('min = nil');
    Readln;
    exit;
  end;

  for i:=i+1 to array1Length do
  begin
    for j:=1 to array2Length do
    begin
      if array1[i]=array2[j] then break;
    end;
    if j = array2Length+1 then
    begin
      if min > array1[i] then min := array1[i];
    end;
  end;

  Writeln('min = ', min);
  Readln;
end;

begin
  while true do main;
end.
Кому не сложно, гляньте, может что-то можно сократить.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 11.07.2015, 09:58   #5
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Алгоритм такой:
1. Находим сначала элементы для поиска наименьшего:
1.1. Берем элемент из первого и сравниваем со всеми элементами второго.
1.2. Если выбранный элемент не имеет аналога во втором, то запоминаем его.
1.3. Если есть ещё элементы вернутся к действию 1.1
2. Заводим переменную со значением 0(min).
3. Запоминаем 1 элемент из тех выборок, которые получили в 1 действие.
4. Начинаем перебирать, начиная со второго элемента выборок.
Код проверки:
Код:
if Massiv[index]<min then min:=Massiv[index];
Перебирать лучше for to do. Для поиска выборок лучше использовать repeat until или while do.
Думаю записать данный алгоритм на языке программирование мозгов хватит.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 11.07.2015, 15:01   #6
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
1.2. Если выбранный элемент не имеет аналога во втором, то запоминаем его.
Изначально тоже думал так сделать и считаю, что так было бы правильнее, но тогда нужен будет 3-ий массив. В идеале, еще из 3-го массива нужно исключить повторные элементы.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 11.07.2015, 22:05   #7
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
Изначально тоже думал так сделать и считаю, что так было бы правильнее, но тогда нужен будет 3-ий массив. В идеале, еще из 3-го массива нужно исключить повторные элементы.
Третий массив- это как раз выборки. Динамические создай и не парься. После выборки можно будет сразу обнулить первые два с помощью SetLength.
По сути код выглядит так:
Код:
Var 
Massiv1, Massiv2, List: array of Integer;
min: integer; 
i,k: integer;
j: boolean;
begin
...//здесь вставь код заполнения первых двух массивов 
//поиск...
for i:=0 to High(Massiv1) do 
begin
k:=0;
j:=false;
repeat 
if K>High(Massiv2) then break;
if Massiv1[i]=Massiv2[k] then
begin
j:=true;
end;
K:=K+1;
until j<>true;
if j=false then 
begin
SetLength(List,Length(Cases)+1);
List[High(List)]:=Massiv1[i];
end;
end; 
SetLength(Massiv1,0);
SetLength(Massiv2,0);
if Length(List)=0 then 
begin
Writeln('Выборок нет');
Readln;
Exit;
end;
min:=List[0];
//поиск минимального
for i:=1 to High(List) do 
if List[i]<min then min:=List[i];
SetLength(List,0);
Writeln('Минимальный элемент в первом массиве, не имеющий аналогов во втором:',min);
Readln;
end;
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.

Последний раз редактировалось саша40; 11.07.2015 в 22:09.
саша40 вне форума Ответить с цитированием
Старый 12.07.2015, 01:44   #8
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Вариант с динамическими массивами и возможностью ручного ввода:

Код:
procedure main;

//  константы для случайной генерации массивов
const array1RandomLength = 17;   // from 1 to array1RandomLength
      array1RandomValues = 10;   // from -array1RandomValues to array1RandomValues

      array2RandomLength = 17;   // from 1 to array2RandomLength
      array2RandomValues = 10;   // from -array2RandomValues to array2RandomValues

var array1, array2, array3 : array of integer;
    i,j,k,min,array1Length,array2Length,array3Length: integer;
begin

  //  ввод массивов (рандом)
  Randomize;
  //  array1
  SetLength(array1,Random(array1RandomLength)+1);
  for i:=0 to High(array1) do array1[i] := Random(array1RandomValues*2+1)-array1RandomValues;

  //  array2
  SetLength(array2,Random(array2RandomLength)+1);
  for i:=0 to High(array2) do array2[i] := Random(array2RandomValues*2+1)-array2RandomValues;

{
  //  ввод массивов (ручной)
  //  array1
  Write('Input array 1 length: ');
  Readln(array1Length);
  SetLength(array1,array1Length);
  for i:=0 to High(array1) do
  begin
    Write('Array1[',i,'] = ');
    Readln(array1[i]);
  end;

  //  array2
  Write('Input array 2 length: ');
  Readln(array2Length);
  SetLength(array2,array2Length);
  for i:=0 to High(array2) do
  begin
    Write('Array2[',i,'] = ');
    Readln(array2[i]);
  end;
}

  //  вывод массивов
  //  array1
  Write('Array1: ');
  for i:=0 to High(array1) do Write(array1[i]:4);
  Writeln;

  //  array2
  Write('Array2: ');
  for i:=0 to High(array2) do Write(array2[i]:4);
  Writeln;


  //  перезапись элементов в array3, которые нужно проверять на минимальное значение
  SetLength(array3, Length(array1));
  array3Length:=0;

  for i:=0 to High(array1) do
  begin
    for j:=0 to High(array2) do
    begin
      if array1[i]=array2[j] then break;
    end;
    if j = High(array2)+1 then
    begin
      k:=0;
      while k < array3Length do
      begin
        if array3[k]=array1[i] then break;
        Inc(k);
      end;
      if k = array3Length then
      begin
        array3[array3Length]:=array1[i];
        Inc(array3Length)
      end;
    end;
  end;

  SetLength(array3, array3Length);

  //  вывод массива 3
  //  array3
  Write('Array3: ');
  for i:=0 to High(array3) do Write(array3[i]:4);
  Writeln;

  //  поиск минимального значения
  if array3Length=0 then
  begin
    Writeln('min = nil');
    Readln;
    Exit;
  end;

  min:=array3[0];
  for i:=1 to High(array3) do
    if min > array3[i] then min:=array3[i];

  Writeln('min = ', min);

  Readln;
end;



begin
  while true do main;
end.
Результаты:
results.jpg
Но кода стало еще больше...
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 12.07.2015 в 01:58.
Krasiosoft вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написать программу массивы (C++) - Даны два массива, скопировать эти массивы в 3-й результирующий (размером 10 элементов) так, что Саша1990 Помощь студентам 1 02.02.2015 16:03
Одномерные массивы, двумерные массивы, строки Sand093 C++ Builder 11 20.05.2012 21:48
Двумерные массивы(матрица) 2)Строковые массивы(строки): 3)Структуры nuriyat Помощь студентам 1 21.01.2012 16:16
Двумерные массивы(массивы указателей на массивы) krytishka99 Помощь студентам 1 29.12.2011 19:51
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12