Вычислительные машины имеют дело не только с числами. Едва ли не больше времени
они бывают заняты обработкой текста. В Паскале для этого есть специальный тип
данных, который называется CHAR (от слова character - символ).
12.1.Тип CHAR (символьный или
строковый или литерный).
Его значениями являются отдельные символы: буквы, цифры, знаки. Символьные
константы заключаются в кавычки, например, 'A', 'B', 'C', '4', '7', ' '(пробел).
Символьные переменные описываются предложением:
Var имя переменной:
char;
Символьные значения можно вводить и выводить, присваивать, сравнивать. Ниже
приведен пример, где выполняются все эти действия.
Var x,y:char;
Begin
Write('Введите символ');
Readln(x);
Y:='A';
If x<y then write ('X') else write ('y');
{на экран буде выдан символ хранящийся в переменной
Х или Y в зависимости от проверки условия}
Readln;
End.
Сравнивать символы можно благодаря тому, что в машинной памяти они хранятся в
виде целых чисел (кодов символов). Из двух символов большим считается тот, код
которого больше. Символы упорядочены следующим образом:
'A'<'B'<...<'Z'
'a'<'b'<...<'z'
'0'<'1'<...<'9'
'а'<'б'<...<'я'
'А'<'Б'<...<'Я'
Для символов допустимы все шесть операций сравнения: =, <=,>=,<,>,<>.
12.2.Стандартные символьные
функции.
В Паскале имеются стандартные символьные функции:
CHR(N) - возвращает в программу символ с кодом N,
ORD(S) - возвращает код символа S,
PRED(S) -возвращает предыдущий символ
SUCC(S) - возвращает следующий символ
Примеры:
CHR(128) = Б
ORD(':') = 58
PRED('Б') = А
SUCC('Г') = Д
Каждый символ имеет свой уникальный двоичный код. Коды всех символов сведены в
таблицу. Первая половина таблицы стала международным стандартом, который
называется ASCII - American Standard Code Information Interchange ( читается "аски
код") в ней кроме прочего содержится латинский алфавит, вторая имеет разные
варианты для разных языков. Кириллица (русский алфавит) имеет несколько
стандартов. В Паскале используется стандарт КОИ-8.
Пример использования переменной
символьного типа.
Составить программу, по которой компьютер многократно вычисляет сумму А+В при
различных значениях А и В. в конце каждого этапа появляется запрос о продолжении
или прекращении вычислений: "Завершить программу?(Д/Н)".
Var A,B:real; { PROGRAM имя; не обязательное предложение}
C : char;
Begin
repeat
Write('Введите два числа'); Readln(a,b);
Writeln(a+b:0:2);
Writeln('Завершить программу?(Д/Н)');
Readln(с);
Until с='Д'; {программа завершит работу если будет введено Д}
Readln
End.
Тренировочные задания.
1. Что вернет функция CHR(ORD(X))?
2. Определить значения следующих функций (как правило таблица аски кодов есть в
любом справочнике по программированию):
CHR(68)
ORD('d')
PRED(1)
SUCC('Я')
3. С клавиатуры вводится два числа. Составить программу сравнивающую эти числа и
в зависимости от результата сравнения выводящую на экран нужный знак. Например:
3<5 или 3=3 или 3>2. Процедуру WRITE для вывода результата разрешается
использовать только один раз.
4. Составить программу, по которой компьютер находит произведение нечетных
чисел, начиная с единицы, и до тех пор, пока на вопрос, задаваемый после каждого
шага вычислений: "Продолжить вычисления? (Д/Н)", отвечают 'Д'.
Вы уже познакомились с символьным типом данных CHAR,
который позволяет работать с отдельными символами текста. Для обработки более
крупных текстовых единиц - строк введен тип данных, который называется STRING
(строка).
Значениями этого типа являются строки любых символов длиной до 255.
Переменные строки должны быть описаны предложением:
VAR имя: STRING
Строки можно присваивать, сравнивать, вводить, выводить и соединять.
Соединение обозначается знаком "+". Вот примеры некоторых операций сравнения над
строками:
'стол'<= 'столик ' true
'ABC' <'ADBA' true
'12' <'2' 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);
readln
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,y:byte;
a,b:string;
begin
readln(a);
readln(b);
x:=length(b); {определяем длину слова b, чтобы узнать номер последнего
символа}
if a[1]=b[x] then write('верно') else write('неверно');
readln
end.
Тренировочные задания.
1. Дано название города. Определить, четно или не четно количество символов в
нем.
2. Дано слово. Вывести на экран его третий символ и дважды его последний символ.
3. Дано слово. Верно ли, что оно начинается и оканчивается на одну и ту же
букву?
4. Дано слово. Получить и вывести на экран буквосочетание, состоящее из его
третьего и последнего символа.
5. Составить программу которая запрашивает название футбольной команды и
повторяет его на экране со словами: "Это чемпион!".
1. Дано натуральное число N. Определить, является ли оно палиндромом. Число
палиндром можно читать справа налево и слева направо: 4 88 121 767767 и т.д.
var k,n,m:longint;
begin
Repeat
write('Введите натуральное число '); readln(n);
until n>0;
m:=n; k:=0;
while m div 10<>0 do {собираем число в обратном порядке}
begin
k:=k*10+m mod 10;
m:=m div 10
end;
k:=k*10+m mod 10;
if k=n then writeln('данное число палиндром')
else writeln('это не палиндром');
readln;
end.
3. Дано натуральное число. Найти:
a. Число, получаемое при прочтении его цифр справа налево;
b. Число, получаемое в результате приписывания по двойке в начало и конец
записи исходного числа;
c. Число, получаемое удалением из исходного всех цифр А;
d. Число, получаемое из исходного перестановкой его первой и последней цифр;
e. Число, образованное из исходного приписыванием к нему такого же числа.
var k,n,m,p:longint;
a:byte;
begin
{a}
Repeat {проверка ввода}
write('Введите натуральное число '); readln(n);
until n>0;
m:=n; k:=0;
while m div 10<>0 do {собираем число в обратном порядке}
begin
k:=k*10+m mod 10;
m:=m div 10;
end;
k:=k*10+m mod 10;
writeln('обратное число=',k);
{б}
Repeat {проверка ввода}
write('Введите натуральное число '); readln(n);
until n>0;
m:=n;
k:=10;
while m div 10<>0 do {определяем разрядность числа} -
begin
k:=k*10;
m:=m div 10;
end;
m:=(2*k+n)*10+2;
writeln('число c двойками=',m);
{в}
Repeat {проверка ввода}
write('Введите натуральное число '); readln(n);
until n>0;
Repeat {проверка ввода}
write('Введите цифру ');readln(a);
until (a>=0) and (a<10);
m:=n; k:=1; p:=0;
while m div 10<>0 do {собираем число исключая цифру}
begin
if m mod 10<>a then
begin
p:=p+(m mod 10)*k;
k:=k*10
end;
m:=m div 10;
end;
if m mod 10<>a then p:=p+m mod 10*k;
writeln('число без цифры ',a:2,'=',p);
{г}
Repeat {проверка ввода}
write('Введите натуральное число больше 9='); readln(n);
until n>9;
m:=n; k:=10; p:=0;
a:=m mod 10;
m:=m div 10;
while m div 10<>0 do {собираем число, исключая цифру}
begin
p:=p+(m mod 10)*k;
k:=k*10;
m:=m div 10
end;
p:=a*k+p+m;
writeln('число с перестановкой первой и последней цифр ',a:2,'=',p);
{д}
Repeat {проверка ввода}
write('Введите натуральное число '); readln(n);
until (n>0)and(n<21474);
m:=n; k:=10;
while m div 10<>0 do {определяем разрядность}
begin
k:=k*10;
m:=m div 10
end;
p:=n*k+n;
writeln('число= ',a:2,'=',p);
readln;
end.
Из предыдущего урока вы узнали, что можно обращаться к отдельным символам строки,
указав их порядковый номер. Сегодня мы разберем задачи, в которых используется
это свойство строковой переменной.
Пример 1.
Дано слово, состоящее из четного числа букв. Вывести на экран его первую
половину.
Var i,x:byte;
a:string;
begin
repeat
write('Введите слово из четного числа букв');
readln(a);
x:=length(a); {определяем длину слова}
until (x mod 2 = 0);
x:= x div 2; {применяем целочисленное деление}
for i:=1 to x do write(a[i]);
readln
end.
Пример 2.
Составить программу, которая печатает заданное слово в обратном порядке.
Var i,x:byte;
a:string;
begin
write('Введите
слово
');
readln(a);
x:=length(a);{определяем
длину
слова}
for i:=x downto 1 do write(a[i]);
readln
end.
Пример
3.
Дано
предложение.
Определить
число
пробелов
в
нем.
Var i,x,k:byte;
a:string;
begin
write('Введите
предложение');
readln(a);
x:=length(a); {определяем
длину
слова}
k:=0;
for i:=1 to x do if a[i]=' ' then k:=k+1;
writeln(k);
readln
end.
Пример
4.
Дано предложение. Определить порядковый номер первой встреченной буквы 'к'. Если
такой буквы нет, сообщить об этом.
Var i,x,k,f:byte;
a:string;
begin
write('Введите
предложение');
readln(a);
x:=length(a);{определяем
длину
слова}
k:=0; I:=0; f:=0;
repeat
I:=I+1;
if a[i]<>'к'
then k:=k+1 else f:=1;
until (I=x)or( a[i]='к'
);
if f=1 then writeln(k) else writeln('
Нет
такой
буквы');
readln
end.
Тренировочные задания.
1. Дано слово. Получить его часть, образованную идущими подряд буквами, начиная
с m-й и кончая n-й (m<n).
2. Дано слово из четного числа букв. Поменять местами его половины.
3. Дано слово. Перенести первые k его букв в конец.
4. Получить строку, состоящую из пяти эвездочек, т.е. символов "*".
5. Дано предложение. Напечатать все его буквы "и".
1. Дано название города. Определить, четно или не четно количество символов в
нем.
Var x:byte;
a:string;
begin
write('Введите
слово');
readln(a);
x:=length(а);
if odd(x) then write('не
четно')
else write('четно');
readln
end.
Значение функции odd(x) истинно, если число x не четное.
2. Дано слово. Вывести на экран его третий символ и дважды его последний символ.
3. Дано слово. Верно ли, что оно начинается и оканчивается на одну и ту же букву?
4. Дано слово. Получить и вывести на экран буквосочетание, состоящее из его
третьего и последнего символа.
Var x:byte;
a:string;
begin
repeat
write('Введите
слово
не
менее
четырех
букв');
readln(a);
x:=length(a); {определяем
длину
слова}
until x>= 4;
write(a[3],a[x]);
readln
end.
5. Составить программу которая запрашивает название футбольной команды и
повторяет его на экране со словами: "Это чемпион!".
Var a:string;
begin
write('Введите название футбольной команды');
readln(a);
write(a, ' Это чемпион!');
readln
end.