ТЕКСТОВЫЙ И СИМВОЛЬНЫЙ ТИПЫ ДАННЫХ Паскаль ABC Вычислительные машины имеют дело не только с числами. Едва ли не больше времени они бывают заняты обработкой текста. В Паскале для этого есть специальный тип данных CHAR (от слова character – символ). (символьный, или строковый, или литерный). Его значениями являются отдельные символы: буквы, цифры, знаки. Символьные константы заключаются в кавычки, например, ‘A’ ’B’ ’C’ ‘4’ ‘7’ ‘ ‘ (пробел). Символьные переменные описываются предложением Var имя переменной: char; Символьные значения можно вводить и выводить, присваивать, сравнивать. Ниже приведен пример, где выполняются все эти действия. Var x,y:char; Begin Write(‘введите 1-й символ '); Readln(x); Write(‘введите 2-й символ '); Readln(y); Write('меньший символ '); If x<y then write (x) else write (y); End. Сравнивать символы можно благодаря тому, что в машинной памяти они хранятся в виде целых чисел (кодов символов). Из двух символов большим считается тот, код которого больше. Символы упорядочены следующим образом: ‘0’ ‘A’ ‘a’ ‘А’ ‘а’ < < < < < ’1’ ’B’ ’b’ ’Б’ ’б’ < < < < < … … … … … < < < < < ’9’ ’Z’ ’z’ ’Я’ ’я’ Для символов допустимы все шесть операций сравнения: =, <=, >=, <, >, <>. Таблица ASCII American Standard Code Information Interchange 32 пробел 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ‘ 40 ( 41 ) 42 * 43 + 44 , 45 46 . 47 / 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 Кириллица (русский алфавит) имеет несколько стандартов. В Паскале используется стандарт КОИ-8. Стандартные символьные функции. В Паскале имеются стандартные символьные функции: CHR(N)– возвращает в программу символ с кодом N, ORD(S) – возвращает код символа S, PRED(S) –возвращает предыдущий символ SUCC(S) – возвращает следующий символ ПРИМЕРЫ: CHR(128) = Б ORD(‘:’) = 58 PRED(‘Б’) = А SUCC(‘Г’) =Д Задача Составить программу, по которой компьютер многократно вычисляет сумму А+В при различных значениях А и В. В конце каждого этапа появляется запрос о продолжении или прекращении вычислений: «Завершить программу?(Д/Н)». Var A,B:integer; C: char; Begin repeat Write(‘Введите два числа‘); Readln(a,b); Writeln(a+b:6:2); Writeln(‘Завершить программу?(Д/Н)’); Readln(C); Until C=’Д’; End. Для обработки более крупных текстовых единиц - строк введен тип данных, который называется STRING (строка). Значениями этого типа являются строки любых символов длиной до 255. Переменные строки должны быть описаны: VAR имя: STRING Строки можно присваивать, сравнивать, Соединение обозначается знаком "+". вводить, выводить соединять. Для обработки более крупных текстовых единиц - строк введен тип данных, который называется STRING (строка). Значениями этого типа являются строки любых символов длиной до 255. Переменные строки должны быть описаны: VAR имя: STRING Вот примеры некоторых операций сравнения над строками: ‘стол’ ‘ABC’ ’12’ ‘пар’ <= ‘столик‘ < ‘ADBA’ < ‘2’ + 'о' + 'воз' true true true 'паровоз' Среди всевозможных значений строк есть пустая строка. Она изображается двумя апострофами (одинарными кавычками), между которыми ничего нет. Чтобы ввести этот символ в состав строки, надо повторить его дважды. Например, оператор write ('об''явление') выведет на экран: об'явление Программисту доступны отдельные символы строковой переменной, для этого кроме имени переменной надо указать порядковый номер символа в строке. Например, если описана переменная X:STRING, то X[1] - первый символ строки, X[2] - второй и т.д. У X[0] особая роль - хранить длину строки. Значением X[0] является символ, код которого равен количеству символов в строке. Но для определения длины строковой переменной обычно используется функция LENGTH(строковая переменная). Например, если N:=LENGTH(x); то N присвоится значение равное числу символов в строке. При описании строковой переменной мы можем ограничить длину строки, указав ее максимально возможный размер, тогда в строке будет храниться только указанное число символов. Var a,b:string[4]; begin write('введите слово'); readln(a); write(a); readln end. Если при выполнении этой программы ввести слово КУКУРУЗА, то программа выведет КУКУ. ЗАПОМНИТЕ. Если при выполнении программы необходимо ввести значение для нескольких строковых переменных, для каждой из них должен быть указан свой оператор ввода READLN. Например, Var a,b,c:string; begin readln(a); readln(b); readln(c); write(a+b+c); end. Проверьте, что произойдет, если записать READLN(a,b,c); или READ(a,b,c). Пример 1. Составить программу определяющую, какая из двух фамилий длиннее. Фамилии имеют разную длину. Var a,b:string; begin readln(a); readln(b); if length(a)>length(b) then write(a) else write(b); readln end. Пример 2. Даны два слова. Составить программу определяющую верно ли, что первое слово начинается на ту же букву, которой оканчивается второе слово. Var x:byte; a,b:string; begin readln(a); readln(b); x:=length(b); {определяем длину слова b, чтобы узнать номер последнего символа} if a[1]=b[x] then write('верно') else write('неверно'); end. Строковые процедуры и функции Функция копирования строки или ее части. s:= COPY (строка, позиция, N); Функция копирования называется также "вырезкой". Результатом выполнения функции будет часть строки начиная с указанной позиции длиной N. S:= COPY (‘информатика’,3,5) = ‘форма’; S:= Pos(подстрока,строка) Функция возвращает первую позицию подстроки в строке (или 0, если подстрока не найдена) x:= Pos(‘а’,’информатика’) = 7 x:= Pos(‘г’,’информатика’) = 0 Пример . Текст и две разных буквы bukva1 и bukva2 вводятся с клавиатуры. Программа должна заменить в тексте все символы, совпадающие с bukva1 на bukva2. Если символа bukva1 в тексте не обнаружиться, то должно быть выведено сообщение об этом. var Slovo: string; Bukva1, bukva2:char;len,i,k:integer; Begin clrscr; writeln('Задайте текст'); readln(slovo); writeln('Задайте первую букву');readln (bukva1); writeln('Задайте вторую букву');readln (bukva2); len:=length(slovo); k:=0; i:=0; repeat k:=pos(bukva1,slovo); slovo[k]:=bukva2; i:=i+1; until k=0; if i=1 then writeln('Буквы ',bukva1,‘ нет в этом тексте') else writeln (slovo,i-1:5,’замен’); end. Строковые процедуры и функции Пример: Дано предложение. Определить порядковый номер первой встреченной буквы 'к'. Если такой буквы нет, сообщить об этом. Var x: integer; a: string; begin write('Введите предложение'); readln(a); x:= pos('к',a); if x=0 then writeln('Такой буквы нет') else writeln(x); end. Составить программу, которая переставляет символы в заданном тексте задом на перёд. Не использовать дополнительную строку. var Slovo: string; Bukva: char; len, i:integer; Begin writeln ('Задайте строку букв и цифр'); readln (slovo); len:=length(slovo); for i:=1 to len div 2 do begin bukva:= slovo[i]; slovo[i]:=slovo[len-i+1]; slovo[len-i+1]:=bukva; end; writeln (slovo); end. Вы знаете, что каждый символ на клавиатуре имеет свой код. Компьютер работает как раз с этими кодами. ORD определяет код символа, CHR преобразовывает код обратно в символ. Var Simvol: char; Kod: integer; Begin ... Kod:=ord(Simvol); Simvol:=chr(Kod); ... Пример 4. Составить программу, которая в заданном тексте меняет все заглавные буквы на прописные. Для того, чтобы это сделать, нам нужно: •определить код символа с помощью функции ORD, •проверить его, •если он попадает в заданный интервал, пересчитать его •преобразовать код обратно в символ с помощью обратной функции CHR var Slovo: string; Bukva1,bukva2:char; len,i,k:integer; Begin writeln ('Задайте текст'); readln (slovo); len:=length(slovo); 65-90 десятичные коды k:=0; заглавных букв for i:=1 to len do begin английского алфавита. k:=ord(slovo[i]); if (k>=65) and (k<=90) then begin k:=k+32; slovo[i]:=chr(k); end; end; Код любой английской маленькой буквы на 32 writeln (slovo); больше кода соответствующей end. заглавной буквы Строковые процедуры и функции Для работы со строковыми переменными в Паскале существует набор стандартных процедур и функций. Их применение упрощает решение задач. Результат выполнения функции должен быть запомнен в переменной соответствующего типа. Процедура удаления части строки DELETE(строка, позиция, количество) процедура удаляет из исходной строки указанное количество символов, начиная с указанной позиции. Процедура вставки подстроки в строку INSERT(строка1, строка2, позиция); Строка1 вставляется в строку 2 начиная с указанной позиции. Пример : Дано слово, состоящее из четного числа букв. Вывести на экран его первую половину. Var x:byte; a:string; begin repeat write('Введите слово из четного числа букв'); readln(a); x:=length(a);{определяем длину слова} until (x mod 2 = 0); x:= x div 2 {применяем целочисленное деление} delete(a,x+1,x); write(а); end. Пример . Составить программу, которая в заданном тексте после каждой буквы вставляет заданный символ. Var Slovo:string; Bukva:char; len,i: integer; Begin writeln('Задайте слово'); readln (slovo); len:=length(slovo); writeln('Задайте букву'); readln (bukva); for i:=1 to len do insert(bukva,slovo,i+i); writeln (slovo); end. 1. Решить задачу из классной работы а) с использованием процедур DELETE и INSERT; б) без использования процедур и функций работы со строками. Текст и две разных буквы bukva1 и bukva2 вводятся с клавиатуры. Программа должна заменить в тексте все символы, совпадающие с bukva1 на bukva2. Если символа bukva1 в тексте не обнаружиться, то должно быть выведено сообщение об этом. 2. Дано предложение. Определить порядковый номер первой встреченной буквы 'к'. Если такой буквы нет, сообщить об этом. 3. Составить программу, которая определяет, является ли введенное с клавиатуры число или текст палиндромом. Определение: Числа или фразы, которые читаются одинаково слева на право и с права на лево, называются палиндромами. 4. Составить программу, по которой компьютер находит произведение нечетных чисел, начиная с единицы, и до тех пор, пока на вопрос, задаваемый после каждого шага вычислений: «Продолжить вычисления? (Д/Н)», отвечают ‘Д’. Тренировочные задания. 1. Что вернет функция CHR(ORD(X))? 2. Определить значения следующих функций: CHR(68) ORD(‘d’) PRED(1) SUCC(‘Я’) 3. Составить программу, по которой компьютер находит произведение нечетных чисел, начиная с единицы, и до тех пор, пока на вопрос, задаваемый после каждого шага вычислений: «Продолжить вычисления? (Д/Н)», отвечают ‘Д’. Процедура вставки подстроки в строку INSERT(строка1, строка2, позиция); Строка1 вставляется в строку2 начиная с указанной позиции. Тренировочные задания. 1. Дано предложение. Определить число вхождений в него некоторого символа. 2. Дано предложение. Заменить в нем все вхождения буквосочетания "ах" на "ух". 3. Дано слово. Проверить, является ли оно "перевертышем", т.е. читается одинаково как с начала, так и с конца. 4. Дано слово: a. удалить из него первую из букв "о", если такая буква есть; b. удалить из него последнюю из букв "т", если такая буква есть. 5. Дано предложение. Удалить из него все буквы "с". Тренировочные задания. 1. Дано название города. Определить, четно или не четно количество символов в нем. 2. Дано слово. Вывести на экран его третий символ и дважды его последний символ. 3. Дано слово. Верно ли, что оно начинается и оканчивается на одну и ту же букву? 4. Дано слово. Получить и вывести на экран буквосочетание, состоящее из его третьего и последнего символа. 5. Составить программу, которая запрашивает название футбольной команды и повторяет его на экране со словами: "Это чемпион!".