СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до 14.07.2025

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Процедуры и функции на языке Паскаль

Категория: Информатика

Нажмите, чтобы узнать подробности

Просмотр содержимого документа
«Процедуры и функции на языке Паскаль»

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

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

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

В языке Паскаль имеется два вида подпрограмм - процедуры и функции.

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

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

 

Описание и вызов процедур и функций

Структура описания процедур и функций до некоторой степени похожа на структуру Паскаль-программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, переменных. Исполняемая часть содержит собственно операторы процедур.

Формат описания процедуры имеет вид:

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 ab 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 ab 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.


Передача параметров

В стандарте языка Паскаль передача параметров может производиться двумя способами - по значению и по ссылке. Параметры, передаваемые по значению, называют параметрами-значениями, передаваемые по ссылке - параметрами-переменными. Последние отличаются тем, что в заголовке процедуры (функции) перед ними ставится служебное слово var.

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

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

Выбор способа передачи параметров при создании процедуры (функции) происходит в соответствии со сказанным выше: входные параметры нужно передавать по значению, а выходные - по ссылке. Практически это сводится к расстановке в заголовке процедуры (функции) описателя var при всех параметрах, которые обозначают результат работы подпрограммы. Однако, в связи с тем, что функция возвращает только один результат, в ее заголовке использовать параметры-переменные не рекомендуется.

 

Локальные и глобальные идентификаторы

Использование процедур и функций в Паскале тесно связано с некоторыми особенностями работы с идентификаторами (именами) в программе. В часности, не все имена всегда доступны для использования. Доступ к идентификатору в конкретный момент времени определяется тем, в каком блоке он описан.

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

Основные правила работы с глобальными и локальными именами можно сформулировать так:

  • Локальные имена доступны (считаются известными, "видимыми") только внутри того блока, где они описаны. Сам этот блок, и все другие, вложенные в него, называют областью видимости для этих локальных имен.

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

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

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

Имя, описанное в блоке, "закрывает" совпадающие с ним имена из блоков, содержащие данный. Это означает, что если в двух блоках, один из которых содержится внутри другого, есть переменные с одинаковыми именами, то после входа во вложенный блок работа будет идти с локальной для данного блока переменной. Пременная с тем же имнем, описанная в объемлющем блоке, становится временно недоступной и это продолжается до момента выхода из вложенного блока.

Рекомендуется все имена, которые имеют в подпрограммах чисто внутреннее, вспомогательное назначение, делать локальными. Это предохраняет от изменений глобальные объекты с такими же именами.



Файлы

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

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

Понятие файла достаточно широко. Это может быть обычный файл на диске, коммуникационный порт ЭВМ, устройство печати, клавиатура или другие устройства.

При работе с файлами выполняются операции ввода - вывода. Операция ввода означает перепись данных с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода - это пересылка данных из основной памяти на внешнее устройство (в выходной файл).

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

'LAB1.DAT'

'c:\ABC150\pr.txt'

'my_files'

  Типы файлов Турбо Паскаль

Турбо Паскаль поддерживает три файловых типа:

  • текстовые файлы;

  • типизированные файлы;

  • нетипизированные файлы.

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

file of тип - типизированный файл (указан тип компоненты);
text - текстовый файл;
file - нетипизированный файл.

Примеры описания файловых переменных:

var

f1: file of char;

f2: file of integer;

f3: file;

t: text;

 

Стандартные процедуры и функции

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

Assign(f, FileName)

связывает файловую переменную f с физическим файлом, полное имя которого задано в строке FileName. Установленная связь будет действовать до конца работы программы, или до тех пор, пока не будет сделано переназначение.

После связи файловой переменной с дисковым именем файла в программе нужно указать направление передачи данных (открыть файл). В зависимости от этого направления говорят о чтении из файла или записи в файл.

Reset(f)

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

Если f - типизированный файл, то процедурой reset он открывается для чтения и записи одновременно.

Rewrite(f)

открывает для записи файл, с которым связана файловая переменная f. После успешного выполнения этой процедуры файл готов к записи в него первого элемента. Если указанный файл уже существовал, то все данные из него уничтожаются.

Close(f)

закрывает открытый до этого файл с файловой переменной f. Вызов процедуры Close необходим при завершении работы с файлом. Если по какой-то причине процедура Close не будет выполнена, файл все-же будет создан на внешнем устройстве, но содержимое последнего буфера в него не будет перенесено.

EOF(f): boolean

возвращает значение TRUE, когда при чтении достигнут конец файла. Это означает, что уже прочитан последний элемент в файле или файл после открытия оказался пуст.

Rename(f, NewName)

позволяет переименовать физический файл на диске, связанный с файловой переменной f. Переименование возможно после закрытия файла.

Erase(f)

уничтожает физический файл на диске, который был связан с файловой переменной f. Файл к моменту вызова процедуры Erase должен быть закрыт.

IOResult

возвращает целое число, соответствующее коду последней ошибки ввода - вывода. При нормальном завершении операции функция вернет значение 0. Значение функции IOResult необходимо присваивать какой-либо переменной, так как при каждом вызове функция обнуляет свое значение. Функция IOResult работает только при выключенном режиме проверок ошибок ввода - вывода или с ключом компиляции {$I-}.

  Работа с типизированными файлами

Типизированный файл - это последовательность компонент любого заданного типа (кроме типа "файл"). Доступ к компонентам файла осуществляется по их порядковым номерам. Компоненты нумеруются, начиная с 0. После открытия файла указатель (номер текущей компоненты) стоит в его начале на нулевом компоненте. После каждого чтения или записи указатель сдвигается к следующему компоненту.

Запись в файл:

Write(f, список переменных);

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

Чтение из файла:

Read(f, список переменных);

Процедура читает из файла f компоненты в указанные переменные. Тип файловых компонент и переменных должны совпадать. Если будет сделана попытка чтения несуществующих компонент, то произойдет ошибочное завершение программы. Необходимо либо точно рассчитывать количество компонент, либо перед каждым чтением данных делать проверку их существования (функция eof, см. выше)

Смещение указателя файла:

Seek(f, n);

Процедура смещает указатель файла f на n-ную позицию. Нумерация в файле начинается с 0.

Определение количества компонент:

FileSize(f): longint;

Функция возвращает количество компонент в файле f.

Определение позиции указателя:

FilePos(f): longint;

Функция возвращает порядковый номер текущего компонента файла f.

Отсечение последних компонент файла:

Truncate(f);

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

 

назад содержание вперед

Работа с текстовыми файлами

Текстовый файл - это совокупность строк, разделенных метками конца строки. Сам файл заканчивается меткой конца файла. Доступ к каждой строке возможен лишь последовательно, начиная с первой. Одновременная запись и чтение запрещены.

Чтение из текстового файла:

Read(f, список переменных);

ReadLn(f, список переменных);

Процедуры читают информацию из файла f в переменные. Способ чтения зависит от типа переменных, стоящих в списке. В переменную char помещаются символы из файла. В числовую переменную: пропускаются символы-разделители, начальные пробелы и считывается значение числа до появления следующего разделителя. В переменную типа string помещается количество символов, равное длине строки, но только в том случае, если раньше не встретились символы конца строки или конца файла. Отличие ReadLn от Read в том, что в нем после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки. Если список переменных отсутствует, то процедура ReadLn(f) пропускает строку при чтении текстового файла.

Запись в текстовый файл:

Write(f, список переменных);

WriteLn(f, список переменных);

Процедуры записывают информацию в текстовый файл. Способ записи зависит от типа переменных в списке (как и при выводе на экран). Учитывается формат вывода. WriteLn от Write отличается тем, что после записи всех значений из переменных записывает еще и метку конца строки (формируется законченная строка файла).

Добавление информации к концу файла:

Append(f)

Процедура открывает текстовый файл для добавления информации к его концу. Используйте эту процедуру вместо Rewrite.

 

назад содержание

Работа с нетипизированными файлами

Нетипизированные файлы - это последовательность компонент произвольного типа.

Открытие нетипизированного файла:

Reset(f, BufSize)

Rewrite(f, BufSize)

Параметр BufSize задает число байтов, считываемых из файла или записываемых в него за одно обращение. Минимальное значение BufSize - 1 байт, максимальное - 64 К байт. Если BufSize не указан, то по умолчанию он принимается равным 128.

Чтение данных из нетипизированного файла:

BlockRead(f, X, Count, QuantBlock);

Эта процедура осуществляет за одно обращение чтение в переменную X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера. Значение Count не может быть меньше 1. За одно обращение нельзя прочесть больше, чем 64 К байтов.

Необязательный параметр QuantBlock возвращает число блоков, прочитанных текущей операцией BlockRead. В случае успешного завершения операции чтения QuantBlock = Count, в случае аварийной ситуации параметр QuantBlock будет содержать число удачно прочитанных блоков. Отсюда следует, что с помощью параметра QuantBlock можно контролировать правильность выполнения операции чтения.

Запись данных в нетипизированный файл:

BlockWrite(f, X, Count, QuantBlock);

Эта процедура осуществляет за одно обращение запись из переменной X количества блоков, заданное параметром Count, при этом длина блока равна длине буфера.

Необязательный параметр QuantBlock возвращает число блоков, записанных успешно текущей операцией BlockWrite.

Для нетипизированных файлов можно использовать процедуры Seek, FIlePos и FileSize, аналогично соответствующим процедурам типизированных файлов.

 

назад содержание



Строки

содержание вперед

Строковый тип данных

Для обработки строковой информации в Турбо Паскаль введен строковый тип данных. Строкой в Паскале называется последовательность из определенного количества символов. Количество символов последовательности называется длиной строки. Синтаксис:

var s: string[n];

var s: string;

n - максимально возможная длина строки - целое число в диапазоне 1..255. Если этот параметр опущен, то по умолчанию он принимается равным 255.

Строковые константы записываются как последовательности символов, ограниченные апострофами. Допускается формирование строк с использованием записи символов по десятичному коду (в виде комбинации # и кода символа) и управляющих символов (комбинации ^ и некоторых заглавных латинских букв).

Пример:

'Текстовая строка'
#54#32#61
'abcde'^A^M

Пустой символ обозначается двумя подряд стоящими апострофами. Если апостроф входит в строку как литера, то при записи он удваивается.

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

Выражения типа char можно присваивать любым строковым переменным.

В Турбо Паскаль имеется простой доступ к отдельным символам строковой переменной: i-й символ переменной st записывается как st[i]. Например, если st - это 'Строка', то st[1] - это 'С', st[2] - это 'т', st[3] - 'р' и так далее.

Над строковыми данными определена операция слияния (конкантенации), обозначаемая знаком +. Например:

a := 'Turbo';

b := 'Pascal';

c := a + b;

В этом примере переменная c приобретет значение 'TurboPascal'.

Кроме слияния над строками определены операции сравнения ,=,,=. Две строки сравниваются посимвольно, слева направо, по кодам символов. Если одна строка меньше другой по длине, недостающие символы короткой строки заменяются символом с кодом 0.

 

назад содержание вперед

Процедуры и функции для работы со строками

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

Length(s:string):integer

Функция возвращает в качестве результата значение текущей длины строки-параметра

Пример.

n := length('Pascal'); {n будет равно 6}


Concat(s1,[s2,...,sn]:string):string

Функция выполняет слияние строк-параметров, которых может быть произвольное количество. Каждый параметр является выражением строкового типа. Если длина строки-результата превышает 255 символов, то она усекается до 255 символов. Данная функция эквивалентна операции конкатенации "+" и работает немного менее эффективно, чем эта операция.
 

Copy(s:string; index:integer; count:integer):string

Функция возвращает подстроку, выделенную из исходной строки s, длиной count символов, начиная с символа под номером index.

Пример.

s := 'Система Turbo Pascal';

s2 := copy(s, 1, 7); {s2 будет равно 'Система'}

s3 := copy(s, 9, 5); {s3 будет равно 'Turbo'}

s4 := copy(s, 15, 6); {s4 будет равно 'Pascal'}


Delete(var s:string; index,count:integer)

Процедура удаляет из строки-параметра s подстроку длиной count символов, начиная с символа под номером index.

Пример.

s := 'Система Turbo Pascal';

delete(s,8,6); {s будет равно 'Система Pascal'}


Insert(source:string; var s:string;index:integer)

Процедура предназначена для вставки строки source в строку s, начиная с символа index этой строки.

Пример.

s := 'Система Pascal';

insert('Turbo ',s,9); {s будет равно 'Система Turbo Pascal'}


Pos(substr,s:string):byte

Функция производит поиск в строке s подстроки substr. Результатом функции является номер первой позиции подстроки в исходной строке. Если подстрока не найдена, то функция возвращает 0.

Пример.

s := 'Система Turbo Pascal';

x1 := pos('Pascal', s); {x1 будет равно 15}

x2 := pos('Basic', s); {x2 будет равно 0}


Str(X: арифметическое выражение; var st: string)

Процедура преобразует численное выражение X в его строковое представление и помещает результат в st.
 

Val(st: string; x: числовая переменная; var code: integer)

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

В дополнение приведем некоторые функции, связанные с типом char, но которые тем не менее часто используются при работе со строками.
 

Chr(n: byte): char

Функция возвращает символ по коду, равному значению выражения n. Если n можно представить как числовую константу, то можно также пользоваться записью #n.
 

Ord(ch: char): byte;

В данном случае функция возвращает код символа ch.
 

UpCase(c: char): char;

Если c - строчная латинская буква, то функция возвращает соответствующую прописную латинскую букву, в противном случае символ c возвращается без изменения.

 

назад содержание вперед

Пример нахождения НОД двух натуральных чисел

  1. простой способ:

Program nod;

Var A, B, C: Integer;

Begin

Repeat

write (‘Введите число А: ’);

read (A);

if Aошибка, число

Until A=1;

Repeat

write (‘Введите число B: ’);

read (B);

if Bошибка, число

Until B=1;

Repeat if A

Begin

C:=A;

A:=B;

B:=C;

End;

A:=A mod B

Until A:=0;

Writeln (‘НОД= ’, B);

End.

  1. пример нахождения с процедурой

Program NODPROC;

Var A, B, C: Integer;

Procedure vvod (x: Char; Var Y: Integer);

Begin

Repeat

Write (‘Введите число ’,x, ‘: ’);

Read (Y);

If YОшибка, число

Until Y1;

End;

Begin

Vvod (‘A’, A);

Vvod (‘B’, B);

Repeat if A
Begin

C:=A;

A:=B;

B:=C;

End;

A:=A mod B

Until A:=0;

Writeln (‘НОД= ’, B);

End.



Процедуры и функции в Паскале

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


Например: X:=A(D);
вызывается функция А с аргументом D. Результат возвращается и умножается на 5. Все помещается в переменную X. Но допускается вызов функции без возвращения значения.
Например: A(D);

Общий вид:
function ():;
;
begin
;
end;

В функции существует предопределенная переменная Result.
Например:

1

2

3

4

5

function MY (a,b : Integer) : Integer;

begin

Result:=a+b;

Result:=Result*a;

end;

Объявление процедуры практически ничем не отличается от объявления функции в Паскале. Для процедуры не указывается возвращаемое значение.

Общий вид:
procedure ();
;
begin
;
end;

Пример:

1

2

3

4

5

procedure MY (var a,b : Integer);

Var itog:Integer;

begin

itog:=a+b;

end;




«Процедуры и функции в Паскале» (урок 10 класс)

Тема: “Процедуры и функции в Паскале”.

Вид урока: комбинированный (урок-практикум, тренировочный урок).

Цели урока:

          • закрепить теоретические знания;

          • правила записи и вызова подпрограмм;

          • понятия локальных и глобальных величин;

          • формальных и фактических параметров;

          • рассмотреть отличия между процедурами и функциями,

          • составить программы с использованием подпрограмм;

          • ответить на тест по теме: «Процедуры и функции»

Задачи

Образовательные

Воспитательные

Развивающие

Закрепление приобретённых знаний и умений,

приобретение навыков при решении задач на компьютере,

систематизация полученных знаний

Развитие познавательного интереса, воспитание самостоятельности при выполнении заданий,

выработка умения работать в коллективе

развитие логического мышления, памяти, алгоритмической культуры учащихся; знаний и умений при составлении подпрограмм на языке Паскаль

Учащиеся должны

знать

уметь

назначение подпрограмм в языке Паскаль; правила записи, механизм вызова и исполнения функций и процедур пользователя; понятия локальных и глобальных величин, формальных и фактических параметров;

отличия между процедурами и функциями

применять принцип модульности при решении задач средствами языка программирования Паскаль;

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

Оборудование:

  • Компьютеры, мультимедийный проектор, экран.

  • ПО MS Windows XP: среда программирования Turbo Pascal 7.0 и Паскаль АВС.

  • Раздаточный материал.

Межпредметные связи: математика, физика.

Этапы урока:

Организационный момент

Приветствие класса. Контроль отсутствующих. Формулировка темы и цели урока.

Ход урока.

Актуализация опорных знаний.

Повторить структуру Паскаль программы:

PROGRAM имя;
раздел описаний
BEGIN
раздел операторов
END.
Раздел описаний:
USES - подключение библиотеки
VAR - подраздел переменных
PROCEDURE, FUNCTION - подраздел процедур и функций.

Контроль знаний учащихся по теме: «Процедуры и функции».

УСТНЫЙ ОПРОС.

Вступление

Иногда говорят, «за деревьями не видно леса».

Почему, и какова связь с темой урока?

Часто бывает, что за операторами не видно программы. Внешний вид и лёгкость чтения программы улучшаются, если придать программе хорошую структуру. Получается очень разборчиво. Пример(рис1)







Что такое подпрограмма?

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

Подпрограмма это разделение сложной задачи на подзадачи

Зачем нужны подпрограммы?

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


Такой принцип дефрагментации программы называется …?

Нисходящим программированием и соответствует принципам структурного программирования. Повышается надёжность программы. Использование подпрограмм сокращает текст программы, существенно уменьшает время исполнения.

Где располагаются подпрограммы в программе?
В программе описание процедур и функций между разделами переменных и операторов.

Как оформляется подпрограмма?
Подпрограмма оформляется подобно основной программе, т.е. состоит из заголовка, раздела описаний, раздела операторов.

Различие глобальных и локальных переменных?
Все имена, представленные в разделе описаний основной программы, называются глобальными. Они действуют как в разделе операторов основной программы, так и в любой подпрограмме. Имена, представленные в разделе описаний подпрограммы, называют локальными. Они действуют только в рамках подпрограммы и недоступны операторам основной программы.

Какие виды подпрограмм вы знаете?

В Паскале используются подпрограммы двух видов: процедуры (PROCEDURE) и функции (FUNCTION).

Встроенные (стандартные) процедуры и функции являются частью языка и могут вызываться по имени без предварительного описания. Например, abs, sqrt, ln, sin…- функции (возвращают результат), readln, write… – процедуры (не возвращают результат). Их наличие существенно облегчает разработку прикладных программ. Однако в большинстве случаев некоторые специфичные для данной программы действия не находят прямых аналогов в библиотеках Turbo Pascal, и тогда программисту приходится разрабатывать свои нестандартные процедуры и функции. Например, вычисление функции Эйри, Лежандра, Бесселя и др.

Оформление процедур.
PROCEDURE имя (формальные параметры);
раздел описаний
BEGIN
раздел операторов
END;
Вызывается процедура по имени:
имя (фактические параметры);

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

Рассмотрим пример программы с процедурой.

В программе risunok не используются дополнительные переменные, поэтому после первой строки с указанием имени программы сразу следует описание заголовка процедуры. Что появится на экране после реализации следующей программы?


program risunok;

procedure kwadrat;

begin

writeln('* * *');

writeln('* *');

writeln('* * *');

end;


begin

kwadrat; writeln; writeln;

kwadrat; writeln; writeln;

kwadrat;

end.


Ученики:

Output


* * *

* *

* * *



* * *

* *

* * *



* * *

* *

* * *


Как называется первая строка? Показать тело процедуры. Какова структура процедуры? Как называются переменные, описанные в программе?

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

Процедура имеет такую же структуру, как и программа, но с двумя отличиями:

  • Заголовок процедуры имеет другой синтаксис и включает служебное слово Procedure;

  • Описание процедуры заканчивается точкой с запятой (а не точкой).

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

Оформление функций.

Функция - это подпрограмма, результат выполнения которой есть единственное скалярное значение, присваемое имени этой функции.



FUNCTION ИМЯ(список формальных параметров: тип): тип;
раздел описаний
BEGIN
раздел операторов;
END;
Вызывается функция по ее имени с указанием фактических параметров. При этом вызов функции можно делать непосредственно внутри выражения, подобно тому, как используются стандартные встроенные функции, например SIN(X).

В чём состоит отличие процедуры от функции при вызове?

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

Далее используем диск с КУРСАМИ по теме: «Подпрограммы» слайд 7,8,9 и 10,11

По способу взаимодействия вызывающей и вызываемой подпрограмм параметры подразделяются на

  • входные (сообщают подпрограмме исходные данные),

  • выходные (передают из подпрограммы результаты),

  • входные и выходные (сообщают исходные данные и передают результаты).

Для обеспечения такого взаимодействия используются

  • параметры-значения,

  • параметры-переменные

  • и параметры-константы.

КОМПЬЮТЕРНЫЙ ПРАКТИКУМ

Раздаются ученикам карточки с заданиями

  • Задание на использование процедуры с параметрами-переменными. Осуществить обмен двух переменных.


  • Задание на использование процедуры без параметров, необходимо вывести 135 звёздочек в строку.

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

  • Задание* на составление подпрограммы-функции вычисления общего сопротивления для двух параллельно соединенных проводников.


R2


R1


R3


R6


R4


R5







ТЕСТОВЫЕ ЗАДАНИЯ

Используя электронное учебное пособие для изучения программирования «Образовательные комплексы – вычислительная математика и программирование», входящее в систему программ 1С:Образование 3.0 информационно-технологического профиля (Б-углубленного изучение языка программирования Turbo Pascal) предлагается ученикам пройти два варианта теста на центральном компьютере проецируя изображение на доску по теме: «Подпрограммы».


Фактические параметры используются при...


...могут использоваться и при вызове, и при описании

...описании подпрограммы

...вызове подпрограммы




Списки параметров нужны для...


...организации интерфейса между программой и подпрограммой

...вызова подпрограммы

...обмена информацией между вызывающей программой и вызываемой подпрограммой




После вызова подпрограммы из программы...


...запускается подпрограмма, программа и подпрограмма работают параллельно

...выполнение программы приостанавливается и управление передается в подпрограмму, после завершения подпрограммы управление возвращается в программу.






Тело подпрограммы в Турбо-Паскале должно находиться:


...в разделе описаний

...либо в разделе описаний, либо в разделе выполняемых операторов

...в разделе выполняемых операторов





Глобальные и локальные имена занимают...


...одну и туже область оперативной памяти

...размещаются в разных областях ОП только на время работы соответствующего программного блока

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




Изобретение подпрограмм сравнивают с...


...открытием Америки

...изобретением электрической лампочки

...изобретением колеса



Параметры делятся на...







...входные, выходные, входные и выходные одновременно

...выходные

...входные и выходные



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







...явно по виду фактического параметра

...неявно, причем определяются по виду фактического параметра

...явно при описании формальных параметров




Анализ результатов


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

Демонстрация программ с использованием проектора.

Первое задание на использование процедуры с параметрами-переменными


program Zerkalo;

var A,B:integer;

procedure obmen (var x,y:integer );

var Help: integer;

begin

Help:=x; x:=y;y:=Help;

end;


begin

a:=1; b:=2;writeln(A,' ',B);

obmen(a,b);writeln(A,' ',B);

obmen(a,b);writeln(A,' ',B);

end.





Output


1 2


2 1


1 2



Второе задание на использование процедуры без параметров, необходимо вывести 135 звёздочек в строку.


program StarLine;

procedure StarLine;

var i: integer;

begin

for i:=1 to 135 do

write('*');

end;


begin

StarLine;

end.


Output **************************************************************

Третье задание - программа, которая демонстрирует различия между процедурами и функциями на примере сложения двух целых чисел. Рассмотреть различия между этими двумя подходами.

program procedure_and_function;

var a,b,sum_numbers:integer;

procedure summing_up(var sum:integer; a,b:integer);

begin

sum:= a + b;

end;


function sum(a,b:integer):integer;

begin

sum:= a + b;

end;


begin

a := 12; {Установка начальных значений}

b := 15; {переменных "а" и "b"}


{Суммирование чисел с использованием процедуры}


summing_up(sum_numbers,a,b);

writeln('Cyмма чисел равна:',sum_numbers);


{Суммирование чисел с использованием функции}


sum_numbers:=sum(a,b);

writeln('Cyммa чисел равна:',sum_numbers);

{При обращение к функции можно непосредственно использовать оператор вывода writeln или write}

writeln('Cyммa чисел равна: ',sum(a,b)); end.

Вызов процедуры summing_up производится по ее имени. Наряду с параметрами-значениями а и b, которые подлежат сложению, в списке параметров процедуры присутствует параметр – переменная sum, который содержит возвращаемое процедурой значение – сумму.

Четвёртое задание* - Составить подпрограмму-функцию вычисления общего сопротивления для двух параллельно соединенных проводников.


X


Y






Описание функции на Паскале:

Function Par(X, Y: real):real;

­begin

Par:=X * Y / (X + Y);

end;

Внимание:

  • Не забудьте про то, что знаменатель дроби не должен быть равен 0, а также про тип данных. Исходные данные для тестирования программы задать самостоятельно.

Задание. Найти общее сопротивление проводников, соединённых по схеме:


R2


R1


R3


R6


R4


R5





Решение.


program sopr;

uses crt;


Function Par(X, Y: real):real;

begin

Par:=X * Y / (X + Y);

end;


var RO, r1, r2,r3,r4,r5,r6:real;


begin

clrscr; writeln;

write('r1=');read(r1);write('r2=');read(r2);write('r3=');read(r3);

write('r4=');read(r4);write('r5=');read(r5); write('r6=');read(r6);


RO := Par (R1, R2) + Par (R3, Par (R4, R5)) + R6;


writeln('RO=',RO:5:2);

end.

Проверка:

Если r1=r2=r3=r4=r5=r6=1, тогда RO=1,83

Использование функции пользователя в программе:

RO := Par (R1, R2) + Par (R3, Par (R4, R5)) + R6;

Здесь трижды вызывается функция Par. При третьем обращении к функции Par (X, Y) в качестве фактических параметров используются: для X – переменная R3, для Y – функция Par (R4, R5).

R1, R2, R3, R4, R5, R6, RO – глобальные переменные вещественного типа.

Домашнее задание

  • Читать стр.243-252

  • Подготовить ответ на контрольный вопрос №1 стр.252

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

Подведение итогов

  • В каких случаях целесообразно использовать подпрограмму как функцию, в каких как процедуру?

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

Процедура – подпрограмма, не возвращающая ничего

Функция – подпрограмма, возвращающая значение.

Функции являются частным случаем процедур.

  • Что можно сказать о количестве, типе и порядке следования фактических и формальных параметров?

Количество, тип и порядок следования фактических и формальных параметров должны совпадать.

  • Обобщение деятельности учащихся на уроке. Выставление оценок.


Приложение 2




R2


R1


R3


R5


R4

Вариант 1

Вариант 2


R2


R1


R4


R6


R5


R3


Вариант 3


R2


R1


R3


R4


R5


R7


R8


R6


R2


R1


R3


R5


R6


R4


R8


R7


Вариант 4












































Ответы - операторы присваивания для вариантов заданий по карточкам

вариант 1 RO := R1 + Par(R2, R3 + R4) + R5;

вариант 2 RO := Par (R1, R2) + R3 + Par (Par (R4, R5), R6);

вариант 3 RO := Par (Par (R1 + R2 + R3, R4), R5 + R6) + Par(R7, R8);

вариант 4 RO := Par (R1, Par(R2 + R3, R4)) + Par (Par (R5, R6), R7 + R8);

где RO – общее сопротивление на участке цепи,

R1, R2, R3, R4, R5, R6, R7, R8 – исходные данные.


program sopr;

uses crt;


Function Par(X, Y: real):real;

begin

Par:=X * Y / (X + Y);

end;


var RO, r1, r2,r3,r4,r5,r6,r7,r8:real;


begin

clrscr;writeln;

write('r1=');read(r1);write('r2=');read(r2);write('r3=');read(r3); write('r4=');read(r4);

write('r5=');read(r5); write('r6=');read(r6); write('r7=');read(r7); write('r8=');read(r8);


RO:= R1 + Par(R2, R3 + R4)+R5;

{RO := Par (R1, R2) + R3 + Par (Par (R4, R5), R6);

RO := Par (Par (R1 + R2 + R3, R4), R5 + R6) + Par(R7, R8);

RO := Par (R1, Par(R2 + R3, R4)) + Par (Par (R5, R6), R7 + R8); }


writeln('RO=',RO:5:2);

end.


program sopr; {Вычисляет сопротивление электрической цепи}


uses crt;


function Sopr(r1,r2:real;t:integer):real;


begin

if t=1 then Sopr:=r1+r2 else

if t=2 then Sopr:=r1*r2/(r1+r2) else Sopr:=-1;

end;


var f, r1, r2:real; t:integer;


begin

clrscr;

writeln;

write('r1=');read(r1);

write('r2=');read(r2);

write('Тип соединения (1-последовательное, 2-параллельное) - ');read(t);

f:=Sopr(r1,r2,t);

writeln('Sopr=',f:5:2);


end.

Приложение 1

Карточки с условиями задач разной сложности для компьютерного практикума


Задание №1

Процедуры с параметрами-переменными.

Осуществить обмен двух переменных.


Задание №2

Процедуры без параметров.

Вывести 135 звёздочек в строку.


Задание №3

Демонстрация различий между процедурами и функциями.

Сложение двух целых чисел.


Задание №4


X


Y



а) Составить подпрограмму-функцию вычисления общего сопротивления для двух параллельно соединенных проводников.



Описание функции на Паскале:

Function Par(X, Y: real):real;

­begin

Par:=X * Y / (X + Y);

end;


Внимание:

  • Не забудьте про то, что знаменатель дроби не должен быть равен 0, а также про тип данных.

Исходные данные для тестирования программ готовьте самостоятельно







R2


R1


R3


R6


R4


R5

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






Скачать

Рекомендуем курсы ПК и ППК для учителей

Вебинар для учителей

Свидетельство об участии БЕСПЛАТНО!