Разработка программ оценки сложности программного обеспечения

Автор работы: Пользователь скрыл имя, 19 Января 2011 в 23:37, практическая работа

Краткое описание

Метрики третьей группы базируются на оценке использования, конфигурации и размещения данных в программе. В первую очередь это касается глобальных переменных.
Предполагается методика, связывающая сложность программ с обращениями к глобальным переменным.

Содержимое работы - 1 файл

Документ Microsoft Word.doc

— 168.00 Кб (Скачать файл)
 

 

2 РАЗРАБОТКА  ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ 

 

 

 

 

 

Листинг программы

program Project1; 
 

uses

  Forms,

  Unit1 in 'Unit1.pas' {Form1},

  Unit2 in 'Unit2.pas' {Form2}; 

{$R *.res} 

begin

  Application.Initialize;

  Application.CreateForm(TForm1, Form1);

  Application.CreateForm(TForm2, Form2);

  Application.Run;

end. 
 
 

unit Unit1; 
 

interface 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

      Dialogs, StdCtrls, Unit2, math; 

type

  TForm1 = class(TForm)

    Button1: TButton;

    Memo1: TMemo;

    OpenDialog1: TOpenDialog;

    Button2: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end; 

type

      TOperatorInfo = record

            n : string;

            c : Integer;

      end; 

const TABLE_OF_SEPARATORS : array[0..3] of TOperatorInfo =

      ((n:' ';c:0), (n:Chr(10);c:0), (n:Chr(13);c:0), (n:Chr(9);c:0)); 

var

      Form1: TForm1;

      tableOfFunctions : array of TOperatorInfo;

      tableOfVariables : array of TOperatorInfo;

      TABLE_OF_OPERATORS : array[0..20] of TOperatorInfo =

      ((n:'+';c:0), (n:'-';c:0), (n:'/';c:0), (n:'*';c:0), (n:';';c:0),

       (n:',';c:0), (n:':';c:0), (n:'=';c:0), (n:'^';c:0), (n:'>';c:0),

       (n:'<';c:0), (n:'.';c:0), (n:'@';c:0), (n:'(';c:0), (n:')';c:0),

       (n:'{';c:0), (n:'}';c:0), (n:'[';c:0), (n:']';c:0), (n:'''';c:0),

       (n:'"';c:0));

      TABLE_OF_KEWORDS : array[0..40] of TOperatorInfo =

      ((n:'div';c:0), (n:'mod';c:0), (n:'not';c:0), (n:'and';c:0), (n:'or';c:0),

       (n:'xor';c:0), (n:'shl';c:0), (n:'shr';c:0), (n:'in';c:0), (n:'is';c:0),

       (n:'not';c:0), (n:'while';c:0), (n:'do';c:0), (n:'begin';c:0), (n:'end';c:0),

       (n:'var';c:0), (n:'const';c:0), (n:'type';c:0), (n:'record';c:0), (n:'repeat';c:0),

       (n:'until';c:0), (n:'til';c:0), (n:'for';c:0), (n:'to';c:0), (n:'if';c:0),

       (n:'else';c:0), (n:'then';c:0), (n:'case';c:0), (n:'with';c:0),

       (n:'uses';c:0), (n:'goto';c:0), (n:'implementation';c:0), (n:'public';c:0),

       (n:'function';c:0), (n:'procedure';c:0), (n:'interface';c:0),

       (n:'private';c:0), (n:'array';c:0), (n:'of';c:0), (n:'class';c:0), (n:'unit';c:0));

      constCount : Integer; 

function myIsOperator( name : String ) : Boolean;

function myIsFunction( name : String ) : Boolean;

function myIsConstant( name : String ) : Boolean;

function myIsVariable( name : String ) : Boolean;

function mySkipFirstSeparators( text : String; pos : Integer ) : Integer;

function myGetNextWord( text : String; Var pos : Integer ) : String;

procedure myAddFunction( text : String );

procedure myAddVariable( text : String );

procedure myRecognize( text : String );

procedure myAnalize(); 

implementation 

uses StrUtils; 

{$R *.dfm} 

function myIsOperator( name : String ) : Boolean;

var

      i, l : Integer;

begin

      l := Length( TABLE_OF_OPERATORS ) - 1;

      for i := 0 to l do

            if CompareText( TABLE_OF_OPERATORS[i].n, name ) = 0 then begin

                  TABLE_OF_OPERATORS[i].c := TABLE_OF_OPERATORS[i].c + 1;

                  Result := True;

                  Exit;

            end; 

      l := Length( TABLE_OF_KEWORDS ) - 1;

      for i := 0 to l do

            if CompareText( TABLE_OF_KEWORDS[i].n, name ) = 0 then begin

                  TABLE_OF_KEWORDS[i].c := TABLE_OF_KEWORDS[i].c + 1;

                  Result := True;

                  Exit;

            end;

      Result := False;

end; 

function myIsFunction( name : String ) : Boolean;

var

      i, l : Integer;

begin

      l := Length( tableOfFunctions ) - 1;

      for i := 0 to l do

            if CompareText( tableOfFunctions[i].n, name ) = 0 then begin

                  tableOfFunctions[i].c := tableOfFunctions[i].c + 1;

                  Result := True;

                  Exit;

            end;

      Result := False;

end; 

function myIsConstant( name : String ) : Boolean;

Var

      pos : Integer;

      tmp : Double;

begin

      Val( name, tmp, pos );

      if pos = 0 then begin

            Result := true;

            Inc( constCount );

      end else Result := False;

end; 

function myIsVariable( name : String ) : Boolean;

var

      i, l : Integer;

begin

      l := Length( tableOfVariables ) - 1;

      for i := 0 to l do

            if CompareText( tableOfVariables[i].n, name ) = 0 then begin

                  tableOfVariables[i].c := tableOfVariables[i].c + 1;

                  Result := True;

                  Exit;

            end;

      Result := False;

end; 

function mySkipFirstSeparators( text : String; pos : Integer ) : Integer;

Var

      move : Boolean;

      i, j, l, lstr : integer;

begin

      l := Length( TABLE_OF_SEPARATORS ) - 1; //количество сепараторов

      lstr := Length( text );       //длмна строки

      i := pos - 1;          //начало поиска

      move := true;          //условие продолжения поиска 

      While move and ( i < lstr ) do begin

            Inc( i );

            for j := 0 to l do

                  if text[i] = TABLE_OF_SEPARATORS[j].n then break;

            if j > l then move := False;

      end;

      Result := i;

end; 

function myGetNextWord( text : String; Var pos : Integer ) : String;

Var

      i, posSep, posOp, tmp, l : integer;

begin

      l := Length( TABLE_OF_SEPARATORS ) - 1;

      posSep := Length( text );

      posOp := posSep;

      Result := ''; 

      pos := mySkipFirstSeparators( text, pos ); 

      for i := 0 to l do begin

            tmp := PosEx( TABLE_OF_SEPARATORS[i].n, text, pos );

            if ( tmp < posSep ) and ( tmp > 0 ) then posSep := tmp;

      end; 

      l := Length( TABLE_OF_OPERATORS ) - 1;

      for i := 0 to l do begin

            tmp := PosEx( TABLE_OF_OPERATORS[i].n, text, pos );

            if ( tmp < posOp ) and ( tmp > 0 ) then posOp := tmp;

      end; 

      if posSep < posOp then begin

            tmp := posSep - pos;

            Result := MidStr( text, pos, tmp );

            pos := posSep;

      end else if ( posOp = pos ) then begin

            tmp := 1;

            Result := MidStr( text, pos, tmp );

            Inc(pos);

      end else begin

            tmp := posOp - pos;

            Result := MidStr( text, pos, tmp );

            pos := posOp;

      end;

end; 

procedure myAddFunction( text : String );

var

      l : Integer;

begin

      l := Length( tableOfFunctions );

      SetLength( tableOfFunctions, l + 1 );

      tableOfFunctions[l].n := text;

      tableOfFunctions[l].c := 1;

end; 

procedure myAddVariable( text : String );

var

      l : Integer;

begin

      l := Length( tableOfVariables );

      SetLength( tableOfVariables, l + 1 );

      tableOfVariables[l].n := text;

      tableOfVariables[l].c := 1;

end; 

procedure myRecognize( text : String );

var

      delMe: Boolean;

      len, curPos, tmp : Integer;

      element : String;

begin

      delMe := true;

      curPos := 1;

      len := Length( text );

      SetLength( tableOfFunctions, 0 );

      SetLength( tableOfVariables, 0 );

      element := ''; 

      while curPos <= len do begin

            element := myGetNextWord( text, curPos );

            if ( curPos > 933 ) and delMe then

                  delMe := False;

            if not ( myIsOperator( element ) or

                              myIsFunction( element ) or

                              myIsConstant( element ) or

                              myIsVariable( element ) ) then begin

                  Form2.Edit1.Text := element;

                  Form1.Memo1.SelStart := curPos;

                  Form1.Memo1.SelLength := Length(element);

                  if Form2.ShowModal() = mrOk then begin

                        if Form2.RadioGroup1.ItemIndex = 0 then myAddFunction( element )

                        else myAddVariable( element );

                  end;

            end;

      end;

end; 

procedure myAnalize();

var

      i, l : Integer;

begin

      l := Length( tableOfVariables ) - 1;

      for i := 0 to l do

            Inc( constCount, tableOfVariables[i].c ); 

// Result := False;

end; 

procedure TForm1.Button1Click(Sender: TObject);

begin

      if OpenDialog1.Execute() then begin

            Memo1.Lines.LoadFromFile( OpenDialog1.FileName );

      end;

end; 

procedure TForm1.Button2Click(Sender: TObject);

var

      i, n1, n2, nn, nn1, nn2, span : Integer;

      _nn : Double;

Информация о работе Разработка программ оценки сложности программного обеспечения