ВСР_инф_МЭО. Методические рекомендации по их выполнению по дисциплине Информатика и икт
Скачать 1.29 Mb.
|
Самостоятельная работа № 12Составление подпрограмм в Паскале Цель работы: ознакомление с подпрограммами-функциями; ознакомление с подпрограммами-процедурами; получение навыков в составлении х программ на основе приобретённых сведений. Общие понятия Автономная часть программы, с помощью которой можно производить одни и те же вычисления с разными исходными данными и в различных местах программы, многократно называется подпрограммой. Преимущества использования подпрограмм уменьшение объема программы, сокращение времени на отладку. В Pascal существует 2 вида подпрограмм: процедуры и функции. В отличие от стандартных процедур и функций, описанных в специальных модулях, все пользовательские подпрограммы должны быть описаны в начале программы (до начала тела программы). Функция Function Sum_v (var a:vector;n:byte): integer; зарезер. имя список формальных тип возвращ. слово функции параметров значения Процедура Procedure Sum_vec (a:vector;n:byte; var sum:integer); зарезерв. имя список формальных слово процедуры параметров Основные отличия между процедурами и функциями приведены в таблице 5. Таблица 5 Основные отличия между процедурами и функциями
Выполнение подпрограммы начинается при обращении к ней из основной программы. Процесс обращения называется вызовом процедуры или функции. Когда в теле основной программы встречается оператор вызова подпрограммы, выполнение инструкций основной программы приостанавливается и выполняются инструкции подпрограммы. После выполнения всех инструкций подпрограммы продолжается выполнение инструкций основной программы с оператора, следующего за обращением к процедуре или функции. Формальные и фактические параметры Параметры (переменные), определяемые при описании процедуры или функции, называются формальными. Параметры (переменные), задаваемые при вызове подпрограммы, называются фактическими. Замена формальных параметров фактическими делается так: на место первого формального параметра подставляется первый фактический параметр, на место второго формального параметра второй фактический и т.д. Поэтому количество и типы формальных и фактических параметров должны совпадать. Формальные параметры, если они приводятся при описании процедуры, можно разделить на несколько категорий. Мы будем рассматривать только две: параметры-значения; параметры-переменные. Основные отличия параметров-значений и параметров-переменных приведены в таблице 6. Таблица 6 Основные отличия параметров-значений и параметров-переменных
Локальные и глобальные параметры Переменные и константы, описанные внутри подпрограммы, называются локальными. Для основной программы они не существуют. Переменные и константы, определенные в разделе описаний основной программы, называются глобальными. Любой подпрограмме доступны все глобальные параметры, за исключением тех, с чьими именами совпадают имена ее параметров или локальных переменных. В заголовках процедур и функций в списке формальных параметров необходимо указывать их тип. Правилами языка Pascal определено, что можно использовать либо стандартные типы (определенными разработчиками языка), либо так называемые предопределенные типы (определённые программистом ранее). Вводить новый тип в списке формальных параметров не допускается. Рекурсия Язык Pascal допускает, чтобы процедуры или функции были рекурсивными. Рекурсия это такой способ организации вычислительного процесса, при котором процедура или функция в собственном разделе операторов обращается сама к себе. В ряде случаев этот прием позволяет существенно повысить эффективность программирования. Рекурсивная форма организации алгоритма обычно выглядит изящнее итерационной и дает более компактный текст программы, но при выполнении, как правило, медленнее и может вызвать переполнение стека. Стек – это специальная область памяти (конечное число ячеек), где сохраняется адрес возврата (адрес вызывающей программы, используется для передачи управления вызывающей программе). Стеки используются также для передачи параметров в процедуры (для обычных параметров в стек заносятся их значения, для параметров-переменных – их адреса), размер стека ограничен. Стек можно представить в виде стопки книг. Если стопка достигла максимального размера, то при добавлении новой книги сверху – нижняя книга должна быть убрана. Нужно обязательно отслеживать в программе наполнение стека, то есть не допускать зацикливания рекурсии. Примеры решения задач Пример 1. Вычислить хn , используя рекурсивную функцию. Решение: uses crt; var x1,x2:Writer; i,m:byte; s:longint; function xn(x,n:byte):longint; begin if n=0 then xn:=1 else xn:=xn(x,n-1)*x; end; begin clrscr; write('x,n='); readln(x1,m); writeln('xn-',xn(x1,m)); readkey; end. Пример 2. Написать рекурсивную функцию вычисления суммы 1 + 2 + 3 + 4 + 5 + … + N. Решение: uses crt; var m:Writer; funnction sum(n:Writer):longint; begin if n=1 then sum:=1 else sum:=sum(n-1)+n; end; begin write('n='); readln(m); writeln('сумма -',sum(m)); readkey; end. Пример 3. Написать функцию, подсчитывающую количество цифр числа. Используя ее, определить, в каком из двух данных чисел больше цифр. Решение: uses crt; var nl,n2:longint; kl,k2:byte; function Quantity(x:longint):byte; var k:byte; begin while x<>0 do begin inc(k); x:=x div 10; end; Quantity:=k; end; begin writeln ('Введите два числа’); readln(nl,n2); kl:=Quantity(nl); {количество цифр первого числа} k2:=Quantity(n2);{количество цифр второго числа} if kl=k2 then writeln('Одинаковое количество цифр') else if kl>k2 then writeln('В первом числе цифр больше') else writeln('Во втором числе цифр больше'); readkey; end. Пример 4. Дана точка. Определить, лежит ли она в кольце. Решение: uses crt; var x,y,r1,r2,a,b:real; procedure haltpr; begin writeln('Неверные данные'); write('r1 readln; halt; end; begin clrscr; write('координаты центра окр. a=');readln(a); write('координаты центра окр. b=');readln(b); write('x='); readln(x); write('y='); readln(y); write('r1=');readln(r1); write('r2=');readln(r2); if r1>r2 then haltpr; if (sqr(x-a)+sqr(y-b) then write('лежит') else write('не лежит'); readln; end. Пример 5. Определить, сократимая ли дробь a/b (дробь a/b несократимая, если НОД=1). Решение: uses crt; var m,n,ot:longint; procedure nod(a,b:longint; var n:longint); begin while a<>b do if a>b then a:=a-b else b:=b-a; n:=a; end; begin clrscr; write('числитель'); readln(m); write('знаменатель'); readln(n); nod(m,n,ot); if ot=1 then write('несократимая') else write('сократимая'); readln; end. Задание: Выполните задания в соответствии с номером учащегося в списке по журналу (см. в табл. ). Таблица – Номера вариантов учащихся по списку
Задания для самостоятельного решения
, где . Для вычисления функции f(x, n) используйте подпрограмму-функцию. Значения аргумента x введите с клавиатуры. 17. Составьте программу, вычисляющую значение функции: , где Для вычисления функции f(i) используйте подпрограмму-функцию. Значения аргумента nвведите с клавиатуры. 18. Составьте программу, вычисляющую значение функции: , где Для вычисления функции f(t) используйте подпрограмму-функцию. Значения аргумента x введите с клавиатуры. После ввода данных программа должна проверять условие существования функции z(x). 19. Составьте программу, вычисляющую значение функции: , где Для вычисления функции f(x) используйте подпрограмму-функцию. Значения аргументов a и bвведите с клавиатуры. После ввода данных программа должна проверять условие существования функции z(a, b). 20. Напишите функцию для определения номера первого встретившегося элемента в одномерном целочисленном массиве произвольной длины, значение которого совпадает с заданным. При отсутствии такого элемента функция должна возвращать значение 1. |