Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2010, 17:58   #1
boss89
Пользователь
 
Регистрация: 18.10.2010
Сообщений: 15
По умолчанию

Здраствуйте.
Есть код программы но написан в паскале,переписал пару строк чтобы работал в делфи.
Скажите правильно переписал? и есть ли ошибки в коде??
И если не сложно укажите на них.

в паскале:

Код:

Код:
var
 i,N,T : integer;
 Pt,C1,C2 : Real;

function Zatrati ( t : Integer ) : Real;
begin
if t = 0 then begin Zatrati := 0; Exit; end;
Zatrati := N * ( C1*Pt*(t) + C2 ) / T;
end;

begin
//readln(N,Pt,C1,C2,T);
N := 100;
Pt := 0.1;
C1 := 10;
C2 := 50;
T := 100;
for i := 1 to T-1 do
 begin
 writeln ( Zatrati(i) );
 if ( Zatrati(i)<Zatrati(i+1) ) and ( Zatrati(i)< Zatrati(i-1) ) then
  begin
  writeln ('Искомый период найден : ', i); Exit;
  end;
 end;
writeln ('Критерий оптимальности не выполняется на заданном числе периодов T');
end.
В делфи:

Код:
var
 i,N,T : integer;
 Pt,C1,C2,rez : Real;

function Zatrati ( t : Integer ) : Real;
begin
if t = 0 then begin Zatrati := 0; Exit; end;
Zatrati := N * ( C1*Pt*(t) + C2 ) / T;
end;

begin
N := 100;
Pt := 0.1;
C1 := 10;
C2 := 50;
T := 100;
for i := 1 to T-1 do
 begin
 rez:=( Zatrati(i) );
 if ( Zatrati(i)<Zatrati(i+1) ) and ( Zatrati(i)< Zatrati(i-1) ) then
  begin
  Label1.Caption:= ('Искомый период найден : '+Floattostr(i)); Exit;
  end;
 end;
Label1.Caption:= ('Критерий оптимальности не выполняется на заданном числе периодов T');
end;
end.
P.S.
Вот описание самой проги кому интересно:http://www.programmersforum.ru/showthread.php?t=117627
Может ктонибуть знает почему критерий оптимальности никогда не выполняется!?

Спасибо за внимание.

Народ не проходите мимо ответьте пожалуйста на мои вопросы.

Последний раз редактировалось Stilet; 21.10.2010 в 16:18.
boss89 вне форума Ответить с цитированием
Старый 21.10.2010, 16:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и есть ли ошибки в коде?
Нет не правильно. В Делфи результат функции возвращается через инструкцию Result
Result := N * ( C1*Pt*(t) + C2 ) / T;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.10.2010, 16:20   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Нет не правильно. В Делфи результат функции возвращается через инструкцию Result
Result := N * ( C1*Pt*(t) + C2 ) / T;
Совсем не обязятельно, можно и по имени функции.Вот я, например, никогда не юзаю Result(в паскале привык делать по имени функции, вот и не могу отвыкнуть )
_-Re@l-_ вне форума Ответить с цитированием
Старый 21.10.2010, 16:22   #4
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

Цитата:
Result := N * ( C1*Pt*(t) + C2 ) / T;
вопросов нет, так профессиональнее, но с присваиванием результата имени функции тоже будет работать.
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###
MadReason вне форума Ответить с цитированием
Старый 21.10.2010, 16:56   #5
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,861
По умолчанию

Код:
 rez:=( Zatrati(i) );
 if ( Zatrati(i)<Zatrati(i+1) ) and ( Zatrati(i)< Zatrati(i-1) ) then
Нет, так не делается.
Зачем 5 раз вычислять значение функции от одного и того же аргумента? Ресурсы впустую расходуются.
Примерно так надо переписать:
Код:
var
 i,N,T : integer;
 Pt,C1,C2,rez : Real;
  Next, Pred: Real;

function Zatrati ( t : Integer ) : Real;
begin
if t <> 0 then Result := N * ( C1*Pt*(t) + C2 ) / T
  else Result := 0;
end;

begin
N := 100;
Pt := 0.1;
C1 := 10;
C2 := 50;
T := 100;
Pred := Zatrati(0);
Next := Zatrati(1);
for i := 1 to T-1 do
 begin
 rez:=Next;
 Next := Zatrati(i+1);
 if ( rez<Next ) and ( rez< Pred ) then
  begin
  Label1.Caption:= ('Искомый период найден : '+Floattostr(i)); Exit;
  end;
  Pred := rez;
 end;
Label1.Caption:= ('Критерий оптимальности не выполняется на заданном числе периодов T');
end;
end.
Arigato вне форума Ответить с цитированием
Старый 21.10.2010, 17:32   #6
boss89
Пользователь
 
Регистрация: 18.10.2010
Сообщений: 15
По умолчанию

Спасибо всем за ответы.

Но блин почему етот критерий оптимальности, никогда не выполняется? Когда должен!
Код вроде правильный условия оптимальности тоже соблюдены, а программа не вычисляет(
boss89 вне форума Ответить с цитированием
Старый 24.10.2010, 15:31   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но блин почему етот критерий оптимальности, никогда не выполняется?
А задача то какая? У тебя код
Цитата:
Label1.Caption:= ('Критерий оптимальности не выполняется на заданном числе периодов T');
Будет выполнен всегда. хотя бы потому что он не отсекается никакими условиями...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.10.2010, 15:49   #8
boss89
Пользователь
 
Регистрация: 18.10.2010
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
У тебя код
Будет выполнен всегда. хотя бы потому что он не отсекается никакими условиями...

var
i,N,T : integer;
Pt,C1,C2,rez : Real;
Next, Pred: Real;

function Zatrati ( t : Integer ) : Real;
begin
if t <> 0 then Result := N * ( C1*Pt*(t) + C2 ) / T
else Result := 0;
end;

begin
N := 100;
Pt := 0.1;
C1 := 10;
C2 := 50;
T := 100;
Pred := Zatrati(0);
Next := Zatrati(1);
for i := 1 to T-1 do
begin
rez:=Next;
Next := Zatrati(i+1);
if ( rez<Next ) and ( rez< Pred ) then
begin
Label1.Caption:= ('Искомый период найден : '+Floattostr(i)); Exit;
end;
Pred := rez;
end
else
Label1.Caption:= ('Критерий оптимальности не выполняется на заданном числе периодов T');
end;
end.

Исправил, но критерий выполнятся всёравно не хочет.
boss89 вне форума Ответить с цитированием
Старый 24.10.2010, 16:07   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,861
По умолчанию

А к чему этот else относится, к циклу for что ли?
Приведите для начала код в порядок, что бы были нормально выставлены отступы. Разбираться в коде, написанном таким образом, я даже не хочу.
Arigato вне форума Ответить с цитированием
Старый 26.10.2010, 03:43   #10
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

сорцы
вероятности поломки компов.zip



Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,math;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  N,T : integer;
  Pt,C1,C2,rez : Real;
  Nextz, Predz: Real;

implementation

{$R *.dfm}

function Zatrati ( t : Integer ) : Real;
begin
  if t <> 0 then Result := N * ( C1*Pt*Min(random(3),random(3)) + C2 ) / T
  //формула была неверной
  //случайная величина-количество компов сломавшихся в этот момент
  //должна задаваться не так правда, а через биноминальное распределение,
  //так возрастет итоговый номер найди как реализуется или попроси кого нибудь
  //для реалистичности стоит Min(random(3),random(3))
  else Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:word;
begin
randomize;
memo1.Clear;
N := 100;//количество компов
Pt := 1/n;//вероятность поломки одного(равновероятны)
C2 := 100;//стоимость профилактики
C1 := 1000;//стоимость ремонта
T := 20;//временной промежуток
{Pred := Zatrati(0);}// смысл вызова функции если даст 0 все равно
Predz:=0;
Nextz := Zatrati(1);
Label1.Caption:= ('Критерий оптимальности не выполняется на заданном числе ' +
  'периодов T');
for i := 2 to T do
  begin
    rez:=Nextz;
    memo1.Lines.Add(inttostr(i-1)+':   '+FloatToStr(rez));
    Nextz := Zatrati(i);
    if ( rez<Nextz ) and ( rez< Predz ) then
      begin
        Label1.Caption:= ('Искомый период найден : '+inttostr(i-1));
        memo1.Lines.Add(inttostr(i)+':   '+FloatToStr(nextz));
        Exit;
      end;
    Predz := rez;
  end;
end;

end.
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###
MadReason вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На чем написана программа Владимир-N Софт 5 06.06.2010 23:27
Правильно ли написана программа в С Денис999 Помощь студентам 1 30.05.2010 17:21
[delphi] лаба1: написана программа. л2 реализовать случайное изменение величины дисперсией. подскажите бедный_студент Помощь студентам 4 16.12.2009 18:03
Правильно ли написана програма (с++) ? Alex1991 Помощь студентам 1 28.03.2009 15:52
Посмотрите пожалуйста правильно ли написана программа,если нет укажите ошибку. Викулька Помощь студентам 1 10.12.2007 22:49