Процедуры, функции, модули (Лабораторная работа № 6)

Страницы работы

8 страниц (Word-файл)

Содержание работы

Лабораторная работа N 6.  Процедуры, функции, модули.

1.  Процедуры и функции.

Процедуры и функции реализуют в Паскале так называемую процедурно-ориентированную парадигму программирования. Ее еще называют – структурное программирование. Этот способ написания программ основывается  на теореме структурного программирования:

любой алгоритм можно представить в одном из трех видов :

Алгоритм =

1.  либо Алгоритм следования : 

                            начало       Алгоритм_А; Алгоритм_Б         конец;

2.  либо Алгоритм ветвления: 

                           начало       если Условие_истинно то Алгоритм_С иначе Алгоритм_Д        конец;

3.  либо Алгоритм цикла:

                           начало         пока Условие_истинно делать Алгоритм_Ф          конец;

Здесь под словами Алгоритм_А; Алгоритм_Б … понимается опять один из трех возможных алгоритмов.

Для написания программы нужно вначале понять, какой из трех алгоритмов Ваша задача содержит. Для примера рассмотрим задачу вычисления суммы ряда

 1 + {cos[sin(x)]+ 1 + ln(p*x)}^1 + {cos[sin(x)]+ 1 + ln(p*x)}^2 + ...                                    (1)

с заданным числом членов ряда и вывода результата на экран. Сразу видим, что алгоритм состоит из двух линейно следующих друг за другом алгоритмов:

Ø  вычислить сумму ряда

Ø  вывести результат.

Начинаем писать программу на Паскале, учитывая обнаруженный линейный алгоритм:

Program My1;

Var  ...

Begin

   SumCalc() ; // вычислить

   Output() ;  // вывести на экран

End.

Ясно, что не хватает того, “что” вычисляем и куда результат записать. Объявим  переменную для суммы и передадим в процедуру величины для вычислений:

Program My1;

Var  sum : real;

Begin

   SumCalc( 2.3, 3.1, sum, 25 )  ; // вычислить сумму с 25-ю слагаемыми в точке x = 2.3, p = 3.1

   Output(“Задача состоит в том, что …”, “Сумма ряда = ”,   sum ) ;  // вывести на экран с 

                                                                                                                                                     //    комментарием

End.

Теперь не хватает собственно алгоритмов SumCalc и Output. Объявляем эти алгоритмы:

Program My1;

Var  sum : real;

Procedure SumCalc(x, p : real; var s : real;  N : integer  )  ;

                                //  из этой процедуры значение s  выходит – поэтому var

Begin

  …  после детализируем это место …

End;

Procedure Output (s1, s2: string; res : real  ) ;

Begin

   Writeln(s1) ;

   Writeln(s2, res) ;

End;

Begin

   SumCalc( 2.3, 3.1, sum, 25 )  ;  // вычислить

   Output(“Задача состоит в том, что …”, “Сумма ряда =”,   sum ) ; 

End.

Далее детализируем SumCalc. Напоминаем себе задачу:

                         1 + {cos[sin(x)]+ 1 + ln(p*x)}^1 + {cos[sin(x)]+ 1 + ln(p*x)}^2 + ...                                    (1)

Procedure SumCalc(x : real; p : real; var s : real;  N : integer  )  ;

Var     a : real ;

            i : integer ;

Begin

   a := termFunc(x, p) ;

   s := 0 ;

   for i:=1 to N do   s:= s + a ;

End;

Далее детилизируем termFunc.

Function   termFunc(x : real; p : real ) : real;

Begin

   termFunc := cos( sin(x) )  + 1 + log(p*x) ;

End;

Procedure SumCalc(x, p : real; var s : real;  N : integer  )  ;

Var   a : real ;

          i : integer ;

Begin

   a := termFunc(x, p) ;

   s := 0 ;

   for i:=1 to N do  s:= s + a ;

End;

Итак, вся программа имеет вид:

Program My1;

Function   termFunc( x : real; p : real  ) : real;

Begin

   termFunc := cos( sin(x) )  + 1 + ln(p*x) ;

End;

Procedure SumCalc( x , p : real;   var s : real;  N : integer  )  ;

Var    a  : real ;

           i   :  integer ;

Begin

   a := termFunc(x, p) ;

   s := 1 ;

   for i:=1 to N do

                 s:= s + exp(n*ln(a) );

End;

Procedure Output (s1, s2: string; res : real  ) ; // s1, s2 и res назад не возвращаются (без слова var)

Begin

   Writeln(s1) ;

   Writeln(s2, res) ;

End;

Var  sum : real;

Begin

   SumCalc( 2.3, 3.1, sum, 25 )  ;  // вычислить

   Output(“Задача состоит в том, что …”, “Сумма ряда =”,   sum ) ;  // вывести на экран с  комментарием

End.

Было бы хорошо, если бы не слишком много строк в одном файле. Эстетически самое лучшее, если в одном файле расположено 1-2 страницы кода. Чтобы этого добиться, можно независимые части кода вынести в так называемые программные единицы – Unit (Модуль). Проделаем это с нашей программой – сделаем отдельный модуль (файл) с подпрограммами.

2.  Структура модуля:

                               

 


Создаем модуль для нашей программы в DELPHI:

Если Вы сохраните Unit с другим именем, то имя Unit изменится:

   

Одновременно изменится и заголовок Вашего проекта:

DELPHI знает, что Вы создали Unit для текущего проекта и, не спрашивая Вас, вставил в главный файл проекта строку Uses AuxProc in ...

Нам остается заполнить шаблон Unit AuxProc. Проделаем это.

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

Запускаем на выполнение F9:    

3.  Задания

1.  Написать программу с подпрограммами, которая описана в первой части этого руководства. (10 мин)

2.  Написать программу с модулем, которая описана во второй части этого руководства. (10 мин)

3.  Написать программу, которая в главной программе содержит меню следующего содержания:

Выполненные в 1-м семестре лабораторные работы

Ст-та гр. Ф-ХХ по ПММ

Ø  Лабораторная работа 1. Консольное приложение в DELPHI

Ø  Лабораторная работа 2. Линейные вычисления.

Ø  Лабораторная работа 3. …

Ø 

Требования к программе:

·  Каждую лабораторную работу оформить в виде подпрограмм в отдельном модуле.

·  Для вывода результатов с задержкой консоли во всех лабораторных работах использовать одну процедуру, помещенную в модуль “Utils” (утилиты) с именем Output(...) – см. тело этой процедуры выше в этом руководстве. Для ввода данных с экрана напишите процедуры:

       Input1( s:string; Var x: real );

       Input2( s:string; Var x: integer );

И поместите эти процедуры в тот же модуль утилит “Utils”.

Модуль “Utils” подключить в каждой из лабораторных работ.

Для главной программы использовать цикл вида:

Program MyLabs;

Var   Stop : Boolean ;

             NL : integer ;

Begin

   Stop := false ;

   repeat

                                        Output( ‘Лабораторная работа 1. Консольное приложение в DELPHI’ ) ;

         Output( ‘Лабораторная работа 2. Линейные вычисления’ ) ;

          ...

         Input2( ‘ Введите номер лабораторной работы (0 - выход):  ’,  NL );

         Case   NL   of

              1 : Lab1 ;  // вызов процедуры из первого модуля

              2 : Lab2 ;    

               ...

              0 : Stop := true ;

          Else

              Output( ‘Повторите ввод – нет такой работы : ’, NL ) ;

          End ;

      Until Stop ;

   End ;

Похожие материалы

Информация о работе