Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Стандартные процедуры и функции
Паскаль предоставляет в распоряжение программиста целый ряд встроенных функций и процедур, предназначенных для обработки строк. Рассмотрим наиболее важные из них.
Удаление Для удаления из строки фрагмента используется процедура 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.
МНОЖЕСТВЕННЫЙ ТИП ДАННЫХ Множество в языке Паскаль представляет собой набор различных элементов одного (базового) типа. Базовый тип − это совокупность всех возможных элементов множества. Всего в базовом типе должно быть не более 256 различных элементов. Значение переменной множественного типа может содержать любое количество различных элементов базового типа − от нуля элементов (пустое множество) до всех возможных значений базового типа (напомним, что их должно быть не более 256). Иными словами, возможными значениями переменных множественного типа являются все подмножества базового типа. Множества, используемые в программе, могут быть описаны либо в разделеType:
Type <имя типа>=Set Of <тип элементов>; Var <имя множества>: <имя типа>;
либо непосредственно в разделе описания переменных Var: Var <имя множества>: Set Of <тип элементов>; Пример Type mnog_Char=Set Of Char; Var mn1: Set Of Char; mn2: mnog_Char; mn3: Set Of 'A'..'Z'; s1: Set Of Byte; s2: Set Of 1000..1200; Здесь mn1 и mn2 − это множества символов; так как различных символов всего 256, то тип Char можно использовать в качестве базового; mn3 − множество больших латинских букв; s1 − множество целых чисел (от 0 до 255); так как тип Byte содержит только целые числа от 0 до 255 (всего 256 различных чисел), его тоже можно использовать в качестве базового типа элементов; s2 − множество целых чисел от 1000 до 1200. Формирование (конструирование) множеств. В программе элементы множества задаются в квадратных скобках, через запятую. Если элементы идут подряд друг за другом, то можно использовать диапазон. Пример Type digit=Set Of 1..5; Var s: digit; Переменная s может принимать значения, состоящие из любой совокупности целых чисел от 1 до 5: [ ] − пустое множество; [I], [2], [3], [4], [5] − одноэлементные множества; [1, 2], [1, 3], ..., [2, 4], [4, 5] − двухэлементные (пара любых элементов); [1, 2, 3], [1, 2, 4],..., [3, 4, 5] − трехэлементные (тройка элементов); [1, 2, 3, 4], [1, 2, 3, 5], [1, 2 , 4, 5], [1, 3, 4, 5], [2, 3, 4, 5] − четырехэлементные; [1, 2, 3, 4, 5] − полное множество (взяты все элементы базового типа).
Операции над множествами Объединением двух данных множеств называется множество элементов, принадлежащих хотя бы одному из этих множеств. Знак операции объединения множеств в Паскале − "+". Примеры 1) ['А','F']+['В','D']=['A','F','B','D']; 2) [1..3, 5, 7, 11]+[3..8, 10, 12, 15..20]=[1..8, 10..12, 15..20] Пусть S1:=[1..5, 9], a S2:=[3 .. 7, 12]. Тогда если S:=S1+S2, то S=[1..7, 9, 12]. Пусть A1:=['a'..'z']; A1:=A1+['A']. Тогда А1=['А', 'a'..'z']. Пересечением двух множеств называется множество элементов, принадлежащих одновременно и первому, и второму множеству. Знак операции пересечения множеств в Паскале − "*". Примеры 1) ['А', 'F']*['В', 'D']=[ ], так как общих элементов нет; 2) [1..3, 5, 7, 11]*[3..8, 10, 12, 15..20]=[3, 5, 7]; 3) если S1:=[1..5, 9] и S2:=[3..7, 12], a S:=SI*S2, то S=[3. .5]. Разностью двух множеств называется множество, состоящее из тех элементов первого множества, которые не являются элементами второго. Знак операции вычитания множеств − "−". Примеры 1) ['А', 'F']-['В', 'D']=['А', 'F'], так как общих элементов нет; 2) [1..3, 5, 7, 11]-[3..8, 10, 12, 15..20] =[1, 2, 11]; 3) S1:=[1..5, 9]; S2:=[3..7, 12]; S:=S1-S2; Тогда S=[1, 2, 9]; 4) А1:=['А'..'Z']; А1:=А1-['А']. Тогда А1=['В'..'Z'].
|
||
Последнее изменение этой страницы: 2018-05-31; просмотров: 241. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |