Сайт Koder.kz сайт для Delphi программистов.

koder.kz

Web or desctop App Developer

Написать

Добавил admin | Категория Pascal за 12 уроков, перевод | 24 Января 2014


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

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


Program Lesson7_Program1;
Uses Crt;
Var Counter : Integer;
Begin
textcolor(green);
GotoXy(10,5);
For Counter := 1 to 10 do
Begin {Step [1]}
write(chr(196)); {Step [2]}
End; {Step [3]}
GotoXy(10,6);
For Counter := 1 to 10 do
Begin {Step [1]}
write(chr(196)); {Step [2]}
End; {Step [3]}
GotoXy(10,7);
For Counter := 1 to 10 do
Begin {Step [1]}
write(chr(196)); {Step [2]}
End; {Step [3]}
GotoXy(10,10);
For Counter := 1 to 10 do
Begin {Step [1]}
write(chr(196)); {Step [2]}
End; {Step [3]}
Readkey;
End.
Теперь тоже самое но уже с процедурой

Program Lesson7_Program1;
Uses Crt;
Procedure DrawLine;
{This procedure helps me to avoid the repetition of steps [1]..[3]}
Var Counter : Integer;
Begin
textcolor(green);
For Counter := 1 to 10 do
Begin {Step [1]}
write(chr(196)); {Step [2]}
End; {Step [3]}
End;
Begin
GotoXy(10,5);
DrawLine;
GotoXy(10,6);
DrawLine;
GotoXy(10,7);
DrawLine;
GotoXy(10,10);
DrawLine;
Readkey;
End.

    Есть некоторые различия между этими двумя программами, давайте их отметим для себя:
  • Размер программы. Это очень важно для программы, когда исполнительный файл программы занимает мало место на диске это очень хорошо со всех сторон. К примеру первая программа размер которой составляет 1900 байт больше второй программы размер которой составляет 1350 байт!
  • Опрятность исходного кода программы. Оформление отдельно взятых повторяющихся кусков программного кода в одну процедуру. Такой подход помогает отладчику и программисту. Оформление исходного кода в процедуру так же помогает найти ошибки в коде
  • Повторения. Повторения в программе может привести к трудно для программиста. Так процедуры являются хорошим способом избежать исключительных ситуаций в программе. Повторения так же увеличивают размер исполняемого файла программы.
  • Отладка эффективности. Когда от вас требуется отладка программы, ошибки можно найти гораздо проще, ошибки будут встречаться гораздо реже, программа становится намного удобней когда она разбита на блоки. Вы можете запустить программу и увидеть ошибку в определенной строке вашей процедуры или функции. Было бы гораздо труднее найти ошибку в программе если бы это был один сплошной листинг. «Нарезание» программы на фрагменты требует определенных знаний и умений, которые я надеюсь вы почерпнете из данного урока. Кодирование(написание исходного кода программы) это самый важный и самый сложный этап в разработке программного продукта. На этапе кодирования программист должен знать какие процедуры и функции ему нужно разработать для решения поставленной перед ним задачи.

Использование процедур с параметрами Возвращаясь к программе Lesson7_Program1b, в процедуру GotoXY мы можем передавать параметры, назовем процедуру DrawLine;и тем самым изменить повторения для процедуры GotoXY. И так что у нас получилось:


Program Lesson7_Program2;
Uses Crt;
Procedure DrawLine(X : Integer; Y : Integer);
{the decleration of the variables in brackets are called
parameters or arguments}
Var Counter : Integer;
{normally this is called a local variable}
Begin
GotoXy(X,Y); {here I use the parameters}
textcolor(green);
For Counter := 1 to 10 do
Begin
write(chr(196));
End;
End;
Begin
DrawLine(10,5);
DrawLine(10,6);
DrawLine(10,7);
DrawLine(10,10);
Readkey;
End.

Теперь наша программа включает в себя процедуру в которой передаются параметры, каждый из которых принимает нужное для нас значение. При каждом вызове нашей процедуры нам необходимо передавать параметры для отрисовки GotoXy. Для передачи параметров в процедуру используются ()-скобки, все что в них все параметры для передачи в процедуру. При передачи параметров в процедуру переменные должны быть объявлены и должен быть указан тип переменных, все как обычно в общем.
Procedure DrawLine(X : Integer; Y : Integer);
В процедуре должны использоваться только локальные переменные самой процедуры и переменные которые переданы в заголовке процедуры, глобальные переменные использовать не рекомендуется.
Для большего понимания посмотрите листинг ниже, там пользователю предлогается ввести цвет текста и цвет фона которые будут использоваться для записи текста далее в программе. Исходный код:


Program Lesson7_Program3;
Uses Crt;
Var 
    UName, USurn, UCoun, UMail : String[50]; 
     {These var's are global because
      they are used by more than one procedure}
    TxtB, TxtC, i : Integer;
    InfoCor : Boolean;
Procedure EnterUserInfo(TxtCol : SmallInt; TxtBck : SmallInt);
Begin
 textcolor(TxtCol);
 textbackground(TxtBck);
 ClrScr;
 Write('Your Name: ');
 Readln(UName);
 Write('Your Surname : ');
 Readln(USurn);
 Write('Country : ');
 Readln(UCoun);
 Write('E-Mail Address: ');
 Readln(UMail);
 Write(' Thank you for entering your personal information!!');
 Readkey;
End;
Procedure ConfirmationField(TxtCol : SmallInt; 
                            TxtBck : SmallInt);
Var 
    YN : Char; { a local variable }

Begin
 textcolor(TxtCol);
 textbackground(TxtBck);
 ClrScr;
 Writeln('Your Name: ',UName);
 Writeln('Your Surname : ',USurn);
 Writeln('Country : ',UCoun);
 Writeln('E-Mail Address: ',UMail);
 Writeln;
 Writeln;
 Writeln('This is a confirmation field. Please verify that');
 Writeln('your information is correct!');
 Writeln;
 Write('Is your personal information all correct? [Y/N] ');
 Repeat
  YN := Readkey;
  Case YN Of
'N' : InfoCor := False; 'Y' : InfoCor := True; End; Until (YN = 'N') or (YN = 'Y'); End; Begin { main program } InfoCor := True; ClrScr; TextBackground(cyan); TextColor(green); Write('A list of colours is being displayed...'); For i := 1 to 16 do Begin Case i Of 16 : Begin TextBackGround(white); End; End; textcolor(i); Writeln(i,': This is Colour No.',i); End; TextBackGround(black); TextColor(white); Write('Please, put into your mind your favourite colour. '); Write('When you are ready press any key...'); Readkey; ClrScr; Write('Enter your favourite text colour: (only numbers) '); Readln(TxtC); Write('Enter your favourite background colour : __'); Readln(TxtB); Writeln; Writeln; Write('Now, you must enter your personal information. '); Write('Hit any key to continue...'); ClrScr; EnterUserInfo(TxtC,TxtB); ConfirmationField(TxtC,TxtB); If InfoCor = False then Repeat Writeln; Writeln('You verified that your information is, '+ +'for some reason, incorrect.'); Writeln('You are now going to re-enter your '+ +'correct information. Hit any key..'); Readkey; EnterUserInfo(TxtC,TxtB); ClrScr; ConfirmationField(TxtC,TxtB); Until InfoCor = True; End.

Возвращаемый параметр (Переменный параметр) Параметры в процедуру можно не только передавать, но и возвращать. В этом случае данные могут передаваться через переменную в обоих направлениях. Для того что бы объявить возвращаемый параметр в заголовке процедуры мы должны указать ключевое слово var
Procedure PROCEDURE_NAME(Var Variable_Name : Type);
Пример такой процедуры представлен ниже:


Program VAR_PARAM_EXAMPLE;
  Procedure Square(Index : Integer; Var Result : Integer);
  Begin
    Result := Index * Index;
  End;
Var
  Res : Integer;
Begin
 Writeln('The square of 5 is: ');
 Square(5, Res);
 Writeln(Res);
End.

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


Program Lesson7_Program4;
Uses Crt;
Var SizeA, sizeB : Real;
    YN : Char;
    unitS : String[2];
Function PythagorasFunc(A:Real; B:Real) : Real;
{The pythagoras theorem}
Begin
 PythagorasFunc := SQRT(A*A + B*B);
{Output: Assign the procedure name to the value.
 If you forget to assign the function to the value, 
 you will get a trash value from the memory}
End;
Begin
 Repeat
  Writeln; 
  Write('Enter the size of side A : ');
  Readln(sizeA);
  Write('Enter the size of side B : ');
  Readln(sizeB);
  Repeat
   Write('metres or centimetres? Enter : [m or cm] ');
   Readln(unitS);
  Until (unitS = 'm') or (unitS = 'cm');
  Writeln(PythagorasFunc(sizeA,sizeB),' ',unitS);
  Writeln;
  Write('Repeat? ');
  YN := Readkey;
 Until (YN in ['N','n']);
End.