![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Мне задали курсач на тему "Определение опорного плана транспортной задачи методом дифференцированных рент" и мне нужно написать программу для вычисления таких задач.
В процессе написания программы, я столкнулся с проблемой... в общем у меня есть одномерный массив состоящий из 5 элементов. В идеале в массиве нужно найти наименьший по значению элемент, записать его значение в другую переменную и искать следующий наименьший элемент тем же способом(цикл).И этот цикл заканчивается тогда когда переменная z1=0. Я нашел в массиве и записал ПЕРВЫЙ наименьший элемент, а все последующие... что бы я не делал, ничего не получается. Программа либо зацикливается, либо вообще ниче не работает... Подскажите как лучше сделать, очень надо... Последний раз редактировалось TheVenom, 29.12.2011 в 21:03. Причина: Очень срочно: |
|
#2
|
||||
|
||||
|
Ваш код приведите, пожалуйста.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
TheVenom (30.12.2011)
| ||
|
#3
|
|||
|
|||
|
Если надо удалить элемент, то тут такой вопрос - а какой массив у вас, статический или динамический. Подготовительные работы одинаковые, т.е. надо все элементы после удаляемого сдвинуть на 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
|
||||
|
||||
|
Либо я чего-то непонимаю, либо вы не так объясняете. Наименьший элемент ищется элементарно:
Код:
Min := Arr[1]; for i := 2 to N do if Arr[i] < Min then Min := Arr[i]; Но зачем вообще так делать, если можно просто отсортировать массив по убыванию и все. |
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
TheVenom (30.12.2011)
| ||
|
#5
|
|||
|
|||
|
или отсортировать и выбирать по порядку
|
|
#6
|
|||
|
|||
|
проблема состоит не в том чтобы найти наименьший элемент, а в том чтобы найти "следующий" наименьший элемент. У меня была идея сделать это с помощью цикла, так чтобы в конце цикла массив сокращался(т.е. наименьший элемент удалялся), но в этом случае программа по каким то причинам зацикливается, выводит ошибку или вообще выводит какие то левые цифры непонятно откуда. Вот мой код посмотрите, что с ним можно сделать...
Код:
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
|
||||
|
||||
|
Код:
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); |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
TheVenom (30.12.2011)
| ||
|
#8
|
|||
|
|||
|
Допустим, min1 = byteArray[0] , тогда мне нужно в конце цикла удалить byteArray[0] из массива и икать следующий наименьший элемент до тех тор пока z1 не станет =0, т.е. "until (z1=0);". Как мне лучше это сделать?
|
|
#9
|
|||
|
|||
|
Цитата:
|
|
#10
|
|||
|
|||
|
Как вариант - находишь наименьший элемент, сделал с ним всё что нужно, присвоил ему значение наибольшего элемента, опять нашел наименьший и т.д.
|
|
#11
|
|||
|
|||
|
Хм... в принципе да, но все же хотелось бы сделать по нормальному)))
|
|
#12
|
|||
|
|||
|
Ну есть у кого какие нибудь варианты???
мне очень срочно надо. |
|
#13
|
|||
|
|||
|
Цитата:
Цитата:
Сам себе противоречишь Срочно по-нормальному не бывает) |
|
#14
|
|||
|
|||
|
просто я подумал и понял что этот вариант не подойдет(((
Цитата:
|
|
#15
|
||||
|
||||
|
Ну вот вам демка с удалением элемента.
Код:
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. |
![]() |
|
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|
|