русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

С Т Р О К И


Дата добавления: 2014-11-27; просмотров: 491; Нарушение авторских прав


 

Обработка текста в виде массива символов сопряжена с рядом недостатков.

1. Символьный массив обрабатывается в цикле по одному элементу, вследствие чего программа становится громоздкой.

2. Cимвольному массиву можно присвоить значение строки символов лишь в том случае, когда длина строки и объявленный размер массива одинаковы.

Чтобы исключить указанные недостатки, в Турбо Паскале введен тип данных string. Переменная типа stringв отличие от массива символов может принимать значения переменной длины. При объявлении такой переменной указывается ее максимальная длина.

Объявление строки имеет вид:

Var S : string[v],

где v - атрибут длины, представляющий собой целочисленное выражение.

Каждый символ строки занимает один байт.

Атрибут длины может принимать значение от 0 до 255. При v = 0 имеем строку нулевой длины, т.е. пустую строку. Если атрибут длины не указан в объявлении строки, то по умолчанию он принимается равным 255.

Если строка объявлена в виде string[n], то в памяти для нее выделяется n+1 байт, которые имеют номера 0, 1, ... , n. В нулевом байте хранится текущая длина строки.

Память строке, как и другим переменным, выделяется в соответствии с описанием ее типа. Однако, как и в массиве, эта память может использоваться не полностью. При объявлении string[Nmax] текущее количество символов строки, обрабатываемое в программе, может принимать значение 0 £ n £ Nmax. На это количество указывает содержимое нулевого байта строки. Поскольку численное значение байта изменяется в диапазоне 0 .. 255, то это и определяет минимальное и максимальное количество символов в строке.

Примечание. Хотя содержимое нулевого байта, определяющее текущую длину строки, по физическому смыслу – число, но этот байт, как и остальные байты строки, считается в программе символом. Поэтому более точно можно сказать, что текущая длина строки – это порядковый номер символа, записанного в нулевом байте.



 

Пример 1.

Var S1,S2 : string[20];

S3 : string;

Begin

S1:='abc'; S2:='';

 

Строкам S1 и S2 выделяется по 21 байту памяти, строке S3 - 256 байтов. Текущая длина строки S1 равна 3 символа, строки S2 - 0 символов (пустая строка); текущая длина строки S3 неопределенная, поскольку этой строке не присвоено никакого конкретного значения.

 

Пример 2.

Var S1 : string[10];

S2 : string[5];

S3 : string[20];

Begin

S1:='abcdefghijklmn';

S2:=S1; S3:=S1;

 

Как известно, при выполнении оператора присваивания вначале вычисляется значение выражения в его правой части, а затем полученное значение записывается в поле памяти, которое отведено для переменной в левой части. В первом операторе присваивания выражение в его правой части - это строка-константа 'abcdefghijklmn' длиной 14 символов. Так как эта длина превышает максимальную длину строки S1, то в S1 записываются лишь первые 10 символов, а остальные отбрасываются (они не поместятся в поле памяти, отведенное для строки S1).

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

Содержимое строк в примере 2:

S1 : 'abcdefghij'; S2 : 'abcde'; S3 : 'abcdefghij';

 

Поскольку строка неявно представляет собою массив символов, то к отдельным символам строки можно обращаться по индексу.

 

Пример 3.

Var ch : char;

S : string;

Begin

S:='0123456789';

ch:=S[5]; S[7]:='z'; Writeln('ch=',ch,' S=',S);

S[0]:=chr(4); Writeln('ch=',ch,' S=',S);

Будет отпечатано:

ch=4 S=012345z789

ch=4 S=0123

 

Нулевой байт S[0], определяющий текущую длину строки, рассматривается в составе строки таким же образом, как и остальные байты, т.е. как символ. Поэтому оператор типа S[0]:=4 в данном случае недопустим.

 

Для ввода-вывода строк используются те же процедуры, что и для ввода-вывода числовой информации.

 

Пример 4.

Var S : string[10];

Begin

S:='0123456789'; Writeln(' S=',S);

Writeln(' S=',S:15); Writeln(' S=',S:5);

 

Формат в процедуре печати определяет, сколько позиций на внешнем носителе (в данном случае на экране дисплея) должно быть выделено для размещения выводимого значения. Если формат превышает требуемое количество позиций, то "лишние" позиции слева заполняются пробелами (выводимая строка размещается в правой части поля). Если формат вывода меньше требуемого значения, то на внешнем носителе выделяется столько позиций, сколько содержится символов в выводимом значении.

В примере 4 будет отпечатано:

S=0123456789

S= 0123456789

S=0123456789

 

Пример 5. Ввод строковых переменных.

Будем рассматривать ввод из текстового файла F (частным случаем текстового файла является клавиатура ПЭВМ). Пусть в строках файла F, начиная с их первой позиции, записана следующая информация:

abcdefghijklmnopqrst

АБВГДЕЖЗИЙКЛМНОП

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

abcdefghijklmnopqrst

­

АБВГДЕЖЗИЙКЛМНОП

 

Пусть в разделе Varобъявлены следующие переменные:

Var S1 : string[5];

S2 : string[10];

S3,S4 : string[15];

 

Рассмотрим выполнение оператора Read(F,S1,S2,S3,S4), эквивалентного следующим четырем операторам:

Read(F,S1); Read(F,S2); Read(F,S3); Read(F,S4).

При выполнении первого оператора в строку S1 будут занесены 5 символов, начиная с текущей позиции файла F; при этом строка S1 получит значение 'abcde'. Указатель файла переместится в позицию 6 первой строки:

abcdefghijklmnopqrst

­

АБВГДЕЖЗИЙКЛМНОП

 

После выполнения второго оператора ввода в переменную S2 запишется строка 'fghijklmno', а указатель файла переместится в позицию 16:

abcdefghijklmnopqrst

­

АБВГДЕЖЗИЙКЛМНОП

 

При вводе строк S3 и S4 будут использованы символы, начиная с текущего положения указателя файла и до конца строки. Тогда строке S3 будет присвоено значение 'pqrst', а строке S4 - пустое значение.

В этом случае текущая длина строки S3 станет равной 5, а строки S4 - 0.

Пусть по отношению к тому же файлу F ввод строк выполняют операторы

Readln(F,S1); Readln(F,S2); Readln(F,S3); Readln(F,S4).

Это эквивалентно следующему:

 

Read(F,S1); Readln(F);

Read(F,S2); Readln(F);

Read(F,S3); Readln(F);

Read(F,S4); Readln(F).

 

После выполнения первого оператора строка S1, как и раньше, получит значение 'abcde', а указатель файла переместится в позицию 6 первой строки. Выполняемый после этого оператор Readln(F) перемещает указатель в первую позицию второй строки. После выполнения всех операторов будем иметь:

 

S1 = 'abcde'

S2 = '0123456789'

S3 = 'АБВГДЕЖЗИЙКЛМНО'

S4 = ''.

 

По отношению к строкам выполняется лишь одна операция - операция сцепления (конкатенации), которая обозначается символом "+". Если переменные S1 и S2 объявлены как строки, то выражение S1 + S2 означает, что к концу строки S1 дописывается строка S2.

 

Пример 6.

VarS1,S2 : string[10];

S3 : string;

Begin

S1:='0123456789'; S2:='abcd'; S3:=S1+S2;

Writeln(' S3=',S3);

 

Будет отпечатано:

S3=0123456789abcd

 

Пример 7.

VarS : string[15];

i : byte;

Begin

S:='123456';

For i:=1 to6 do

S:=S+'a';

Writeln('S=',S);

 

Получим:

S=123456aaaaaa (текущая длина строки равна 12)

 

Пример 8.

VarS : string[15];

i : byte;

Begin

S:='123456';

For i:=1 to12 do

S:=S+'a';

Writeln('S=',S);

 

Получим:

S=123456aaaaaaaaa (текущая длина строки равна 15, но не 18 )

 

Пример 9.

VarS : string[15];

i : byte;

Begin

S:='123456';

For i:=7 to 12 do

S[i]:='a';

Writeln('S=',S);

Получим:

S=123456 (текущая длина строки равна 6)

 

В примере 9, хотя и будут заполнены байты 7 .. 12 символом 'a', но операции присваивания выполняются по отношению к отдельным символам, а не по отношению к строке в целом. Поэтому текущая длина строки не изменяется. Если после оператора цикла добавить оператор S[0] := chr(12), то будет напечатано

S=123456aaaaaa (текущая длина строки 12).

 

Для строк допустимы все операции отношения. Сравнение строк выполняется слева направо по одному байту, пока не будут обнаружены различные байты. Пусть в этих байтах расположены символы ch1 и ch2.

Тогда ch1 < ch2, если ord(ch1) < ord(ch2).

Если текущие длины сравниваемых строк неодинаковы, то более короткая строка дополняется справа символом chr(0), который меньше любого другого символа таблицы ASCII.

 

Пример 10.

Var b1,b2,b3 : boolean;

Begin

b1:='abcdefgh'<'abcdxyzu';

b2:='300'>'30';

b3:=''='1234567';

Здесь имеем b1 = true, b2 = true, b3 = false.

 

Строчные и прописные буквы в строке считаются разными. В частности, 'a' ¹ 'A', так как ord('a') ¹ ord('A').

 

Строки могут быть оьъявлены не только как переменные (раздел Var), но и как константы (раздел Const). Например

Const Digits = ‘0123456789’;

Здесь нужно обратить внимание на следующее обстоятельство: к элементам строки-константы нельзя обращаться по индексу. Следовательно, мы не можем записать

ch := Digits[5] или Digits[5]:=’a’;

Разрешение доступа по индексу означало бы, что строку-константу можно изменять (пример – приведенный выше второй оператор присваивания), что недопустимо для констант.

 

 



<== предыдущая лекция | следующая лекция ==>
М А С С И В Ы С И М В О Л О В | ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ ОБРАБОТКИ СТРОК


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.007 сек.