Задания на процедуры и функции в паскале

образовательная

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

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

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

    I. Орг. момент

    II. Вступление. Актуальность

    Выдать задание на листочках ( Приложение 1 ). Найти повторы.

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

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

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

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

    III. Объяснение нового материала

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

    Структура процедуры повторяет структуру программы, это «программа в миниатюре» — она также представлена заголовком и телом.

    Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры.

    VAR … // раздел описания переменных главной программы

    //тело главной программы

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

    Пример 1. Программа вычисления площади и периметра.

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

    write('Введите стороны a, b: ');

    Вызов в нужном месте:

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

    Т.е. мы «научили» ПК новой команде tx. Ею можно пользоваться только в этой программе и, причем, много раз. ( Приложение 3 )

    Достоинства подпрограмм:

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

    Пример 2. Пользователь вводит две стороны трех прямоугольников. Вывести их площади.

    Можно решить задачу так:

    writeln(‘Введите a и b:’);

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

    Читайте также:  Даны катеты прямоугольного треугольника найти его периметр

    текст

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

    procedure pl (c,d: integer);

    writeln(‘площадь прямоугольника со сторонами ’,c, ‘ ‘ ,d, ‘=‘,S);

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

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

    pl(4,5);

    Фактические параметры должны совпадать по типу и количеству с формальными.

    Итак, главная программа:

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

    Составим процедуру проверки:

    procedure error (f,g:integer);

    Итак формат процедуры:

    Procedure (формальные параметры);

    Пример 3. Составить программу обмена местами двух чисел с=5 и d=7.

    procedure obmen ( a,b:integer);

    writeln ('Введите 2 числа: ');

    После запуска программы видно, что поменялись местами формальные параметры (в процедуре), а фактические (которые используются в лавной программе) — не поменялись. Рассмотрим рисунок, на котором приведена часть оперативной памяти:

    1) при вызове процедуры obmen с двумя параметрами 5 и 7, в переменные a и b помещаются тоже числа 5 и 7 соответственно:

    2) далее в процедуре осуществляется перестановка значений ячеек памяти a и b:

    3) но в переменных c и d данные не поменялись, т.к. они находятся в других ячейках памяти.

    Для того чтобы переменные c и d, a и b ссылались на одни и те же ячейки памяти (если изменятся значения a и b, то изменятся значения и c, d) необходимо при описании формальных параметров, перед нужными переменными добавить слово VAR:

    procedure obmen (var a,b:integer);

    Измените программу obmenDan:

    ошибка из-за var. Числа — константы, которые нельзя изменять в процедуре.

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

    procedure circle (r:real);

    Процедура должна возвращать результат:

    procedure circle (r:real; var S:real);

    readln(a, e);

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

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

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

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

    Например, sqr(x) — возведет в квадрат значение х и возвратит в точку вызова вычисленное значение квадрата числа х: y:=sqr(x);

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

    Function (формальные параметры) : ;

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

    Пример 5. Переделаем задачу о площади круга.

    function circle (r:real): real;

    a:=circle(5); (ОБЯЗАТЕЛЬНО присваиваем)

    Используем функцию нахождения факториала, т.к подаем на вход и получаем результат.

    function fact (a:integer): integer;

    В строке fact:=fact*I;

    компилятор найдет ошибку, т.к fact должна вызываться с параметрами. Поэтому обячно вводят дополнительную переменную, в которую помещают результат. А потом в переменную fact присваивают этот результат:

    var sum,n,j: integer;

    function fact (a: integer): integer;

    IV. Итог урока

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

    Читайте также:  Голосовой переводчик с португальского на русский

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

    Решить задачи (письменно):

    1. Составить процедуру, которая во введенной строке заменяет все буквы a на *.
    2. Даны два предложения. Найти общее количество букв «н» в них. (Определить функцию для расчета количества букв «н» в предложении.)

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

    лабораторные работы и задачи по программированию и информатике, егэ по информатике

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

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

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

    Итак, рассмотрим синтаксис объявления и описания процедуры в Паскале

    procedure pr; var i:integer; begin for i:=1 to 60 do begin <тело подпрограммы>write('*'); writeln; end; end; <конец подпрограммы>begin pr; <вызов процедуры>end.

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

    Процедуры с параметрами. Фактические и формальные параметры

    Рассмотрим пример необходимости использования процедуры.

    Особенность: Три похожие фигуры.

  • общее: размеры, угол поворота
  • отличия: координаты, цвет
  • Алгоритм решения:

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

    Решение на паскале:
    Процедура:

    Программа:

    uses GraphABC; procedure Tr( x, y: integer; color:system.Drawing.Color); begin MoveTo(x, y); LineTo(x, y-60); LineTo(x+100, y); LineTo(x, y); FloodFill(x+20, y-20,color); end; begin SetPenColor(clBlack); Tr(100, 100, clBlue); Tr(200, 100, clGreen); Tr(200, 160, clRed); end.

    Рассмотрим синтаксис объявления и описания процедуры с параметрами в Паскале.

    Параметры процедуры (в некоторых языках они называются аргументами) указываются в скобках после ее имени (в объявлении).

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

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

    var s:char; procedure pr(a:char); var i:integer; begin for i:=1 to 60 do begin write(a); writeln; end; end; begin writeln('simvol'); readln(s); pr(s); end.

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

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

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

    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('vvedite x,y'); readln(x,y); MaxNumber(x,y,m); <фактические параметры>writeln('max=',m) end.

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

    Читайте также:  Как вернуть лаунчер по умолчанию

    Таким образом, сформулируем понятия:

    Если в качестве формального параметра указана обычная переменная с указанием ее типа, то такой параметр есть параметр-значение или входной параметр ( a и b в примере). Тип данных формального параметра-значения должен соответствовать типу данных его фактического параметра ( a и b должны попарно соответствовать типу данных x и y ).

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

    var x,y:integer; procedure exchange(a: integer;var b:integer); var c:integer; begin if a>b then begin c:=a; a:=b; b:=c; <второй параметр процедуры — b — всегда будет максимальным>end; end; begin writeln('введите два числа'); readln(x,y); exchange (x,y); writeln('max=',y) end.

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

    1. Необходимо определить наибольший общий делитель двух введенных чисел, используя цикл.
    2. Необходимо определить наибольший общий делитель двух введенных чисел, используя процедуру (два параметра-значения, один параметр-переменная).


    Словесный алгоритм:

    • Вводятся a и b (например, 18 и 24)
    • В цикле повторяем действия:
    • Если а 18 если b>a -> swap(a,b) 24/18 = 1(6) a=6, b=18 6 18/6 =3(0) a=0, b=6 6 128 и 56 128/56=2(16) a=16,b=56 16 56/16=3(8) a=8,b=16 8 16/8=2(0) a=0, b=8 8

    0 do begin if a

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

    const n = 10; var i:integer; a, b: array[1..n] of integer; procedure arr_out (k:integer; arr: array[1..n] of integer); var i: byte; begin write ('вывод массива: '); for i := 1 to k do write (arr[i]:4); writeln; end; begin for i:=1 to n do a[i]:=random(10); arr_out (n, a); end.

    Пояснение:
    Тело основной программы:
    — формирование элементов массива (с функцией random ).
    — вызов процедуры с двумя параметрами: количество элементов, массив.
    Тело процедуры:
    — вывод элементов массива с использованием параметров

    Продолжим нашу задачу:

    const n = 10; var a, b: array[1..n] of integer; procedure arr_rand (k:integer; var arr: array[1..n] of integer); var i: byte; begin write ('Заполнение массива случайными числами '); randomize; for i := 1 to k do arr[i]:=random(100); end; begin arr_rand (n, a); end.

    Самостоятельная работа

    Общее задание 2: Описать процедуру Mean(X, Y, AMean, GMean) , вычисляющую:

    • среднее арифметическое AMean = (X+Y)/2
    • и среднее геометрическое GMean = √X*Y двух положительных вещественных чисел X и Y .

    X и Y/ — входные параметры, AMean и GMean — выходные параметры вещественного типа.
    В основной программе: Для заданных A, B, C, D найти среднее арифметическое и среднее геометрическое для пар (A, B), (A, C), (A, D), используя созданную процедуру.

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

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

    * сложное С помощью процедуры формировать случайным образом одномерные массивы из 10 элементов (значения от −20 до +20). Вызывать процедуру до тех пор, пока среди значений не появится ноль.

    Оцените статью
    Adblock detector