Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Програмирование. Структурное програмирование, подпрограммы, строки. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Ниже приведена таблица соответствия фактических параметров формальным параметрам при вызове подпрограммы.
Вид формального параметра
Вид подставляемого фактического параметра
Параметр­значение
Выражение совместимого по присваиванию типа с типом формального параметра
Параметр­переменная
Переменная тождественного типа с типом формального параметра
Нетипированный параметр­переменная
Переменная произвольного типа
ЛОКАЛЬНЫЕ И ГЛОБАЛЬНЫЕ ОБЪЕКТЫ
Если объект (константа, переменная, процедура, функция или тип) имеет смысл только в пределах некоторой части программы, то этот объект называется локальным. В теле подпрограммы используются объекты двух видов: локальные и нелокальные объекты. Последние определены в контексте, являющемся средой для описания подпро­граммы. Если они определены в головной программе, то такие объекты называются глобальными; если же они определены в самом языке (т. е. в контексте, в который «погружается» программа), то они называются стандартными объектами. Областью существования локального объек­та является весь текст подпрограммы. Это означает, что после оконча­ния процесса, описанного подпрограммой, пространство в памяти, за­нятое локальными переменными, становится снова свободным
и его можно использовать для других переменных. Очевидно, при повтор­ном вызове той же самой подпрограммы значения ее локальных пере­менных снова не определены, точно так же как они не были определе­ны при первом вызове подпрограммы.
При идентификации локальных объектов существенно то, что мы
можем выбирать их имена вне зависимости
от среды. Головную про­грамму удобно рассматривать как подпрограммы без имени. Ее средой является операционная система вычислительной машины, где предва­рительно определены все стандартные объекты. Таким образом, ясно, почему идентификаторы можно выбирать, не считаясь со стандартны­ми именами. Если стандартный объект не используется в программе, то употребление (случайное или преднамеренное)
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, An­siString, 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 - переменная строкового типа An­siString } begin SetConsoleOutputCP(1251);{Кириллизация вывода.} s:= Copy(y,9,Length(y)); {Значение переменной s ­'константа' } writeln(s); readln; end.
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]