Занятие 29 Тема Составление программ с использованием символьных и строковых процедур и функций
Скачать 40.12 Kb.
|
Практическое занятие №29Тема: Составление программ с использованием символьных и строковых процедур и функций.Цель работы: Познакомиться с операторами присваивания, вывода String и Char, научиться владеть этими операторами, научиться грамотно записывать выражения на Паскале. Краткие теоретические сведенияВ стандарте языка Паскаль описаны два типа переменных для литерных вели- чин. Это - String и Char. Переменная типа Char может содержать в себе только один единственный символ, тип String предназначен для хранения строковых величин до 255 символов длиною. При описании переменной этого типа можно указать максимальное число сим- волов, которое можно занести в нее (это число не должно превышать 255). Например: Var S : String[30]; {максимальнаядлинастрокиS–30символов} St: String; ]; {максимальнаядлинастроки St–255символов} При использовании строковой переменной, к каждому ее символу можно обра- титься отдельно, указав его порядковый номер. Пример 1.Вывести посимвольно строку 'primer' Program pr1; Var st: string[6]; i: integer; BEGIN st:='primer'; for i:=1 to 6 do write(st[i], ' '); END. В результате работы данной программы на экран будут распечатаны следующие значения: p r i m e r Таким образом, первым символом st[1]в переменной stявляется буква p, вто- рым символом st[2]является r , третьим – i и т.д. Две строковые величины можно объединять. Эта операция называется конкате-нацией и обозначается знаком "+". В переменной S будет значение 'abrakadabra'. Для конкатенации результат зависит от порядка операндов (в отличие от опера- ции сложения). Следует помнить о том, какой максимальной длины может быть ре- зультирующая переменная, так как в случае превышения значением выражения числа, указанного после String в описании переменной, "лишние" символы в переменную не попадут. Строковые величины можно сравнивать между собой. Сравнение строк проис- ходит посимвольно. Большим из двух символов считается тот, код которого больше. Если равны первые символы, то сравнивается следующая пара до тех пор, пока не бу- дет найдено различие. Если начало строк совпадает, а одна из них кончается раньше, то вторая автоматически называется большей. Код символа в Паскале можно определить при помощи функции Ord(C), где С - либо непосредственно указанный символ, либо переменная символьного типа, либо один символ строковой переменной. Есть и обратная функция, которая возвращает символ по известному коду. Это функция Chr(N), где N - выражение, приводящее к целому числу в интервале от 0 до 255 (возможные значения кода символа). Очевидно, что Chr(Ord(C))=C, Ord(Chr(N))=N. Пример 2.Вывести на экран кодовую таблицу: Program Pr2; Var I : Byte; BEGIN For I:=32 to 255 do Write(I:4, '-',Chr(I)) END. Цикл в программе начинается с 32 потому, что символы с кодами от 0 до 31 яв- ляются управляющими и не имеют соответствующего графического представления. В Паскале используются следующие процедуры и функции для обработки стро- ковых величин: Функция Concat(S1[,S2,…,SN]): string – сцепляет (объединяет) строки S1,S2,…,SN. Параметры, указанные в квадратных скобках, не являются обязательными. Функция Copy(S: string; Index, Count: integer): string – копирует из строки S количество Count символов, начиная с символа с номером Index. Функция Length(S: string):byte – определяет длину строки S. Функция Pos(SubS, S: string):byte – отыскивает в строке S первое вхождение подстроки SubS и определяет номер позиции, с которой она начинается. Если подстро- ка не найдена, то выдается 0. Функция UpCase(C: char):char – преобразует строчную латинскую букву в прописную. Любые другие символы возвращаются без преобразования. Процедура Delete(var S: string; Index, Count: integer)– удаляет количество Count символов из строки S, начиная с символа с номером Index. Процедура Insert(SubS: string; var S: string; Index: integer) – вставляет под- строку SubSв строку S, начиная с символа с номером Index. Процедура Str(X [:Width [:Decimals]]; Var S: string) – преобразует число Х в строку символов S. Параметры Width и Decimals задают формат преобразования (об- щую ширину поля и количество символов в дробной части соответственно). Процедура Val(S: String; var X; var Code: integer) – преобразует строковое значение Sв его численное представление X типа Real или Integer. Параметр Code со- держит признак ошибки преобразования (0 – нет ошибки), Пример 3.Определить длину введенной пользователем строковой величины. Program Pr3; Var S : String; BEGIN Writeln('Введите последовательность символов'); Readln(S); Writeln('Вы ввели строку из ',Length(S), ' символов') END. Пример 4.Задан список из 6 слов. Определить, сколько слов списка начинается на букву «п». Program Pr4; Var s: string[20]; i,k:integer; BEGIN k:=0; for i:=1 to 6 do begin writeln('Введите слово'); readln(s); if s[1]='п' then k:=k+1; end; writeln(k); END. Пример 5.Определить, является ли введенная строка "перевертышем". Перевертышем называется такая строка, которая одинаково читается с начала и с конца. Например, "казак" и "потоп" - перевертыши, "канат" - не перевертыш". Поступим следующим образом: из введенной строки сформируем другую строку из символов первой, записанных в обратном порядке, затем сравним первую строку со второй; если они окажутся равны, то ответ положительный, иначе - отрицательный. Естественно, предложенный способ решения не является единственно возможным. Program Pr5; Var S,B : String; I : Byte; BEGIN Writeln('Введите строку'); Readln(S); B:=''; {ПеременнойBприсваиваемзначение"пустаястрока"} For I:=1 to Length(S) do {перебираемсимволыстроки} B:=S[I]+B; {СимволыстрокиSприсоединяютсякпеременнойBслева} If B=S Then Writeln('Перевертыш') Else Writeln('Не перевертыш') END. Пример 6.Найти сумму цифр введенного натурального числа. Program Pr6; Var S : String; I,X,A,C : Integer; BEGIN Writeln('Введите натуральное число'); Readln(S); {Числовводитсявстроковуюпеременную} A:=0; For I:=1 To Length(S) Do Begin Val(S[I],X,C); {Цифрапреобразуетсявчисло} A:=A+X {Числасуммируются} End; Writeln('Сумма цифр равна ',A) END. Пример 7.Во введенной строке заменить все вхождения подстроки 'ABC' на ‘KLMNO’. Program Pr7; Var S : String; A : Byte; BEGIN Writeln('Введите строку'); Readln(S); While Pos('ABC',S)<>0 Do {покаподстрока 'ABC'содержитсявстрокеS } Begin A:= Pos('ABC',S); {определяемпозициювхожденияподстроки'ABC'встрокуS} Delete(S,A,3); {удаляемизстрокиS3 символа,начинаяспозиции А} Insert('KLMNO',S,A){вставляемвстрокуSнаэтоместоподстроку'KLMNO'} End; Writeln(S) END. Пример 8.Во введенной строке подсчитать процент вхождения символа ‘o’ и символа ‘e’ (создать функцию для определения процентного содержания заданного символа в строке) Program Pr8; {функция,определяющаяпроцентвхождениясимволасвстрокуst} Function proc_char(st:string;c:char):real; Var k, n, I:integer; {k–количествозаданныхсимволов, n – длина строки,I- номер очередногосимволастроки} Begin n:=length(st); {вычисляемдлинустроки} k:=0; for I:=1 to n do {перебираемсимволыстроки} if st[I]=c then k:=k+1; {еслиочереднойсимволстрокиравензаданному символу,тоувеличиваемсчетчик k} proc_char:=k/n*100; {определяемпроцентзаданныхсимволов} End; Var st: string; p1,p2: real; BEGIN {основнаяпрограмма} write('st=');readln(st); {вводимстроку} p1:=proc_char(st,'o'); {определяемпроцентноесодержаниесимвола ‘o’}p2:=proc_char(st,'e'); { определяемпроцентноесодержаниесимвола ‘e’}writeln('o-', p1:2:1,'%'); {выводрезультата} writeln('e-', p2:2:1,'%'); END. Пример 9.Задан список из 8 слов. Найти самое короткое слово в списке. Если таких слов несколько, то распечатать их в один столбец. Решение поставленной задачи сводится к нескольким этапам: ввести список слов в виде массива строковых переменных; подсчитать длину каждой строки; опре- делить наименьшую из длин; распечатать те строки массива, длина которых совпада- ет с наименьшей. Program Pr9; Var s: array[1..8] of string[20]; n: array[1..8] of integer; i, min: integer; BEGIN for i:=1 to 8 do begin writeln('Введите слово'); readln(s[i]); n[i]:=length(s[i]); END. end; min:=n[1]; for i:=2 to 8 do if min>n[i] then min:=n[i]; for i:=1 to 8 do if n[i]=min then writeln(s[i]); В данной программе для обозначения слов используется массив строковых пе- ременных s, для обозначений соответствующих им длин слов – целочисленный массив n.Наименьший элемент массива nхранится в виде переменной min. Пример 10.Задана строка из двух слов, разделенных пробелом. Поменять в данной строке слова местами. Program Pr10; Var s: string[40]; s1,s2: string[20]; i,n: integer; BEGIN writeln('Введите строку'); readln(s); n:=length(s); i:=pos(' ', s); s1:=copy(s, 1, i); s2:=copy(s, i+1, n-i); s:=s2 + ' ' + s1; writeln(s); END. В данной программе переменная sслужит для обозначения строки из двух слов, переменные s1 и s2 – для обозначения первого и второго слова строки соответствен- но. Алгоритм решения заключается в том, что сначала с помощью функции Pos выяс- няется, каким по счету символом в строке s находится пробел. Далее в строке выделя- ются две подстроки: одна включает все символы левее пробела (первое слово), другая – правее пробела (второе слово). В конце программы слова сцепляются в обратном по- рядке с использованием разделяющего их пробела. Контрольные вопросыПонятие строки. Описание строкового типа данных. Представление строки в Паскале. Обращение к символу строки. Длина строки. Стандартные строковые процедуры и функции в языке Паскаль. Понятие строковых выражений. Операции со строковыми данными. Примеры программ работы со строками. |