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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2017, 16:41   #1
wolf777
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 27
По умолчанию отрицательный массив из за чего?

подскажите что я делаю не правильно? у меня выводит отрицательный массив...

Снимок1.PNG

вот листинг массива

PHP код:
unit frmProizISUnit;

interface
uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsStdCtrlsExtCtrls,MathGrids;

type
  TFrmProizvIS 
= class(TForm)
    
ButtonExeTButton// кнопка выполнить
    
ButtonExitTButton// кнопка выход
    
RadioGroup1TRadioGroup// колонка групп
   // RadioButtonApdex: TRadioButton; // радиокнопка Apdex
    
RadioButtonOPdexTRadioButton// радиокнопка  Opdex
    
StrGridFRTStringGrid// компонент StrGridFR
    
Label7TLabel;
    
ButtonObnTButton// кнопка обновления
    
Label3TLabel;
    
Label6TLabel;
    
EditLTEdit;
    
Label8TLabel;
    
EditKTEdit;
    
Label12TLabel;
    
EditKDTEdit;
    
Label13TLabel;
    
EditKolIntTEdit;
    
EditTintTEdit;
    
ButtonPokazTButton;
    
Label4TLabel;
    
Label5TLabel;
    
EditMoTEdit;
    
EditDispTEdit;
    
Label9TLabel;
    
EditLOTEdit;
    
Label10TLabel;
    
EditKOTEdit;
    
//RadioButtonSTdex: TRadioButton;
    
EditTotkTEdit;
    
StrGridIDTStringGrid;
    
LabelRITLabel;
    
ButtonRasprTButton;
    
LabelRTLabel;
    
procedure ButtonExitClick(SenderTObject);
    
procedure ButtonExeClick(SenderTObject);
    
procedure FormCreate(SenderTObject);
    
procedure ButtonObnClick(SenderTObject);
    
procedure ButtonPokazClick(SenderTObject);
   
//procedure StrGridIDSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string);
    
procedure ButtonRasprClick(SenderTObject);
    
procedure StrGridIDSetEditText(SenderTObjectAColARowInteger; const Valuestring);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
FrmProizvISTFrmProizvIS;
  
masID,srmID,masMT,masTZ,masBZ: array of real;  //integer;
  
masFR,masZM,masGR: array of integer;
  
szmID,szmFR,szmZM,szmGR:integer;
  
Totk,TintFrinteger;
  
RedTxtboolean;
  
nGrafString;

implementation

uses frmApdexUnit
frmOPdexUnitfrmGrafUnitProcUnit;

{
$R *.dfm}

  
procedure formMasID();    // формирование масива исходных данных
     
var
     
i,k,m:integer;
     
Lreal;
 
begin
         szmID
:=StrToInt(FrmProizvIS.EditKD.Text);
         
L:=StrToFloat(FrmProizvIS.EditL.Text);
         
k:=StrToInt(FrmProizvIS.EditK.Text);
            
SetLength(masID,szmID);
         for 
i:=1 to szmID-do
            
begin
             masID
[i]:=round(ProcUnit.Erlang(L,k));
            
end;
      
FrmProizvIS.StrGridID.ColCount:=szmID+1;
      
m:=FrmProizvIS.StrGridID.ColCount;
         for 
i:=0 to m-1  do
           
begin
             FrmProizvIS
.StrGridID.Cells[i+1,0]:=IntToStr(i);
             
FrmProizvIS.StrGridID.Cells[i+1,1]:=FloatToStr(masID[i]);
            
// i:=StrToInt(FrmProizvIS.StrGridID.Cells[i+1,0]);
            // masID[i]:=StrToFloat(FrmProizvIS.StrGridID.Cells[i+1,1]);
 
end;
    
RedTxt:=false;
 
end;

 
procedure funcRaspr();   // формирование массива  функции распределения
     
var
        
i,j,k,n:integer;
        
tekZn,intN,intKreal;
         
KolIntinteger;
        
mo,disp,maxID,minID,Lo,Koreal;
 
begin
   
if RedTxt then     // если masID редактировался
    
begin
     
for i:=1 to szmID-do
     
begin
       masID
[i]:=StrToFloat(FrmProizvIS.StrGridID.Cells[i,1]);  //восстановление отредактированного masID
     
end;
        
RedTxt:=false;
     
end;
         
KolInt:=StrToInt(FrmProizvIS.EditKolInt.Text);
         
Lo:=StrToFloat(FrmProizvIS.EditLO.Text);
         
Ko:=StrToFloat(FrmProizvIS.EditKO.Text);
         
mo:=StrToFloat(FrmProizvIS.EditMo.Text);
         
disp:=StrToFloat(FrmProizvIS.EditDisp.Text);
         
ProcUnit.StsMasID(masID,szmID,mo,disp);
         
ProcUnit.minT(masID,szmID,minID);
         
ProcUnit.maxT(masID,szmID,maxID);
         
TintFr:=round((maxID-minID)/KolInt)+1;
         
FrmProizvIS.EditTint.Text:=IntToStr(TintFr);
      
szmFR:=KolInt;
         
SetLength(masFR,szmFR);
      for 
i:=0 to szmFR-do
        
begin
        intN
:=(i)*TintFr;
        
intK:=(i+1)*TintFr;
      
k:=0;
      for 
j:=0 to szmID-do
            
begin
            tekZn
:=masID[j];
          if (
intN tekZn) And (tekZn <= intKthen
               k
:=k+1;
     
end;
         
masFR[i]:=k;
  
end;
n:=FrmProizvIS.StrGridFR.ColCount;
FrmProizvIS.LabelR.Caption:='Распределение по интервалам Tint= '+IntToStr(TintFr)+' сек';
         for 
i:=0 to n-1  do
           
begin
             FrmProizvIS
.StrGridFR.Cells[i+1,0]:=IntToStr(i);
             
FrmProizvIS.StrGridFR.Cells[i+1,1]:=FloatToStr(masFR[i]);
           
end;
       
//FrmProizvIS.EditMo.Text:=FloatToStr(mo);
       //FrmProizvIS.EditDisp.Text:=FloatToStr(disp);
       //FrmProizvIS.EditLO.Text:=FloatToStr(Lo);
       //FrmProizvIS.EditKO.Text:=FloatToStr(Ko);
     //Lo:=mo/disp;
    // Ko:=Lo*mo;

    
end;

procedure TFrmProizvIS.ButtonObnClick(SenderTObject);
 
begin
  
if (EditL.Text '0') and (EditLO.Text '0') and (EditTotk.Text '0') and
  (
EditK.Text '0') and (EditKO.Text '0') and (EditKD.Text '0') and
  (
EditKolInt.Text '0') and (EditTint.Text '0')and (EditMo.Text '0') and
   (
EditDisp.Text '0'then
      begin
     formMasID
();
     
// funcRaspr();
 
end
  
else
    
ShowMessage('Заполните все поля переменных');
 
end;

procedure TFrmProizvIS.ButtonPokazClick(SenderTObject);
 var
     
i:integer;
 
begin
  
if szmFR >0 then
      begin
         szmGR
:=szmFR;
         
SetLength(masGR,szmGR);
            
masGR[0]:=0;
    for 
i:=1 to szmGR-do
       
masGR[i]:=masFR[i-1];
      
frmGrafUnit.nGraf:='распределения исходных данных';
     
frmGrafUnit.TintGr:=StrToInt(EditTint.Text);
     
frmGrafUnit.FrmGraf.LabelInfo.Caption:='Интервал ='+EditTint.Text+'сек';
     
frmGrafUnit.FrmGraf.Show();
 
end
 
else
    
ShowMessage('Массив функции распределения не определен');
end;

procedure TFrmProizvIS.ButtonRasprClick(SenderTObject);
 
begin
  
if szmID >0 then
 begin
     funcRaspr
();
 
end
 
else
    
ShowMessage('распределение невозможно, для начала сформируйте массив исходных данных ');
end;

procedure TFrmProizvIS.FormCreate(SenderTObject);
begin
      StrGridFR
.Rows[0].Text:='Интервал, с';
      
StrGridFR.Rows[1].Text:='Колич.изм';
            
formMasID();
            
funcRaspr();
end;

procedure TFrmProizvIS.StrGridIDSetEditText(SenderTObjectACol,
  
ARowInteger; const Valuestring);
  
begin
    RedTxt
:=false;
end;

procedure TFrmProizvIS.ButtonExeClick(SenderTObject);
begin
 
//  if RadioButtonApdex.Checked then
   //   begin
   //    FrmApdex.Show();
   //   end ;
 
if RadioButtonOPdex.Checked then
    begin
      FrmOPdex
.Show();
    
end;
   
//  if RadioButtonSTdex.Checked then
  //  begin
   //   FrmSTdex.Show();
   // end;
   
end;

procedure TFrmProizvIS.ButtonExitClick(SenderTObject);
begin
    masFR
:=nil;
    
masID:=nil;
    
masZM:=nil;
      
Close();
end;
end
wolf777 вне форума Ответить с цитированием
Старый 09.04.2017, 16:41   #2
wolf777
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 27
По умолчанию

а вот листинг процедур и функций к массиву

PHP код:
unit ProcUnit;

interface
uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsStdCtrlsExtCtrls,MathGrids;

type
  TProcUnit 
= class(TForm);

    
procedure minT(masID: array of realszmIDinteger; var minreal);
    
procedure maxT(masID: array of realszmIDinteger; var maxreal);
    
procedure StsMasID(masID: array of realszmIDinteger; var modispreal);
    Function 
Factorial (NWord): Longint;
    Function 
Erlang(PrrealKmdinteger): real;


implementation

  uses frmApdexUnit
frmOPdexUnitfrmGrafUnitfrmProizISUnit;

function 
Erlang(PrrealKmdinteger): real;
  var
   
jinteger;
   
x,s,mreal;
 
begin
 Kmd
:= round(StrToFloat(FrmProizvIS.EditK.Text));
 
Pr:=StrToFloat(FrmProizvIS.EditL.Text);
     
randomize;
    
s:=0;
  for 
j:=1 to Kmd do
      
m:=s+random(Kmd); //Если s = 0 и random(k) = 0, то получите деление на 0
    
x:=-1/(Pr)*m;
Erlang:=x;
end;

   
procedure minT(masID: array of realszmIDinteger; var minreal);
  var
   
iinteger;
   
mreal;
   
begin
     m
:=masID[1];
     for 
i:=2 to szmID-do
    if 
masID[i] < m then
      m
:=masID[i];
      
min:=m;
  
end;

  
procedure maxT(masID: array of real;szmID:integer;var maxreal);
   var
   
iinteger;
   
mreal ;
   
begin
     m
:=masID[1];
     for 
i:=2 to szmID-do
    if 
masID[i] > m then
      m
:=masID[i];
      
max:=m;
     
end;

  
procedure StsMasID(masID: array of real;szmID:integer;
  var 
mo,dispreal);
   var
   
iinteger;
   
sumreal;
   
begin
   szmID
:=StrToInt(FrmProizvIS.EditKD.Text);
     
sum:=0;
     for 
i:=0 to szmID-do
        
sum:=sum+masID[i];
      
mo:=sum/szmID;
      
sum:=0;
     for 
i:=0 to szmID-do
        
sum:=sum+(masID[i]-mo)*(masID[i]-mo);
      
disp:=sum/(szmID-1);
  
end;

  Function 
Factorial (NWord): Longint;    {Заголовок функции}
 Var
 
jWordpLongint;    {Объявление т.нлокальных переменных}
  
Begin                {Начало составного оператора тела функции}
      
p:= 1;
      For 
j:=2 to N do p:=p*j;{Переменная p накапливает произведение}
       
Factorial:=p    {Имя функции должно получать значение в блоке}
  
end;            {операторная скобказакрывающая объявление функции}
end
wolf777 вне форума Ответить с цитированием
Старый 09.04.2017, 16:42   #3
wolf777
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 27
По умолчанию

должно вывести вот так

3.jpg
wolf777 вне форума Ответить с цитированием
Старый 09.04.2017, 16:47   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код:
x:=-1/(Pr)*m;
Откуда здесь возьмутся ваши положительные элементы?
p51x вне форума Ответить с цитированием
Старый 09.04.2017, 16:49   #5
wolf777
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Откуда здесь возьмутся ваши положительные элементы?
а как правильно написать?
wolf777 вне форума Ответить с цитированием
Старый 09.04.2017, 16:58   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Чтобы сказать, как правильно, надо для начала знать, что это. Просто факт деление отрицательного числа на положительное даст отрицательное.
p51x вне форума Ответить с цитированием
Старый 09.04.2017, 17:04   #7
wolf777
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Чтобы сказать, как правильно, надо для начала знать, что это. Просто факт деление отрицательного числа на положительное даст отрицательное.
согласен с вами, получается так,

Kmd:= round(StrToFloat(FrmProizvIS.EditK. Text)); // 1
Pr:=StrToFloat(FrmProizvIS.EditL.Te xt); // 4
_____

m:=s+random(Kmd); //Если s = 0 и random(k) = 0, то получите деление на 0
x:=1/(Pr)*m; // x:=-1/(Pr)*m;
_____
получается -1/1*4=-0,25, убрал минус результат вышел такой

Снимок1.PNG

а как сделать чтоб точь в точь такой результат был?

3.jpg
wolf777 вне форума Ответить с цитированием
Старый 09.04.2017, 18:13   #8
wolf777
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 27
По умолчанию

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

PHP код:
 Kmd:= round(StrToFloat(FrmProizvIS.EditK.Text));  //4
 
Pr:=StrToFloat(FrmProizvIS.EditL.Text);      // 1
     
randomize;
    
s:=0;
  for 
j:=1 to Kmd do
      
m:=s+random(Kmd);
    
x:=1/(Pr)*m;     //       x:=-1/(Pr)*m;
Erlang:=x// на выходе получается 2
end
wolf777 вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отрицательный размер файла jura_k Windows 3 19.07.2017 07:47
Как по указателю на массив узнать массив чего это(array of string/integer/int64...) WhiskasTM Общие вопросы Delphi 4 07.01.2013 21:11
Дан двумерный массив.Найти наибольший отрицательный элемент выше побочной диагонали и наименьший положите red-white Помощь студентам 1 05.11.2010 09:51
Прибавить отрицательный процент к сумме. ms.green Microsoft Office Excel 5 11.06.2010 00:07
Паскаль. Первый отрицательный элемент. DaRus Помощь студентам 7 18.12.2009 21:26