Страницы

Уроки 21, 22 Символьный тип данных. Строковый тип данных

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


Под символами мы понимаем буквы и все те значки, которые вы видите на клавиатуре. В Паскале переменные для хранения символов имеют тип Char.
За каждым символом закреплен свой числовой код. Все коды сведены в таблицу.

Кодовая таблица ASCII (http://foxtools.ru/ASCII#1251)
Обычно для хранения символов используют код, называемый ASCII (американский стандартный код обмена информацией).

Таблица 3.1. Фрагмент таблицы ASCII (таблица кодов символов)
Код
Двоичный
Символ
Код
Двоичный
Символ
код
код
48
00110000
0
65
01000001
А
49
00110001
1
66
01000010
В
50
00110010
2
67
01000011
С
57
00111001
9
89
01011001
Y
90
01011010
Z

В компьютере коды записаны в двоичном виде.
На каждый код выделено 8 бит, то есть 1 байт.
Получаем 28 = 256 двоичных кодов.
Всего в таблице ASCII 256 кодов: наименьшее значение кода 00000000, наибольшее —11111111 (это 255 в двоичном виде).

Значения символьным величинам задаются:
командой присваивания (s:=’e’;) и записывается в апострофах;
вводом с клавиатуры (read (s); readln(a,b);).
При вводе с клавиатуры  апострофы не ставятся, т.е. они не являются элементами величины.


Функции для обработки символьной информации:

Ord(w) - дает порядковый номер (код) символа, который содержит переменная  w,
Chr(i) определяет символ с порядковым номером (кодом)  i.
Функции Ord и Chr обратные по отношению друг к другу.
Pred(q) – предыдущий символ, по отношению к символу, который содержит переменная q.
Succ(q) – следующий символ, по отношению к символу, который содержит переменная q.


Операции с символами

Отношение порядка на множестве символов по­зволяет выполнять операции сравнения. Из двух символов ме­ньше тот, который встречается раньше в кодировке ASCII.

Склеивание (сцепление символов)
Write (‘м’+’и’+’р’);

Пример 1. Демонстрация стандартных функций для работы с типом Char.
Program pr1; 
var
NInteger; 
XChar;
begin 
X:='L'; { В символьную переменную X записали символ ' L' }
writeln(X);
N:=0rd (X); { Функция Ord, возвращает код символа.
занесенного в переменную X, то есть код буквы ‘L' }
writeln(N); 
X: =' А'; 
writeln(X);
X:=Chr (N); { Функция Chr возвращает символ
по заданному коду. Сейчас в переменной X оказался символ ' L’ — именно его код мы  только что записали в переменную N }
writeln(X); 
end.

При выполнении программа выведет на экран следующее:
L
76
А
L



Пример 2. Ввод символов с клавиатуры
Program pr2; 
var
X,Y: Char; 
begin
   writeln('Введите несколько символов:');
   readln(X);
   writeln(X);
   writeln('Введите еще несколько символов:'); 
   readln(X,Y); 
   writeln(X,Y); 

end.

Запустив программу на выполнение, введите с клавиатуры последовательность символов (например, ABC) и нажмите Enter. Программа выведет единственный символ: А
В ответ на второе предложение введите с клавиатуры CAT. На экране получим следующее:
СА

ЗАМЕЧАНИЕ
Переменная типа Char принимает только один символ из введенной строки. При вводе символы не заключаются в апострофы. Таким образом, в первом случае из введенных символов запомнился только один, во втором — два.

Можно определять и символьные константы:
const Leto='X';


Тип Char — порядковый тип!
В таблице кодов вы могли заметить такую закономерность:
'0'<’1’< '2'< '3'< ...< '9'<... <'А'< 'В'< 'С'< ...< 'X' < 'Y' < 'Z’... (коды символов упорядочены).
Таким образом, для каждого элемента типа Char всегда есть предшествующий и последующий элементы.
Такой тип данных называется порядковым.
Тип Char — порядковый тип.
Тип Integer также является порядковым.



Пример 3. Стандартные функции, применяемые к порядковому типу.
Program pr3; 
var
Х1,Х2,ХЗ,Х4: Char; 
begin
   X1: ='L'; 
   writeln(Xl) ;
   X2:=Pred (X1); { Функция Pred возвращает предшествующий элемент      относительно значения переменной X1 }
   writeln('Pred=',X2);
   X3:=Succ (X1); { Функция Succ возвращает последующий элемент относительно значения переменной X1 }
   writeln('Succ=',ХЗ); 
end.

При выполнении программа выведет на экран следующее:
L
Pred=K 
Succ=M


Задание 1. Известно, что коды прописных (заглавных) букв латинского алфавита следуют в таблице непрерывно друг за другом. Коды строчных букв латиницы также следуют непрерывно друг за другом на расстоянии 32 символов от прописных (ниже по таблице).
Если ord('A') = 65, то ord('A')+32 = 97, и это код строчной буквы «а», то есть chr(ord('A')+32) = 'а'.
Напишите программу, в которой вы вводите прописную букву (только латиницу!), а получаете ее строчной эквивалент, и наоборот, по строчной букве получаете соответствующую прописную.


ЗАМЕЧАНИЕ
С русскими символами такого порядка нет из-за особенностей организации кодовой таблицы. В частности, строчные буквы в таблице следуют не подряд, а с разрывом в середине алфавита.

Экспериментальный раздел

В следующем примере подсчитывается количество симво­лов, введенных с клавиатуры. Ввод заканчивается символом '.' Вы вводите несколько символов, затем точку и нажимаете кла­вишу  EnterПрограмма выдает правильный результат. А если нажимать клавишу Enter после ввода каждого символа? Резу­льтат неверный, он как будто бы в три раза превышает истин­ный результат. На самом деле все верно. Нажатие клавиши Епter генерирует ввод еще двух символов (управляющих) — возврата каретки (код 13) и перевода строки (код 10).

Program pr4;
Var i :Char;
j:Integer;
Begin 
   Read(i); j:=0;
   While i<>'.'Do 
       Begin  
       Inc (j ) ;
       Read (i) ;
       End;
   WriteLn (j) ; 
End.

Другая версия этой простой программы позволяет отказать­ся от символа точка как признака конца ввода данных. Символ #   перед целым числом говорит о том, что это число следует рассматривать как ASCII код символа.

Program pr4_1;
Var i :Char;
j:Integer;
Begin 
   Read(i); 
   j:=0;
   While i<>#10   Do 
       Begin  
       Inc (j ) ;
       Read (i) ;
       End;
   WriteLn (j) ;
End.

В следующем примере подсчитывается количество цифр во вводимых с клавиатуры данных.

Program pr5;
Var    s:Char;
k:Integer;
Begin
   Read(s) ;
   k: =0 ;
  While s<>#13 Do 
     Begin
     if   (s>='0')   and   (s<='9')   
       then  Inc (k) ; 
     Read (s) ; 
     End;
  WriteLn('Количество цифр равно   ' ,k) ;
End.

Функция Upcase(s) преобразует значение переменной символьного типа, если оно соответствует строчной латинской букве, в код прописной буквы, иначе значение остается не­изменным. Определите, что за обработка вводимых символов осуществляется в следующем примере.

Program pr6;
Var    s:Char;
Begin
   Read(s);
   While s<>#13    Do 
       Begin
       IF   (s>='a')   And   (s<='z')   
            Then  Write(Upcase (s)) 
           Else  Write(s);
      Read(s); 
       End;
End.



Задания

  1. Составьте программы для определения кода у буквы «F», символа под кодом 87?
  2. В программе определены 3 переменные (a,b,c:char;). В ответ на инструкцию readln(b,а,с); пользователь ввел текст Леша. В каком месте памяти оказалась каждая из введенных букв?
  3. Каков будет результат выполнения инструкции c:=succ(pred(succ('D')))?
  4. Какое значение получит переменная i в операторе i := pred(ord('F’) - 2)?
  5. Напишите программу расшифровки 4-буквенного однословного сообщения. Для получения 4 букв нужно ввести 3 строки:- из первой строки прочесть только первую букву;- из второй строки прочесть только первую букву;- из третьей строки прочесть первую и вторую буквы.
       Далее расшифровать полученные четыре буквы по такому алгоритму: вместо       первой и третьей букв подставить соответственно буквы, отстоящие от них по алфавиту на две буквы назад, а вторую и четвертую буквы оставить без изменения.
Для проверки возьмите пример, приведенный ниже.
Ввод:
FINISHED
OR
PENDING?
На выводе должно быть слово DONE




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

Величина, представляющая собой строку символов от 0 до 255 знаков, обозначается в программе служебным словом  String. 

Для расширения функциональности строк разработчики новых диалектов pascal'я придумали тип ansistring. Строки этого типа могут иметь произвольную длину. Объясняется это следующим образом: в отличие от обычных строк, последний байт в ansistring не является показателем длины, он играет роль простого ограничителя (сколько бы символов не было, все что находится после ограничителя строкой не считается и игнорируется pascal'ем).
Тип ansistring определен только во Free Pascal.


Способы описания

var Slovo: string[15];
       Word: string; e,y:ansistring;

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

Экспериментальная часть

Соответствие типов
Наберите программу:

program z1;
var a,d:string;
b,c: char;
begin
   a:='f';
   b:=' ';
   c:=a; writeln(c);
   c:=b; writeln(c);
end.
  •  Объясните результат.
  • Измените программу, чтобы она стала выполнимой.


         

                          

Действия с строками


Для строк применимы операции присваивания, сцепления и сравнения.

Операция присваивания
var str1:string[2]; str2:string;

Str1:='SR'; Str2:='SKOR';
Str1:=Str2;

В результате будет присвоено: Str1:='SK'. Ввод и вывод строковых переменных осуществляется без апострофов. 

Замечание. Для исключения ошибок ввода-вывода строковых переменных следует всегда использовать оператор Readln (вместо Read).


Операция сцепления
Эта операция применяются для сцепления нескольких строк в одну строку. Операция сцепления обозначается знаком +.

 Например: writeln(a+b); или     c:=a+b;

Задание: Написать программу, в которой складываются два слова. Придумать такую пару слов, чтобы результат сложения имел смысл.

var a, b: string;
begin
    a:=‘пар’;
    b:=‘ус’;
    writeln(a+b);
end.

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

Program Pr;
var St1:string[3];
St2:string[8];
Begin
   St1:='Str'; 
   St2:=St1;
   if St1=St2 
        then writeln('St1 равно St2')
        else writeln('St1 не равно St2');
End.

В результате будет напечатано:
St1 равно St2.
Следует учесть, что одинаковые заглавные и строчные буквы в строках имеют разные значения строковых переменных. Такесли St1:='SТR', a St2:='Str', то St1 не равно St2.



Стандартные функции


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

Length(строка)  - длина строки (количество знаков в строке). При выполнении команды writeln(length(a)); на экране печатается число, равное количеству символов в строке.

Пример:
  var a,b,c: string;
Begin
   а:='информатика';
   b:='  ';
   c:='';
   writeln(length(a));
   writeln(length(b));
   writeln(length(c));
end.

Copy(str, n, k) - выделение подстроки из строки str с позиции n в количестве k символов.

Результат копирования может быть выведен на экран или присвоен другой строковой переменной.

Пример:
program p1;
var a: string;
begin
  a:=‘прилипала’;
  writeln(copy(a,4,4));
end.


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

program p2;
var а, w1, w2: string;
begin

   а:=‘картографирование’;
   w1:=copy (а, 6,5);
   writeln (w1+a[15]);
   w2:=copy (а, 11,4);
   writeln (‘д’+w2);
end.

Pos (St1,St2) - определяет наименьший номер элемента в строке St2, начиная с которого строка St1 входит в St2 как подстрока.
Например:
St:='Давление, атм';
P:=Pos('атм',St);
Результат: P=10.

Задание. Определить наличие буквы "о" в слове "хоровод".


Процедуры

Процедура является самостоятельной командой (т.е. ее результат не присваивают другой переменной и не выводят на экран) и изменяет исходную строку.
           
delete(s,n,k); - процедура, удаляющая из строки S  k символов, начиная с n-го.
Пример:
var a: string;
begin
      a:=‘значение’;
      delete(a,4,2);
      writeln(a);
end.

 Insert(s1,s,n); - процедура, вставляющая подстроку s1 в строку   в позицию n-ного символа.

Пример:
var a: string;
begin
   a:=‘око’;
   insert(‘мол’,a,1);
   writeln(a);
end.

Str(Ch,St); - преобразует число в строковую переменную.
Например:
Str(1342,St1);
Результат: St1:='1342'.

Val (St,Ch,cod); - преобразует строковое значение в численное данное. Если во время преобразования ошибки не обнаружено, Cod=0. В противном случае Cod будет содержать номер позиции первого ошибочного символа.


Задание 1. Составить программу получения из строки ‘ГАРМОНИЯ’ новые ‘ГОРМОН’, ’МОЛНИЯ’, ‘МАНИЯ’. Использовать соответствующие функции и процедуры, а также символы исходного слова. Недостающие символы при необходимости добавить.



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

       Тесты         Посмотреть решение       
  • Измените программу, чтобы она определяла количество слов во введенной фразе.
  • Измените программу, которая бы подсчитывала, какая из букв ‘и’ или ‘e’ встречается чаще.



Задание 3.Составить программу, которая получает перевёртыш заданной строки (экран – наркэ).

       Тесты         Посмотреть решение       
  • Измените команду в теле цикла на s:=a[i]+s, проверьте результат.
  • Измените программу, чтобы она определяла является ли слово палиндромом, т.е.  слева направо и наоборот читается одинаково (проверить для слов: экран, шалаш).


Задания для самостоятельного решения

  1. Составить программу, определяющую количество знаков препинания (. , : ; -) в предложении.
  2. Составить программу, которая выделяет отдельные слова в заданном предложении и выводит их в столбик на экран дисплея.
  3. Из данной символьной строки выбрать все цифры и сформировать другую строку из этих цифр, сохранив их последовательность.
  4. Составьте программу шифрования текстового сообщения. Можно использовать такой способ шифровки. Шифровальщик задает ключ шифровки - целое число, которое определяет величину смещения букв русского алфавита, например ключ =3, тогда в тексте буква “а” заменяется на “г” и т.д. Используются все буквы русского алфавита.
  5. Составьте программу дешифрования текстового сообщения, зашифрованного программой  предыдущей задачи.