Практическая работа № 14 «Символы и строки

advertisement
Практикум по программированию на Pascal
МОУ СОШ № 3 ОИ и ВТ
Практическая работа № 14
«Символы и строки»
Строковые переменные описываются типом String и могут содержать до 255 символов.
Так же существуют символьные переменные, они описываются типом Char и содержат отдельные
символы. К этим переменным в Паскале применимы специальные операции.
Для начала надо немного отвлечься, чтобы сообщить о том, что каждый символ,
представленный на клавиатуре для компьютера переводится в числовой код. Эти коды
объединены в стандартную международную таблицу кодов ASCII. Коды с 0 по 32 не имеют
изображения на экране и служат для функций управления (пробел, клавиши управления курсором
и т. д.). Далее следуют знаки препинания, цифры, строчные и прописные буквы латинского
алфавита и другие символы, которые вы можете найти на клавиатуре. Всего их 128. А еще 128 кодов (от 129 до 255) служат для расширения возможностей клавиатуры, например для генерации
национальных символов — в нашем случае для кириллицы. Учить их наизусть ни в коем случае не
надо — они есть в таблице. Но если ее не окажется под рукой, то вы должны определить код
любого символа, используя специальные функции ASC и CHR$.
Функции Ord и Chr
Функция Ord определит нам код ASCII для первого символа этой строковой переменной
и имеет следующую форму записи:
Ord(‘строковая_переменная’)
Например:
Var N:Integer;
begin
N:= Ord (‘A’);
WriteLn(N:4);
End.
В результате получим:
Код заглавной буквы A - 65
Замечание
Следует помнить, что коды заглавных и строчных букв — разные. Кроме того, если
мы напрямую указываем в функции Ord символ или текст, то он берется в кавычки, а
если это строковая переменная, то без кавычек.
Функция Chr определит нам символ, код которого указан в скобках. Форма записи функции:
Chr(код)
Например:
Var N:Integer;
Label M;
Begin
ClrScr;
M:WriteLn(‘Введите любой код от 33 до 128’);
ReadLn(N);
If (N<33) or (N>128) then
Begin
WriteLn(‘Обратите внимание на числовые границы для кода’);
Goto M;
End;
WriteLn(‘Символ с кодом ‘, N, ‘-это ‘, Chr(N))
End.
Обратите внимание на оформление программы. Сначала выполняется очистка экрана. Затем —
запрос кода. Если он введен не в требуемых пределах, то программа возвращает человека к запросу — простейший, но очень полезный способ помочь пользователю.
Задача 1. Опробуйте представленную выше программу и узнайте, что за символы скрываются
под кодами 33, 66, 99, 100, 128.
Эти программы грамотно работают для первых стандартизированных 128 кодов. Чтобы
правильно работать, например, с русским текстом, надо знать коды строчных и прописных букв
Практикум по программированию на Pascal
МОУ СОШ № 3 ОИ и ВТ
кириллицы, которые скрываются в интервале от 129 до 255. Поэтому еще одно задание.
Задача 2. Напишите программу, выводящую на экран символы, скрывающиеся за кодами 129—
255.
Но, всякий раз вводить текст побуквенно — большая морока. Нельзя ли как-нибудь
обрабатывать слова и строки? Конечно, можно. Для этого существуют специальные функции.
Строка фактически является массивом символов. С каждым символом строки
ассоциировано уникальное значение индекса. Предположим переменной MyString типа String
присвоено значение MyString:=’Это строка’, тогда структура массива MyString имеет вид:
Индекс
1 2 3 4 5 6 7 8 9 10
MyString
Э
т
о
с
т
р
о
к
а
Обратиться к отдельному символу внутри строковой переменной можно с помощью
выражения имя_строки[i], где i – индекс символа, на который вы хотите сослаться.
Функция Length
Следующая функция — Length(S). Значение функции типа Integer.Она определяет
длину строковой переменной S в символах, т.е. число символов из которых она состоит.
Синтаксис: Length (S),
где S : String.
Например,
Var S:String;
N:Integer;
Begin
WriteLn(‘Введите Вашу фамилию’);
ReadLn(S);
N:= Length(S);
WriteLn(‘В вашей фамилии ‘, N, ‘ букв ‘);
End.
Представленная программа выясняет количество букв во введенной пользователем
фамилии. Причем, обратите внимание, что функция Length учитывает не только буквы, но и
символы, т.е. она распознает и пробелы, и знаки препинания, и цифры, содержащиеся во
введенном тексте. Например:
Var S:String;
N:Integer;
Begin
WriteLn(‘Введите Ваш адрес’);
ReadLn(S);
N:= Length(S);
WriteLn(‘В вашем адресе ‘, N, ‘ символов‘);
End.
Задача 3. Определите с помощью предыдущего примера, сколько символов будет в следующем
адресе:
684092, Камчатская область, Вилючинск, Крашенинникова 30 а.
Преобразование строчных и прописных букв
Если ваш текст напечатан строчными буквами, вы хотите заменить его прописными или
наоборот, не надо заново его набирать. Для этого есть две функции:
 UPPERCASE(строковая_переменная) — преобразует все буквы строки в прописные.
 LOWERCASE(строковая_переменная) — преобразует все буквы строки в строчные.
К сожалению, эти функции применимы только к латинскому алфавиту.
Функции эти очень полезны, когда мы просим пользователя ввести один из возможных
ответов, например "YES" или "NO", или просто "Y" или "N", а пользователь, естественно, может
ввести ответ как строчными, так и прописными буквами. В таком случае, с помощью функций
Практикум по программированию на Pascal
МОУ СОШ № 3 ОИ и ВТ
UPPERCASE и LOWERCASE сначала надо привести ответ к требуемому виду, а потом проверять
условие. Например:
WriteLn(‘Будете еще играть? (Y/N)’); ReadLn(N);
IF UPPERCASE (N)="N" THEN WriteLn(‘До свидания’);
Функция выбора части строки
Для получения фрагмента строки применяeтся специальная функция. Для выбора n
символов из строки S, начиная с позиции P применяется функция
Copy(S,P,n). Где S:String, P,n:Integer.
Пример: S1,S2:string;
Begin
S1:=’У Егорки веда отговорки, у Миладки всегда шоколадки’;
S2:= Copy(S1,28,26);
Writeln(S2);
End.
Функция вставки строковой переменной в строку
Для вставки в строку S, начиная с позиции P, строки W применяется функция
Insert(W,S,P). Где W, S:String, P:Integer.
Пример: S1,S2,S3:string;
Begin
S1:=’У Егорки веда отговорки’;
S2:=’Матрены и ‘;
S3:=Insert(S2,S1,3);
Writeln(S3);
End.
Функция удаления символов из строки
Для удаления n символов из строки S, начиная с позиции P применяется функция
Delete(S,P,n). Где S:String, P,n:Integer.
Пример: S1,S2:string;
Begin
S1:=’У Егорки веда отговорки’;
S2:=Deletet(S1,7,83);
Writeln(S2);
End.
Задача 4. Из слова «Самокат» получить «Самолет».
Функция определения вхождения подстроки
Допустим, мы хотим найти в тексте какое-либо слово. Нам на помощь приходит
функция Pos, имеющая следующий синтаксис:
Pos(w,s) Значение функции типа Integer.
В строке S отыскивается первое вхождение строки w (номер позиции). Если вхождения
нет, то выдается 0.
Например:
Var S,w:String;
N:Integer;
Begin
S:= ‘Свиноводство, овцеводство, пчеловодство’;
W:= ‘чело’;
N:= Pos(S,W);
WriteLn(‘Слово <чело> в строке есть и начинается с ’ ; N;’ позиции ‘);
End.
Какой будет результат программы?
Практикум по программированию на Pascal
МОУ СОШ № 3 ОИ и ВТ
Задача 5. Заменить в исходном тексте "photo, graph, philophon, cophe" все сочетания "ph" на
символ "F”.
Функция слияния строк
Если необходимо записать строки одна за другой, то используется функция конкатенации
или, по-простому, слияния, которая записывается просто знаком + или Concat(S1,S2,…,Sn), где
S1,s2,…:String. Используя эти функции для начала можно с их помощью поиграть в игру
"Наборщик", когда из букв, составляющих какое-либо слово, нужно составить другие слова.
Например фрагмент программы:
F:=`ГАЗОНОКОСИЛЫЦИК`;
W1:=Copy(F, 5, 2)+Copy(F, 9,7);
S1:=`У Егорки всегда отговорки`;
S2:=`у Миладки всегда шоколадки`;
W2:=Concat(S1,S2);
WriteLn(W1);
WriteLn(W2);
Определите, какие слова получатся в результате выполнения программы?
Задача 6. Напишите программу, которая выдаст на экран пять слов максимальной длины из
слова "ЭЛЕКТРИЧЕСТВО".
Сравнение строковых переменных
Над строковыми переменными тоже можно производить операции сравнения. Больше
будет та переменная, которая начинается с символов, более близких к концу алфавита, т. е.
имеющих больший код, а если символы совпадают, то более длинное слово. Строковые
переменные считаются идентичными, если они полностью тождественны. Если они отличаются
пробелами в начале или конце, то они уже не идентичны! Например,
`DOG` > `CAT`, но `ELEFANT` < `MOUSE`
`TIGER2` > `TIGER1`; `Ml 6` > `Ml б`
В качестве очередного примера приведем задачу подсчета слов во введенном тексте. Как
известно, для компьютера словом является последовательность символов, заключенная в пробелы
с двух сторон. Это необязательно слово, в привычном для нас понимании, а любой набор
символов, например, 45ро9) или ВАР56+УР47. Поэтому, в простейшем случае, подсчет количества
слов во введенном тексте сводится к подсчету количества пробелов и добавлении к полученному
значению единицы. (Почему так? Очень просто: слов два, а пробел между ними один; слов три —
а пробелов два и т. д.) Получаем программу.
Var S:String;
N,I,Ch:Integer;
Begin
WriteLn(`Введите текст телеграммы`);
ReadLn(S);
N:= Length(S);
Ch:=0;
For i:=1 to N do
If S[i]=` ` then Ch:=Ch+1;
WriteLn(‘В вашей телеграмме ‘, Ch+1, ‘ cлов‘);
End.
Программа работает очень просто. Она определяет длину текста в символах и заносит
это число в переменную N. Затем устанавливает счетчику пробелов Ch нулевое значение. После
чего, в цикле проверяет, а не является ли очередной символ пробелом. Если это так, то увеличивает счетчик пробелов Ch на единицу, а если нет — берет следующий символ. По завершении
цикла в переменной к хранится количество пробелов в тексте, и мы выводим ответ о количестве
слов на экран, добавляя к Ch еще единичку.
Функция преобразования числа в строку
Синтаксис:
Str(V,S)
Преобразует число V в строку и записывает результат в S.
Практикум по программированию на Pascal
МОУ СОШ № 3 ОИ и ВТ
V : Integer или Real, S: String.
Например:
P:=1234;
Q:=34.5;
Str(P,S1); Str(Q,S2);
WriteLn(S1,S2);
Функция преобразования строки в число
Синтаксис:
Val(S,V,W)
Если строка S состоит из цифр, то они преобразуются в числовое значение переменной
V, значение W = 0. В противном случае строка состоит не только из цифр,- преобразование не
выполняется, W0 – признак ошибки.
V : Integer или Real, S: String, W:Integer.
Например:
S1:=`5555`; S2:=`23.345`; S3:=`34rr2`;
Val(S1,P,W); Val(S2,q,W); Val(S3,d,W);
Задача 7. Используя пример с подсчетом слов в телеграмме, напишите программу, имитирующую
отделение связи с очень хорошим обслуживанием. Программа должна выяснять имя клиента и в
дальнейшем обращаться к нему только по имени. Запрашивается также регион, куда
посылается телеграмма. Их три — Россия (коэффициент 1), страны СНГ (стоимость одного
слова умножается на 2) и дальнее зарубежье (стоимость одного слова умножается на 5). По
России стоимость одного слова составляет 1 руб. 50 коп. (причем неважно, какой длины слово).
Затем у клиента запрашивается текст телеграммы, определяется количество слов, стоимость
телеграммы. После расчета, с клиентом прощаются.
Домашнее задание № 13.
Задача 1. Напишите программу, проверяющую, является ли введенное слово или фраза
палиндромом, т. е. читающимся слева направо и справа налево одинаково (например, шалаш, казак, А роза упала на лапу Азора). Программа сообщает "Да, это палиндром", или "Нет, это не
палиндром" и выводит на экран введенный текст в варианте слева направо и справа налево.
Задача 2. Подсчитать, сколько раз входит каждый символ в данную строку.
Download