Стандартные процедуры и функции
Паскаль предоставляет в распоряжение программиста целый ряд встроенных функций и процедур, предназначенных для обработки строк. Рассмотрим наиболее важные из них.
Удаление Для удаления из строки фрагмента используется процедура Delete(Str, n, m), которая вырезает из строки Str m символов начиная с n−го, таким образом, сама строка изменяется. Пример Str1:='ABCDEFGH'; Delete(Str1, 3, 4); Writeln(Str1); После выполнения этих операторов из строки будут удалены 4 символа начиная с 3−го, то есть строка будет такой: Str1='ABGH'.
Вставка
Для вставки подстроки в строку используется процедура Insert(Str1, Str2, n), которая вставляет строку Str1 в строку Str2 начиная n−го символа, при этом первая строка остается такой же, как и была, а вторая получает новое значение. Пример Str1:='ABCDEFGH'; Str2:='abcdefgh'; Insert(Str1, Str2, 3); В результате выполнения данной процедуры строка будет такой: Str2='abABCDEFGHcdefgh'. Этот же результат будет и после выполнения такой последовательности операторов: Str2:='abcdefgh'; Insert(‘ABCDEFGH’, Str2, 3);
Копирование Функция Copy(Str, n, m) копирует m символов строки Str начиная с n−го символа, при этом исходная строка не меняется Пример 1 Str1:='ABCDEFGH'; Str2:='abcdefgh'; Str3:=Copy(Str1, 4, 3); Writeln(Str3); Writeln(Copy (Str2, 4, 3)); Значение переменной Str3='DEF'. А на экран будут выведены следующие строки: DEF def Пример 2 Предскажите результат работы программы. Program Example_127; uses crt; vara, b, c, d, e: string[15]; Begin clrscr; a:='стихотворение'; b:=copy(a, 1, 4); c:=copy(a, 2,4); d:=copy(a, 6, 8); e:=copy(a, 7, 3); writeln(b, ', ',c, ', ',d, ', ',e); readln; End. Длина строки Под длиной строки понимается фактическое (а не максимально возможное!) количество символов в строке. Это значение можно найти при помощи функции Length(Str), результат которой − целое число, равное количеству символов. Пример Str1:='ABCDEFGH'; Str2:='мама мыла раму.'; k1:=Length(Str1); k2:=Length(Str2); В результате значения целых переменных будут равны: k1=8, k2=15.
Поиск подстроки Имеется функция, определяющая позицию подстроки в строке, − Pos(Str1, Str2). Результат этой функции − целое число, и оно определяет номер элемента, с которого начинается первое вхождение подстроки Str1 в строку Str2. Если Str1 не входит в Str2, то значение функции равно 0. Пример 1 Strl:='CDE'; Str2:='ABCDEFGH'; kl:=Pos(Str1, Str2); k2:=Pos(Str2, Str1); Значение переменной k1 равно 3, так как строка Str1 входит в строку Str2 с третьего символа, а значение k2 равно 0. Пример 2 k1:=Pos(' ша',' Наша Таня громко плачет.') В этом случае значение k1 равно 3, так как функция Pos возвращает номер элемента, начиная с которого подстрока встречается первый раз. Пример 3 Program Example_128; uses crt; var a, b, c: string[100]; m, n: integer; Begin clrscr; a:='Жил-был в норе под землей хоббит'; b:='был'; c:='хоббит'; m:=pos(b, a); n:=pos(c, a); writeln(b, '-', m); {был-5} writeln(c, '-', n); {Хоббит-27} End. Числа и строки
Часто возникает необходимость получить строковое представление числа и наоборот (например, получить строку '13' из числа 13). Для работы с числами и строками применяются две процедуры. Str(N, Str1) − переводит числовое значение N в строковое и присваивает результат строке Str1, причем можно переводить как целые числа, так и вещественные. Примеры Str(1234, Str1) − после выполнения Str1='1234'; Str (452.567, Str1) − переводим вещественное число с фиксированной запятой, результат Str1='452.567'; Str(4.52567е+2, Str1) − переводим вещественное число в экспоненциальной форме, результат Str1='4.52567e+2', Вторая процедура выполняет обратное действие. Val(Str, N, К) − переводит строковое значение в числовое. Если данная строка действительно является записью числа (целого или вещественного), то значение К=0, а N − это искомое число, иначе К будет равно номеру первого символа, с которым процедура Val "не справилась". Примеры
Val('1234', n, k) - n=1234, k=0; Val('234.56', n, k) - n=234.56, k=0; Val('2.3456e+2', n, k) - n=2.3456e+2, k=0; Val('12-45', n, k) k=3, так как знак "−" в записи чисел может быть только на первом месте; Val('2,567m', n, k) k=2, так как разделительным знаком между целой и дробной частями является точка, а не запятая; Val ('5.87с-5') k=5, так как символ 'с' не должен встречаться в записи вещественного или целого числа. Решение задач Пример 1 Сколько раз в данной строке встречается символ 'a'? Решение Опишем функцию, которой будем передавать строку. Результат выполнения − целое число. Program Example_129; Function Q_Ch(st: String): Byte; Var i, k: Byte; Begin k:=0; {Просматриваем все символы строки, их количество равно длине строки; если очередной символ равен 'а', то увеличиваем счетчик} For i:=1 To Length(st) Do If st[i]='a' Then Inc(k); Q_Ch:=k; End; Пример 2 Если в строке нечетное число символов, то удалить средний. Решение Program Example_130; Procedure Del(Var st: String); Var k: Byte; Begin k:=Length(st); If k Mod 2=1 Then Delete(st, k Div 2+1,1); End; Пример 3
Заменить все вхождения подстроки 'del' на 'Insert'. Решение Пока такая подстрока встречается, необходимо находить номер первого символа очередного вхождения подстроки 'del' , удалять 'del' и вставлять 'Insert'. Program Example_131; Procedure Ins(Var st: String); Var k: Byte; Begin While Pos ('del', st)<>0 Do Begin k:=Pos ('del', st); Delete(st, k, Length ('del')); Insert('Insert', st, k); End; End; Пример 4 Дана строка, состоящая из нескольких слов, между словами один пробел, в конце строки − точка. Подсчитать количество слов и вывести на экран только те из них, которые начинаются с буквы 'а' (слов не больше 30). Решение Разобьем предложение на отдельные слова и каждое будем хранить как элемент массива строк. Program Example_132; Const n=30; Type Myarray_Str=Array [1..n] Of String; Var A: Myarray_Str; str: String[255]; k: Byte; Procedure Init(Var b: Myarray_Str); Var i: Integer; Begin k:=1; {Пока не встретится пробел, формируем очередное слово k, прибавляя по одной букве} For i:=1 To Length(str)-1 Do If str[i]<>' ' Then b[k]:=b[k]+str[i] Else {Если это не последний символ, то увеличиваем счетчик слов и начинаем формировать очередное слово} If i<>Length(str)-1 Then Begin Inc(k); b[k]:=' 'End; End; Begin Writeln('Введите предложение'); Readln(str); Init(A); Writeln('Всего слов: ',k); {Просматриваем все слова, если первый символ очередного слова равен букве 'а', то выводим его} For i:=1 To k Do If A[i][1]='a' Then Write(A[i],' '); Readln; End. Пример 5 Подсчитать сумму цифр, входящих в данную строку. Program Example_133; Function Sum(st: String): Integer; Var i, d: Byte; s,k: Integer; Begin s:=0; For i:=1 To Length(st) Do Begin Val(st[i], d, k); If k=0 Then s:=s+d; End; Sum:=s; End; Пример 6 Строка символов представляет собой некоторый текст, слова в котором разделены одним или более пробелами. Преобразовать эту строку так, чтобы все слова разделялись ровно одним пробелом, а ведущие и хвостовые пробелы отсутствовали. Решение Program Example_134; var s: string; Begin writeln('Введите строку текста с пробелами'); readln(s); while pos(' ', s)>0 do delete (s, pos (' ', s),1); {Пока в строке существуют два рядом стоящих пробела, удаляем один из них} if s[1]=' ' then delete(s, length (s), 1); if s[length(s)]=' ' then delete(s, length(s), 1); readln; End. Пример 7 Дана строка символов следующего вида: p1q1p2q2p3q3...qnpn где pi − целое неотрицательное число, а qi − знак арифметического действия из набора (+,-,*). Написать программу вычисления значения введенного выражения, предполагая, что действия выполняются согласно правилам арифметики. Решение Пока в строке присутствуют знаки умножения, мы находим первый из них. Выделяем числа, стоящие слева и справа, удаляем соответствующуе часть строки (число, знак умножения, число) и вставляем на это же место результат умножения выделенных чисел друг на друга. Остальные действия выполняются по порядку. Корректность введенного выражения будет проверена по ходу вычислений. Program Example_135; var pq, p1, p2: string; m,n, k, l, j: word; Begin writeln('Введите арифметическое выражение'); readln(pq); while pos('*', pq)>0 do {цикл для выполнения всех действий умножения} Begin p1:=' '; k:=pos('*', pq); while (k>1) and (pq[k-1] in ['0'..'9']) do Begin k:=k-1; p1:=pq[k]+p1 {формируем число, стоящее справа от знака умножения} end; {while} p2:=' '; l:=pos('*', pq); while (l<length(pq)) and (pq[l+1] in ['0'..'9']) do Begin l:=l+1; p2:=p2+pq[l]; {формируем число, стоящее справа от знака умножения} end; {while} val(p1, n, j); if j>0 then Begin writeln('ошибка в выражении'); halt end; {if} val(p2, m, j); if j>0 then Begin writeln('ошибка в выражении); halt; end; {if} j:=m*n; str(j, p1); delete(pq, k, l-k+1); {часть строки удаляем} insert (p1, pq, k); {вставляем результат умнож.} end; {while} {все умножения выполнены} while (pos('+',pq)>0) or (pos('-',pq)>0) do Begin p1:=' '; k:=1; while (pq[k] in ['0'..'9']) do Begin p1:=p1+pq[k]; k:=k+1; end; {while} p2:=' '; l:=k; while (l<length(pq)) and (pq[l+1] in ['0'..'9']) do Begin l:=l+1; p2:=p2+pq[l]; end; {while} val(p1, n, j); if j>0 then Begin writeln('ошибка в выражении'); halt; end; {if} val(p2, m, j); if j>0 then Begin writeln('ошибка в выражении'); halt; end; {if} case pq[k] of '+': j:=n+m; '-': j:=n-m; end; {case} str(j, p1); delete(pq, 1, l); insert(p1, pq, 1) end; {while} {все сложения и вычитания выполнены} val(pq, n, j); if j>0 then Begin writeln('ошибка в выражении'); halt; end; {if} writeln('=', pq); readln; End. Оператор halt − стандартная процедура, которая завершает выполнение программы и выполняет возврат в операционную систему. Пример 8 Подсчитать, сколько букв а в тексте. ProgramExample_136; uses crt; var a: string; i, s: integer; Begin clrscr; writeln('Введите текст'); readln(a); s:=0; for i:=1 to length(a) do Begin if (copy (a, i, 1)= 'a') or (copy(a, i, 1)= 'A') then s:=s+1; end; writeln('В заданном тексте буква <a> встречается ', s, ' раза'); End. Пример 9 Найти сумму двух целых чисел, которые вводятся с клавиатуры, а также сумму цифр каждого из цифр. Program Example_137; uses crt; var a, b, c1, c2, i, k, s, sa, sb: integer; ca, cb: string[5]; Begin clrscr; s:=0; sa:=0; sb:=0; write('Задайте 1-е число'); readln(a); write('Задайте 2-е число'); readln(b); s:=a+b; str(a, ca); str(b, cb); for i:=1 to length(ca) do Begin val(copy(ca, i, 1), c1, k); sa:=sa+c1; end; for i:=1 to length(cb) do Begin val(copy(cb, i, 1), c2, k); sb:=sb+c2; end; writeln(' Сумма чисел равна ',s); writeln(' Сумма цифр 1-го числа= ', sa) writeln(' Сумма цифр 2-го числа= ', sb); readln; End. Пример 10 Определить, каких цифр в числе больше: четных или нечетных. ProgramExample_138; uses crt; var a: string[5]; b: string[1]; i, k, s, sn, x: integer; Begin clrscr; s:=0; sn:=0 write('Задайте число'); readln(a); for i:=1 to length(a) do Begin b:=copy(a, i, 1); val(b, x, k); if x mod 2=0 then s:=s+1 else sn:=sn+1; end; if s>sn then writeln('четных цифр больше'); if s<sn then writeln('нечетных цифр больше'); if s=sn then writeln('Одинаково'); End.
Популярное: Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... ![]() ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (759)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |