Показать сообщение отдельно
  #4  
Старый 29.04.2010, 21:06
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Примерно так:
Код:
type
  TDistrib = (PROP,FIRST,LAST);
  TSumCollect = array of single;
function Distrib(aType:TDistrib;Sum:Single;aCollection:TSumCollect):TSumCollect;
var
  i:integer;
  AllSumm:single;
begin
  SetLength(Result,Length(aCollection));
  FillChar(Result,SizeOf(Single)*Length(Result),#0);
  case aType of
    FIRST:
      begin
        i:=Low(aCollection);
        While (Sum>0) and (i<High(aCollection)) do
          if Sum>aCollection[i] then
            begin
              Result[i]:=aCollection[i];
              Sum:=Sum-aCollection[i];
              inc(i)
            end
          else
            begin
              Result[i]:=Sum;
              Sum:=0;
            end;
      end;
    LAST:
      begin
        i:=High(aCollection);
        While (Sum>0) and (i>Low(aCollection)) do
          if Sum>aCollection[i] then
            begin
              Result[i]:=aCollection[i];
              Sum:=Sum-aCollection[i];
              dec(i)
            end
          else
            begin
              Result[i]:=Sum;
              Sum:=0;
            end;
      end;
    PROP:
      begin
        AllSumm:=0;
        for i:=Low(aCollection) to High(aCollection) do
          AllSumm:=aCollection[i]+AllSumm;
        for i:=Low(aCollection) to High(aCollection) do
          Result[i]:=Sum*(aCollection[i]/AllSumm);
      end;
  end; {of case}
end;

В работе не проверял, вроде компилится Не уверен я в выделенных сравнениях, "плавающие" так не сравниваются. Но т.к. уже час ночи а завтра на работу - дорабатывайте сами
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием