Строки- практическая работа
1. Действия с отдельными символами
Описание переменных и констант: Var s: String; - строка, длина которой не превышает 255 символов, s1: String[10]; - строка, длина которой не превышает 10 символов. Const Name='Svetlana'; Длина строки S (количество символов в строке S): Length(S) Обращение к отдельным символам: S[1] - первый символ строки S, S[3] - третий символ строки S, S[Length(S)] - последний символ строки S, S[k] - k-тый символ строки S. Добавление-замена символов: Добавить в конец строки S восклицательный знак: S:=S+'!'; Добавить в начало строки S три вопросительных знака: S:='???'+S; Третий символ строки S заменить на звездочку: S[3]:='*'; |
Пример 1.1. a) Чему равна длина введенной строки? b) Чему равен первый символ строки? c) Сколько символов 'V' в строке? d) Есть ли в строке хотя бы один символ 'V'? e) Состоит ли строка только из символов 'V'? |
Разбор примера 1.1.
Program prim_1_1; Uses Crt; Var S: String; x, k: Integer; begin ClrScr; Write('S='); Readln(S); {a} Writeln('длина S =', Length(S)); {b} Writeln('S[1]=',S[1]); {c} x:=0; For k:=1 To Length(S) Do If S[k]='V' Then inc(x); Writeln('x=',x); {d} If x0 Then Writeln('Есть V') Else Writeln('Нет V'); {e} If x=Length(S) Then Writeln('Только V') Else Writeln('Не только V'); end. | S - строка x - количествово символов 'V' и k - переменная цикла - целые числа
Запросить строку S Длина строки Первый символ x - количество символов 'V' В цикле просматриваем каждый символ S[k]; если это 'V', то x увеличивается на 1
Если x0, то 'V' в строке есть
Если x = длина строки (Length), то строка состоит только из 'V'. |
Пример 1.2. Во введенной строке заменить все вопросительные знаки на восклицательные. |
Program prim_1_2; Uses Crt; Var S: String; k: Integer; begin ClrScr; Write('S='); Readln(S); For k:=1 To Length(S) Do If S[k]='?' Then S[k]:='!'; Writeln('new S=', S); end. |
В цикле просматриваем все символы строки S если k-тый символ '?', то присваиваем ему новое значение '!' |
Для строк определены операции сравнения (сравниваются коды символов), например, 'Alina''Aleksandra' (коды латинских букв растут в алфавитном порядке). Если k-тый символ строки S - заглавная латинская буква…: If (S[k]='A') AND (S[k]или If S[k] in ['A'..'Z'] Then… Если k-тый символ строки S - цифра…: If (S[k]='0') AND (S[k]или If S[k] in ['0'..'9'] Then… |
Пример 1.3. Каких символов в строке S больше: заглавных или строчных латинских букв? |
{фрагмент программы} x1:=0; x2:=0; For k:=1 To Length(S) Do If S[k] in ['A'..'Z'] Then inc(x1) Else If S[k] in ['a'..'z'] Then inc(x2); If x1x2 Then Writeln('больше заглавных') Else If x2x1 Then Writeln('больше строчных') Else Writeln('заглавных и строчных поровну'); | x1 - количество заглавных букв, x2 - количество строчных букв В цикле просматриваем все символы Если S[k] лат. загл., растет x1, если лат. стр.,- растет x2 После цикла сравниваем значения x1 и x2 |
Пример 1.4. Есть ли в строке S одинаковые символы? |
{ фрагмент программы } x:=0; For k:=1 To Length(S)-1 Do For i:=k+1 To Length(S) Do If S[i]=S[k] Then inc(x); If x0 Then Writeln('Yes') Else Writeln('No'); |
x - количество повторяющихся символов Каждый символ, кроме последнего, сравниваем со всеми последующими Если они одинаковы, x растет Если x0, то одинаковые есть; если x=0, то нет. Примечание. Алгоритм можно улучшить - выйти из циклов после первого же совпадения. |
2. Действия с фрагментами строки
Copy(S,k,x) - подстрока строки S начиная с k-того символа длины x: Pos(S1,S) - позиция подстроки S1 в строке S; (если фрагмента S1 в строке S нет, то Pos(S1,S)=0) Delete(S,n,x) - удалить из строки S подстроку начиная с n-ого символа длины x; Insert(S1,S,n) - вставить строку S1 в строку S начиная с n-той позиции. |
Конкретные примеры помогут понять, как работают эти функции и процедуры.
Фрагмент программы (S, S1, S2: String; x1,x2,x3: Integer;) | Результат |
S:='crocodile'; S1:=Copy(S,4,3); S2:=Copy(S,7,2); | S1='cod', S2='il' |
S:='crocodile'; x1:=Pos('roc',S); x2:= Pos('il',S); x3:= Pos('rod',S); | x1=2, x2=7, x3=0 |
S:='crocodile'; S1:=S; Delete(S,4,2); Delete(S1,1,7); | S='crodile', S1='le' |
S:='crocodile'; Insert('roro',S,6); | S:='crocororodile'; |
Пример 2.1. Программа запрашивает существительное первого склонения (женский род) и склоняет его (без проверки). |
Write ('S: '); Readln(S); S1:= Copy(S,1,Length(S)-1); Writeln('И. ',S); Writeln('Р. ',S1+'ы'); Writeln('Д. ',S1+'е'); … | если S='лиса', то S1='лис' - корень слова Именительный: ‘лиса’ Родительный: ‘лисы’ Дательный: ‘лисе’ ... |
Пример 2.2. a) Есть ли во введенной строке имя 'Anna'? b) Сколько раз оно встречается? |
Program prim_2_2; Uses Crt; Var S: String; x, k: Integer; begin ClrScr; Write('S='); Readln(S); {a} If Pos('Anna',S)0 Then Writeln('Yes') Else Writeln('No'); {b} x:=0; For k:=1 To Length(S)-3 Do If Copy(S,k,4)='Anna' Then inc(x); Writeln('x=', x); end. | Запросить строку Ответить на первый вопрос очень легко
Ответ на второй вопрос ищем в цикле S='Anna11Anna22Anna'
S[13]=S[Length(S)-3] Примечание. Алгоритм можно улучшить. |
Пример 2.3. Во введенной строке заменить все фрагменты 'cat' на 'mouse'. |
Program prim_2_3; Uses Crt; Var S: String; p: Integer; begin ClrScr; Write('S='); Readln(S); p:=Pos('cat',S); While p0 Do begin Delete(S,p,3); Insert('mouse',S,p); p:=Pos('cat',S); end; Writeln('new S=', S); end. |
Запросить строку p - позиция фрагмента 'cat' в строке S Цикл: пока в строке S есть фрагменты 'cat'
удалить 'cat' из S (3 символа, начиная с p) вставить 'mouse' на то же место найти следующий фрагмент 'cat' конец цикла Примечание. Удалить из S фрагмент S1, начинающийся с p: Delete(S,p,Length(S1)); |
Пример 2.4. Запросить строку, в которой записано время в формате hh:mm:ss. Записать его в формате hh ч. mm мин. ss сек. |
Program prim_2_4; Uses Crt; Var S,S1: String; begin ClrScr; Write('S='); Readln(S); S1:=Copy(S,1,2)+' ч. '+ Copy(S,4,2)+' мин. '+ Copy(S,7,2)+' сек. '; Writeln('S1=', S1); end. |
время: 03:13:54 номера символов: 12345678
Примечание. Возможны и другие решения. |
2