Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.011 c
2-1214309144
Alex_C
2008-06-24 16:05
2008.07.27
Вопрос по TMenuItem


2-1214419508
Igor23
2008-06-25 22:45
2008.07.27
CMD+ShellExecute


6-1190791300
botaniQ
2007-09-26 11:21
2008.07.27
POST запрос с помощью ShellExecute...


2-1214480489
lewka-serdceed
2008-06-26 15:41
2008.07.27
Поиск слова в строке


2-1214410294
Анониммм
2008-06-25 20:11
2008.07.27
Как загрузить иконку файла?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский