Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Програмирование. Структурное програмирование, подпрограммы, строки. Учебное пособие
.pdf
путем добавления к символам левой строки (левого операнда) симво-
p
лов правой строки (правого операнда).
Пример 16. Сложение строк
const
y = ''; { пустая строка }
n = 'TURBO'; { строковая константа}
g = 'Borland''TURBO Pascal';{ Строка содержит апо-
строф.}
var w, k:String; ch: Char;
begin
w:= n + ' Pascal';{ w получает значение равное 'TURBO
Pascal'}
k:= y + ' 1999';{ k = 'TURBO Pascal 1999'}
ch:= 'г';{ ch - символьная переменная}
k:= k + ch;{ k = 'TURBO Pascal 1999г' к строке доба-
вили символ}
end.
ПРОЦЕДУРЫ НА СТРОКАХ
Набор стандартных строковых процедур предназначен для обработки данных, организованных в форме строк. Приведенные здесь
процедуры поддерживают все строковые типы. Более широкий набор
процедур, поддерживающий строки AnsiString, содержится в модуле
StrUtils.
Стандартные строковые процедуры
Процедура Описание Заголовок
Delete
Insert
Str
Val
Удаляет подстроку
из строки
Вставляет подстроку
в строку
Преобразует числовое значение в его строковое
представление
Преобразует строковое
значение в его числовое
представление
procedure Delete(var S: string; Index,
Count:Integer);
rocedure Insert(Source: string; var S:
string; Index: Integer);
procedure Str(X [: Width [: Decimals
]]; var S);
procedure Val(S; var V; var Code:
Integer);
51

Пример 17. Процедуры на строках
var
s:String; code:integer; v:Real; n:Integer; g:String =
'';
begin
g:= 'new year';
Insert('1997 ',g,5); { g = 'new 1997 year'}
Delete(g,5,5); { g = 'new year'}
Delete(g,1,4); { g = 'year'}
g:='happy';s:= 'new 1997 year';
Insert(g+' ',s,10); { s = 'new 1997 happy year'}
Val(Copy(s,5,4),n,code); { n = 1997}
s:= 'длина 5.25 метра';
Val(Copy(s,7,4),v,code); { v = 5.25}
v:=5.25;
Str(v,s); { s = '5.25'}
n:=10;
Str(n,s); { s = '10'}
end.
ФУНКЦИИ НА СТРОКАХ
Набор стандартных строковых функций предназначен для обработки данных, организованных в строки. Приведенные здесь функции
поддерживают все строковые типы. Более широкий набор функций,
поддерживающий строки AnsiString, содержится в модуле StrUtils.
Стандартные строковые функции
Функция Описание Заголовок
Concat
Copy
Length
Pos
Выполняет конкатенацию
(сложение) последова-
тельности строк
Выделяет подстроку
из строки
Возвращает динамиче-
скую длину строки
Производит поиск под-
строки в строке
function Concat(s1 [, s2,..., sn]:
string): string;
function Copy(S: string; Index,
Count: Integer): string;
function Length(S: string): Integer;
function Pos(Substr: string;
S: string): Integer;
52

Пример 18. Функции на строках
var
s: String; n: Integer; g:String = '';
begin
s:= 'new 1997 happy year';
g:= Copy(s,10,5); { g = 'happy'}
g:= Copy('new 1997 happy year',5,4); { g = '1997'}
n:= Pos('99',g); { n = 2}
g:= 'new 1997 happy year';
n:= Pos('h',g); { n = 10}
n:=Length(g); { n = 19}
n:=Sizeof(g); { n = 256}
n:=Sizeof(f); { n = 26}
s:=Concat('new ', '1997 ', 'happy', ' year');
{s = 'new 1997 happy year'}
end.
СТРОКА КАК МАССИВ
К символам строки можно получить доступ для записи и чтения по
индексу, как к компонентам массива, поскольку строковый тип можно
рассматривать как одномерный массив символов
array [1...n] of Char
где n – атрибут длины строки.
Пример 19. Строка как массив
var
s: string;
i: longint;
ch: char;
begin
s:= 'Delphi';
for i:= 1 to Length(s) do writeln(s[i]);
s:= s + ' Borland';//s = 'Delphi Borland'
writeln(s); // Delphi Borland
ch:= s[1];
writeln(ch);// D
s[1]:= ' ';// s = ' elphi Borland'
writeln(s); // elphi Borland
readln;
end.
53

СТРОКОВЫЕ ТИПЫ ПОЛЬЗОВАТЕЛЯ
Object Pascal разрешает определять пользовательские строковые
типы.
Такие типы объявляются на основе стандартного типа String. Они
позволяют пользователю выбрать константный атрибут длины строки
в интервале 1…255.
Пользовательский строковый тип объявляется так:
type
T = String[L];
Здесь T – идентификатор пользовательского строкового типа; L – целочисленное выражение, определяющее константный атрибут длины
строки для типа T.
Использование
переменных пользовательского строкового типа
ничем не отличается от использования переменных типа String.
Исключением являются некоторые ограничения при использовании
их в качестве параметров подпрограмм.
Пример 20. Строковые типы пользователя
Type
Line = String[79]; {Объявлен строковый тип пользова-
теля Line с константным атрибутом длины строки равным 79
символам.}
const
n = 'TURBO'; {Простая константа n, представляет
значение 'TURBO'.}
g: Line= 'TURBO'; { Типизованная константа gтипа
Line.}
var
s: Line; {s - переменная строкового типа Line.}
L: Byte;
begin
s:= 'TURBO';
L:= Length(s); { L = 5, так как в строке 'TURBO',
представленной s 5 символов.}
L:= Sizeof(s) - 1; { L = 79, как константный атрибут
длины строки типа Line.}
end.
54

Короткие строки ShortString
Память для коротких строк так же, как и для массивов, выделяется
статически. Как структура данных, ShortString-строка аналогична одномерному массиву символов, но имеет существенное отличие от него.
Массив символов имеет фиксированную длину (количество элементов), которая определяется при описании, а ShortString-строка имеет
две разновидности длины:
общую длину
строки, которая характеризует размер памяти, вы-
деляемый короткой строке при описании;
текущую длину строки (всегда меньше общей длины или равную
ей), которая показывает количество смысловых символов короткой
строки в каждый конкретный момент времени.
В ShortString-строках текущая длина строки указывается в нулевом, т. е. имеющем индекс 0, элементе строки. В этот
элемент записывается символ, код которого равняется значению текущей длины. Нулевой элемент строки при этом сделан невидимым для пользователя,
однако использовать его в программах (записывать в него и извлекать
из него информацию), хотя не рекомендуется, но в принципе допускается. Поскольку каждый символ занимает один байт памяти, при таком
способе указания текущей длины максимально допустимая длина
строки будет ограничена максимальным значением, которое можно
записать в один байт памяти, т. е. максимальная текущая длина строки
может быть не более 255 символов.
Преимуществом такого способа представления строк является
чрезвычайно простой доступ к значению текущей длины строки, что
позволяет эффективно выполнять работу со строками
. Недостаток со-
стоит в ограничении на максимальную длину строки.
p = 7 n = 14
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
• B O R L A N D
символ, код которого = 7
n – фиксированная общая длина строки
p – текущая длина строки
var s: String[14];
begin
s:= BORLAND;
55
Номера символов

Напомним, что этому способу реализации строк соответствует
предопределенный тип String при выключенной директиве {$Н-}.
Определяемая при описании общая длина строки указывается в квадратных скобках.
Примеры:
{$H-}
var
SI : String [10];
S2 : String [128];
Smaxl : String;
Smax2 : ShortString;
Если длина в описании типа String не указывается, то по умолчанию принимается максимальная длина, равная 255 символам.
Внимание!
Предопределенный идентификатор ShortString всегда соответствует короткой строке максимальной длины в 255 символов и указания какой-либо другой длины не допускает.
ОРГАНИЗАЦИЯ СТРОК ANSISTRING В ПАМЯТИ
Память под длинные строки AnsiString, в отличие от ShortString-
строк, выделяется не статически, а динамически. Кроме того, AnsiString-строки не имеют максимальной длины, устанавливаемой при
объявлении, только динамическую текущую длину. Общим для обоих
типов строк является наличие дескриптора. Однако если для коротких
строк дескриптор имеет простейший вид дополнительного нулевого
элемента, в котором хранится текущая длина строки, то у длинных
строк дескриптор представляет собой более сложную структуру длиной в 8 байт, которая имеет следующий вид.
Текущая длина строки (4 байта) Счетчик ссылок на строку (4 байта)
Переменная типа AnsiString представляет собой 4-байтовый указа-
тель на дескриптор приведенной структуры, непосредственно вслед за
56

которым в памяти располагаются значащие символы строки. Если
длинная строка имеет нулевую длину, то память под нее и под дескриптор не выделяется, а соответствующая переменная имеет значение nil. Переменным длинного строкового типа при создании автоматически присваивается пустое начальное значение nil, независимо от
того, где они объявлены (являются ли они
глобальными или локальными переменными процедуры, или составными частями динамического объекта и т. п.).
Обобщая сказанное, внутреннее строение длинной строки в памяти
можно представить так, как показано на рисунке.
var
LongStrl, LongStr2: AnsiString;
{ После обработки объявлений значение указателя на строку }
{ AnsiString устанавливается в nil }
LongStrl
nil
begin
LongStrl:= 'Очень длинная строка...';
{ После такого присваивания структура представления }
{ строки AnsiString примет следующий вид }
LongStr1
Адрес строки
4 байта
Текущая длина
строки
4 байта 4 байта
Счетчик ссылок
на строку
Очень длинная строка …
\0
нуль-
символ
Внутреннее строение длинной строки в памяти
Предопределенный идентификатор AnsiString всегда соответствует
длинным строкам независимо от значения директивы компилятора $Н.
57

КОНТРОЛЬНЫЕ ВОПРОСЫ
1. В чем различие строковых типов ShortString, AnsiString, Wide-
String?
2. В каком диапазоне значений может находиться длина строки для
типа ShortString?
3. В каком диапазоне значений может находиться длина строки для
типа AnsiString?
4. В каком диапазоне значений может находиться длина строки для
типа WideString?
5. Из символов какого кода строятся строки для типа
ShortString?
6. Из символов какого кода строятся строки для типа AnsiString?
7. Из символов какого кода строятся строки для типа WideString?
8. Какие операции определены на строках?
9. Каков порядок выполнения операций отношения?
10. Для чего можно использовать операции отношения на строках?
11. Какие две строки считаются равными друг другу?
12. Чему может
быть равна пустая строка?
13. Каково назначение подпрограммы Length и передаваемых в нее
параметров?
14. Назначение подпрограммы Pos и передаваемых в нее параметров.
15. Назначение подпрограммы Copy и передаваемых в нее параметров.
16. Назначение подпрограммы Concat и передаваемых в нее пара-
метров.
17. Назначение подпрограммы Delete и передаваемых в нее пара-
метров.
18. Назначение подпрограммы Insert и
передаваемых в нее параметров.
19. Назначение подпрограммы Val и передаваемых в нее параметров.
20. Назначение подпрограммы Str и передаваемых в нее параметров.
58

СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
ТЕХНОЛОГИЯ СТРУКТУРНОГО
ПРОГРАММИРОВАНИЯ
В конце 60-х годов прошлого века в США было отмечено явление
под названием «software crisis» (кризис ПО). Это выражалось в том,
что большие проекты стали выполняться с отставанием от графика или
с превышением сметы расходов, разработанный продукт не обладал
требуемыми функциональными возможностями, производительность
его была низка, качество получаемого программного обеспечения
устраивало потребителей.
Кризис программного обеспечения привел к необходимости создания нового способа разработки программ, который снижал бы общие
затраты на протяжении всего жизненного цикла программы – от замысла до завершения эксплуатации (морального старения). Такая технология появилась в начале 1970-х годов и была названа структурным
программированием. В основе структурного
сочетание теории программирования и личного опыта высококвалифицированных программистов, а также учет современных требований
к программам и промышленного характера их производства.
Одно из основных требований, которому должна удовлетворять
программа, – она должна работать в полном соответствии с заданной
на нее спецификацией и адекватно реагировать на любые действия
пользователя. Кроме этого
заявленному сроку, затраты на разработку не должны превышать сметы расходов. Программа должна допускать внесение необходимых изменений и дополнений в процессе ее эксплуатации. Она должна удовлетворять такому критерию качества как надежность. Кроме того, она
должна обладать свойством, которое обеспечивает возможность планировать
ния этих целей программа должна иметь простую структуру, быть хорошо читаемой и легко модифицируемой.
производство программы и ее сопровождение. Для достиже-
, программа должна быть выпущена точно к
59
программирования лежит
не

Структурное программирование – это технология создания программ, позволяющая путем соблюдения определенных правил уменьшить время разработки и количество ошибок, а также облегчить возможность модификации программы.
Структурный подход охватывает все стадии разработки проекта:
анализ требований, проектирование, собственно программирование и
тестирование.
Структурный подход к программированию позволил успешно создавать достаточно крупные
проекты, но сложность программного
обеспечения продолжала возрастать, и требовались все более развитые
средства ее преодоления. Идеи структурного программирования получили свое дальнейшее развитие в объектно-ориентированном программировании (ООП) – технологии, позволяющей достичь простоты
структуры и управляемости очень крупных программных систем.
СТРУКТУРНЫЕ МЕТОДЫ АНАЛИЗА
И ПРОЕКТИРОВАНИЯ ПО
Проблема сложности – одна из основных
проблем, которые прихо-
дится решать при создании больших и сложных систем любой природы. Программное обеспечение – не исключение. В силу ограниченности человеческих возможностей ни один разработчик не в состоянии
понять всю сложную систему в целом. Эффективный подход к решению этой проблемы заключается в построении сложной системы из
небольшого
количества меньших частей, каждая из которых, в свою
очередь, строится из частей еще меньшего размера, и так до тех пор,
пока самые небольшие части будет нецелесообразно разделять далее.
Этот подход известен под разными названиями такими, как «разделяй
и властвуй» (divide et imperd), иерархическая декомпозиция и др.
По отношению к проектированию сложной программной системы это
означает, что ее необходимо разделить (декомпозировать) на небольшие подсистемы, каждую из которых можно разрабатывать независимо от других. Это позволяет осуществлять независимую разработку
подсистем любого уровня.
Структурные методы являются строгой дисциплиной системного
анализа и проектирования. Методы структурного анализа и проектирования стремятся преодолеть сложность больших систем путем расчленения
их на части («черные ящики») и иерархической организации
этих «черных ящиков». Выгода в использовании «черных ящиков»
60
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
