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

Delphi Sources



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

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

Исходник работает так:
-В поле Edit1 вводится произвольное целое число;
-В поле Edit2 вводятся произвольное множество целых чисел через запятую;
-При нажатии на кнопку Button1 в поле Memo1 выводится сумма целых чисел из ряда Edit2 максимально приблеженных к числу введеного в поле Edit2.

Задача
Необходимо переделать под поиск оптимальной суммы вещественных чисел с наименьшей погрешностью, хотябы до 4 знака после запятой?
Помогите решить эту задачу. Заранее спасибо.

Код:
procedure TForm1.Button1Click(Sender: TObject);
VAR
    I, J    :   Integer;
    N, V    :   Cardinal;
    S, Sm   :   AnsiString;
    MaxS    :   Cardinal;
    Variants:   TStringList;
    Current :   Cardinal;
    Original    :   Integer;
    Mas         :   ARRAY OF Integer;
begin
    Memo1.Clear;
    Memo1.Lines.Add('Собираем число: '+Edit1.Text);
    S:= Edit2.Text;
    N:= 1;
    FOR I:= 1 TO Length(S) DO
        IF S[i] = ',' THEN
            Inc(N);
    SetLength(Mas, N);
    N:= 0;
    Memo1.Lines.Add('Из чисел: '+Edit1.Text);
    REPEAT
        I:= Pos(',', S);
        IF I = 0 THEN
            Mas[N]:= StrToInt(S)
        ELSE Begin
            Mas[N]:= StrToInt(Copy(S, 1, I-1));
            S:= Copy(S, I+1,Length(S));
        End;
        Memo1.Lines.Add(IntToStr(Mas[N]));
        Inc(N);
    UNTIL I = 0;
    FOR I:= 0 TO N-1 DO Begin
        V:= I;
        FOR J:= I+1 TO N-1 DO Begin
            IF Mas[J] < Mas[V] THEN
                V:= J;
        End;
        J:= Mas[i];
        Mas[i]:= Mas[V];
        Mas[V]:= J;
    End;
    Memo1.Lines.Add('------------');
    Original:= StrToInt(Edit1.Text);
    FOR I:= 0 TO N-1 DO Begin
        IF Mas[i] > Original THEN Begin
            N:= I;
            break;
        End;
        Memo1.Lines.Add(IntToStr(Mas[i]));
    End;
    Mas:= Copy(Mas, 0, N);
    Memo1.Lines.Add('------------');
    Current:= 0;
    MaxS:= (1 shl N)-1;
    Variants:= TStringList.Create;
    Variants.AddObject('0', TObject(0));
    REPEAT
        Inc(Current);
        J:= 0;
        Sm:= '';
        V:= 1;
        FOR I:= 0 TO N-1 DO Begin
            IF (Current and V) > 0 THEN Begin
                J:= J+Mas[i];
                Sm:= Sm+IntToStr(Mas[i])+' + ';
            End;
            V:= V shl 1;
        End;
        Sm[Length(Sm)-1]:= '=';
        Sm:= Sm+IntToStr(J);
        IF Integer(Variants.Objects[0]) = J THEN
            Variants.AddObject(Sm, TObject(J))
        ELSE IF (J > Integer(Variants.Objects[0])) AND (J <= Original) THEN Begin
            Variants.Clear;
            Variants.AddObject(Sm, TObject(J))
        End;
    UNTIL Current = MaxS;
    Memo1.Lines.AddStrings(Variants);
end;

Последний раз редактировалось lmikle, 04.11.2011 в 02:25.
Ответить с цитированием
 


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter