Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод кода С в Дельфи 
:(
    Опции темы
Lemoral
Дата 23.5.2013, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 23.5.2013

Репутация: нет
Всего: нет



Есть код на Си
Код

            int    i = 0;
            double eps = 0.001;
            double    a = 0,
                    b = 0,
                    g = 0,
                    h = 0,
                    y = 0,
                    f[3],
                    x[4] = {1,1,1,1},
                    k[3] = {1,1,1},
                    y1[3],
                    Fmax[4] = {0,0,0,0},
                    MaxF = 0;            
for (i = 2; i >= 0; i--)
            {
                for (y = 0; y < 1; y += eps)
                {
                    f[i] = g*y + h*(1-y) + Fmax[i+1] * (a*y + b*(1-y));
                    if (f[i] > Fmax[i])
                    {
                        Fmax[i] = f[i];
                        y1[i] = y;
                    }
                }
                if (y1[i] == 0)
                {
                    k[i] = b; 
                }
                else 
                {
                    k[i] = a;
                }

                if (Fmax[i] > MaxF ) MaxF = Fmax[i];
for (i=2; i >= 0 ; i--)
            {
                x[i] = k[2-i] * x[i+1];
            }

Его надо перевести в Дельфи. Делаю вот так:
Код

var
  i: integer;
  a, b, y, eps, g, h, MaxF: real;
  f: array[1..3] of real;
  k: array[1..3] of real;
  x: array[1..4] of real;
  y1: array[1..3] of real;
  Fmax: array[1..4] of real;
begin
a := 0.7;
b := 0.8;
g := 0.6;
h := 0.5;
eps := 0.001;
MaxF := 0;
for i := 0 to 4 do x[i] := 10000;
while (i<=2) do
begin
  while (y<1) do
    begin
    f[i] := g*y + h*(1-y) + Fmax[i+1] * (a*y + b*(1-y));
    if (f[i] > Fmax[i]) then
      begin
      Fmax[i] := f[i];
      y1[i] := y;
      end;
    y := y + eps;
    end;
  if (y1[i] = 0) then k[i] := b else k[i] := a;
  if (Fmax[i] > MaxF) then MaxF := Fmax[i];
  x[i] := k[2-i] * x[i+1];
Memo1.Lines.Add(IntToStr(i) + ' ' + FloatToStr(y[i]) + ' ' + FloatToStr(Fmax[i]));
inc(i);

Ничего не выходит. Помогите, пожалуйста! 
PM MAIL   Вверх
Beltar
Дата 23.5.2013, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Начнем с того, что в Си массивы всегда начинаются с нулевого индекса.

Код

for i := 0 to 4 do x[i] := 10000;


1) В коде на Ц инициализация единицами.
2) Как ты смеешь обращаться к 0 элементу, когда массив объвил [1..4]? Кара может быть непредсказуемой и очень суровой.

В Си действительно нет цикла for и существующая конструкция просто вариант записи while, но это не значит, что надо while писать на Паскале.

Я не вдавался в логику, но этого
Код

for (i=2; i >= 0 ; i--)
            {
                x[i] = k[2-i] * x[i+1];
            }


в Паскаль-коде не вижу.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
david_yu
Дата 24.5.2013, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.10.2006

Репутация: нет
Всего: нет



1. Массивы заданы с нулевого индекса, а у тебя нет (пример double f[3] -> f: array [0..2] of Double)
2. x[4] = {1,1,1,1}, а у тебя (x: array[1..4] of real) - а это полдела, а дальше for i := 0 to 4 do x[i] := 10000; Сколько переборов будет? Варианты ответа 4 или 5


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
david_yu
Дата 24.5.2013, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.10.2006

Репутация: нет
Всего: нет



Раннее такое вариант, уже рассматривался

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1690 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.