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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2011, 13:22   #1
Varv
 
Регистрация: 19.01.2011
Сообщений: 7
По умолчанию

пару функций и формула с суммой выдает ошибку [Fatal Error] Unit1.pas(97): Internal error: C1118


вот листинг:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btn1: TButton;
    lbl1: TLabel;
    edt1: TEdit;
    lbl2: TLabel;
    edt2: TEdit;
    lbl3: TLabel;
    lbl4: TLabel;
    lbl5: TLabel;
    lbl6: TLabel;
    lbl7: TLabel;
    procedure btn1Click(Sender: TObject);
    procedure edt1KeyPress(Sender: TObject; var Key: Char);
    procedure edt2KeyPress(Sender: TObject; var Key: Char);
  private
    function factorial(N:Real):Real;
    function chislsoch (x, y: Real): Real;
    function engset(A,M,N: Real): Real;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i,N,M:Integer;
  x,y,z,znam,chisl: Real;
implementation

{$R *.dfm}

{ TForm1 }

function TForm1.factorial(N: Real): Real;
begin

  if n = 1 then
  factorial:= 1
 else 
  factorial:= n*factorial(n-1);

end;


function TForm1.chislsoch(x, y: Real): Real;
begin
  chislsoch:= factorial(y)/(factorial(y-x)*factorial(x));
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  if (Edt1.Text='') or (Edt2.Text='') then  lbl1.Caption:=('ââåäèòå çíà÷åíèå')

  else begin
    N:=StrToInt(Edt1.Text);
    M:=StrToInt(Edt2.Text);
        if N>M then lbl1.Caption:=('íå âîçìîæíî,M>N')
     else begin
      Lbl1.Caption:=floattostr(factorial(N));
      Lbl2.Caption:=floattostr(chislsoch(N,M));
       Lbl7.Caption:=floattostr(engset(2,N,M));
           end
    end;
end;


procedure TForm1.edt1KeyPress(Sender: TObject; var Key: Char);
begin
   if not (key in['1'..'9',decimalseparator,#8]) then key:=#0;  //ðàçðåøàåì ââîäèòü òîëüêî ÷èñëà
end;

procedure TForm1.edt2KeyPress(Sender: TObject; var Key: Char);
begin
  if not (key in['2'..'9',decimalseparator,#8]) then key:=#0;  //ðàçðåøàåì ââîäèòü òîëüêî ÷èñëà
end;


function TForm1.engset(A,M,N: Real): Real;
begin

  engset:= (chislsoch(N,M-1)*Power(A,N))/znam;
   znam := 1;
          for z:=1 to N do  begin

         znam:=znam+chislsoch(z,M-1)*Power(A,z);
       end;

end;

end.


ошибка в функции engset

Последний раз редактировалось Stilet; 06.02.2011 в 19:08.
Varv вне форума Ответить с цитированием
Старый 06.02.2011, 13:31   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Ну так не дели на 0, и не будет ошибки )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 06.02.2011, 13:36   #3
Varv
 
Регистрация: 19.01.2011
Сообщений: 7
По умолчанию

так я нигде и не делю вроде как? и он выводит ошибку при компиляции, я еще никакие значения не забиваю...
Varv вне форума Ответить с цитированием
Старый 06.02.2011, 16:26   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
так я нигде и не делю вроде как?
Код:
engset:= (chislsoch(N,M-1)*Power(A,N))/znam;
При первом входе чему будет равевн znam?
p51x вне форума Ответить с цитированием
Старый 06.02.2011, 17:19   #5
Varv
 
Регистрация: 19.01.2011
Сообщений: 7
По умолчанию

так разве не 1?
znam := 1;
если не так то как тогда задать?
Varv вне форума Ответить с цитированием
Старый 06.02.2011, 20:01   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> так разве не 1?

так ты сначал делишь на znam, который равен 0 при входе, т.к. это глобальная переменная, а потом уже ему 1 присваиваешь.

Но это будет потом. А пока у тебя ошибка С1118, сорри, сразу не заметил. Так вот, это скорей всего (но не на 100%) связано с множествами вот тут:

Код:
if not (key in['2'..'9',decimalseparator,#8]) then ....
закомментируй эти строки и попробуй компильнуть. Если не поможет, комментируй всё остальное, пока ошибка не пропадёт.

И, кстати, так с вещественными числами не работают:
Код:
 if n = 1 then
И да, пора уже выбросить тип Real из своих программ на Дельфи. Он был введен Борландом для ускорения работы паскаля на машинах без сопроцессоров в дремучих 80-х годах и оставлен в Дельфи только для совместимости со старым кодом.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 06.02.2011 в 20:05.
veniside вне форума Ответить с цитированием
Старый 07.02.2011, 07:18   #7
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

veniside
И каким типом пользоваться для дробных значений рекомендуете?
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 07.02.2011, 08:07   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Single (4 байта) или Double (8 байт) в зависимости от нужной точности. Если особая точность не нужна (у Single 7-8 значащих цифр, у Double в два раза больше), а память нужно экономить, используйте Single. Иначе Double.

Кстати, по поводу Real я не совсем прав. В какой-то версии Дельфи (может и в первой, не помню, гг ) Real стал синонимом Double, а старый кривой 6-тибайтовый Real из паскаля обозвали Real48. Но по-любому Real лучше не использовать, имхо, просто чтобы не вводить лишние сущности.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расшифровка текста. Michelin Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 10.01.2010 21:19
Расшифровка кода Rid Помощь студентам 14 19.10.2009 21:46
Расшифровка формулы НатальяН Microsoft Office Excel 5 31.07.2008 14:41