Составление программы на языке программирования. Отладка и тестирование программы

Вид материалаДокументы

Содержание


3.16. Строковый тип данных
Подобный материал:
1   ...   10   11   12   13   14   15   16   17   ...   21

3.16. Строковый тип данных


Теперь мы познакомимся с типом данных, который относится к числу структурированных. Это строковый тип данных (строка). Следует заметить, что строковый тип данных есть в Турбо Паскале и отсутствует в стандартном Паскале.

Строка — это последовательность символов. Каждый символ занимает 1 байт памяти (код ASCII). Количество символов в строке называется ее длиной. Длина строки может находиться в диапазоне от 0 до 255. Строковые величины могут быть константами и переменными.

Строковая константа есть последовательность символов, заключенная в апострофы. Например:

'Язык программирования ПАСКАЛЬ',

'IBM PC — computer',

'33-45-12'.

Строковая переменная описывается в разделе описания переменных следующим образом:

Var <идентификатор>: String[<максимальная длина строки>]

Например:

Var Name: String[20]

Параметр длины может и не указываться в описании. В таком случае подразумевается, что он равен максимальной величине — 255. Например:

Var slovo: String

Строковая переменная занимает в памяти на 1 байт больше, чем указанная в описании длина. Дело в том, что один (нулевой) байт содержит значение текущей длины строки. Если строковой переменной не присвоено никакого значения, то ее текущая длина равна нулю. По мере заполнения строки символами ее текущая длина возрастает, но она не должна превышать максимальной по описанию величины.

Символы внутри строки индексируются (нумеруются) от единицы. Каждый отдельный символ  идентифицируется именем строки с индексом, заключенным в квадратные скобки. Например:

Name[5], Name[i], slovo[k+1].

Индекс может быть положительной константой, переменной, выражением целого типа. Значение индекса не должно выходить за границы описания.

Тип String и стандартный тип char совместимы. Строки и символы могут употребляться в одних и тех же выражениях.

Строковые выражения строятся из строковых констант, переменных, функций и знаков операций. Над строковыми данными допустимы операции сцепления и операции отношения.

Операция сцепления (+) применяется для соединения нескольких строк в одну результирующую строку. Сцеплять можно как строковые константы, так и переменные.

Например:

'ЭВМ'+'IВМ'+'РС'.

В результате получится строка:

'ЭВМ IBM PC'.

Длина результирующей строки не должна превышать 255. Операции отношения =, <


, >, <=, >=, <> производят сравнение двух строк, в результате чего получается логическая величина (true или false). Операция отношения имеет более низкий приоритет, чем операция сцепления. Сравнение строк производится слева направо до первого несовпадающего символа, и больше считается та строка, в которой первый несовпадающий символ имеет больший номер в таблице символьной кодировки.

Если строки имеют различную длину, но в общей части символы совпадают, считается, что более короткая строка меньше, чем более длинная. Строки равны, если они полностью совпадают по длине и содержат одни и те же символы.

Пример:

Выражение            Результат

'cosmi'<'cosm2'      True

'pascal'>'PASCAL'    True

'Ключ_'<>'Ключ'      True

'MS DOS'='MS DOS'    True

Функция Copy (S, Poz, N) выделяет из строки s подстроку длиной в N символов, начиная с позиции Poz.N и Poz — целочисленные выражения.

Пример:

Значение S                 Выражение                Результат

'ABCDEFG'    Copy(S,2,3)    'BCD'

'ABCDEFG'    Copy(S,4,4)    'DEFG'

Функция Concat (Sl, S2, ..., SN) выполняет сцепление (конкатенацию) строк S1,... ,SN в одну строку.

Пример:

Выражение                                                    Результат

Concat('АА','XX','Y')    'AAXXY'

Функция Length (S) определяет текущую длину строки S. Результат — значение целого типа.

Пример:

Значение S            Выражение                Результат

'test-5'     Length(S)       6

'(А+В)*С'    Length(S)       7

Функция Pos (Sl, S2) обнаруживает первое появление в строке S2 подстроки Sl. Результат — целое число, равное номеру позиции, где находится первый символ подстроки S1.

Если в строке S2 подстроки Sl не обнаружено, то результат равен 0.

Пример:

Значение S2              Выражение                Результат

'abcdef      Pos('cd',S2)    3

'abcdcdef    Pos('cd',S2)    3

'abcdef      Pos('k',S2)     0

Процедура Delete (S, Poz, N) выполняет удаление N символов из строки S, начиная с позиции Poz.

Пример:

Исходное значение S       Оператор                                Конечное значение S

'abcdefg'         Delete(S,3,2)          'abefg'

'abcdefg'         Delete (S,2,6)     'a'

В результате выполнения процедуры уменьшается текущая длина строки в переменной S.

Процедура Insert(Sl,S2,Poz) выполняет вставку строки S1 в строку S2, начиная с позиции Poz.

Пример:

Начальное S2                         Оператор                                            Конечное S2

'ЭВМ PC'        Insert('IBM-',S2, 5)       'ЭВМ IBM-PC'

'Рис.2'         Insert('N',S2,6)           'Рис. N2'

Пример 1. Следующая программа получает из слова «ВЕЛИЧИНА» слово «НАЛИЧИЕ»:

Program Slovo_1;

Var S11,S12: String[10];

Begin

S11:='ВЕЛИЧИНА';

S12:=Copy(S11,7,2)+Copy(S11,3,4)+S11[2];

WriteLn(S12)

End.

Пример 2. По следующей программе из слова «СТРОКА» будет получено слово «СЕТКА».

Program Slovo_2;

Var S1: String[10];

Begin

S1:='СТРОКА';

Delete(S1,3,2);

Insert('E',Sl,2);

WriteLn(S1)

End.

Пример 3. Составим программу, которая формирует символьную строку, состоящую из п звездочек (п — целое число, 1 ≤ п ≤ 255).

Program Stars;

Var A: String;

N,I: Byte;

Begin

Write('Введите число звездочек');

ReadLn(N);

A:=';

For I:=1 To N Do

A:=A+'*';

WriteLn(A)

End.

Здесь строковой переменной а вначале присваивается значение пустой строки (' '). Затем к ней присоединяются звездочки.

Пример 4. В символьной строке подсчитать количество цифр, предшествующих первому символу !.

Program С;

Var S: String;

К,I: Byte;

Begin

WriteLn(«Введите строку»);

ReadLn(S);

K:=0;

I:=l;                    

While (K»Length(S)) And (S[I]<>'!') Do

Begin

If (S[I]>='0') And (S[i]<='9')

Then K:=K+1;

I:=I+1

End;

WriteLn ('Количество цифр до символа «!» равно',К)

End.

В этой программе переменная К играет роль счетчика цифр, а переменная I — роль параметра цикла. Цикл закончит выполнение при первом же выходе на символ ! или, если в строке такого символа нет, при выходе на конец строки. Символ S[I] является цифрой, если истинно отношение: 0
Пример 5. Дана символьная строка, которая имеет следующий вид:





 b ='

На месте а и b стоят десятичные цифры; значком



 обозначен один из знаков операций: +, -, *. Иначе говоря, записано арифметическое выражение с двумя однозначными числами и знак равенства, например '5+7 ='. Нужно, чтобы машина вычислила это выражение и после знака равенства вывела результат. Операция деления не рассматривается для того, чтобы иметь дело только с целыми числами.

Программу решения такой задачи назовем интерпретатором. Интерпретатор должен расшифровать содержание строки и выполнить соответствующую арифметическую операцию

От исходной символьной информации он должен перейти к работе с числовой информацией. Если предположить, что строка составлена только из четырех символов в соответствии с указанным форматом, то задача решается довольно просто. Вот программа такого интерпретатора:

Program Interpretator;

Var Str: String[4];

А, В: 0..9;

С: -100..100;

Begin

{ввод исходной строки}

WriteLn('Введите выражение!');

WriteLn;

Read(Str);

{преобразование цифровых символов в числа}

A:=Ord(Str[l])-Ord('0');

B:=Ord(Str[3])-Ord('0');

(выполнение арифметической операции)

Case Str[2] Of

'+': С:=А+В;

'-': С:=А-В;

'*': С:=А*В

End;

{вывод результата}

WriteLn(С:2)

End.

В этой программе появился новый для нас оператор. Он называется оператором выбора. Формат этого оператора описывается синтаксической диаграммой (рис. 33).



Здесь <селектор> — это выражение любого порядкового типа; <константа> — постоянная величина того же типа, что и селектор; <оператор> — любой простой или составной оператор.

Выполнение оператора выбора происходит так: вычисляется выражение-селектор; затем в списках констант ищется такое значение, которое совпадает с полученным значением селектора; далее исполняется оператор, помеченный данной константой. Если такой константы не найдено, то происходит переход к выполнению оператора, следующего после оператора выбора.

В приведенной выше программе роль селектора играет символьная величина Str[2]. Если она равна +, то выполнится оператор c:=a+b; если равна -, то выполнится оператор с:=а-b; если равна *, выполнится оператор с:=а*b. Для любых других значений Str[2] не выполнится ни один из операторов присваивания, и значение переменной С останется неопределенным.

Приведенное выше описание оператора выбора соответствует стандарту Паскаля. В Турбо Паскале допустимо использование в операторе Case альтернативной ветви после служебного слова Else. Вот пример для той же задачи. Если мы хотим, что-. бы в случае неверного символа в Str[2] выдавалось сообщение об этом, нужно программировать так:

Case Str[2] Of

'+': С:=А+В;

'-': С:=А-В;

'*': С:=А*В

Else WriteLn("неверный знак операции')

End;

А теперь вернемся к программе interpretator и разберемся в том, как она будет выполняться.

После ввода строки цифровые символы переводятся в соответствующие десятичные числа. Затем интерпретируется знак операции. В зависимости от знака выполняется одно из трех арифметических действий. Далее результат выводится на экран после символа =.