Ну, формулу действительно надо бы смотреть в физике.
Тут другой вопрос. Как сдизайнить классы.
Если пойти по простому, то тебе нужны всего 2 класса (т.к. испарять пар как-то не имеет смысла). Хотя, только если возвращать тоже класс.
Ну попробуем прикинуть:
Код:
type
TBase = class
protected
function GetE(TT, Ro : Integer) : Integer;
public
m : Integer; // масса
T : Integer; // нач. темп.
function HeatIt : Integer; virtual; abstract;
end;
TFog = class(TBase)
function HeatIt : Integer; override;
end;
TWater = class(TFog)
function HeatIt : Integer; override;
end;
TIce = class(TWater)
function HeatIt : Integer; override;
end;
...
function TBase.GetE(TT, Ro : Integer) : Integer;
begin
// Здесь расчет кол-ва энергии, необходимой для перехода в сл.
// агрегатное состояние. Ro - теплоемкость, TT - температура перехода.
Result := ...;
end;
function TFog.HeatIt : Integer;
begin
// Пар испарить нельзя, он уже пар.
Result := 0;
end;
function TWater.HeatIt : Integer;
begin
Result := inherited + GetE(100,1000); // Ro = 1000 взято с потолка. глянь в справочнике
end;
function TIce.HeatIt : Integer;
begin
Result := inherited + GetE(0,10000); // Ro = 10000 взято с потолка. глянь в справочнике
end;
Примерно как-то так.
Создаешь класс, соответствующий исходному веществу и вызываешь метод HeatIt. Т.е. тебе надо реализовать базовую функцию расчета кол-ва тепла и указать нужные значения Ro во всех остальных.
ЗЫ. Что-то знакомая задача. Кто-то уже ее спрашивал, кажись.