Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Програмирование. Структурное програмирование, подпрограммы, строки. Учебное пособие
.pdf
Ниже приведена таблица соответствия фактических параметров
формальным параметрам при вызове подпрограммы.
Вид
формального
параметра
Вид
подставляемого
фактического
параметра
Параметрзначение
Выражение
совместимого
по
присваиванию
типа с типом
формального
параметра
Параметрпеременная
Переменная
тождественного
типа с типом
формального
параметра
Нетипированный
параметрпеременная
Переменная
произвольного
типа
ЛОКАЛЬНЫЕ И ГЛОБАЛЬНЫЕ ОБЪЕКТЫ
Если объект (константа, переменная, процедура, функция или тип)
имеет смысл только в пределах некоторой части программы, то этот
объект называется локальным. В теле подпрограммы используются
объекты двух видов: локальные и нелокальные объекты. Последние
определены в контексте, являющемся средой для описания подпрограммы. Если они определены в головной программе, то такие объекты
называются глобальными; если же они определены в самом языке (т. е.
в контексте, в который «погружается» программа), то они называются
стандартными объектами. Областью существования локального объекта является весь текст подпрограммы. Это означает, что после окончания процесса, описанного подпрограммой, пространство в памяти, занятое локальными переменными, становится снова свободным
и его
можно использовать для других переменных. Очевидно, при повторном вызове той же самой подпрограммы значения ее локальных переменных снова не определены, точно так же как они не были определены при первом вызове подпрограммы.
При идентификации локальных объектов существенно то, что мы
можем выбирать их имена вне зависимости
от среды. Головную программу удобно рассматривать как подпрограммы без имени. Ее средой
является операционная система вычислительной машины, где предварительно определены все стандартные объекты. Таким образом, ясно,
почему идентификаторы можно выбирать, не считаясь со стандартными именами. Если стандартный объект не используется в программе,
то употребление (случайное или преднамеренное)
31
его идентификатора

в качестве имени локального объекта не вызовет каких-либо нежелательных эффектов.
Локальные и глобальные переменные
Локальная переменная – это переменная, описанная в подпрограмме.
Формальные параметры подпрограмм также являются локальными
переменными (см. рисунок). От других локальных переменных они
отличаются тем, что их описание вынесено в заголовок подпрограммы.
Это сделано для того,
чтобы при вызове подпрограммы через них
можно было осуществлять обмен данными между подпрограммой и
вызвавшей ее программой или подпрограммой.
Память под локальные переменные выделяется в момент вызова
(активизации) подпрограммы в стеке вызова (сегмент стека). Она закрепляется за ними с момента вызова подпрограммы до завершения ее
выполнения.
При вызове подпрограммы
в сегменте стека выделяется память
Глобальная
переменная
Program Test;
var a: real;
function Log2(x: real):real;
{ Функция возвращает двоичный логарифм x
}
begin
log2:=ln(x)/ln(2);
end;
begin
…
end.
формальный
параметр
значение
под все ее локальные переменные
Оперативное запом инающее
устро йство (ОЗУ)
Локальная
2
переменная x
Сегмент
стека
Глобальная
переменная а
Сегмент
данных
Старшие
адреса
памяти
Паскальпрограмма
(карта памяти)
В сегменте данных выде-
ляется память
под все глобальные пере-
менные и типизованные
константы программы
Сегмент
кода
Младшие
адреса памяти памяти
Локальные переменные
По завершении подпрограммы все локальные переменные становятся недоступны для дальнейшего использования.
Память под локальные переменные выделяется в разделе памяти,
выделяемой под программу во время ее выполнения, называемом сегментом стека (стеком вызова подпрограмм, см. рисунок).
32

Глобальная переменная – это переменная, внешняя по отношению
к подпрограмме; она существует в том контексте, где описана подпрограмма.
Взаимодействие программы и подпрограммы при вызове
Взаимодействие по управлению представлено на следующем рисунке:
Программа
Procedure swap(var x,y: real);
begin
t:= x;
x:= y;
y:= t;
end;
var
a,b: real;
begin
a:= 10;
b:= 20;
swap(a,b);
writeln(a,b);
end.
Подпрограмма
swap
{х меняем на а,
y на b}
t:= a;
a:= b;
b:= t;
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. В каком разделе программы описываются подпрограммы?
2. Чем отличается стандартная подпрограмма от подпрограммы
пользователя?
3. Какие формы подпрограмм определены в Object Pascal?
4. С помощью какой языковой конструкции вызываются процедуры?
5. С помощью какой языковой конструкции вызываются функции?
6. Какой механизм обеспечивает обмен данными между подпро-
граммой и вызвавшей ее программой или
подпрограммой?
7. Какие переменные называются локальными?
33

8. Являются ли формальные параметры подпрограмм локальными
переменными?
9. Где выделяется память под локальные переменные?
10. В течение какого времени существуют локальные переменные?
11. Из каких двух частей состоит описание функции?
12. Из каких частей состоит заголовок описания функции?
13. Из каких частей состоит блок?
14. В чем отличия в
описаниях функций и программ?
15. Какие части блока описания функции обязательны?
16. Какие разделы описания функции – обязательные?
17. Какие разделы описания функции – не обязательные?
18. Можно ли обращаться в головной программе к переменным,
описанным в функции?
19. Можно ли обращаться в головной программе к константам, опи-
санным в функции?
20. Можно
ли обращаться в головной программе к подпрограммам,
описанным в функции?
21. В каком разделе содержится описание последовательности дей-
ствий, выполняемых функцией?
22. Из каких двух частей состоит описание процедуры?
23. Из каких частей состоит заголовок описания процедуры?
24. Из каких частей состоит блок?
25. В чем различия в описаниях процедуры
и программы?
26. Какие части блока описания процедуры обязательны?
27. Какие разделы описания процедуры – обязательные?
28. Какие разделы описания процедуры – не обязательные?
29. Можно ли обращаться в головной программе к переменным,
описанным в процедуре?
30. Можно ли обращаться в головной программе к константам, опи-
санным в процедуре?
31. Можно ли обращаться
в головной программе к подпрограммам,
описанным в процедуре?
32. В каком разделе содержится описание последовательности дей-
ствий, выполняемых процедурой?
33. В каком разделе программы описываются процедуры?
34. Чем отличается стандартная процедуры от процедуры пользова-
теля?
35. Что такое рекурсивный вызов процедуры?
36. С помощью какой языковой конструкции вызываются процеду-
ры?
34

37. Какой механизм обеспечивает обмен данными между процеду-
рой и вызвавшей ее программой или подпрограммой?
38. Может ли процедура не возвращать результатов в вызвавшую ее
программу или подпрограмму?
39. Какая языковая конструкция предназначена для обозначения вы-
зова процедуры?
40. Может ли оператор процедуры содержать только идентификатор
процедуры?
41. Как узнать,
сколько фактических параметров необходимо пере-
дать процедуре при вызове?
42. За чем необходимо следить при подстановке фактического пара-
метра при вызове процедуры?
43. Где описаны действия, которые будут выполняться при вызове
процедуры?
44. Где содержится необходимая информация для записи оператора
процедуры?
45. В каком разделе программы описываются функции?
46. Чем отличается
стандартная функция от функции пользователя?
47. Что такое рекурсивный вызов функции?
48. С помощью какой языковой конструкции вызываются функции?
49. Какой механизм обеспечивает обмен данными между функцией
и вызвавшей ее программой или подпрограммой?
50. Может ли функция не возвращать результатов в вызвавшую ее
программу или подпрограмму?
51. Какая языковая конструкция
предназначена для обозначения вы-
зова функции?
52. Может ли вызов функции содержать только идентификатор
функции?
53. Как узнать, сколько фактических параметров необходимо пере-
дать функции при ее вызове?
54. За чем необходимо следить при подстановке фактического пара-
метра при вызове функции?
55. Где описаны действия, которые будут выполняться при вызове
функции
?
56. Какие параметры различают при работе с подпрограммами?
57. Что такое формальные параметры?
58. Что такое фактические параметры?
59. Какие виды параметров различают при работе с подпрограмма-
ми?
35

60. Какой механизм обеспечивает обмен данными между вызываю-
щей и вызываемой подпрограммами?
61. Что может выступать в качестве фактических параметров под-
программ?
62. Что такое формальный параметр?
63. В каких формах может быть представлен формальный параметр?
64. Если ли различие в использовании формальных параметров и
локальных переменных подпрограммы в разделе
операторов?
65. В чем различие в использовании формальных параметров и ло-
кальных переменных при вызове подпрограммы?
66. Как описываются формальные параметры-значения?
67. Является ли формальный параметр-значение локальной пере-
менной подпрограммы?
68. Используются ли формальные параметры-значения для передачи
в подпрограмму исходных данных?
69. Используются ли формальные параметры-значения для
возвра-
щения из подпрограммы результатов ее работы?
70. Как описываются формальные параметры-переменные?
71. Является ли формальный параметр-переменная локальной пере-
менной подпрограммы?
72. Используются ли формальные параметры-переменные для пере-
дачи в подпрограмму исходных данных?
73. Используются ли формальные параметры-переменные для воз-
вращения из подпрограммы результатов ее работы?
74. Как описываются формальные нетипированные параметры-
переменные?
75. Является ли формальный нетипированный параметр-переменная
локальной переменной подпрограммы?
76. Используются ли формальные нетипированные параметры-
переменные для передачи в подпрограмму исходных данных?
77. Используются ли формальные нетипированные параметры-
переменные для возвращения из подпрограммы результатов ее работы?
78. Как использовать формальный нетипированный параметр
переменную в разделе операторов?
79. Что такое фактический параметр?
80. В каких формах может быть представлен фактический параметр?
81. Что такое фактический параметр-переменная?
82. Что такое фактический параметр-значение?
36
-

83. Что такое фактический нетипированная параметр-переменная?
84. В какой форме можно представить фактический параметр-
переменную?
85. В какой форме можно представить фактический параметр-
значение?
86. В какой форме можно представить фактический нетипирован-
ный параметр-переменную?
87. Что такое фактический параметр-значение?
88. В каких формах может быть представлен фактический
параметр-
значение?
89. Какое отношение должно быть между формальным и фактиче-
ским параметрами-значениями?
90. Что такое фактический параметр-переменная?
91. В какой форме должен быть представлен фактический параметр-
переменная?
92. Какое отношение должно быть между формальным и фактиче-
ским параметрами-переменными?
93. Может ли подпрограмма при ее выполнении вызвать изменения
значения фактического параметра-переменной?
94. Можно ли при вызове подпрограммы использовать в качестве
фактического параметра-переменной переменную строкового типа
пользователя?
95. Что такое фактический параметр?
96. Что такое фактический нетипированный параметр-переменная?
97. В какой форме можно представить фактический нетипирован-
ный параметр-переменную?
98. Можно ли возвратить результат работы подпрограммы
через
фактический нетипированный параметр-переменную?
37

СТРОКИ
В настоящем разделе изучаются следующие вопросы: организация
данных с помощью строк символов, строковые типы: ShortString, AnsiString, WideString, строковые константы: строковые литералы, простые константы, строковые переменные, операции на строках: соединение строк, отношения на строках, подпрограммы для обработки
строк.
Строковые типы данных предназначены для организации, хранения
и обработки текстовой информации.
В Object Pascal строковые типы
вещественные, разделены на две категории.
1. Фундаментальные строковые типы ShortString, AnsiString, Wide-
String.
2. Родовой строковый тип String.
Фундаментальные строковые типы представляют три разновидности строк с дескриптором:
короткие строки, которые имеют стандартное для Borland Turbo
Pascal представление. Этим строкам соответствует предопределенный
идентификатор ShortString;
длинные строки (символы кода ANSI), которые не имеют
ничений на длину. Этим строкам соответствует предопределенный
идентификатор AnsiString;
длинные строки (символы кода Unicode), которые не имеют
ограничений на длину. Этим строкам соответствует предопределенный
идентификатор WideString.
В таблице приведены характеристики фундаментальных строковых
типов.
Назначение зарезервированного слова String, которое обозначает
родовой строковый тип, управляется директивой компилятора $Н. При
выключенном состоянии этой директивы {$Н-}
ет коротким строкам (ShortString) и работа с ними выполняется, как и в
предыдущих реализациях. При включенной директиве {$Н+} тип
так же, как целые, символьные и
огра-
тип String соответству-
38

String соответствует длинным строкам так же, как и предопределенный
идентификатор AnsiString. По умолчанию устанавливается значение
{$Н+}. Можно изменить настройку по умолчанию в интегрированной
среде разработки с помощью меню Project|Options|Compiler Huge
strings.
Тип
ShortString 255 символов От 2 до 256 байт Для совместимости
AnsiString ~2^31 символов
WideString ~2^30 символов
Максимальная
длина
Требуемая
память
От 4 байт
до 2 Гбайт
От 4 байт
до 2 Гбайт
Используется
8-битовые (ANSI) символы
Unicode символы; многопользовательские
серверы и многоязыковые приложения
Со строковыми типами связаны:
множество значений (эти значения будут принимать переменные
типа) строк символов;
набор операций на строках;
набор библиотечных подпрограмм для работы со строками.
На множестве значений строковых типов определен один и тот же
набор операций для работы со строками. Для работы со строками
имеются также библиотеки
процедур и функций.
Пример 1. Строковые типы
const
y = ''; {y -пустая строка.}
d = 'Delphi'; { Простая константа d, представляет зна-
чение 'Delphi' }
var
s,z: String; { s,z - переменные строкового типа String
}
begin
s:= 'Borland'; {Значение переменной s представлено литеральной константой 'Borland'.}
z:= s + ' ' + d; { z = 'Borland Delphi'}
end.
39

Далее более подробно мы рассмотрим работу с длинными (далее по
тексту AnsiString-строки) и короткими (далее по тексту ShortStringстроки) строками.
СТРОКОВЫЙ ТИП ANSISTRING (ДЛИННЫЕ СТРОКИ)
Строковый тип AnsiString определяет множество значений, которые могут принимать переменные типа AnsiString. Значение типа
AnsiString – строка символов расширенного кода ANSI. Строка может
содержать от 0 до ~2
31
символов – значений типа Char. На значениях
строкового типа (строках) определены:
операция соединения строк (+),
операции отношения.
Кроме этого подпрограммы для работы со строками находятся в
модуле System. Посмотреть их описание можно через меню
Help|Delphi Help|, на закладке «Предметный указатель» введите string
handling routines и выберите интересующую вас подпрограмму.
Пример 2. Строковый тип AnsiString
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
const
y = 'Простая константа'; {Простая константа y, представляет литерал 'константа'.}
var
s: AnsiString; { s - переменная строкового типа AnsiString }
begin
SetConsoleOutputCP(1251);{Кириллизация вывода.}
s:= Copy(y,9,Length(y)); {Значение переменной s 'константа' }
writeln(s);
readln;
end.
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
