Автор: Пользователь скрыл имя, 17 Июня 2014 в 22:02, практическая работа
Цель : Закрепление умений и навыков составления подпрограмм, программных модулей, личных библиотек.
Дата |
Содержание занятия |
Отметка |
14.05.2014 |
ТЕМА: Подпрограммы. Пошаговая детализация алгоритма. Модульное программирование. Организация личных библиотек.
Наименование работы: Подпрограммы. Пошаговая детализация алгоритма. Модульное программирование. Организация личных библиотек.. Цель урока: Закрепление умений и навыков составленияподпрограмм, программных модулей, личных библиотек.
Метод пошаговой детализации алгоритмов. Технология нисходящего проектирования с пошаговой детализацией является неотъемлемой частью создания хорошо структурированных программ. При написании программы с использованием этой технологии вся задача рассматривается как единственное предложение (вершина), выражающее общее назначение программы. Так как вершина редко отображает достаточное количество деталей, на основании которых можно написать программу, то поэтому надо начинать процесс детализации. Вершина разделяется на ряд более мелких задач в том порядке, в котором эти задачи должны выполнятся. В результате получим первую детализацию. Далее каждая из подзадач разбивается на подзадачи, принадлежащие второму уровню детализации. Программист завершает процесс нисходящей разработки с пошаговой детализацией, когда алгоритм настолько детализирован, чтобы его можно было бы преобразовать в программу. Пример: детализировать следующую задачу Ввести два одномерных массива с помощью генератора случайных чисел, и получить в сумму соответствующих элементов в третий массив (с[i]:=a[i]+b[i]). Последовательность наших действий будет следющая 1. Ввод массива а; 2. Вывод на экран полученного массива а; 3. Ввод массива b; 4. Вывод на экран полученного массива b; 5. Получение
массива с по формуле с[i]:=a[ 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 байт). При написании модуля необходимо придерживаться следующих основных правил:
В интерфейсной части описываются все константы, типы данных и переменных, процедуры и функции, доступные в этом модуле для использования внешними программами. Интерфейсная часть модуля несёт всю информацию, необходимую для использования процедур и функций, определённых в модуле. Любая другая информация о модуле для обычного его использования не нужна. Примечание. В рамках приложение Турбо Паскаль 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.
Получить новую
матрицу путем деления всех
элементов матрицы размером 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.
|