Процедуры и функции: обзор
Процедура или функция представляет собой последовательность операторов, которая имеет имя, список параметров и может быть вызвана из различных частей программы. Функции, в отличие от процедур, в результате своего выполнения возвращают значение, которое может быть использовано в выражении. Для единообразия функции и процедуры называются подпрограммами.
Описание процедур и функций
Любая используемая в программе процедура или функция должна быть предварительно описана в разделе описаний.
Описание процедуры имеет вид:
procedure имя ( список формальных параметров );
раздел описаний
begin
операторы
end;
Описание функции имеет вид:
function имя ( список формальных параметров ): тип возвращаемого значения ;
раздел описаний
begin
операторы
end;
Операторы подпрограммы, окаймленные операторными скобками begin / end , называются телом этой подпрограммы.
Список формальных параметров вместе с окружающими скобками может отсутствовать. Он состоит из одной или нескольких секций, разделенных символом » ; «. Каждая секция состоит из списка переменных, перечисляемых через запятую, после которого следуют двоеточие и тип. Каждая секция может предваряться ключевым словом var или const , что указывает на то, что параметры передаются по ссылке (см.п. Параметры процедур и функций). Тип формального параметра должен быть либо именем, либо динамическим массивом, либо множеством, либо процедурной переменной (для последних трех типов имеет место структурная эквивалентность типов).
Раздел описаний процедуры или функции устроен так же, как и раздел описаний основной программы. Здесь описываются так называемые локальные переменные и константы, типы (за исключением классов — классы можно описывать только глобально) а также вложенные процедуры и функции. Все такие локальные объекты доступны лишь внутри данной подпрограммы и не видны извне.
В разделе описаний подпрограммы можно описывать другие подпрограммы. Исключение составляют методы класса, описываемые непосредственно в теле класса: в них нельзя описывать вложенные подпрограммы ввиду синтаксической неоднозначности.
procedure DoAdd(a,b: real; var res: real);
begin
res := a + b;
end;
Вызов подпрограммы
Подпрограмма один раз описывается и может быть многократно вызвана. Для вызова процедуры используется оператор вызова процедуры:
begin
var x := ReadInteger;
var y := ReadInteger;
var res: integer;
DoAdd(x,y,res);
Print(res);
DoAdd(2*x,y,res);
Print(res);
end;
Для вызова функции используется выражение вызова функции.
Переменная Result
Внутри тела любой функции определена специальная переменная с именем Result , которая хранит результат вычисления функции. Ее тип совпадает с типом возвращаемого значения функции. Например:
function Sum(a,b: real): real;
begin
Result := a + b;
end;function MinElement(a: array of real): real;
begin
Result := real.MaxValue;
foreach var x in a do
if x < Result then
Result := x;
end;begin
var a := Seq(1,5,3);
writeln(MinElement(a) + Sum(2,3));
end.
Если внутри функции не присвоить переменной Result некоторое значение, то функция вернет в результате своего вызова непредсказуемое значение.
Упрощенный синтаксис описания подпрограмм
В PascalABC.NET имеется упрощенный синтаксис описания однооператорных процедур:
Аналогичный синтаксис имеется для функций, вычисляющих одно выражение:
При этом в ряде случаев для возвращаемого значения функции возможен автовывод типов:
Basic Pascal Tutorial/Chapter 1/Variables and Data Types/ru
Переменные похожи на константы, но их значения могут быть изменены во время выполнения программы. В Pascal переменные должны быть сначала объявлены, прежде чем они могуть быть использованы:
var IdentifierList1 : DataType1; IdentifierList2 : DataType2; IdentifierList3 : DataType3; .
IdentifierList — несколько идентификаторов, разделённых запятыми (,). Все идентификаторы в списке объявляются как имеющие одинаковый тип.
Основные типы данных Pascal включают:
Стандартный Pascal не предусматривает строкового типа данных, но большинство современных компиляторов имеют его. Опытные программисты на Pascal также используют указатели для динамического распредедения памяти, объекты для объектно-ориентированного прграммирования и многие другие, но эти позволят вам начать.
Дополнительная информация о типах данных Pascal:
- Тип данных integer может содержать целые числа от -32768 до 32767. Это знаковый диапазон, который может быть сохранён в 16-битном слове, и является наследием эпохи, когда были распространены 16-битные процессоры. Для обратной совместимости 32-битный знаковый integer является longint и может содержать гораздо больший диапазон значений.
- Тип данных real имеет диапазон от 3.4x10 -38 до 3.4x10 38 , в дополнение к такому-же диапазону в отрицательной области. Вещественные значения хранятся внутри компьютера сходно с научной нотацией — с мантиссой и экспонентой, с некоторыми усложнениями. В Pascal вы можете выразить вещественое значение в вашем коде либо в нотации с фиксированной точкой, либо в научной нотации с символом E, отделяющим мантиссу от экспоненты. Таким образом, 452.13 и 4.5213e2 эквивалентны.
- Тип данных char содержит символы. Обязательно заключайте их в апострофы, например, так: 'a', 'B', '+'. Стандартный Pascal использует 8-битные символы, а не 16-битные, поэтому Unicode, который используется для представления наборов всех мировых языков в одной системе UNIfied CODE, не поддерживается.
- WideChar — это двухбайтный символ (элемент DBCS: Double Byte Character Set) и может содержать юникодный символ.
- Free Pascal поддерживает такую-же реализацию типа PChar, как Delphi. PChar определён как указатель на тип Char, но позволяет дополнительные операции. Тип PChar может быть лучше понят как Pascal-эквивалент нуль-терминированной сроки в стиле языка C, т.е. переменная типа PChar является указателем, который указывает на массив типа Char, завершающийся нулевым символом (#0). Free Pascal поддерживает инициализацию типизированных констант PChar, или прямое присваивание. Например, следующие фрагменты кода эквивалентны:
program one; var P : PChar; begin P := 'This is a null-terminated string.'; WriteLn (P); end.
program two; const P : PChar = 'This is a null-terminated string.'; begin WriteLn (P); end.
- Free Pascal поддерживает тип String, как он определён в Turbo Pascal: последовательность символов с необязательным указанием размера. Он также поддерживает ansistring (с неограниченной длиной), как в Delphi. Возможные объявления:
variable_name : string; // если не указана длина, по умолчанию принимается 255 variable_name : string[length]; // где: 1 < length
- Предопределённый тип ShortString определён как строка длиной 255.
- AnsiString - строки, которые не имеют ограничения по длине. Это строки с подсчётом ссылок и гарантированно завершающиеся нулевым символом. Внутренне ansistring рассматривается как указатель: реальное содержимое строки хранится в куче, в которой выделяется столько памяти, сколько необходимо для хранения содержимого строки.
- Тип Widestring (используется для представления строк юникодных символов) реализован во многом подобно ansistring: с подсчётом ссылок, нуль-терминированный массив, только реализованный как массив WideChar вместо обычных Char.
- Тип данных boolean может иметь только два значения: TRUE (истина) и FALSE (ложь).
Пример объявления нескольких переменных:
var age, year, grade : integer; circumference : real; LetterGrade : char; DidYouFail : Boolean;
Из документации FPC:
| Тип | Диапазон | Байтов |
|---|---|---|
| Byte | 0 .. 255 | 1 |
| Shortint | -128 .. 127 | 1 |
| Smallint | -32768 .. 32767 | 2 |
| Word | 0 .. 65535 | 2 |
| Integer | smallint или longint | 2 or 4 |
| Cardinal | longword | 4 |
| Longint | -2147483648 .. 2147483647 | 4 |
| Longword | 0..4294967295 | 4 |
| Int64 | -9223372036854775808 .. 9223372036854775807 | 8 |
| QWord | 0 .. 18446744073709551615 | 8 |
Free Pascal осуществлят автоматическое преобразование типов в выражениях, где используются различные виды целых типов.
| Тип | Диапазон | Значащих цифр | Байтов |
|---|---|---|---|
| Real | зависит от платформы | . | 4 or 8 |
| Single | 1.5E-45 .. 3.4E38 | 7-8 | 4 |
| Double | 5.0E-324 .. 1.7E308 | 15-16 | 8 |
| Extended* | 1.9E-4932 .. 1.1E4932 | 19-20 | 10 |
| Comp | -2E64+1 .. 2E63-1 | 19-20 | 8 |
| Currency | -922337203685477.5808 | 922337203685477.5807 | 8 |
* Обратите внимание, что для 64-разрядных версий Windows и целей, не относящихся к Intel, Extended является псевдонимом для Double.
| Тип | Байтов | Ord(True) |
|---|---|---|
| Boolean | 1 | 1 |
| ByteBool | 1 | Любое ненулевое значение |
| WordBool | 2 | Любое ненулевое значение |
| LongBool | 4 | Любое ненулевое значение |
| ◄ | ▲ | ► |
- Russian
- FPC/ru
- Delphi/ru
- Pascal/ru
- Basic Pascal Introduction/ru
Простейшие новые возможности
В данной статье рассматриваются простейшие новые возможности, часто используемые в коде программ PascalABC.NET:
- Операторы +=, -=, *=, /=
- Инициализация переменной при описании
- Внутриблочные описания переменных
- Автоопределение типа переменной при описании
- Описание переменных в заголовке цикла for
Ометим, что их использование, хотя и удобно, но не всегда является оправданным: такие программы не будут работать в других версиях языка Object Pascal.
Операторы +=, -=, *=, /=
Данные операторы пришли из языка C. Запись a+=2 воспринимается легче, чем a:=a+2, и уж подавно легче, чем Inc(a,2). Кроме того, записи
a += 2;
можно обучать буквально на первом занятии по программированию, а запись Inc(a,2) нуждается в пояснениях: что такое стандартные процедуры и что такое передача параметра по ссылке.
Небольшая тонкость: если i: integer, то i /= 2 вызовет ошибку компиляции, поскольку будет трактоваться как i := i / 2.
Разумеется, для множеств определены только операторы +=, -=, *=, а для строк определен только оператор +=:
var s: string := 'PascalABC'; d: set of integer := [200..300]; begin s += '.NET'; d -= [100..298]; writeln(s); writeln(d); end.
Данные операторы имеются также в Free Pascal (должна быть включена опция C-like operators). Кроме того, операции += и -= активно используются для делегатов .NET (процедурные переменные в PascalABC.NET) и присутствуют также в этом качестве в системе Chrome.NET.
Инициализация переменной при описании
Переменная может быть инициализирована при описании:
var i: integer := 1;
Подобное можно сделать и в Delphi Object Pascal, но только для глобальных переменных. В PascalABC.NET можно производить также инициализацию локальной переменной и поля записи или класса:
procedure p; var i: integer := 1; begin end; type Frac = record num: integer := 0; denom: integer := 1; end; MyClass = class s: string := 'NET'; end;
Инициализация полей класса производится в конструкторе объекта этого класса до других действий.
Кроме того, можно инициализировать переменные не только константными, но и неконстантными выражениями, в частности, вызовам конструкторов:
var L: List := new List;
Внутриблочные описания переменных
Если какая-то переменная используется лишь в одном месте алгоритма, то описывать ее в разделе описаний вместе с другими, более важными переменными, неудобно. Кроме того, сразу не всегда понятно, сколько переменных может потребоваться для реализации алгоритма. Выход прост: описать в разделе описаний очевидные переменные, а если при написании алгоритма понадобится дополнительная переменная, описать ее прямо внутри блока.
Например, пусть дано x и требуется вычислить y=x 7 , используя как можно меньше умножений. Сколько при этом понадобится дополнительных переменных - неизвестно. Начнем решение:
var x,y: real; begin readln(x);
Вычислим во вспомогательных переменных x 2 , x 3 , после чего воспользуемся формулой x 7 =x 2 *x 2 *x 3
var a: real := x * x; var b: real := a * x; y := a * a * b; writeln(y); end.
Таким образом, описание вспомогательных переменных внутри блока позволяет не только упростить решение задачи, но и разгружает область глобальных описаний от лишних переменных.
Кроме того, тесты показывают, что доступ к внутриблочным переменным в PascalABC.NET по скорости примерно в 2 раза быстрее, чем к глобальным.
Автоопределение типа переменной при описании
Имя типа в описании
var i: integer := 1;
избыточно. Ведь константа 1 имеет тип integer. Поэтому достаточно написать:
var i := 1;
Тип переменной i автоопределится по типу константы.
Еще более показательно автоопределение типа в случае обобщенных типов:
var d := new Dictionarystring,integer>;
var d: Dictionarystring,integer> := new Dictionarystring,integer>;
Описание переменных в заголовке цикла for
Одной из проблем использования циклов for в языке Pascal является некорректное использование переменной-параметра цикла после цикла. Кроме того, описание такой переменной в разделе описаний замусоривает его.
В PascalABC.NET можно описывать параметр цикла for непосредственно в заголовке цикла:
var str := ''; for c: char := 'a' to 'z' do str += c;
Oбласть видимости такой переменной ограничена заголовком и телом цикла. Кроме того, можно использовать автоопределение типа параметра цикла, пользуясь следующей разновидностью описания в заголовке цикла:
var p := 1; for var i := 1 to 10 do p *= i;
Вывод
Все рассмотренные выше возможности направлены на упрощение записи и улучшение читаемости ряда часто используемых конструкций. Тем не менее, они не совместимы с другими версиями языка Pascal, поэтому не могут рекомендоваться как общая практика.
Паскаль – Типы переменных
Переменная – это не что иное, как имя, данное области памяти, которой могут манипулировать наши программы. Каждая переменная в Паскале имеет определенный тип, который определяет размер и расположение памяти переменной; диапазон значений, которые могут быть сохранены в этой памяти; и набор операций, которые могут быть применены к переменной.
Имя переменной может состоять из букв, цифр и символа подчеркивания. Он должен начинаться либо с буквы, либо с подчеркивания. Паскаль не чувствителен к регистру , поэтому заглавные и строчные буквы здесь означают одно и то же. Основываясь на базовых типах, описанных в предыдущей главе, будут следующие базовые типы переменных:
Основные переменные в Паскале
Обычно один октет (один байт). Это целочисленный тип.
целое число
Наиболее натуральный размер целого числа для машины.
Значение с плавающей запятой одинарной точности.
Указывает истинные или ложные логические значения. Это также целочисленный тип.
Перечислимый
Определяет пользовательский список.
Поддиапа- зон
Представляет переменные, значения которых лежат в диапазоне.
Хранит массив символов.
Обычно один октет (один байт). Это целочисленный тип.
целое число
Наиболее натуральный размер целого числа для машины.
Значение с плавающей запятой одинарной точности.
Указывает истинные или ложные логические значения. Это также целочисленный тип.
Перечислимый
Определяет пользовательский список.
Поддиапа- зон
Представляет переменные, значения которых лежат в диапазоне.
Хранит массив символов.
Язык программирования Pascal также позволяет определять различные другие типы переменных, которые мы рассмотрим в следующих главах, таких как Pointer, Array, Records, Sets, Files и т. Д. В этой главе мы изучим только основные типы переменных.
Объявление переменных в Паскале
Все переменные должны быть объявлены до того, как мы используем их в программе Pascal. Все объявления переменных сопровождаются ключевым словом var . Объявление определяет список переменных, за которыми следует двоеточие (:) и тип. Синтаксис объявления переменной –
var variable_list : type;
Здесь тип должен быть допустимым типом данных Pascal, включая символьные, целые, действительные, логические или любые другие определяемые пользователем типы данных и т. Д., А variable_list может состоять из одного или нескольких имен идентификаторов, разделенных запятыми. Некоторые действительные объявления переменных показаны здесь –
var age, weekdays : integer; taxrate, net_income: real; choice, isready: boolean; initials, grade: char; name, surname : string;
В предыдущем уроке мы обсуждали, что Pascal позволяет объявлять тип. Тип может быть идентифицирован по имени или идентификатору. Этот тип может использоваться для определения переменных этого типа. Например,
type days, age = integer; yes, true = boolean; name, city = string; fees, expenses = real;
Теперь определенные типы могут использоваться в объявлениях переменных –
var weekdays, holidays : days; choice: yes; student_name, emp_name : name; capital: city; cost: expenses;
Обратите внимание на разницу между объявлением типа и объявлением var . Объявление типа указывает категорию или класс типов, таких как целое число, вещественное и т. Д., Тогда как спецификация переменной указывает тип значений, которые может принимать переменная. Вы можете сравнить объявление типа в Pascal с typedef в C. Самое главное, имя переменной относится к области памяти, где будет храниться значение переменной. Это не так с объявлением типа.
Инициализация переменной в Паскале
Переменным присваивается значение с двоеточием и знаком равенства, за которым следует постоянное выражение. Общая форма присвоения значения –
variable_name := value;
По умолчанию переменные в Паскале не инициализируются с нуля. Они могут содержать мусорные значения. Поэтому лучше инициализировать переменные в программе. Переменные могут быть инициализированы (им присвоено начальное значение) в их объявлении. За инициализацией следует ключевое слово var, а синтаксис инициализации следующий:
var variable_name : type = value;
Вот некоторые примеры:
age: integer = 15; taxrate: real = 0.5; grade: char = 'A'; name: string = 'John Smith';
Давайте посмотрим на пример, который использует различные типы переменных, которые обсуждались до сих пор –
program Greetings; const message = ' Welcome to the world of Pascal '; type name = string; var firstname, surname: name; begin writeln('Please enter your first name: '); readln(firstname); writeln('Please enter your surname: '); readln(surname); writeln; writeln(message, ' ', firstname, ' ', surname); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат –
Please enter your first name: John Please enter your surname: Smith Welcome to the world of Pascal John Smith
Перечисляемые переменные
Вы видели, как использовать простые типы переменных, такие как integer, real и boolean. Теперь давайте посмотрим переменные перечислимого типа, которые можно определить как –
var var1, var2, . : enum-identifier;
Когда вы объявили перечислимый тип, вы можете объявить переменные этого типа. Например,
type months = (January, February, March, April, May, June, July, August, September, October, November, December); Var m: months; . M := January;
Следующий пример иллюстрирует концепцию –
program exEnumeration; type beverage = (coffee, tea, milk, water, coke, limejuice); var drink:beverage; begin writeln('Which drink do you want?'); drink := limejuice; writeln('You can drink ', drink); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат –
Which drink do you want? You can drink limejuice
Переменные поддиапазона
Переменные поддиапазона объявляются как –
var subrange-name : lowerlim . uperlim;
Примеры поддиапазонных переменных:
var marks: 1 . 100; grade: 'A' . 'E'; age: 1 . 25;
Следующая программа иллюстрирует концепцию –
program exSubrange; var marks: 1 .. 100; grade: 'A' .. 'E'; begin writeln( 'Enter your marks(1 - 100): '); readln(marks); writeln( 'Enter your grade(A - E): '); readln(grade); writeln('Marks: ' , marks, ' Grade: ', grade); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат –
