Часто некоторую последовательность операторов требуется выполнить в нескольких местах программы при различных исходных данных.
Часто не тратить время и не загромождать программу многократным повторением этих операторов целесообразно оформить их как вспомогательный программный модуль со своим именем, называемый ПОДПРОГРАММОЙ, а в соответствующих местах программы, являющейся основной (головной) ведущей единицей просто обратиться к ней (сослаться).
В качестве простых примеров использования подпрограмм в вычислительном процессе можно рассмотреть стандартные подпрограммы вычисления тригонометрических и иных функций (синус, логарифм и т.д.)
Для организации совместной работы основной программы с подпрограммой в нужных местах основной программы выполняется обращение к подпрограмме (вызов).
При вызове подпрограммы внутри основной программы указывается ИМЯ подпрограмы и какие исходные данные ей необходимо передать — фактические параметры, которые перечисляются в круглых скобках. Фактическими параметрами могут служить константы и переменные основной программы. Их значения могут использоваться и изменяться внутри подпрограммы.
Подпрограмма ЧПУ, разъяснение.
Подпрограмма должна иметь имя, указанное в обращении, которое выбирается по тем же правилам, что имя переменных и объявляется в заголовке. В качестве аргументов объявляются формальные параметры. Формальными их называют потому, что они не имеют собственных значений. В качестве формальных параметров используют переменные.
Между формальными и фактическими параметрами устанавливается взаимно- однозначное соответствие по их порядку следования в списке. В момент вызова подпрограммы каждый формальный параметр принимает значение соответствующего фактического параметра основной программы и начинается выполнение вычислительной процедуры подпрограммы. Соответствие устанавливается по порядковому номеру формального и фактического параметров.
Результаты приведенных в подпрограмме расчетов автоматически возвращаются в основную программу. Таким образом, осуществляется двусторонний обмен информацией между основной программой и подпрограммой: из основной программы в подпрограмму передаются исходные данные, а обратно результаты ее выполнения.
Схема алгоритма решения задач с использованием подпрограммы может быть организована в виде двух отдельных схем алгоритмов — основного и вспомогательного. Причем при составлении схемы вспомогательного алгоритма, реализуемого в виде подпрограммы, в схеме появляются надписи ВХОД и ВЫХОД в начале и конце алгоритма соответственно. Обращение к вспомогательному алгоритму выполняется в схеме основного алгоритма с помощью специального блока.
![]() |
В ПАСКАЛЕ различают 2 вида подпрограмм: ФУНКЦИЯ и ПРОЦЕДУРА.
Главное их различие состоит в количестве результатов, возвращаемых в основной алгоритм(программу). Функцию целесообразно использовать, если результатом вычисления является только одно значение. Процедура универсальна. Она используется, когда результатом является произвольное количество значений, в том числе и ни одного.
Подпрограмма
Источник: studopedia.su
Описание и вызов процедур и функций
Структура описания процедур и функций до некоторой степени похожа на структуру Паскаль-программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, перменных. Исполняемая часть содержит собственно операторы процедур.
Формат описания процедуры имеет вид:
procedure имя процедуры (формальные параметры); раздел описаний процедуры begin исполняемая часть процедуры end;
Формат описания функции:
function имя функции (формальные параметры): тип результата; раздел описаний функции begin исполняемая часть функции end;
Формальные параметры в заголовке процедур и функций записываются в виде:
var имя праметра: имя типа
и отделяются друг от друга точкой с запятой. Ключевое слово var может отсутствовать (об этом далее). Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа. При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type.Список формальных параметров может отсутствовать.
Вызов процедуры производится оператором, имеющим следующий формат:
имя процедуры (список фактических параметров);
Список фактических параметров — это их перечисление через запятую. При вызове фактические параметры как бы подставляются вместо формальных, стоящих на тех же местах в заголовке. Таким образом происходит передача входных параметров, затем выполняются операторы исполняемой части процедуры, после чего происходит возврат в вызывающий блок. Передача выходных параметров происходит непосредственно во время работы исполняемой части.
Вызов функции в Турбо Паскаль может производиться аналогичным способом, кроме того имеется возможность осуществить вызов внутри какого-либо выражения. В частности имя функции может стоять в правой части оператора присваивания, в разделе условий оператора if и т.д.
Для передачи в вызывающий блок выходного значения функции в исполняемой части функции перед возвратом в вызывающий блок необходимо поместить следующую команду:
имя функции:= результат;
При вызове процедур и функций необходимо соблюдать следущие правила:
· количество фактических параметров должно совпадать с количеством формальных;
· соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.
Заметим, что имена формальных и фактических параметров могут совпадать. Это не приводит к проблемам, так как соответствующие им переменные все равно будут различны из-за того, что хранятся в разных областях памяти. Кроме того, все формальные параметры являются временными переменными — они создаются в момент вызова подпрограммы и уничтожаются в момент выхода из нее.
Рассмотрим использование процедуры на примере программы поиска максимума из двух целых чисел.
var x,y,m,n: integer; procedure MaxNumber(a,b: integer; var max: integer);begin if a>b then max:=a else max:=b;end; begin write(‘Введите x,y ‘); readln(x,y); MaxNumber(x,y,m); MaxNumber(2,x+y,n); writeln(‘m=’,m,’n=’,n);end.
Аналогичную задачу, но уже с использованием функций, можно решить так:
var x,y,m,n: integer; function MaxNumber(a,b: integer): integer; var max: integer;begin if a>b then max:=a else max:=b; MaxNumber:= max;end; begin write(‘Введите x,y ‘); readln(x,y); m:= MaxNumber(x,y); n:= MaxNumber(2,x+y); writeln(‘m=’,m,’n=’,n);end.
A[I]:= Trunc(Random*101)-50
Write(A[I],’VVV’)
End.
С обработкой линейных массивов связано множество задач. Их мы рассмотрим на практических занятиях.
Двумерные и многомерные массивы
Представьте себе таблицу, состоящую из нескольких строк. Каждая строка состоит из нескольких ячеек. Тогда для точного определения положения ячейки нам потребуется знать не одно число (как в случае таблицы линейной), а два: номер строки и номер столбца. Структура данных в языке Паскаль для хранения такой таблицы называется двумерным массивом. Описать такой массив можно двумя способами:
Var
A: Array [1..20] Of Array [1..30] Of Integer;
II.
Var
A: Array [1..20,1..30] Of Integer;
В обоих случаях описан двумерный массив, соответствующий таблице, состоящей из 20 строк и 30 столбцов. Приведенные описания совершенно равноправны.
Отдельный элемент двумерного массива адресуется, естественно, двумя индексами. Например, ячейка, находящаяся в 5-й строке и 6-м столбце будет называться A[5][6] или A[5,6].
Для иллюстрации способов работы с двумерными массивами решим задачу: «Задать и распечатать массив 10X10, состоящий из целых случайных чисел в интервале [1,100]. Найти сумму элементов, лежащих выше главной диагонали.»
При отсчете, начиная с левого верхнего угла таблицы, главной будем считать диагональ из левого верхнего угла таблицы в правый нижний. При этом получается, что элементы, лежащие на главной диагонали будут иметь одинаковые индексы, а для элементов выше главной диагонали номер столбца будет всегда превышать номер строки. Договоримся также сначала указывать номер строки, а затем — номер столбца.
Program M5;
Var
A: Array[1..10,1..10] Of Integer;
I, K: Byte;
S: Integer;
Begin
S:=0;
For I:=1 To 10 Do
Begin
For K:=1 To 10 Do
Begin
A[I,K]:=Trunc(Random*100)+1;
Write(A[I,K]:6);
If K>I Then S:=S+A[I,K]
End;
Writeln
End;
Writeln(‘Сумма элементов выше гл. диагонали равнаV’,S)
End.
Если модель данных в какой-либо задаче не может свестись к линейной или плоской таблице, то могут использоваться массивы произвольной размерности. N-мерный массив характеризуется N индексами. Формат описания такого типа данных:
Type
Процедуры и функции
При решении сложных объемных задач часто целесообразно разбивать их на более простые. Метод последовательной детализации позволяет составить алгоритм из действий, которые, не являясь простыми, сами представляют собой достаточно самостоятельные алгоритмы. В этом случае говорят о вспомогательных алгоритмах или подпрограммах. Использование подпрограмм позволяет сделать основную программу более наглядной, понятной, а в случае, когда одна и та же последовательность команд встречается в программе несколько раз, даже более короткой и эффективной.
В языке Паскаль существует два вида подпрограмм: процедуры и функции, определяемые программистом. Процедурой в Паскале называется именованная последовательность инструкций, реализующая некоторое действие. Функция отличается от процедуры тем, что она должна обязательно выработать значение определенного типа.
Процедуры и функции, используемые в программе, должны быть соответствующим образом описаны до первого их упоминания. Вызов процедуры или функции производится по их имени.
Подпрограммы в языке Паскаль могут иметь параметры (значения, передаваемые в процедуру или функцию в качестве аргументов). При описании указываются так называемые формальные параметры (имена, под которыми будут фигурировать передаваемые данные внутри подпрограммы) и их типы. При вызове подпрограммы вместе с ее именем должны быть заданы все необходимые параметры в том порядке, в котором они находятся в описании. Значения, указываемые при вызове подпрограммы, называются фактическими параметрами.
Формат описания процедуры:
Begin
End;
Раздел описаний может иметь такие же подразделы, как и раздел описаний основной программы (описание процедур и функций — в том числе). Однако все описанные здесь объекты «видимы» лишь в этой процедуре. Они здесь локальны также, как и имена формальных параметров. Объекты, описанные ранее в разделе описаний основной программы и не переопределенные в процедуре, называются глобальными для этой подпрограммы и доступны для использования.
Легко заметить схожесть структуры программы целиком и любой из ее процедур. Действительно, ведь и процедура и основная программа реализуют некий алгоритм, просто процедура не дает решения всей задачи. Отличие в заголовке и в знаке после End.
Формат описания функции:
Begin End;
В теле функции обязательно должна быть хотя бы команда присвоения такого вида: :=;
Указанное выражение должно приводить к значению того же типа, что и тип результата функции, описанный выше.
Вызов процедуры представляет в программе самостоятельную инструкцию:
Типы фактических параметров должны быть такими же, что и у соответсвующих им формальных.
Вызов функции должен входить в выражение. При вычислении значения такого выражения функция будет вызвана, действия, находящиеся в ее теле, будут выполнены, в выражение будет подставлено значение результата функции.
Приведем простейший пример использования подпрограммы.
Задача: «Найти максимальное из трех введенных чисел». Для решения воспользуемся описанием функции, принимающей значение максимального из двух чисел, которые передаются в нее в виде параметров.
Program Fn;
Var
A,B,C:Real;
Function Max(A,B:Real):Real;
Begin
If A>B Then Max:=A
End;
Begin
Writeln(‘Введите три числа’);
Readln(A,B,C);
Writeln(‘Максимальным из всех является ‘, Max(Max(A,B),C))
End.
Обратите внимание на краткость тела основной программы и на прозрачность действий внутри функции. Формальные параметры A и B, используемые в подпрограмме, не имеют никакого отношения переменным A и B, описанным в основной программе.
Существует два способа передачи фактических параметров в подпрограмму: по значению и по ссылке. В первом случае значение переменной-фактического параметра при вызове подпрограммы присваивается локальной переменной, являющейся формальным параметром подпрограммы. Что бы потом ни происходило с локальной переменной, это никак не отразится на соответствующей глобальной.
Для одних задач это благо, но иногда требуется произвести в подпрограмме действия над самими переменными, указанными в качестве фактических параметров. На помощь приходит второй способ. Происходит следующее: при обращении к подпрограмме не происходит формирования локальной переменной-формального параметра. Просто на время выполнения подпрограммы имя этой локальной переменной будет указывать на ту же область памяти, что и имя соответствующей глобальной переменной. Если в этом случае изменить локальную переменную, изменятся данные и в глобальной.
Передача параметров по ссылке отличается тем, что при описании подпрограммы перед именем переменной — формального параметра ставится служебное слово Var. Теперь использование в качестве фактических параметров выражений или непосредственных значений уже не допускается — они должны быть именами переменных.
Еще один классический пример. Задача: «Расположить в порядке неубывания три целых числа».
Program Pr;
Var
S1,S2,S3:Integer;
Procedure Swap(Var A,B: Integer);
Var C: Integer;
Begin
C:=A; A:=B; B:=C
End;
Begin
Writeln(‘Введите три числа’);
Readln(S1,S2,S3);
If S1>S2 Then Swap(S1,S2);
If S2>S3 Then Swap(S2,S3);
If S1>S2 Then Swap(S1,S2);
Writeln(‘Числа в порядке неубывания:V’,S1,S2,S3)
End.
Работа с файлами
Тип-файл представляет собой последовательность компонент одного типа, расположенных на внешнем устройстве (например, на диске). Элементы могут быть любого типа, за исключением самого типа-файла. Число элементов в файле при описании не объявляется. Работа с физическими файлами происходит через так называемые файловые переменные.
Для задания типа-файла следует использовать зарезервированные слова File и Of, после чего указать тип компонент файла.
Пример:
Type
N = File Of Integer;
C = File Of Char;
Есть заранее определенный в Паскале тип файла с именем Text. Файлы этого типа называют текстовыми.
Введя файловый тип, можно определить и переменные файлового типа:
Var
Тип-файл можно описать и непосредственно при введении файловых переменных:
Var
Z: File Of Word;
Файловые переменные имеют специфическое применение. Над ними нельзя выполнять никаких операций (присваивать значение, сравнивать и т.д.). Их можно использовать лишь для выполнения операций с файлами (чтение, запись и т.д.).
Элементы файла считаются расположенными последовательно, то есть так же, как элементы линейного массива. Отличие же состоит в том, что, во-первых, размеры файла могут меняться, во-вторых, способ обращения к элементам совсем другой: невозможно обратиться к произвольному элементу файла; элементы его просматриваются только подряд от начала к концу, при этом в каждый момент времени доступен только один элемент. Можно представить себе, что для каждого файла существует указатель, показывающий в данный момент на определенный компонент файла. После проведения операции чтения или записи указатель автоматически передвигается на следующий компонент.
Перед тем, как осуществлять ввод-вывод, файловая переменная должна быть связана с конкретным внешним файлом при помощи процедуры Assign.
Имя файла задается либо строковой константой, либо через переменную типа Sting. Имя файла должно соответствовать правилам работающей в данный момент операционной системы. Если строка имени пустая, то связь файловой переменной осуществляется со стандартным устройством ввода-вывода (как правило — с консолью).
После этого файл должен быть открыт одной из процедур:
Открывается существующий файл для чтения, указатель текущей компоненты файла настраивается на начало файла. Если физического файла, соответствующего файловой переменной не существует, то возникает ситуация ошибки ввода-вывода.
Rewrite ();
Открывается новый пустой файл для записи, ему присваивается имя, заданное процедурой Assign. Если файл с таким именем уже существует, то он уничтожается.
После работы с файлом он, как правило, должен быть закрыт процедурой Close.
Close ();
Это требование обязательно должно соблюдаться для файла, в который производилась запись.
Теперь рассмотрим непосредственную организацию чтения и записи.
Для ввода информации из файла, открытого для чтения, используется уже знакомый вам оператор Read. Правда, в его формате и использовании вы заметите некоторые изменения:
Read (, );
Происходит считывание данных из файла в переменные, имена которых указаны в списке ввода. Переменные должны быть того же типа, что и компоненты файла.
Вывод информации производит, как можно догадаться оператор Write (, );
Данные из списка вывода заносятся в файл, открытый для записи.
Для текстовых файлов используются также операторы Readln и Writeln с соответствующими дополнениями, относящимися к файловому вводу-выводу. Любопытно, что вывод данных на монитор и ввод с клавиатуры в языке Паскаль тоже являются действиями с файлами. Они даже имеют свои предопределенные файловые переменные текстового типа: Output и Input соответственно. Переменная Output всегда открыта для записи, Input — для чтения. Если не указывать файловые переменные в операторах ввода-вывода (придем к формату, рассмотренному в теме «Операторы ввода-вывода»), то в случае записи по умолчанию выбирается файл Output, в случае чтения — Input.
Как вы знаете, любой файл конечен и продолжать чтение из него информации можно лишь до определенного предела. Как этот предел установить? Проверить, окончен ли файл, можно вызовом стандартной логической функции Eof ()
Она вырабатывает значение True, если файл окончен, и False — в противном случае.
Решим следующую задачу: «Написать программу, которая вводит с клавиатуры список фамилий учащихся, а затем распечатывает его, кроме тех учащихся, у которых фамилия начинается с буквы ‘Ш'».
Так как заранее количество данных не известно, то для их хранения используем файл. Тип элементов — строковый.
Program L;
Var
I,N: Integer;
F: File Of String;
S: String;
Begin
Writeln(‘Введите фамилию’);
Readln(S);
Write(F,S)
End;
Close(F);
Reset(F);
Writeln; Writeln(‘Список учащихся:’);
While Not(Eof(F)) Do
Begin
Read(F,S);
If S[1]<>’Ш’ Then
Writeln(S)
Источник: studopedia.ru
Структурное программирование. модульный принцип программирования. подпрограммы. принципы проектирования программ «сверху — вниз» и «снизу вверх».
csaa 24.01.2011 24.01.2018 Комментарии к записи Структурное программирование. модульный принцип программирования. подпрограммы. принципы проектирования программ «сверху — вниз» и «снизу вверх». отключены
S: При структурном программировании основным требованием к подпрограмме является …
-: отсутствие параметров в заголовке
+: независимость от количества ее предыдущих вызовов
-: размер подпрограммы не более 1 экрана
-: организация подпрограммы в виде отдельного файла
S: Основная идея структурного программирования состоит в том, что …
-: используется инкапсуляция и наследование объектов
-: при написании программ не используются подпрограммы
-: для реализации алгоритма рекомендуется использовать операторы безусловного перехода
+: для написания программ используются только три типа операторов: линейный, ветвление, повторение цикла
Алг подпр1 (аргцел X, Y, резцел F)
вызывается на выполнение
После этого значение переменной В будет равно…
Алг подпр1 (аргцел X, Y, резцел F)
вызывается на выполнение
После этого значение переменной A будет равно…
Алг подпр1 (аргцел X, Y, резцел F)
вызывается на выполнение
После этого значение переменной A будет равно…
Алг подпр1 (арг цел X, Y, рез цел F)
вызывается на выполнение
После этого значение переменной A будет равно…
S: Подпрограмма – это …
-: рекурсивный вызов в функции
-: часть операторов основной программы, выполняющихся как повторение цикла
+: синтаксически выделенный и используемый как единое целое блок операторов
-: скомпилированный исполняемый файл основной программы
S: Подпрограмма может быть вызвана …
-: строго ограниченное число раз
-: не более одного раза в каждом операторе
+: произвольное число раз
-: не более одного раза
Алг подпр1 (арг цел X, Y, рез цел F)
вызывается на выполнение
После этого значение переменной A будет равно…
S: Параметры подпрограммы, используемые для ее описания, называются …
S: Пошаговая детализация постановки задачи, начиная с наиболее общей проблемы, характеризует…
+: метод последовательной декомпозиции сверху – вниз
-: метод проектирования «от частного к общему»
-: поиск логической взаимосвязи
S: Программа – это …
-: набор команд операционной системы компьютера
+: алгоритм, записанный на языке программирования
-: законченное минимальное смысловое выражение на языке программирования
-: протокол взаимодействия компонентов компьютерной сети
S: При структурном подходе к составлению программ могут использоваться понятия:
а) альтернативный выбор
S: Процедура ABCD
писать (‘ВВЕДИТЕ ЗНАЧЕНИЕ A, B, C, D’);
реализует алгебраическое выражение вида…
-:
-:
-:
+:
S: Программирование, основанное на модульной структуре программного продукта и типовых управляющих структурах алгоритмов, называется…
S: Параметры, указываемые в момент вызова подпрограммы из основной программы, называются …
S: Проектирование программ путем последовательного разбиения большой задачи на меньшие подзадачи соответствует …
-: восходящему («снизу-вверх») проектированию
+: нисходящему («сверху-вниз») проектированию
S: По отношению к подпрограммам верным является утверждением, что…
+: подпрограмма может не иметь параметров
-: формальные и фактические параметры могут не совпадать по типу
-: подпрограмма не может возвращать значения
-: подпрограмма не может быть вызвана более 10 раз
S: Программа – это …
-: набор команд операционной системы компьютера
+: алгоритм, записанный на языке программирования
-: законченное минимальное смысловое выражение на языке программирования
-: протокол взаимодействия компонентов компьютерной сети
S: Модульная структура программы отражает одну из особенностей ___________ программирования.
S: К основополагающим принципам структурного программирования не относятся …
-: разбиение проекта на модули, каждый из которых имеет один вход и один выход
-: программирование сверху вниз
-: логика программы допускает только три основные алгоритмические структуры: следования, ветвления и повторения
+: достижение абсолютного минимума символов и строк в тексте программы
S: Программирование сверху вниз – это ….
-: процесс, при котором от начального предположения осуществляется движение по направлению к лучшим решениям
+: процесс пошагового разбиения алгоритма на все более мелкие части с целью получения таких элементов, для которых можно написать конкретные команды
-: метод сведения трудной задачи к последовательности более простых
-: исследование древовидной модели пространства решений и ориентация на поиск оптимального решения
S: В основе методов искусственного интеллекта лежит(-ат)…
S: Средством записи алгоритма не являются…
S: При проектировании программного обеспечения используются подходы:
в) «слева — направо»
г) «справа — налево»
S: Процесс описания объекта на искусственном языке называют_________объекта.
S: После выполнения фрагмента программы
если (a+b30) ИЛИ (b-a
значение переменной а будет равно….
S: В результате выполнения алгоритма
Значение переменной Х будет равно
S: В результате выполнения алгоритма
Алг “вывод чисел “
Будут выведены числа
S: В результате работы алгоритма
переменная y приняла значение 14. До работы
алгоритма значением переменной x являлось число …
S: В программе, вычисляющей сумму положительных чисел из 20
Введенных с клавиатуры,
нц для i:=1 до 20
необходимо вставить оператор …
S: Задан фрагмент алгоритма
если x0 то если y0 то z=1 иначе y=2
В результате выполнения данного алгоритма с начальными значениями
x=1, y=-1 переменная z будет иметь значение …
S: Тип данных языка программирования характеризуется …
+: количеством допустимых значений и набором допустимых над этими значениями операций
-: правилами преобразования значений, заданными в описании языка программирования
-: набором методов обработки данных
S: К основополагающим принципам структурного программирования не относятся …
-: программирование сверху вниз
-: логика программы допускает только три основные алгоритмические структуры следования, ветвления и повторения
-: разбиение проекта на модули, каждый из которых имеет один вход и один выход
+: достижения абсолютного минимума символов и строк в тексте программы
S: Значение переменной d после выполнения фрагмента алгоритма (операция mod(x,y) – получение остатка целочисленного x деления на y)
Источник: csaa.ru