Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.04.2010, 20:08
demda demda вне форума
Прохожий
 
Регистрация: 29.04.2010
Сообщения: 3
Репутация: 10
По умолчанию нужна помощь по делфи

всем доброго вечера, у меня следующая проблема, не кодил на делфе уже года 2, если не больше, а тут очень срочная нужна написать небольшую функцию. Логическое написание простое, это я сделал на другом языке, но надо именно на делфи. Помогите пожалуйста, кто может )
Задание такое:
Код HTML:
Требуется: Необходимо реализовать функцию, выполняющую распределение указанной суммы с учетом типа распределения. Если способ распределения - пропорционально, то распределять сумму пропорционально суммам, остаток от округления добавить к последней сумме, чтобы общая сумма совпала. Если в счет первых, то распределять на всю сумму по порядку. Если в счет последних, то распределять на всю сумму в обратном порядке. В задании использовать округление до копеек. Входные параметры: • Тип распределения – признак: «ПРОП», «ПЕРВ», «ПОСЛ»; • Сумма - дробное число (точность – 2 знака после разделителя), распределяемая сумма; • Суммы - строка, список сумм через «;» в соответствии с которыми распределяется сумма; Выходной параметр: строка, список распределенных сумм через «;». Пример: Вход: Тип распределения - пропорционально (ПРОП) Сумма - 10000 Суммы - 1000;2000;3000;5000;8000;5000 Выход: 416.67;833.33;1250;2083.33;3333.33;2083.34 Вход: Тип распределения - в счет первых (ПЕРВ) Сумма - 10000 Суммы - 1000;2000;3000;5000;8000;5000 Выход: 1000;2000;3000;4000;0;0 Вход: Тип распределения - в счет последних (ПОСЛ) Сумма - 10000 Суммы - 1000;2000;3000;5000;8000;5000 Выход: 0;0;0;0;5000;5000 Требования к решению Возможные языки: любые .NET, Delphi.
логически все легко понимаемо, если один тип ПРОП, то суммируем числа, сумму делим на нужную сумму, получаем коэфицент и каждое число делим на него по отдельности, округляя до 2 знака и апоминая остаток, на 6 числе добваить сумму остатков. Ну и потому же принципу остальные два типа: Вписываем подряд максимально возможноые числа по порядку до тех пор, пока сумма не будет равнятся нужной сумме, и в третьем то же самое, только с конца.
Совсем забыл делфи, очень прошу помощи. Надо очень срочно(
Ответить с цитированием
  #2  
Старый 29.04.2010, 20:23
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

Задача мне понравилась. Берусь за написание) Тринеровки никогда не лишние
__________________
Не твори зла, и жизнь повернется к тебе передом
Ответить с цитированием
  #3  
Старый 29.04.2010, 20:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да тут дельфи нипричем, т.к. в основном сплошная арифметика. На любом языке это будет примерно одинаково.
Ответить с цитированием
  #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;

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

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 29.04.2010, 21:43
demda demda вне форума
Прохожий
 
Регистрация: 29.04.2010
Сообщения: 3
Репутация: 10
По умолчанию

первый код получил, щас буду разбираться в связкам, так сказать что с чем кушать)
Барс, жду еще твоего кода)
Если еще желающие будут написать свой код, буду только рад, лучше сам разберусь и надеюсь вспомню основы делфи )
Ответить с цитированием
  #6  
Старый 29.04.2010, 21:55
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

http://depositfiles.com/files/pjm1yqrod

Вот польностью готовая программа. Только вод в режиме «ПРОП» она хоть и щетает остачю от делений и добовляет к последнему елементу но всё равно в итоге одной копейки не хватает так как остача слишком мала. Если не сможешь сам испраить попросищь я доведу до ума. В программе использовались компоненты пакета Alpha skins
__________________
Не твори зла, и жизнь повернется к тебе передом
Ответить с цитированием
  #7  
Старый 29.04.2010, 22:00
demda demda вне форума
Прохожий
 
Регистрация: 29.04.2010
Сообщения: 3
Репутация: 10
По умолчанию

Спасибо больщушее, щас посмотрю. Думаю с остатком уже разберусь, поскольку это больше логическое доведение системы до "ума"
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:43.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025