Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.12.2011, 03:50
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
Вопрос Удаление элемента из одномерного массива

Мне задали курсач на тему "Определение опорного плана транспортной задачи методом дифференцированных рент" и мне нужно написать программу для вычисления таких задач.
В процессе написания программы, я столкнулся с проблемой... в общем у меня есть одномерный массив состоящий из 5 элементов. В идеале в массиве нужно найти наименьший по значению элемент, записать его значение в другую переменную и искать следующий наименьший элемент тем же способом(цикл).И этот цикл заканчивается тогда когда переменная z1=0.
Я нашел в массиве и записал ПЕРВЫЙ наименьший элемент, а все последующие... что бы я не делал, ничего не получается. Программа либо зацикливается, либо вообще ниче не работает...
Подскажите как лучше сделать, очень надо...

Последний раз редактировалось TheVenom, 29.12.2011 в 21:03. Причина: Очень срочно:
Ответить с цитированием
  #2  
Старый 29.12.2011, 04:12
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ваш код приведите, пожалуйста.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
TheVenom (30.12.2011)
  #3  
Старый 29.12.2011, 07:46
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если надо удалить элемент, то тут такой вопрос - а какой массив у вас, статический или динамический. Подготовительные работы одинаковые, т.е. надо все элементы после удаляемого сдвинуть на 1 позицию влево, т.е. A[3] -> A[2], A[4] -> A[3], A[5]->A[4], именно в таком порядке, т.е.

Код:
var
  I, Idx : Integer;
begin
  Idx := 2; // remove 2nd item
  For I := Idx To High(A)-1 Do A[i] := A[I+1];

а вот потом либо надо переразмерить массив, либо признак конца массива уменьшить на 1.
Ответить с цитированием
  #4  
Старый 29.12.2011, 07:51
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Либо я чего-то непонимаю, либо вы не так объясняете. Наименьший элемент ищется элементарно:
Код:
Min := Arr[1];
for i := 2 to N
do if Arr[i] < Min then Min := Arr[i];
Найти меньше меньшего невозможно, можно найти только равный меньшему, если последовательность предусматривает повторы. Искать дальше меньший имеет смысл если вы из последовательности исключите элемент определенный как меньший, прежде чем искать вторично, иначе будет бесконечный цикл.
Но зачем вообще так делать, если можно просто отсортировать массив по убыванию и все.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
TheVenom (30.12.2011)
  #5  
Старый 29.12.2011, 08:34
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

или отсортировать и выбирать по порядку
Ответить с цитированием
  #6  
Старый 29.12.2011, 11:54
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
По умолчанию

проблема состоит не в том чтобы найти наименьший элемент, а в том чтобы найти "следующий" наименьший элемент. У меня была идея сделать это с помощью цикла, так чтобы в конце цикла массив сокращался(т.е. наименьший элемент удалялся), но в этом случае программа по каким то причинам зацикливается, выводит ошибку или вообще выводит какие то левые цифры непонятно откуда. Вот мой код посмотрите, что с ним можно сделать...
Код:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
  byteArray  : Array of Byte;
  i:integer;
  min1,x1,yy1,z1: Integer;
  begin
    SetLength(byteArray, 5);
  for i := 0 to 4 do
  byteArray[i] := i * 5;
  byteArray[0] := StrToInt(Edit1.Text);
  byteArray[1] := StrToInt(Edit2.Text);
  byteArray[2] := StrToInt(Edit3.Text);
  byteArray[3] := StrToInt(Edit4.Text);
  byteArray[4] := StrToInt(Edit5.Text);
  z1:=0;

  min1:= byteArray[0];
for i := 1 to 4
do if byteArray[i] < min1 then min1 := byteArray[i];

if (min1 = byteArray[0]) then Edit1.Color:=clLime;
if (min1 = byteArray[1]) then Edit2.Color:=clLime;
if (min1 = byteArray[2]) then Edit3.Color:=clLime;
if (min1 = byteArray[3]) then Edit4.Color:=clLime;
if (min1 = byteArray[4]) then Edit5.Color:=clLime;

x1:= StrToInt(Edit21.Text);
if (min1 = byteArray[0]) then yy1:= StrToInt(Edit16.text);
if (min1 = byteArray[1]) then yy1:= StrToInt(Edit17.text);
if (min1 = byteArray[2]) then yy1:= StrToInt(Edit18.text);
if (min1 = byteArray[3]) then yy1:= StrToInt(Edit19.text);
if (min1 = byteArray[4]) then yy1:= StrToInt(Edit20.text);
z1:=x1-yy1-z1;
Label16.Caption:= IntToStr(z1);
end;
Админ: Пользуемся тегами для оформления кода!

Последний раз редактировалось Admin, 29.12.2011 в 20:32.
Ответить с цитированием
  #7  
Старый 29.12.2011, 12:07
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Код:
  for i := 0 to 4 do
    byteArray[i] := i * 5;
Здесь у тебя по 0-му смещению наименьшее значение
Код:
   byteArray[0] := StrToInt(Edit1.Text);
   byteArray[1] := StrToInt(Edit2.Text);
   byteArray[2] := StrToInt(Edit3.Text);
   byteArray[3] := StrToInt(Edit4.Text);
   byteArray[4] := StrToInt(Edit5.Text);
а здесь уже идёт ввод из Edit-ов, массив перезаписывается. И по 0-му смещению уже нет гарантировано наименьшего значения (что там в Edit-ах введено)
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
TheVenom (30.12.2011)
  #8  
Старый 29.12.2011, 12:11
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
По умолчанию

Допустим, min1 = byteArray[0] , тогда мне нужно в конце цикла удалить byteArray[0] из массива и икать следующий наименьший элемент до тех тор пока z1 не станет =0, т.е. "until (z1=0);". Как мне лучше это сделать?
Ответить с цитированием
  #9  
Старый 29.12.2011, 12:53
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
Стрелка

Цитата:
Сообщение от Страдалецъ
...из последовательности исключите элемент определенный как меньший, прежде чем искать вторично...
Именно так и нужно!!!
Ответить с цитированием
  #10  
Старый 29.12.2011, 20:26
U.B.M. U.B.M. вне форума
Новичок
 
Регистрация: 06.10.2011
Сообщения: 94
Версия Delphi: Delphi 7
Репутация: 13
По умолчанию

Как вариант - находишь наименьший элемент, сделал с ним всё что нужно, присвоил ему значение наибольшего элемента, опять нашел наименьший и т.д.
Ответить с цитированием
  #11  
Старый 29.12.2011, 20:36
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
По умолчанию

Хм... в принципе да, но все же хотелось бы сделать по нормальному)))
Ответить с цитированием
  #12  
Старый 29.12.2011, 20:51
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
Вопрос

Ну есть у кого какие нибудь варианты???
мне очень срочно надо.
Ответить с цитированием
  #13  
Старый 29.12.2011, 21:03
U.B.M. U.B.M. вне форума
Новичок
 
Регистрация: 06.10.2011
Сообщения: 94
Версия Delphi: Delphi 7
Репутация: 13
По умолчанию

Цитата:
Сообщение от TheVenom
Хм... в принципе да, но все же хотелось бы сделать по нормальному)))

Цитата:
Сообщение от TheVenom
мне очень срочно надо

Сам себе противоречишь Срочно по-нормальному не бывает)
Ответить с цитированием
  #14  
Старый 29.12.2011, 21:05
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
По умолчанию

просто я подумал и понял что этот вариант не подойдет(((
Цитата:
Сообщение от U.B.M.
Как вариант - находишь наименьший элемент, сделал с ним всё что нужно, присвоил ему значение наибольшего элемента, опять нашел наименьший и т.д.
Ответить с цитированием
  #15  
Старый 30.12.2011, 09:57
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну вот вам демка с удалением элемента.
Код:
program Project15;

{$APPTYPE CONSOLE} //Указаник компилятору дельфи использовать консоль для вывода

uses
  SysUtils;
// Описание переменных
Var
  Arr: Array of Integer;
  i,Min: Integer;
begin
 // Инициализация массива и заполнение случайными значениями
 SetLength(Arr, 10); 
 for i := 0 to Length(Arr) - 1
 do Arr[i] := Random(100) + 1;
 // Организация цикла для последовательного вывода значений массива на консоль, поиска минимального и вывода его на консоль с последующим удалением из массива
 while Length(Arr) > 0
 do begin
    // вывод на консоль значений массива
    for i := 0 to Length(Arr) - 1
    do Write(Arr[i]:5);
    WriteLn;

    // Поиск индекса элемента с минимальным значением
    Min := 0;
    for i := 1 to Length(Arr) - 1
    do if Arr[i] < Arr[Min]
       then Min := i;
    // Вывод на консоль найденного элемента с минимальным значением
    WriteLn(Arr[Min]:5);
    // Сдвиг значений массива влево засчет замены найденного минимального
    for i := Min to Length(Arr) - 2
    do Arr[i] := Arr[i + 1];
    // Укорачивание массива засчет освободившегося значения в результате сдвига
    SetLength(Arr, Length(Arr) - 1);
    end;
 ReadLn;
end.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 30.12.2011 в 17:01.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:20.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter