Форум: "Начинающим";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];
ВнизПарамерт функции Найти похожие ветки
← →
Kaer © (2008-06-20 22:36) [0]Имеется 2 вот такие функции
function Maximum(const Items:array of integer):integer;
var j:integer;
begin
if length(Items) = 0 then exit;
result:=Low(Items);
for j:=Low(Items) to High(Items) do
if result<Items[j] then result:=Items[j];
end;
function W(index,count: integer): integer;
begin
if index=0 then exit;
case count of
0: w:=Maximum([ar[index,count]+w(index-1,count)]);
1: w:=Maximum([ar[index,count]+w(index-1,count-1),ar[index,count-1]+w(index-1,count)]);
2: w:=Maximum([ar[index,count]+w(index-1,count-2),ar[index,count-1]+w(index-1,count-1),ar[index,count-2]+w(index-1,count)]);
3: w:=Maximum([ar[index,count]+w(index-1,count-3),ar[index,count-1]+w(index-1,count-2),ar[index,count-2]+w(index-1,count-1),ar[index,count-3]+w(index-1,count)]);
4: w:=Maximum([ar[index,count]+w(index-1,count-4),ar[index,count-1]+w(index-1,count-3),ar[index,count-2]+w(index-1,count-2),ar[index,count-3]+w(index-1,count-1),ar[index,count-4]+w(index-1,count)]);
end;
end;
В функции Максимум находится большее число, мне так и надо, но вот как сделать так чтобы я мог определить не только значение этого числа, а еще сам параметр который его определяет?
например строка2: w:=Maximum([ar[index,count]+w(index-1,count-2),ar[index,count-1]+w(index-1,count-1),ar[index,count-2]+w(index-1,count)]);
допустим жирным выделино максимально значение, как узнать что это не допустим 150, а значения index и count?
← →
grisme (2008-06-20 22:45) [1]иврит? O__o
← →
Игорь Шевченко © (2008-06-20 23:04) [2]
> case count of
я с ужасом думаю, что будет, если count будет от 0 до 15
← →
Palladin © (2008-06-20 23:16) [3]
>if length(Items) = 0 then exit
это как это эксит? то бишь результат функции мы всевышнему назначить позволим?
в принципе, если ты конечно последовал моему совету заняться изысканием открытых массивов, то должен был бы уже уяснить, что нижний индекс у них всегда 0, а цикл строжайше рекомендуется строить до Length()-1
но, судя по всему, изысканиями ты не озадачился...
телепатор тут подсказывает, что тебе необходимо и достаточно найти индекс максимального элемента в массиве... вот его и возвращай своей функцией
← →
Игорь Шевченко © (2008-06-20 23:20) [4]
> если ты конечно последовал моему совету заняться изысканием
> открытых массивов, то должен был бы уже уяснить, что нижний
> индекс у них всегда 0, а цикл строжайше рекомендуется строить
> до Length()-1
Хорошо, что я вовремя услышал, а то тоже, как дурак, строил циклы от Low до High.
Пойду срочно переделывать, раз такая строгость в рекомендации.
← →
Anatoly Podgoretsky © (2008-06-20 23:22) [5]> Игорь Шевченко (20.06.2008 23:04:02) [2]
Ну не страшно, ты подумай лучше о том, что селектор ограничен 2 миллиардами, вот что страшно.
← →
Palladin © (2008-06-20 23:42) [6]
>Игорь Шевченко © (20.06.08 23:20) [4]
хем, спокойно :) дарую тебе вольность обращаться хоть по -4 напрямую, свет с тобой :)
вот только... давно ли ты писал
Procedure hh(const a:array of integer);
Var
c:int64;
...
c:=high(a);
и почувствовал ли ты разницу в значениях при
c:=length(a)-1
:)
← →
Игорь Шевченко © (2008-06-20 23:56) [7]Palladin © (20.06.08 23:42) [6]
function High1 (const A: array of Integer): Integer;
var
C: Int64;
begin
C := Length(A) - 1;
Result := A[C];
end;
function High2 (const A: array of Integer): Integer;
var
C: Int64;
begin
C := High(A);
Result := A[C];
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessageFmt ("%d vs %d", [High1([1,2,3,4]), High2([1,2,3,4])]);
end;
4 vs 4
Я где-то ошибся ?
← →
Palladin © (2008-06-21 00:06) [8]во первых не приводить int64 к integer, а сделать ShowMessage(IntToStr()) например, ну или просто посмотреть значение переменной c в отладчике при F7, во вторых передать пустой массив [] и в ту и в ту процедуру... тут то все и всплывет, по крайней мере в д6
буду рад если сообщишь результаты для своей версии делфи )
← →
Игорь Шевченко © (2008-06-21 00:30) [9]function High1 (const A: array of Integer): Integer;
var
C: Int64;
begin
C := Length(A) - 1;
ShowMessage (IntToStr(C));
Result := 0;
end;
function High2 (const A: array of Integer): Integer;
var
C: Int64;
begin
C := High(A);
ShowMessage (IntToStr(C));
Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessageFmt ("%d vs %d", [High1([1,2,3,4]), High2([1,2,3,4])]);
ShowMessageFmt ("%d vs %d", [High1([]), High2([])]);
end;
При пустом массиве High1 выдает -1 (Length([])-1), High2 выдает 4294967295
Turbo Delphi 2006.
Я все-таки полагаю это слишком уж граничным условием, чтобы были такие строгости в циклах от 0 до Length(Foo)-1 вместо от Low(Foo) до High(Foo)
кроме того мне трудно использовать Int64 в качестве индекса массива, это, наверное, врожденное...
← →
Palladin © (2008-06-21 00:46) [10]да, согласен, конечно. случай довольно не частый. посетила меня, просто, однажды мысль сэкономить на локальных переменных в одном часто вызываемом методе... в итоге: около 2ух часов поиска плавающего AV и твердого убеждения, что High никогда больше не применю к массивам...
← →
Германн © (2008-06-21 01:12) [11]Дискуссия Тимура с Игорем с комментарием Анатолия интересна. А остальное - туман.
> допустим жирным выделино максимально значение, как узнать
> что это не допустим 150, а значения index и count?
Трудно понять объяснение на пальцах выданное на форуме.
← →
Leonid Troyanovsky © (2008-06-21 11:12) [12]
> Kaer © (20.06.08 22:36)
> В функции Максимум находится большее число, мне так и надо,
> но вот как сделать так чтобы я мог определить не только
> значение этого числа, а еще сам параметр который его определяет?
function Maximum(const Items:array of integer; var ItemIndex):integer;
..
ItemIndex := j;
--
Regards, LVT.
← →
Kaer © (2008-06-21 13:22) [13]
> Германн ©
хотите я тут приведу главу с теорией и примером расчета, я правда не уверен ведь это математика а тут форум о делфи, вдруг меня забанят :-)
← →
Kaer © (2008-06-21 13:27) [14]
> Игорь Шевченко ©
А что не так? от 0 до 15 нельзя чтоли в case делать? объясните пожалуста а то мне непонятно
> Palladin © (20.06.08 23:16) [3]
> >if length(Items) = 0 then exitэто как это эксит? то бишь
> результат функции мы всевышнему назначить позволим?
странно а у меня почемуто все работает, и расчитывает правильно как надо, без ошибок
← →
Kaer © (2008-06-21 13:28) [15]
> Leonid Troyanovsky ©
> Regards, LVT.
А что это? :-)
← →
Kaer © (2008-06-21 13:31) [16]Модераторы, можно я я тут опубликую главу книги, для удобства понимания задачи которая мне трубуется?
← →
Kaer © (2008-06-22 09:46) [17]Вобщем молчание знак согласия.
Глава книги:
http://slil.ru/25919030
Код программы:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
i,j: integer;
ar: array[1..4,0..4] of integer; //Таблица
//Функция перевода символов из ANSI в ASCII
function Rus(mes: string):string;
var
t: integer;
begin
for t:=1 to length(mes) do
case mes[t] of
"A".."п" : mes[t] := Chr(Ord(mes[t]) - 64);
"р".."я" : mes[t] := Chr(Ord(mes[t]) - 16);
end;
Rus := mes;
end;
//Функция возвращающая максимум из входных параметров
function Maximum(const Items:array of integer):integer;
var j:integer;
begin
if length(Items) = 0 then exit;
result:=Low(Items);
for j:=Low(Items) to High(Items) do
if result<Items[j] then result:=Items[j];
end;
//Основная функция расчета
function W(index,count: integer): integer;
begin
if index=0 then exit;
case count of
0: w:=Maximum([ar[index,count]+w(index-1,count)]);
1: w:=Maximum([ar[index,count]+w(index-1,count-1),ar[index,count-1]+w(index-1,count)]);
2: w:=Maximum([ar[index,count]+w(index-1,count-2),ar[index,count-1]+w(index-1,count-1),ar[index,count-2]+w(index-1,count)]);
3: w:=Maximum([ar[index,count]+w(index-1,count-3),ar[index,count-1]+w(index-1,count-2),ar[index,count-2]+w(index-1,count-1),ar[index,count-3]+w(index-1,count)]);
4: w:=Maximum([ar[index,count]+w(index-1,count-4),ar[index,count-1]+w(index-1,count-3),ar[index,count-2]+w(index-1,count-2),ar[index,count-3]+w(index-1,count-1),ar[index,count-4]+w(index-1,count)]);
end;
end;
begin
writeln(Rus("Задача о вложении средств"));
//Присвоение массиву значений таблицы
ar[1,0]:=0; ar[2,0]:=0; ar[3,0]:=0; ar[4,0]:=0;
ar[1,1]:=40; ar[2,1]:=50; ar[3,1]:=30; ar[4,1]:=60;
ar[1,2]:=50; ar[2,2]:=70; ar[3,2]:=55; ar[4,2]:=75;
ar[1,3]:=65; ar[2,3]:=85; ar[3,3]:=70; ar[4,3]:=95;
ar[1,4]:=75; ar[2,4]:=95; ar[3,4]:=95; ar[4,4]:=110;
//Вывод
for j:=1 to 4 do
begin
writeln;
for i:=0 to 4 do
begin
write("Max W");
write(j);
write("(");
write(i*100);
write(") = ");
writeln(W(j,i));
end;
end;
writeln;
for i:=4 downto 1 do
begin
write(Rus("Отрасль "));
write(i);
writeln(" = 100");
end;
writeln;
write(Rus("Для завершения нажмите "));
write("<Enter>...");
readln;
end.
Как видно из кода программа будет правильно рассчитывать W. но вот как сделать чтобы она еще и правильно расчитывала вложения в отрасли, я хоть убейте не могу сообразить. у мено щас тупо выводит что все по 100.
← →
Slym © (2008-06-23 06:50) [18]а смысл?
0: w:=Maximum([ar[index,count]+w(index-1,count)]);
1: w:=Maximum([ar[index,count]+w(index-1,count-1)...
2: w:=Maximum([ar[index,count]+w(index-1,count-2)...
не проще 0?
← →
Slym © (2008-06-23 07:22) [19]:)
function W(index,count: integer): integer;
var
i:integer;
Items:array of integer;
begin
if index=0 then exit;
SetLength(Items,count+1);
for i:=Low(Items) to High(Items) do
Items[i]:=ar[index,count-i]+W(index-1,i);
result:=Maximum(Items);
end;
← →
Kaer © (2008-06-24 13:11) [20]
> Slym ©
а мы не ищем легких путей :-)
← →
Slym © (2008-06-24 13:27) [21]Kaer © (24.06.08 13:11) [20]
а мы не ищем легких путей :-)
8(представил путь при увеличении размерности входных данных...
← →
Kaer © (2008-06-24 13:57) [22]
> Slym ©
спасибо канешно, но к сожалению это не решает моей проблемы :-(
← →
Slym © (2008-06-24 14:23) [23]Kaer © (24.06.08 13:57) [22]
спасибо канешно, но к сожалению это не решает моей проблемы :-(
дак тебе алгоритм нужен? я то ошибки в коде правил :)
← →
Галинка (2008-06-24 14:25) [24]а передавать еще один параметр в функцию, в который и писать индекс (на сколько я поняла именно индекс максимального нужен) додуматься сложно?
Вам известнаprocedure val(string, int, int)
? Так там так и поступают. Все параметры передаются функции: из какой переменной конвертить, в какую результат записать, и код ошибки вернуть, если таковая случилась.
← →
Галинка (2008-06-24 14:28) [25]т.е. твой прототип может быть таким
procedure Maximum(const Items:array of integer, IndOfMax: integer, MaxItem: integer);
← →
Kaer © (2008-06-24 16:25) [26]щас постораюсь объеснить :-)
программа для расчета межотраслевого балланса, тоесть есть 4 гипотетические отрасли, между которыме нужно распеределить 400 у.е., в каждую можно вложить 100, 200, 300, 400 или 0(тоесть вообще не вкладывать), но сумма этих вложений не должан превыщать 400.
вот эта таблица
> //Присвоение массиву значений таблицы ar[1,0]:=0; ar[2,
> 0]:=0; ar[3,0]:=0; ar[4,0]:=0; ar[1,1]:=40; ar[2,1]:
> =50; ar[3,1]:=30; ar[4,1]:=60; ar[1,2]:=50; ar[2,2]:
> =70; ar[3,2]:=55; ar[4,2]:=75; ar[1,3]:=65; ar[2,3]:
> =85; ar[3,3]:=70; ar[4,3]:=95; ar[1,4]:=75; ar[2,4]:
> =95; ar[3,4]:=95; ar[4,4]:=110;
первый параметр это номер отрасли, второй колличство вложений(1=100, 2=200, и тд). а после равно это прибыль этой отрасли(первый параметр!) после вложения в неё средаст(второй параметр).
Например если в первую отрасль вложить 100 то прибыль будет 40 едениц, а если 400 то прибыль будет всего 65. (как видите она увеличится всего в 1.8 раза, и не окупается, значит имеет смысл вложить в неё 100, а осталные 300 распределить между другими 3 отраслями.
вот тут
> writeln; for i:=4 downto 1 do begin write(Rus("Отрасль
> ")); write(i); writeln(" = 100"); end;
я вывожу что оптимальный баланс будет если между отраслями распределить по 100, но это потому что я знаю ответ :-). Вот как раз как добиться того чтобы прога сама это додумывалась вот что мне нужно.
← →
Leonid Troyanovsky © (2008-06-24 16:33) [27]
> Галинка (24.06.08 14:28) [25]
> procedure Maximum(const Items:array of integer, IndOfMax:
> integer, MaxItem: integer);
From [12]:
> function Maximum(const Items:array of integer; var ItemIndex):
> integer;
> ..
> ItemIndex := j;
Но, нас игнорируют (марш лилипутов).
--
Regards, LVT.
← →
Галинка (2008-06-24 17:16) [28]это наверное надо алгоритм сначала правильный. Тогда он правильно в код перевется.
← →
Kaer © (2008-06-24 17:59) [29]
> Галинка
> Вам известна procedure val(string, int, int)
к сожалению не известна
> Leonid Troyanovsky
честно говоря, я не поял, пожалуста объесните мне
← →
Галинка (2008-06-24 18:11) [30]я только хотела сказать, что если нужно вернуть несколько результатов, то самый простой способ, это передать функции параметр, в который этот результат должен быть сохранен.
← →
Leonid Troyanovsky © (2008-06-24 21:42) [31]
> Kaer © (24.06.08 17:59) [29]
> честно говоря, я не поял, пожалуста объесните мне
Дык, напряги мыслительную мышцу.
По крайней мере, попытайся.
--
Regards, LVT.
← →
Kaer © (2008-06-25 17:46) [32]
> Leonid Troyanovsky
я пытался, я не понимаю, завтра нада чтобы программа к курсовой была готова, если вы можете мне помоч то пожалуста помогите, было бы очень здорово если бы вы написали код или просто дали толковое объяснение, пожалуста
← →
Anatoly Podgoretsky © (2008-06-25 17:58) [33]> Kaer (25.06.2008 17:46:32) [32]
Ну пора сухари и носки готовить.
← →
Игорь Шевченко © (2008-06-25 17:59) [34]
> завтра нада чтобы программа к курсовой была готова
пиши, в чем проблема ?
> было бы очень здорово если бы вы написали код
Видишь ли, Леониду курсовую не надо сдавать
← →
Германн © (2008-06-25 18:01) [35]
> Kaer © (25.06.08 17:46) [32]
>
>
http://delphimaster.net/view/15-1214399860/
← →
Kaer © (2008-06-25 18:16) [36]
> Игорь Шевченко
я вот тут описал [26]
← →
Игорь Шевченко © (2008-06-25 21:40) [37]Kaer © (25.06.08 18:16) [36]
> я вот тут описал [26]
да мне тоже не надо курсовую
← →
Kaer © (2008-06-26 09:43) [38]
> Игорь Шевченко
зачем тогда спрашивать в чем проблема, если все рано не хотите помочь? это стеб что ли такой? :-(
← →
Anatoly Podgoretsky © (2008-06-26 10:27) [39]Вот завтра и наступило.
← →
Anatoly Podgoretsky © (2008-06-26 10:28) [40]Вопрос более не актуален, теперь надо идти на форум prizyv.ru
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.07.27;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.009 c