Pascal подпрограми процедури и функции рекурсия - стр
Глава 7. Подпрограми в Pascal. процедури и функции. рекурсия
1. Метод на дедуктивно програмиране
Нека се отклоним за известно време от програмирането и да поговорим за творческия процес като цяло, не само за програмист или математик, но, например, за художник или архитект.
Да кажем, че един художник ще нарисува картина: портрет на човек или нещо друго. Първо в дълбините на съзнанието му узрява общият образ на бъдещата творба, след което започва нейното реално въплъщение върху платно, хартия, дърво или нещо друго. И тук започва тежката работа. Художникът прави скици, рисунки на отделни фрагменти от картината, а след това създава единна творба, въплъщаваща в цветове, цвят и сянка образа, който е понесъл.
Архитектът, много преди да създаде проект за своята нова конструкция, също го вижда като цяло и след това въплъщава един проект на сграда или структура в отделни части.
Подобно на тях, програмистът трябва да види като цяло програма, която решава някакъв проблем, след което да я раздели на отделни части, да състави тези части от програмата на избрания език за програмиране, да ги комбинира в едно цяло и да получи програма.
И така, целият творчески процес може да бъде разделен (разбира се, чисто условно) на следните етапи:
1) основната идея за решаване на проблема;
2) общият дизайн на програмата;
3) избор на отделни, елементарни части от програмата;
4) практическо изпълнение на езика за програмиране на тези части от програмата;
5) комбинирането им в една програма.
Такъв процес на програмиране се нарича структуриран или отгоре надолу. Ще се запознаем с този процес по-подробно по-късно, когато изучаваме поне основите на езика за програмиране, но за отделнитечасти, "тухли", които изграждат програмата, ще научите в този урок.
Подпрограмата е група от оператори, които се извикват няколко пъти от основната програма. Понякога може да бъде 2, 3 пъти и много често, всеки път от цикъла на изпълнение на основната програма.
Съвсем ясно е, че е трудно да се напишат едни и същи групи изрази няколко пъти, извършва се много "техническа" работа, а в някои случаи е просто невъзможно (ако трябва да се обаждате всеки път, когато изпълнявате цикъла).
За да се улесни тази работа, са създадени подпрограми.
Използването на подпрограми ви позволява да:
1) направете основната програма по-визуална и компактна;
2) намаляване на обема на използваната компютърна памет;
3) намаляване на времето за отстраняване на грешки в програмата.
В Pascal има два вида подпрограми: процедури и функции.
Разгледайте следния прост пример, с помощта на който ще се опитаме да разберем конструкцията на процедурите в Pascal.
Пример 1 . Напишете програма за проверка дали три числа са взаимно прости.
Знаем, че числата се наричат относително прости, ако техният най-голям общ делител (gcd) е равен на 1. Така че, за да решим тази задача, ще трябва да намерим gcd на числата два пъти. Ако са дадени три числа: a, b, c, тогава намерете gcd(a, b) и след това намерете gcd(gcd(a, b), c).
Не искаме да пишем оператори за намиране на GCD два пъти, така че ще издадем операторите за GCD като процедура.
Вижте как ще изглежда в програмата:
a, b, c, k : цяло число;
Процедура nod(a, b : цяло число; var n : цяло число);
write('Въведете три естествени числа '); readln(a, b, c);
if k = 1 then writeln('Копрости числа')
else writeln('Числата не са взаимно прости')
INраздел с описания, след декларацията на променливите се изписва заглавието на процедурата: Процедура
Тази дума е служебна и е запазена в Pascal. На същия ред с него, разделено с интервал, се изписва името на процедурата, което трябва да отговаря на всички изисквания за имената, основните от които са: да започват с буква и да нямат интервали, т.е. изискванията са същите като за името на програмата (при нас името на процедурата е nod):
Процедура nod(a, b : цяло число; var n : цяло число);
Освен това в скоби се изписват имената на променливите и техните типове, чиито стойности ще бъдат въведени в процедурата от основната програма, в нашия случай има две от тях ( a , b ) и имат тип integer .
Веднага трябва да се отбележи, че имената на тези променливи може да не съвпадат с имената на променливите в основната програма, да кажем, че можем да ги обозначим с m, n или други имена.
След точка и запетая и запазената дума var се записват променливи и техните типове, чиито стойности ще бъдат резултат от процедурата и изход от нея към основната програма. В нашия пример има само една такава променлива - n. Той ще изведе стойността на gcd на числата a и b. Името му може да има същото име и в главната програма и това по никакъв начин няма да повлияе на работата на процедурата.
Обърнете внимание, че променливите, чиито стойности са въведени от главната програма, не се предшестват от думата var, но променлива, чиято стойност се извежда в главната програма, се предшества от тази дума. Това е много важно обстоятелство!
Така че, ако поставите var преди a и b , тогава компилаторът ще възприеме тези променливи като изходни променливи и няма да приеме стойностите, въведени за тях, и обратно, ако var не е написана преди изходната променлива, тогава компилаторът ще го възприеме като вход и ще покаже стойността му вняма да има основна програма.
По-нататъшното изграждане на процедурата се изгражда по същия начин като основната програма Pascal.
Описани са променливите, които ще участват в нейната работа, но техните имена не трябва да повтарят имената на вече описаните входни и изходни параметри в заглавката на програмата. Операторите, необходими за работа, са описани по-долу.
В нашия пример процедурата за кимване би била:
Процедура nod(a, b : цяло число; var n : цяло число);
Основната програма е изградена по обичайния начин, но когато е необходимо да се намери НОД на числата, се отнася до процедурата. как?
За да направите това, те се позовават на него по име и в скоби записват действителните стойности на входните променливи (в нашия случай за променливи a и b), както и имената на изходните променливи (в нашия случай k).
От секцията на програмата по-долу може да се види, че при първото извикване на процедурата nod се определя НОД на числата a и b (nod(a, b, k) и резултатът се съхранява в променливата k, след това стойностите на променливите a и b се променят и отново се извиква процедурата nod, която вече намира НОД на числата k и c и присвоява резултата на променливата k.
Можете да видите основната част от програмата:
write('Въведете три естествени числа '); readln(a, b, c);
if k = 1 then writeln('Копрости числа')
else writeln('Числата не са взаимно прости')
Нека направим общи изводи за изграждането и действието на процедурите
Процедурите се поставят в раздела за описание и започват със запазена (сервизна) дума
На процедурата трябва да се даде име, което трябва да отговаря на същите изисквания като имената на променливи, т.е. може да бъде една или повече букви, комбинация от букви и цели числа, но без интервали, започване с буква и т.н.
След името в скоби се изписват променливите - параметри и технитетип: вход, чиито стойности се използват за изчисление като аргументи.
Изходните параметри са тези променливи, в които се получава резултатът от изпълнението на процедурата.
Входните и изходните параметри на процедурата се наричат формални параметри.
Действителните, специфични, стойности на формалните параметри трябва да бъдат получени в основната програма след извикването й (засега в процедурата те не са нищо повече от "празни").
След формалните параметри се описват променливите, които са необходими директно за работата на процедурата.
Това са параметри на процедурата. Те са необходими в нея, както във всяка друга програма, и са описани по същия начин. Имената им трябва да са различни от имената на входните и изходните параметри.
Трябва да се отбележи, че процедурата може да бъде такава, че няма да има никакви параметри, а само тези, които ще бъдат въведени от програмата.
Описанието на процедурата изглежда така:
Той се намира в основната програма в секцията с описания.
Според входните и изходните параметри процедурите могат да бъдат от следните видове:
1) имат входни и изходни параметри:
Току що се запознахме с този тип програми.
2) имат входни параметри, но нямат изходни параметри:
3) имат изходни параметри, но нямат входни параметри:
4) нямат нито входни, нито изходни параметри:
В зависимост от това процедурите се различават по своя дизайн и функции.
Това е последвано от раздел от оператори, който се компилира по същите правила, както в другите програми.
Описва се процедурата и след това стартира основната програма.
Извикване на процедура от програма
Как се нарича подпрограма?
Името на процедурата е задължително. Действителните стойности са дадени в скоби.стойностите на входните параметри и тези променливи, в които изходните стойности ще бъдат "запомнени".
Помислете за пример, при който може да се използва процедура от втори тип: тя има входни параметри, но няма изходни параметри.
Пример 2 . Напишете програма, която определя кои числа от зададения интервал [a; b] може да се представи като сбор от две цели числа на квадрат?
В тази програма ще трябва да проверим всяко от числата в интервала [a; b] дали може да се представи като сбор от квадратите на две числа, така че би било разумно да се разработи процедура, която да проверява едно число и след това да го извиква от главната програма, за да провери всяко число от интервала.
Ще създадем процедурата по следния начин. Нека е дадено числото n. Трябва да намерим две числа a и b, така че сумата от техните квадрати да е равна на n, т.е. решете уравнението в цели числа:
Има естествено желание да изпитате естествените числа от 1 до . Но до каква степен не е известно. Ако се доведат до числото n, това ще бъде твърде много ненужна и безполезна работа.
За да разберете този въпрос, можете да организирате цикъл, в който трябва да проверите колко числа a са ви необходими, за да изпълните неравенството: Тук най-малкото естествено число 1 се приема като b. Като организираме такъв цикъл и преброим колко числа a са необходими, ние откриваме колко числа трябва да се разгледат, за да се намери решение на уравнението.
Този цикъл може да изглежда така:
Сега е ясно, че за да тествате числа, трябва да организирате цикъл от 1 до k:
за a := 1 до k направи
Вторият цикъл трябва да е за b стойности. Но ако също е организиран от 1 до k, тогава едни и същи стойности могат да се повторят два пъти, само на различни места, например за числото 20 са дадени следните стойности:
2 2 + 4 2 = 20 и 4 2 + 2 2 = 20.
За да се избегне повторение на числата, цикълът за числата b може да бъде организиран или от 1 до a, или от k до a.