Pascal — различия между версиями

Материал из synset
Перейти к: навигация, поиск
Строка 153: Строка 153:
 
   ReadLn(f1,s2);
 
   ReadLn(f1,s2);
 
   close(f1);
 
   close(f1);
   len:=length(s1);
+
   len:=length(s1);                     {разбиение строк в елементы массивов}
 
   for i:=1 to len do
 
   for i:=1 to len do
 
       a[len-i+1]:=Ord(s1[i])-48;
 
       a[len-i+1]:=Ord(s1[i])-48;
Строка 164: Строка 164:
 
   for i:=1 to len do
 
   for i:=1 to len do
 
     begin
 
     begin
       c:=c+a[i]+b[i];
+
       c:=c+a[i]+b[i];         {переменная ''c'' будет в дальнейшем использоваться для переноса числа в следующия ряд}
       a[i]:=c mod 10;
+
       a[i]:=c mod 10;         {результат сложения запишем в массив ''а''}
 
       c:=c div 10;
 
       c:=c div 10;
 
     end;
 
     end;
Строка 172: Строка 172:
 
       a[len]:=c;
 
       a[len]:=c;
 
     end;
 
     end;
   for i:=len downto 1 do
+
   for i:=len downto 1 do     {вывод результата в файл}
 
       Write(f2,a[i]);
 
       Write(f2,a[i]);
 
   close(f2);
 
   close(f2);
 
end.
 
end.
 
</pre>
 
</pre>

Версия 11:39, 21 февраля 2010

Стандартные программы для реализации алгоритмов на языке Pascal


Функция для определения принадлежности числа к простым:

Function Prime(n:longint):boolean;
var
   p,i:longint;
   b:boolean;
begin
   b:=true;
   if (n=1) or ((n>3) and (n mod 2=0)) then
   b:=false
   else
   begin
      p:=trunc(sqrt(n));
      i:=3;
      While (i<=p) and b do
      begin
         b:=n mod i<>0;
         i:=i+2;
      end;
   end;
   Prime:=b;
end; 

Функция для определения наибольшего общего делителя:

Function GCD(a,b:longint):longint;
var
   x,y:longint;
begin
   x:=a;
   y:=b;
   While x<>y do
      if x>y then x:=x-y
      else y:=y-x;
   GCD:=x;
end;

Работа с текстовыми файлами. Чтение и запись:

var
   f1,f2:text;
   sum,a,b:integer;
begin
   Assign(f1,'input.dat');
   Assign(f2,'output.sol');
   Rewrite(f2);
   Reset(f1);
   Read(f1, a);
   Read(f1, b);
   close(f1);
   sum:=a+b;
   Write(f2, sum);
   close(f2);
 end.



Перевод числа из десятичной системы исчисления в систему исчисления с основанием m:

program Сonversion;

uses
  SysUtils;
const
   nmax=1000000000;
var
   i,v,x,m,j:integer;
   a:array[1..nmax] of byte;
begin
   i:=0;
   ReadLn(x,m);   {Вводим число x которое необходимо перевести в систему исчисления с основанием m}
   v:=x;
   While v>0 do
    begin
      inc(i);
      a[i]:=v mod m;
      v:=v div m
    end;
   Write(x,' in the calculus of reason ',m,' = ');
   for j:=i downto 1 do
      Write(a[j]);
   ReadLn;
end.


Перевод числа из системы исчисления с основанием m в десятичную систему:

program OppositeToConversion;

uses
  SysUtils;
Function Power(x,n:integer):integer;  {функция для возведения в степень n числа x}
var
   p,i:integer;
begin
   if n=0 then Power:=1
   else begin
   p:=x;
   for i:=2 to n do
      p:=p*x;
   Power:=p;
   end;
end;

var
   st:string;
   i,v,sum,m:integer;
   a:array[1..1000000] of byte;
begin
   ReadLn(st);
   ReadLn(m);
   v:=length(st);
   for i:=1 to v do
      a[v-i+1]:=StrToInt(st[v-i+1]); 
   sum:=0;
   for i:=1 to v do
      sum:=sum+Power(m,i-1)*a[v-i+1];
   WriteLn(sum);
   ReadLn;
end.

Длинная арифметика

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


program A+B;

var
   s1,s2:string;
   a,b:array[1..100] of integer;
   len,i,c:integer;
   f1,f2:text;
begin
   Assign(f1,'INPUT.TXT');  Reset(f1);
   Assign(f2,'OUTPUT.TXT'); ReWrite(f2);
   c:=0;
   ReadLn(f1,s1);
   ReadLn(f1,s2);
   close(f1);
   len:=length(s1);                      {разбиение строк в елементы массивов}
   for i:=1 to len do
      a[len-i+1]:=Ord(s1[i])-48;
   len:=length(s2);
   for i:=1 to len do
      b[len-i+1]:=Ord(s2[i])-48;

   if length(s1)>length(s2) then len:=length(s1)
   else len:=length(s2);
   for i:=1 to len do
    begin
      c:=c+a[i]+b[i];         {переменная ''c'' будет в дальнейшем использоваться для переноса числа в следующия ряд}
      a[i]:=c mod 10;         {результат сложения запишем в массив ''а''} 
      c:=c div 10;
    end;
   if c>0 then begin
      len:=len+1;
      a[len]:=c;
    end;
   for i:=len downto 1 do     {вывод результата в файл}
      Write(f2,a[i]);
   close(f2);
end.