2.3 Строки
Строка – это одномерный массив символов. К любому символу в строке можно обратиться как к элементу одномерного массива.
Var
St:string;
Begin
If st[5]=’A’ then
End.
Самый первый байт в строке имеет индекс 0 и содержит текущую длину строки. Первый значащий символ строки занимает второй байт и имеет индекс 1.
Процедуры и функции представляют собой инструмент Турбо Паскаля, позволяющий писать хорошо структурированные программы (расчленненые на относительно самостоятельные фрагменты). В структурированных программах обычно легко прослеживается основной алгоритм, они проще в отладке и менее чувствительны к ошибкам программирования. Все эти свойства являются следствием особенности процедур (функций), каждая из которых представляет собой во многом самостоятельный фрагмент программы, связанный с основной программой лишь с помощью нескольких параметров. Самостоятельность процедур (функций) позволяет локализовать в них все детали программной реализации того или иного алгоритмического действия и поэтому изменение этих деталей обычно не приводит к изменениям основной программы.
Процедурой называется особым образом оформленный фрагмент программы, имеющей собственное имя. Упоминание этого имени в тексте программы приводит к активизации процедуры и называется ее вызовом. Сразу после активизации процедуры начинают выполняться входящие в нее операторы, после выполнения последнего из них управление возвращается обратно в основную программу и выполняются операторы непосредственно стоящие за оператором вызова процедуры.
Для обмена информацией между основной программой и процедурой используется один или насколько параметров вызова (параметры вызова могут и не использоваться). Если они есть, то они перечисляются в круглых скобках за именем процедуры и вместе с ним образуют оператор вызова процедуры.
Функция отличается от процедуры тем, что результат ее работы возвращается в виде значения этой функции, и, следовательно, вызов функции может использоваться наряду с другими операторами в выражениях.
С примерами процедур и функций мы уже встречались – это стандартные процедуры ввода-вывода данных, математические функции и др. Стандартными они называются потому, что созданы одновременно с системой Турбо Паскаля и являются ее неотьемлемой частью. Нестандартные процедуры и функции необходимо писать, чтобы компилятор мог установить связь между оператором вызова и теми действиями, которые предусмотрены в процедуре (функции).
Процедуры и функции
Как и над каждым стандартным типом Pascal'я, над строками определено некоторое множество операций.S1+S2 конкатенация (сцепление)
S1=S2 сравнение на равенство
S1<S2 сравнение на меньше
S1>S2 сравнение на больше
S1<>S2 сравнение на неравенство
Сравнение производится в соответствии с кодами ASCII: если (первые) одноиндексные символы строк равны, то сравниваются следующие. Результат сравнения равен результату сравнения кодов первых (различных) символов. Пробел тоже является символом ASCII, поэтому, если строки различаются лишь количеством последних пробелов, то та, у которой их больше доминирует ту, у которой их меньше. Строка, которая обладает большей длиной, однако, не всегда более короткая строка меньше более длинной ('Cd'>'Abc', так как 'C'>'A').
Кроме того, Pascal содержит следующие встроенные процедуры и функции для работы со строками.
Некоторык из функций:
Function Copy(Str: String; I, J: Byte): String; функция, возвращающая подстроку строки S начиная с позиции I и дляной в J символов
Procedure Delete( Var Str: String; I, J: Integer); процедура, удаляющая из строки S J символов начиная с позиции I
Procedure Insert(Str1: String, Var Str2: String, I: Byte) процедура, вставляющая одну строку в другую начиная с позиции I
Function Pos(Str1; String; Str2: String): Byte; функция, возвращающая позицию начиная с которой первая строка входит во вторую и 0, если такого не случилось
Program CharConvert;
{Программа вводит текстовую строку, преобразует все входящие в нее
буквы в прописные и выводит результат}
Procedure UpString(s1:string; var s2:string);
{Процедура преобразует буквы входной строки s1 в прописные буквы
латинского алфавита и помещает результат преобразования в выходную
строку s2. Предполагается, что последовательность букв образуют
непрерывный массив. В соответствии с таблицей кодировки символов
коды символов латинских строчных букв от а до z образуют непрерывный массив монотонно нарастающих чисел от 97 до 122, а коды соответствующих им прописных букв – непрерывный массив чисел от 65 до90. Преобразование строчных букв в прописные состоит в уменьшении кода буквы на 32}
Var
i:integer;
c:char; {Рабочая переменная преобразования}
begin
s2:=’’; {вначале выходная строка пустая}
{Цикл посимвольного анализа исходной строки}
for i:=1 to Length(s1) do
begin
{Берем из входной строки очередной символ}
c:=s1[i];
{Проверяем символ на принадлежность к массиву}
if (c>=’a’) and (c<=’z’) then
c:=chr(ord(‘A’)+ord(c)-ord(‘a’));
s2:=s2+c;
end
end;
Var
Sinp, Sout:String; {Исходная и преобразованная строки}
Begin
Write(‘Введите строку’);
ReadLn(Sinp);
UpString(Sinp, Sout); {Преобразуем введенную строку к прописным б}
WriteLn(‘Результат’, Sout)
End.
Описание процедуры начинается словом Procedure за которым следует имя процедуры и список формальных параметров. Список параметров заключается в круглые скобки и содержит перечень параметров с указанием их типа. Перед параметром s2, с помощью которого в вызывающую программу возвращается результат преобразования, стоит зарезервированное слово Var. Именно таким способом компилятору указываются те параметры, в которых процедура возвращает вызвавшей ее программе результат своей работы. Procedure, имя и список параметров образуют заголовок процедуры. За заголовком следует тело процедуры, содержащее раздел описаний и раздел операторов.
Второй способ реализации данной программы – оформим алгоритм преобразования в виде функции.
Program CharConvert1;
Function UpString(s1:string):string;
Var
i:integer;
c:char;
s2:string {Результат преобразования}
begin
s2:=’’;
for i:=1 to Length(s1) do
begin
c:=UpCase(s1[i]);
s2:=s2+c;
end;
UpString:=s2 {Присваиваем значение функции UpString }
end;
Var
Sinp:String;
Begin
Write(‘Введите строку’);
ReadLn(Sinp);
WriteLn(‘Результат’, UpString(Sinp))
End.
Функции UpString используется в качестве параметра обращения к другой процедуре (WriteLn). В теле любой функции необходимо осуществлять присваивание ей вычисленного значения (UpString:=s2). В левой части оператора присваивания в этом случае указывается имя функции. С помощью стандартной функции UpCase преобразуется каждый очередной символ латинского алфавита.
Program Code;
{Программа читает символ с клавиатуры и выводит на экран этот
символ и соответствующий ему внутренний код}
Var
Ch : char;
Begin
Write(‘Введите символ’);
ReadLn(Ch);
WriteLn(ch, ‘=’, ord(ch));
End.
3.4 Записи
Запись – это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. В отличие от массива, компоненты (поля) записи могут быть различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются.
Структура:
<имя типа> = Record <список полей> End
Список полей – последовательность разделов записи, между которыми ставится точка с запятой. Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификатором ставится двоеточие и описание типа поля.
Type
BirthDay = Record
day, month : byte;
year: integer
End;
Var
a, b: BirthDay;
Тип BirthDay есть запись с полями day, month, year. Переменные a, b содержат записи типа BirthDay.
Значения переменных типа записи можно присвоить другим переменным того же типа:
a:=b;
К компонентам записи можно получить доступ, если использовать составное имя, т.е. указать имя переменной, затем точку и имя поля
a.day:=27;
b.year:=1990;
Вложенные поля
Type
BirthDay = Record
day, month : byte;
year: integer
End;
Var
c:Record
name:string;
bd:BirthDay
end;
begin
…
if c.bd.year=1990 then
…
end.
