KNOW INTUIT, Лекция, Подпрограми

Целта на лекцията

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

подпрограми

В началото езиците за програмиране бяха по-прости, те се изпълняваха стриктно отгоре надолу, един израз след друг. Такива езици също се наричат ​​линейни. Типичен пример за линейни езици е BASIC. Единственият начин да се организира поне някаква логика в такива езици беше предоставен от оператора за безусловен скок GOTO, който в зависимост от условието „скачаше“ към предварително поставени етикети. В съвременните езици за програмиране GOTO също е останал, вероятно, за любителите на антики. Но използването му може да доведе до трудни за намиране логически грешки по време на изпълнение (грешки по време на изпълнение). Използването на GOTO в съвременното програмиране се счита за лоша форма. Няма да изследваме тази възможност, защото има много по-„напреднали“ инструменти за организиране на логиката! Един такъв инструмент саподпрограми.

С други думи, подпрограмите са като градивни елементи, от които в крайна сметка се получава сграда - програма. Можете да се откажете от подпрограмите, ако пишете малка учебна програма в няколко дузини реда код. Но какво ще стане, ако това е сериозно приложение с няколкостотин модула, всеки от които може да съдържа хиляди редове код? Как да напиша такава програма, без да разделям задачата на отделни части? Подпрограмите помагат за подобряване на кода, структурирането му. Следователно езиците на високо ниво, които позволяват използването на подпрограми, се наричат ​​същопроцедурно-ориентираниезици. И нашият FPC компилатор също принадлежи към такива езици.

Има два вида подпрограми:процедуриифункции- първите просто си вършат работата, вторите също връщат резултата от тази работа.

Всъщност вече сме използвали процедури няколко пъти. Например, когато е генерирано събитие за щракване на бутон. Това събитие е процедура. Процедурата започва с ключовата дума процедура и има следния синтаксис:

Повечето от горния синтаксис не са задължителни - една процедура може да няма параметри, константи, дефинирани от потребителя типове данни, променливи и т.н. - може да бъде много просто, например:

Такава процедура може да бъде извикана от всяко място в програмата, но процедурата трябва да бъде описана по-горе, в противен случай компилаторът няма да разбере за нея. Има и възможност за предварително обявяване на процедурата, но за това по-късно. Така че, ако тази процедура е описана по-горе, тогава можем да я извикаме, като просто посочим нейното име:

Компилаторът ще премине към процедурата и ще изпълни нейния код (в този случай ще покаже съобщение за грешка). След това компилаторът ще се върне обратно и ще изпълни оператора след извикването на процедурата.

Параметрите на подпрограмата са доста важна тема, нека поговорим за това по-подробно. Можете да предадете някои първоначални данни на процедурата (или функцията), така че процедурата да ги обработи. Такива данни се наричат ​​параметриилиформални параметри. Пример - потребителят въведе някакво число (всъщност низ от цифрови знаци), трябва да го удвоим и да докладваме резултата на потребителя. Такава процедура може да бъде описана по следния начин:

декларира процедура Udvoenie с параметър тип string st. Това означава, че сега можем да извикаме процедурата, като й предадем някакъв низ като параметър. Параметърът st условно може да се счита за вътрешна променлива на процедурата, в която компилаторът ще копираниз, предаден на процедурата. Този метод за предаване на данни към подпрограма се наричапараметър по стойност. Да предположим, че по-късно нарекохме процедурата така:

Компилаторът ще направи извикване на процедурата, предавайки указаната стойност '123.4' на параметъра st. Или можем да извикаме процедурата по различен начин, предавайки стойността в нея, която се съхранява в друга низова променлива:

Резултатът ще бъде същият. Тук е важно да запомните, че типът на предадената стойност трябва задължително да съответства на типа на параметъра. Ако имаме низов параметър, тогава трябва да му предадем стойност от тип низ. Компилаторът копира тази стойност в параметъра. С други думи, ако променим стойността на параметъра st вътре в процедурата, това няма да повлияе по никакъв начин на променливата myst, тъй като ще променим копието на данните, а не самите данни.

Да отидем по-нататък. И след това декларираме реална променлива r:

Тук е необходимо, защото трябва да умножим стойността на параметъра по две, така че ще трябва да преобразуваме низовото представяне на числото в реално число - в крайна сметка не можете да умножите низ по две! Поставяме резултата в r:

Функционална дума започваме започваме тялото на процедурата. Със стандартната функция StrToFloat(st) ще преобразуваме низовата стойност на параметъра st в число и ще присвоим това число на променливата r . Освен това всичко е просто:

Удвояваме стойността на r, поставяме резултата обратно в r, след което използваме стандартната функция FloatToStr(r), за да преобразуваме полученото число в низ и показваме този низ в съобщението ShowMessage(). Това всъщност е всичко.

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

Между другото,действителните данни, които предаваме на подпрограмата, се наричат ​​аргументиилидействителни параметри. В примера за извикване на процедура

променлива myst - аргумент .

Като параметри в процедура можете да използвате не една, а много променливи. Ако имат един и същи тип, имената им се разделят със запетаи, а типът се посочва накрая за всички параметри наведнъж. Например:

Ако параметрите са от различен тип, те се разделят с точка и запетая:

Нека обаче разредим теорията с практика и да работим с процедури върху реален пример. ОтворетеLazarusс нов проект. Както винаги, нека наименуваме главната форма (свойство Name) fMain, запишем проекта в папката09-01, като наименуваме проекта, напримерMyPodprog, и наименуваме модулаMain.

В свойството Caption на формуляра напишете

Нашата задача е да получим реално число от потребителя, да го удвоим и да покажем резултата на екрана. Потребителят може също да въведе цяло число, но процедурата ще го третира като реално число (помните ли преобразуването на типа в последния урок?), например, ако потребителят въведе 3, процедурата ще получи 3.0. Резултатът от изчислението е 6.0, но FloatToStr() не показва нули в края, така че потребителят ще види само 6 на екрана.

Добре, сега трябва да решим как да получим номер от потребителя. За целта използваме компонента TEdit, който вече познаваме от предишни лекции. Първо, нека зададем етикета TLabel с обяснителен текст

и инсталирайте TEdit до него. Ще оставим имената на TLabel и TEdit по подразбиране, TEdit ще се нарича Edit1. Не забравяйте да изчистите свойството Text.

По-долу задайте прост бутонTButton, в надписа на който напишете текста:

Разбира се, ще има и други примери. Подравнете компонентите според нуждитепреоразмерете ги. Нашата форма трябва да изглежда така:

know

Засега ще трябва да вярваме на потребителя, че ще въведе число в полетоEdit1и нищо повече. Но на последната лекция ви беше обещано да покажете изпълнението на „защита от глупаци“, така че малко по-късно ще го направим.

Генерирайте събитие за щракване на бутон, то ще бъде така:

Текстът на процедурата е даден по-горе.

know

Обърнете внимание, че предаваме въведената от потребителя стойност към подпрограмата, която се съхранява в свойството Text на компонента Edit1:

В този случай не е необходимо да се създават допълнителни променливи. Запазете проекта и го стартирайте за изпълнение. Опитайте да въведете цяло число. Тогава истински. Моля, обърнете внимание: ако имате инсталирана българска версия на Windows, тогава трябва да въведем запетая като разделител на реално число, а не точка! Помните ли глобалната променлива DecimalSeparator?

Ако случайно или умишлено сте въвели точка, ще получите съобщение за грешка, подобно на това:

Всичко е наред, натиснете бутона "Стоп", след което изберете командата от главното меню "Изпълни -> Нулиране на програмата за отстраняване на грешки". Lazarus ще затвори окачения проект и можете да го стартирате отново. Подобна грешка ще възникне, ако се опитате да удвоите празен низ. Ако сте въвели правилно числата, тогава програмата ще работи както трябва, независимо дали е цяло число или реално число. Все още не затваряйте проекта, все още ни трябва.