Подпрограммы. Пошаговая детализация алгоритма. Модульное программирование. Организация личных библиотек

Автор: Пользователь скрыл имя, 17 Июня 2014 в 22:02, практическая работа

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

Цель : Закрепление умений и навыков составления подпрограмм, программных модулей, личных библиотек.

Файлы: 1 файл

Отчёт1.doc

— 81.50 Кб (Скачать)

Дата

Содержание занятия

Отметка

14.05.2014

 

          ТЕМА: Подпрограммы. Пошаговая детализация алгоритма. Модульное программирование. Организация личных библиотек.

 

          Наименование работы: Подпрограммы. Пошаговая детализация алгоритма. Модульное программирование. Организация личных библиотек..

          Цель урока:  Закрепление умений и навыков составленияподпрограмм, программных модулей, личных библиотек.

 

     Метод пошаговой детализации алгоритмов.

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

             Пример: детализировать следующую задачу

             Ввести два одномерных массива с помощью генератора случайных чисел, и получить в сумму соответствующих элементов в третий массив (с[i]:=a[i]+b[i]).

Последовательность наших действий будет следющая

1. Ввод массива  а;

2. Вывод на  экран полученного массива а;

3. Ввод массива  b;

4. Вывод на  экран полученного массива b;

5. Получение  массива с по формуле с[i]:=a[i]+b[i];

6. Вывод на  экран полученного массива с;

 

         Как видим данная последовательность действий приводит к решению нашей задачи. При детализации отсюда выделим следующие подзадачи:

1. Ввод массива

2. Вывод массива на экран.

3. Получение массива.

 

         Итак реализуем каждую подзадачу с помощью процедуры или функции:

         1. Входных параметров нет – выходной параметр массив. Тип массива опишем в разделе type основной программы

Type

Mas=array[1..10] of integer;

Поскольку выходной параметр один – используем функцию. Получим реализацию подзадачи в виде

Function vvod_mas:mas;

Var x:mas;

Begin

Randomize;

For i:=1 to 10 do x[i]:=Random(11);

Vvod_mas:=mas;

End;

2. Для вывода на экран в  процедуре нужен массив из  основной программы - выходных параметров нет. Используем процедуру:

Procedure vyvod_masiv(x:mas);

Begin

For i:=1 to 10 do write(x[i],’ ‘);

Writeln;

End;

3. Воспользуемся массивами с  основной программы. Тогда входных  параметров программы  не будет  и выходных также. Поэтому воспользуемся процедурой:

Procedure raschet;

Begin

For i:=1 to 10 do c[i]:=a[i]+b[i];

End;

Тогда текст основной программы примет вид

begin

A:=vvod_massiv;

Vyvod_massiv(a);

B:=vvod_massiv;

Vyvod_massiv(b);

Raschet;

Vyvod_massiv(c);

Как видно, текст программы сильно сократился и стал более понятным при разбиении на задачи.

 

Модуль – это автономно – компилируемая программная единица, включающая в себя различные компоненты раздела описаний (типы, константы, переменные, процедуры и функции),

и некоторые исполняемые операторы инициирующей части.

Компилятор Турбо Паскаля размещает программный код модулей в отдельном сегменте памяти. Максимальная длина сегмента не может превышать 64 Кбайт, однако, количество одновременно используемых модулей ограничивается лишь доступной памятью, что даёт возможность создавать весьма

крупные программы.

Модули представляют собой прекрасный инструмент для разработки библиотек прикладных программ и мощное средство модульного программирования.

Модуль можно разделить на несколько разделов:

  • Заголовок;
  • Интерфейсная часть;
  • Реализационная часть;
  • Инициализационная часть.

Структура модуля

Заголовок модуля

UNIT   Имя модуля

{$N+}   Глобальные директивы компилятора

Интерфейсная часть

INTERFACE  Начало раздела объявлений

USES   Используемые при объявлении модули

Подразделы объявления доступных глобальных соответственно

LABEL   меток

CONST  констант

TYPE   типов и

VAR   переменных

Заголовки доступных соответственно

PROCEDURE процедур и

FUNCTION  функций

Реализационная часть

IMPLEMENTATION Начало раздела реализации

USES    Используемые при реализации модули

Подразделы объявления скрытых глобальных соответственно

LABEL  меток

CONST  констант

TYPE   типов

VAR   переменных

Тела доступных и скрытых соответственно

PROCEDURE процедур и

FUNCTION  функций

Инициализационная часть

BEGIN

Основной блок модуля

END.

 

Заголовок модуля аналогичен заголовку программы: в модуле вместо зарезервированного слова PROGRAM используется слово UNIT.

Здесь могут присутствовать директивы компилятору, дающие общие установки и соглашения для всего модуля.

Например,

{$S+} - директива компилятору: включить (отключить) контроль возможного переполнения стека;

{$N+} - директива компилятору: использовать числовой процессор (реализовать операции с плавающей точкой программно),

 применяют для переменных типа real;

{$E+} - директива компилятору: включить (отключить) режим программной эмуляции сопроцессора, применяют для переменных типа extended – вещественное число повышенной точности (10 байт).

При написании модуля необходимо придерживаться следующих основных правил:

  • Имя модуля, как и имя программы не должно совпадать с именами объектов (процедур, функций и т. д.) внутри модуля (программы).
  • Имя модуля должно совпадать с именем файла, в котором он будет храниться. Отсюда, имя модуля не может состоять более чем из 8 символов.

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

Примечание. В рамках приложение Турбо Паскаль 7.0 поставляются стандартные модули System, Strings, Crt, Printer, Dos, WinDos, Graph, Overlay, Graph3 и Turbo3.

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

Следом за оператором USES описываются доступные извне и необходимые для описания процедур и функций определения типов данных, констант и переменных.

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

(с дубликатом их заголовка) в  реализационной части.

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

Реализационная часть – это часть, в которой определяются процедуры и функции.

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

Как и интерфейсная часть, часть реализационная может быть пустой. Такую возможность используют, если необходимо определить некоторые общие для многих программ типы данных, константы и переменные. Имея такое определение в рамках одного проекта, легко включить его во все программы (неявные и подчинённые) с помощью оператора USES.

Инициализационная часть представляет собой основной

блок модуля. Приведённые в ней операторы выполняются первыми, то есть они выполняются перед операторами основного блока главной программы, в которую включён данный модуль.

Чтобы окончательно оформить эту программу как модуль, необходимо сохранить объектный модуль данной программы на диске. Для опции Compile / Destination установить значение Disk и выполнить компиляцию с помощью комбинации клавиш [Ctrl + F9].

ТП7.0 распознаёт в начале текста модуля оператор модуля UNIT и автоматически создаст файл с расширением *.TPU вместо *.EXE (как для обычных программ). Выдаваемое при этом сообщение “Can not run a unit!” просто информирует Вас о том, что модуль самостоятельно не выполняется.

В опции Options / Directories установить значение параметра Include Directory равным пути, где расположен, подключаемый к основной программе, файл с расширением *.TPU (Turbo Pascal Unit), то есть модуль.

 

 

 

 

 

 

 

 

 

Задача №1

 

Описать процедуру PowerA3(A, B), вычисляющую третью степень числа A и возвращающую ее в переменной B (A — входной, B — выходной параметр; оба параметра являются вещественными). С помощью этой процедуры найти третьи степени пяти данных чисел.

program dfdsfds;

uses

    Crt;

var

    A, B : real;

    n1, n2, n3, n4, n5 : real;

    q1, q2, q3, q4, q5 : real;

procedure PowerA3(A : real; var B : real);

begin

    B := A*A*A;

end;

begin

    write('Введите 5 чисел: ');

    readln(n1,n2,n3,n4,n5);

    PowerA3(n1,q1);

    PowerA3(n2,q2);

    PowerA3(n3,q3);

    PowerA3(n4,q4);

    PowerA3(n5,q5);

    writeln;

    writeln(n1,'=',q1);

    writeln(n2,'=',q2);

    writeln(n3,'=',q3);

    writeln(n4,'=',q4);

    writeln(n5,'=',q5);

    readkey;

end.

 

Задание №2

 

Описать функцию Even(K) логического типа, возвращающую true, если целый параметр K является четным, и false в противном случае. С ее помощью найти количество четных чисел в наборе из 10 целых чисел.

program new;

uses CRT;

function even(k:integer):boolean;

begin

if k mod 2=0

then even:=true

else even:=false

end;

var count,i,a:integer;

begin

count:=0;

for i:=1 to 10 do

begin

readln(a);

if even(a) then count:=count+1

end;

writeln('Êîë-âî ÷¸òíûõ ÷èñåë : ',count);

readln

end.

                                               Задание №3

 

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

 

program P3_3;

uses crt;

const

n=4;

var

i,j:integer;

a:array[1..4,1..4] of real;

max:real;

procedure vvod;

begin

randomize;

for i:=1 to 4 do

for j:=1 to 4 do

a[i,j]:=random(20);

end;

procedure vyvod1;

begin

writeln('  Первоначальная матрица :');

writeln('  ======================');

for i:=1 to n do begin

for j:=1 to n do

write(a[i,j]:6:1);

writeln;

end;

writeln('  ======================');

end;

procedure max_;

begin

max:=a[1,1];

for i:=1 to n do

for j:=1 to n do

if max<a[i,j] then

max:=a[i,j];

for i:=1 to n do

for j:=1 to n do

a[i,j]:=a[i,j]/max;

end;

procedure vyvod2;

begin

writeln('  ------------------------------------------------');

writeln('  Максимальный элемент первоначальной матрицы - ',max);

writeln('  ------------------------------------------------');

writeln;

writeln('  Полученная матрица:');

writeln('  ======================');

for i:=1 to n do begin

for j:=1 to n do

write(a[i,j]:6:1);

writeln;

end;

writeln('  ======================');

end;

begin

vvod;

vyvod1;

max_;

vyvod2;

end.

 

 

 

                                          Задание №4

 

Дан массив из 30 целых чисел с отрицательными элементами, определить: сколько чисел больше своего индекса

 

Var a:array[1..30] of integer;

i,k, n:integer;

Begin //Начало программы

//Считывание размерности

k:=0;

For i:=1 to 30 do //Задание массива

begin

a[i]:=random(21)-10;

if (a[i])>i then k:=(k+1); //Подсчёт  чисел

write(a[i],' ');

end;

writeln;

write('Итого: ',k); //Вывод результата

writeln;

end.

 

 

 


Информация о работе Подпрограммы. Пошаговая детализация алгоритма. Модульное программирование. Организация личных библиотек