Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > оптимизация ппрограмм под паскаль


Автор: Remiznik 22.5.2005, 12:32
не давно писал простейшуюю програму с массивамино надо было создать маленькое мень выбора задания масива программа простая а писанинны дофига
так вот вопрос в чём может кто видел сайты или сам что придумал по поводу оптимизации программ если не жалко поделитесь ))))

Автор: remax 22.5.2005, 16:37
Цитата(Remiznik @ 22.5.2005, 09:32)
не давно писал простейшуюю програму с массивамино надо было создать маленькое мень выбора задания масива программа простая а писанинны дофига


???? А в чем проблема ????

Код

procedure Run
var
   nafig:boolean;
   Ch:char;
 begin
   nafig:=false;
   repeat
    View;
    Ch:=ReadKey;
    case Ch of
      #0:                                    { Function keys }
      begin
        Ch:=ReadKey;
        case Ch of
          #45: nafig:=True;                       { Alt-X }
          #63: PrintPages(5); {F5}
          #72: if page>1 then PrevPage; { Up }
          #73: if page>1 then PrevPage; { Page Up }
          #80: if not eof(t) then NextPage; { Down }
          #81: if not eof(t) then NextPages(10); { Page Down }
            end;
        end;
      end;
      #3: nafig:=True;                   { Ctrl-C }
      #27: nafig:=True;                  { Esc }
    end; {case}
   until nafig;
 end;




Автор: Remiznik 26.5.2005, 23:16
я в обшем меню у меня написано просто проги какието громосткие и трудно читабильные ))) получаються

Автор: remax 29.5.2005, 17:44
Используй модульный принцип - Преобразуй повторяющиеся и однотипные фрагменты программы в процедуры и функции. Группируй процедуры и функции по назначению и выноси в отдельные модули. Используй ООП.

Автор: Romtek 30.5.2005, 21:52
Remiznik, можешь выложить свой неоптимизированный код - поможем его упростить.

Автор: Remiznik 31.5.2005, 01:15
я могу код выло жить но я в обшем смысле имел веду типа зачем писать sqr(x) когда можно x*x что то в этом роде

Код

program Project21;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure myarctan(x,e:real ;var s:real);
 var
 n1,n:real;
 begin
  begin
   s:=0;
   n1:=x;
   n:=1;
   while abs(n1)>E*n do
   begin
    s:=s+n1/n;
    n1:=(n1*(-sqr(x)));
    n:=n+2;
   end;
  end;
 end;


function  myarctan1(x:real):real;
 var
 n1,n,s,e:real;
 begin
  s:=0;
  e:=0.000000000000001;
  n1:=x;
  n:=1;
  while abs(n1)>E*n do
  begin
   s:=s+n1/n;
   n1:=(n1*(-sqr(x)));
   n:=n+2;
  end;
  myarctan1:=s;
 end;

 var
 q,a,x,e,s,s1,s2,s3:real;
 z: byte;
 begin
  repeat
  repeat
  writeln ('1 - Procedure');
  writeln ('2 - Function');
  Writeln ('3 - Exit');
  readln (z)
  until  (z=1) or (z=2) or (z=3);
  if (z=1) or (z=2) then
   begin
    case z of
     1:  begin
       write ('vvedute x ');
       readln(x);
       writeln;
      if x<1 then
       begin
        e:=0.0000000000000001;
        myarctan(x,e,s);
        s1:=s;
        x:=2*x;
        myarctan(x,e,s);
        s2:=s;
        x:=(x/2)*3;
        myarctan(x,e,s);
        s3:=s;
        x:=x/3;
        a:=arctan(x)+arctan(2*x)+arctan(3*x);
        q:=s1+s2+s3;
        writeln ('standart arctan y= ',a);
        writeln ('   my arctan    y= ',q);
        writeln ;
       end
      else
       begin
        writeln('|x|<1');
        writeln('poprobui ehe raz');
        writeln;
       end;
  end;
2: begin
write ('vvedute x ');
  readln(x);
  writeln ;
  if x<1 then
  begin
    q:=myarctan1(x)+myarctan1(2*x)+myarctan1(3*x);
   a:=arctan(x)+arctan(2*x)+arctan(3*x);
    writeln ('standart arctan y= ',a);
    writeln ('   my arctan    y= ',q);
    writeln;
    end
     else
     begin
     writeln('|x|<1');
     writeln('poprobui ehe raz');
     writeln;
     end;
end;

3: exit;

 end;
   end;
until z=3;
  { TODO -oUser -cConsole Main : Insert code here }
end.

Автор: Romtek 2.6.2005, 09:24
Sqr() оптимальнее в ассемлерном коде, чем x*x

Заменил бы
e:=0.000000000000001; на e:=1e-15;
until (z=1) or (z=2) or (z=3); на until z in [1..3]; {со множествами работа быстрее}
if (z=1) or (z=2) then на if (z<>3) then

Ну это мелочи. Главное - это алгоритм!


Автор: Remiznik 29.7.2005, 23:35
ну да алгоритм это вобше самое главное )))

Автор: Pakshin A. S. 31.7.2005, 10:18
Вышеизложенное можно превратить вот в это:
Код

program Project21;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
 e = 0.000000000000001;

procedure myarctan(x:real; var s:real);
var
 n1, n:real;
begin
 s:=0;
 n1:=x;
 n:=1;
 while abs(n1)>E*n do
  begin
   s:=s+n1/n;
   n1:=(n1*(-sqr(x)));
   n:=n+2
  end
end;

function  myarctan1(x:real):real;
var
 n1,n,s:real;
begin
 s:=0;
 n1:=x;
 n:=1;
 while abs(n1)>E*n do
  begin
   s:=s+n1/n;
   n1:=(n1*(-sqr(x)));
   n:=n+2
  end;
 Result:=s
end;

function InputX:real;
begin
 repeat
  write('Vvedite X -> ');
  readln(Result);
  if abs(Result)<1
   then
    writeln('Error input')
 until abs(Result) >= 1;
end;

procedure ShowResult(a, b:real);
begin
 writeln('standart arctan y= ', a);
 writeln('   my arctan    y= ', b);
 writeln
end;

procedure DoProcedure(x: real);
var
 r, s:real;
 i:integer;
begin
 r:=0;
 for i:=1 to 3 do
  begin
   myarctan(i*x,s);
   r:=r + s
  end;
 ShowResult(arctan(x/3)+arctan(2*x/3)+arctan(x), r)
end;

procedure DoFunction(x: real);
begin
 ShowResult(arctan(x/3)+arctan(2*x/3)+arctan(x), myarctan1(x)+myarctan1(2*x)+myarctan1(3*x))
end;

var
 z: byte;
begin
 repeat
  writeln ('1 - Procedure');
  writeln ('2 - Function');
  writeln ('3 - Exit');
  readln(z);
  case z of
   1: DoProcedure(InputX);
   2: DoFunction(InputX);
  end
 until z=3
end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)