Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Листинг 9.1. Вывод строки в перевернутом виде и по отдельным словам

Процедуры преобразования типов | И замена фрагментов текста | Преобразование строчных букв в заглавные | Понятие множества | Операции над множествами | Случайных неповторяющихся чисел | Определение и правила записи |


Читайте также:
  1. IX. Прочитайте визначення та заповнити прогалини зі словами в дужках. Зверніться до глосарію.
  2. O переносить по словам,
  3. To have (to) выражает обязанность или необходимость, обусловленную обстоятельствами. Переводится словами должен, приходится, вынужден, надо.
  4. А вывод таков.
  5. АКТИВАЦИЯ Windows 7 VL/Enterprise/Professional/Professional N С ПОМОЩЬЮ КОМАНДНОЙ СТРОКИ
  6. Б) прочитайте текст и найдите в нем слова, имеющие общий корень со словами перед текстом. Определите, к какой части речи они относятся и каковы их значения. Переведите текст.
  7. Базисные средства ввода-вывода

Обработка строк текста

9.1. Типы данных CHAR и STRING

В Turbo Pascal имеется два типа данных для работы с текстами: О char — литерный или символьный тип;

П String — СТрОКОВЫЙ ТИП ИЛИ ПрОСТО СТрОКЭ.

Символьный тип

Значением переменных символьного типа char является один символ. Каж­дому символу соответствует код символа — целое число в диапазоне от О до 255. Из этого следует, что символьный тип является порядковым. В не­которых языках программирования (С, Java) тип char относят к целым ти­пам, что разумно, т. к. в памяти компьютера нет символов —- есть только их числовые коды. Это первый момент, который важно уяснить — все дейст­вия по обработке символов, в конечном счете, сводятся к действиям над целыми числами, расположенными строго по порядку.

Над данными символьного типа определены следующие операции отноше­ния: =, о, <, >, <=, >=, вырабатывающие результат логического типа.

Обратите внимание — при выполнении всех операций сравнения коды сим­волов сравниваются как обычные целые числа. При этом получается, что любая заглавная буква всегда меньше соответствующей ей строчной, т. к. в кодовой таблице сначала располагаются все заглавные буквы, а затем строчные (см. приложение 2). Точно так же любая буква латинского алфави­та всегда меньше любой буквы русского алфавита, даже если их изображе­ния на экране практически неразличимы (А латинская, А русская).


Для данных символьного типа определены следующие стандартные функции: П chr(x) — возвращает значение символа по его коду;

П ordfch) —- возвращает код заданного символа ch; П pred(ch) — возвращает предыдущий символ; О succ(ch) — возвращает следующий символ;

П upcase(ch) — преобразует строчную букву в заглавную. Обрабатывает буквы только латинского алфавита.

Например:

П ord('A')=65

О спг(128)='Б'

О pred('B'}='A>

CJ succ(T') = 'flr


upcase('n')='N'


 


Строковый тип

Строка — это последовательность символов. Максимальное количество символов в строке (длина строки) может изменяться от I до 255. Пере­менную строкового типа можно определить через описание типа в разделе определения типов или непосредственно в разделе объявления переменных.

Type

ИмяТипа = string [максимальная длина строки];

Var


Идентификатор,


ИмяТипа;


Строковую переменную можно задать и без предварительного объявления

типа:

var


Идентификатор,


string[MaKc. длина строки];


ИЛИ var

Идентификатор,...: string;

Если максимальная длина строки не указывается, то она равна 255 байт.

Строковые данные могут использоваться в программе также в качестве кон­стант.

Например:

const stradres = 'ул. Мира, 35'; { строковая константа }

sadr: string[12] = ' ул. Мира' { типизированная константа, ее можно использовать как обычную переменную ]


type str!25 = string [125];

var strl:str!25; { описание с заданием типа }

stl: string; { по умолчанию длина строки = 255 |

st2,st3: string[50];

strnazv: string[280]; { ошибка, длина больше 255 }

В дальнейшем во всех примерах для удобства будем начинать имена всех переменных строкового типа с буквы з.

Строка в языке Turbo Pascal трактуется как массив символов. Для строки из п символов в памяти отводится п+l байт; п байтов — для хранения симво­лов строки, а один дополнительный байт — для значения текущей длины строки. Этот дополнительный байт имеет номер 0, соответственно первый символ строки имеет номер 1, второй — номер 2 и т. д.

Например, переменная sadr типа string [12] хранится в памяти таким обра­зом (табл. 9.1).

Таблица 9.1. Распределение памяти для хранения переменной

Всего строка занимает 13 байтов, из них последние 4 байта оказались неза­нятыми, т. к. реальная длина строки составляет 8 символов, это значение и хранится в нулевом байте строки. Незанятые байты составляют "хвост" строки, в котором может быть любой "мусор", однако программа не будет обращаться к "хвосту", т. к. реальный размер строки ей известен.

(Замечание ~^)

Из этого представления понятно и ограничение на максимальную длину стро­ки — 255 символов, т. к. для хранения длины строки отведен всего один байт (максимальное двоичное число, которое можно уместить в один байт, — восемь подряд идущих единиц, что соответствует десятичному числу 255).

К любому символу в строке можно обратиться как к элементу одномерного массива

array [0.. n] of char

по номеру (индексу) данного символа в строке. Индекс определяется выра­жением целочисленного типа, которое записывается в квадратных скобках, как для массива.

Обратите внимание — в отличие от массивов переменные строкового типа могут участвовать целиком в операторах ввода/вывода.

Например, readln(stl); writeln(st2>;


При вводе строки количество символов в ней определяется автоматически, при этом автоматически заполняется нулевой байт. Для получения длины строки имеется функция length, которая возвращает значение нулевого бай­та строки (см. разд. 9.3).

Разумеется, никто не запрещает вводить и выводить строки по отдельным символам, как массивы, используя любой из операторов цикла. Однако та­кая необходимость возникает редко. Посимвольный ввод строки стоит реа­лизовать только в том случае, если необходимо совместить ввод и какую-то обработку символов (см. листинг 9.9). Посимвольный вывод также удобно использовать для какой-либо нестандартной формы вывода.

Приведем пример, в котором исходная строка вводится целиком, а выво­дится по отдельным символам (листинг 9.1). В данном случае программа сначала выводит строку в "перевернутом" виде (например, вводим РОЗА, а выводится АЗОР). Затем та же строка выводится в прямом виде, но каждое слово с новой строки. Считаем, что слова разделены пробелами, причем не обязательно одиночными. Обратите внимание на условие, которое проверя­ет начало нового слова. Разбивка строки на слова — это типовое действие со строками.

Листинг 9.1. Вывод строки в перевернутом виде и по отдельным словам

var s:string;

i: integer; begin

write('Введите строку');readln(s);

for i:=length(s) ciownto 1 do write (s[i]);

for i:=l to length(s)-l do

if (s[i]) = ' ') and (s[i+l]<>' ') then writeln

else write(s[i]); readln; end

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

;•.......... -.................................:................ •;•"".............;•'-'................ '•........... """'.'..............................................................,,,.,..„..................................................... j

^Листинг 9.2. Проверка баланса скобок в скобочном выражении

var k,i:integer;{ k — номер символа, i — для определения баланса скобок)

s:string;


begin

writeln('Введите скобочное выражение:']; readln(s);

k:=l; i:=0;

while (k<=length(s)) and (i>=0) do

begin

{ если i<0, то выражение неправильно: ')' предшествует '(' }

if s[k]-'(' then i:=i+l;

if s[k]='} ' then i:=i-l,-

k:=k+l; ehd;

if i=0 then writeln('Скобки расставлены правильно.')
{ если i>0, то не хватает закрывающихся скобок }
else writeln{'Скобки расставлены неправильно'};
readln * *

end.


Дата добавления: 2015-11-14; просмотров: 71 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Новая услуга в вашем салоне!| Операции над строками

mybiblioteka.su - 2015-2024 год. (0.01 сек.)