C.Ю.Соловьев

Методические материалы
по курсу
"Алгоритмы и алгоритмические языки"

Программа курса
Программирование в машинных кодах
Примеры-1
Примеры-2
Пример "большой" программы
Нисходящее программирование
Ссылочные типы
Структуры данных
Очереди и стеки
Деревья поиска
AVL-деревья
Таблицы
Хеш-таблицы
Динамические страницы

Примеры. Часть 2

(*                    Пример рекурсивной функции No.2   *)
(* Задача существования пути в лабиринте                *)
(*                                                      *)
(* Исходные данные: LB : array [1..MI,1..MJ] of char;   *)
(* Если LB[I,J] = '*', то переход в эту клетку закрыт   *)
(* Если LB[I,J] = ' ', то переход в эту клетку разрешен *)
(*                                                      *)
(* Потенциальное множество переходов из клетки (I,J) :  *)
(*    (I-1,J),   (I+1,J),   (I,J-1),   (I,J+1)          *)
(*                                                      *)
(* Задача существования пути в лабиринте =              *)
(* Задача существования непрерывной цепочки переходов   *)
(* из клетки (1,1) в клетку (MI,MJ).                    *)
(*                                                      *)
(* Подход. Отметить знаком '+' те клетки, в которые     *)
(*         можно перейти за неск.шагов из клетки (1,1)  *)
(*  MARK : Отметить клетку (I,J) знаком '+', если это   *)
(*         возможно, и сделать из нее все переходы.     *)
 
program Test142;
const MI = 5;
      MJ = 5;
var   LB : array [1..MI,1..MJ] of char;
 
procedure MARK(I,J : integer);
begin   if (1 <= I) and (I <= MI) then
        if (1 <= J) and (J <= MJ) then
        if LB[I,J]   =   ' '      then begin
           LB[I,J]:='+';
           MARK(I+1,J);
           MARK(I-1,J);
           MARK(I,J+1);
           MARK(I,J-1);
        end                              end;
 
begin  (* Пример лабиринта *)
        LB[1]:='  *  ';
        LB[2]:='  *  ';
        LB[3]:='  *  ';
        LB[4]:='*    ';
        LB[5]:='***  ';
        MARK(1,1);
        if LB[MI,MJ] = '+' then writeln('Путь существует')
                           else writeln('Путь не существует');
end.
(*                              Пример функции-параметра *)
(* Вычислить среднее взвешенное       SUM(Ai*Pi)/SUM(Pi) *)
(* Подход.   Ai --> A[I],     Pi --> P[I],               *)
(*           A,P - массивы вещественных чисел            *)
(* Суммирование реализуется универсальной ф-цией Radd    *)
(* I-е элементы сумм поставляются функциями RC и RZ      *)
 
procedure Teast143;
 
type ArReal = array [1..40] of real;
var     A,P : ArReal;
          X : real;
 
function RC(I : integer) : real;
begin    RC:=P[I]*A[I]      end;
 
function RZ(I : integer) : real;
begin    RZ:=P[I]           end;
 
function Radd(function F(I : integer) : real; N : integer) : real;
   var I : integer;
       R : real;
begin   R:=0;
        for I:=1 to N do R:=R+F(I);
        Radd:=R                                               end;
 
begin   (* Ввод N, A[1..N] и P[1..N] *)
        X:=Radd(RC,N)/Radd(RZ,N);     (* X:=Среднее взвешенное *)
        (* ... *)
end.
(*                Пример No.1 операций с множествами *)
(* Сформировать подмножество X нечетных целых        *)
(*                      чисел заданного множества A. *)
(* Процедура OddSet:  X = { y из A | y - нечетное }  *)
 
program T160;
 
type  BaseInt = 1..32;         (* Для определенности *)
      BaseSet = set of BaseInt;
 
var A,X : BaseSet;
      Y : BaseInt;
 
procedure OddSet(var X,A : BaseSet);
   var y : BaseInt;
begin   X:=[];
        for y:=1 to 32 do
        if y in A then
        if odd(y) then X:=X+[y]   end;
 
begin  A:=[1,4,6,8,29,30,32];
       OddSet(X,A);
       for Y:=1 to 32 do
       if Y in X then write(Y,' '); writeln;
end.
(* Протокол:       MS-DOS>T160
                   1 29
Конец протокола. *)
(*                    Пример No.2 операций с множествами *)
(* DelSet : альтернативная реализация разности множеств  *)
(*                                            A := B - C *)
 
program T157;
type BaseType = 'A'..'Z';
     BaseSet  = set of BaseType;
var A,B,C : BaseSet;
 
procedure DelSet(var A,B,C : BaseSet);
   var Y : BaseType;
begin   A:=[];
        for Y:='A' to 'Z' do
        if Y in B then
        if Y in C then
                  else A:=A+[Y]   end;
 
begin   (* Пример *)
        B:=['A','B','Z'];
        C:=['A','D','Z'];
        DelSet(A,B,C);
        (* A = ['B'] *)
end.
(*                 Пример использования файловых переменных *)
(* Слияние двух файлов целых чисел:                         *)
(* Элемент(F):=max(Элемент(G),Элемент(H)) по всем элементам *)
 
program MaxFile(F,G,H);
   var F,G,H : file of integer;
begin   Rewrite(F);
         Reset(G);
         Reset(H);
         while (not eof(G)) and (not eof(H)) do begin
            if H^ < G^ then F:=G^
                       else F:=H^;
            Put(F);
            Get(H);
            Get(G)
         end
end.
(*                    Пример использования текстовых файлов *)
(* Вычислить количество строк в заданном текстовом файле.   *)
 
program Test165(T);
var K : integer;
    T : text;
begin   K:=0;
        Reset(T);
        while not eof(T) do begin
           Readln(T);
           K:=K+1
        end;
        writeln('Количество строк =',K);
end.

Вопросы?