Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Парамерт функции


Страницы:   1 2 3 4

Kaer ©   (2008-06-20 22:36:00) 

Имеется 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?


Slym   (2008-06-23 07:22:00) [61]

:)
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;


Slym   (2008-06-23 06:50:00) [62]

а смысл?
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?


Kaer   (2008-06-22 09:46:00) [63]

Вобщем молчание знак согласия.
Глава книги:
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.


Kaer   (2008-06-21 13:31:00) [64]

Модераторы, можно я я тут опубликую главу книги, для удобства понимания задачи которая мне трубуется?


Kaer   (2008-06-21 13:28:00) [65]


> Leonid Troyanovsky ©


> Regards, LVT.

А что это? :-)


Kaer   (2008-06-21 13:27:00) [66]


> Игорь Шевченко ©

А что не так? от 0 до 15 нельзя чтоли в case делать? объясните пожалуста а то мне непонятно


> Palladin ©   (20.06.08 23:16) [3]
> >if length(Items) = 0 then exitэто как это эксит? то бишь
> результат функции мы всевышнему назначить позволим?

странно а у меня почемуто все работает, и расчитывает правильно как надо, без ошибок


Kaer   (2008-06-21 13:22:00) [67]


> Германн ©

хотите я тут приведу главу с теорией и примером расчета, я правда не уверен ведь это математика а тут форум о делфи, вдруг меня забанят :-)


Leonid Troyanovsky   (2008-06-21 11:12:00) [68]


> Kaer ©   (20.06.08 22:36)  

> В функции Максимум находится большее число, мне так и надо,
>  но вот как сделать так чтобы я мог определить не только
> значение этого числа, а еще сам параметр который его определяет?

function Maximum(const Items:array of integer; var ItemIndex):integer;
..
ItemIndex := j;

--
Regards, LVT.


Германн   (2008-06-21 01:12:00) [69]

Дискуссия Тимура с Игорем с комментарием Анатолия интересна. А остальное - туман.
> допустим жирным выделино максимально значение, как узнать
> что это не допустим 150, а значения index и count?

Трудно понять объяснение на пальцах выданное на форуме.


Palladin   (2008-06-21 00:46:00) [70]

да, согласен, конечно. случай довольно не частый. посетила меня, просто, однажды мысль сэкономить на локальных переменных в одном часто вызываемом методе... в итоге: около 2ух часов поиска плавающего AV и твердого убеждения, что High никогда больше не применю к массивам...


Игорь Шевченко   (2008-06-21 00:30:00) [71]

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:06:00) [72]

во первых не приводить int64 к integer, а сделать ShowMessage(IntToStr()) например, ну или просто посмотреть значение переменной c в отладчике при F7, во вторых передать пустой массив [] и в ту и в ту процедуру... тут то все и всплывет, по крайней мере в д6

буду рад если сообщишь результаты для своей версии делфи )


Игорь Шевченко   (2008-06-20 23:56:00) [73]

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-20 23:42:00) [74]


>Игорь Шевченко ©   (20.06.08 23:20) [4]

хем, спокойно :) дарую тебе  вольность обращаться хоть по -4 напрямую, свет с тобой :)

вот только... давно ли ты писал

Procedure hh(const a:array of integer);
Var
c:int64;

...
c:=high(a);
и почувствовал ли ты разницу в значениях при

c:=length(a)-1

:)


Anatoly Podgoretsky   (2008-06-20 23:22:00) [75]

> Игорь Шевченко  (20.06.2008 23:04:02)  [2]

Ну не страшно, ты подумай лучше о том, что селектор ограничен 2 миллиардами, вот что страшно.


Игорь Шевченко   (2008-06-20 23:20:00) [76]


> если ты конечно последовал моему совету заняться изысканием
> открытых массивов, то должен был бы уже уяснить, что нижний
> индекс у них всегда 0, а цикл строжайше рекомендуется строить
> до Length()-1


Хорошо, что я вовремя услышал, а то тоже, как дурак, строил циклы от Low до High.
Пойду срочно переделывать, раз такая строгость в рекомендации.


Palladin   (2008-06-20 23:16:00) [77]


>if length(Items) = 0 then exit

это как это эксит? то бишь результат функции мы всевышнему назначить позволим?

в принципе, если ты конечно последовал моему совету заняться изысканием открытых массивов, то должен был бы уже уяснить, что нижний индекс у них всегда 0, а цикл строжайше рекомендуется строить до Length()-1

но, судя по всему, изысканиями ты не озадачился...

телепатор тут подсказывает, что тебе необходимо и достаточно найти индекс максимального элемента в массиве... вот его и возвращай своей функцией


Игорь Шевченко   (2008-06-20 23:04:00) [78]


>  case count of


я с ужасом думаю, что будет, если count будет от 0 до 15


grisme   (2008-06-20 22:45:00) [79]

иврит? O__o


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо