Язык программирования Паскаль 6.ppt
- Количество слайдов: 48
Язык программирования Паскаль Работа со строками: посимвольная обработка и стандартные функции. Множественный тип данных 1
Повторение 1 При каком описании формальных параметров следующая ниже программа напечатает три числа: 1 2 3 ? Program M; Var x, y, z: integer; Procedure P(. . ); Var z: integer; begin z: =a; a: =b; b: =c; c: =z end; begin x: =1; y: =2; z: =3; P(x, y, z); writeln(x, y, z) end. 1 Var a, b, c: integer; 2 Var a, b: integer; c: integer; 3 a, b, c: integer; 4 a, b: integer; Var c: integer; 5 a: integer; Var b, c: integer; 2 Ответ: 3
Повторение 2 Запишите, что будет выведено на печать после выполнения программы. var m, n: Byte; Function GCD(a, b: Byte): Byte; Begin While a<>b Do If a>b Then a: =a-b Else b: =b-a; GCD: =a End; Begin m: =36; n: =56; Writeln(GCD(m, n), ’ ‘, m, ’ ‘, n); End. Ответ: 4 36 56 3
Строковый тип данных l l l l Строковый тип относится к числу структурированных типов. Строка – это последовательность любых символов. Каждый символ занимает 1 байт памяти (код ASCII). Количество символов в строке называется ее длиной. Длина строки может находиться в диапазоне от 0 до 255. Особенностью строки в Turbo Pascal является то, что с ней можно работать как с массивом символов, с одной стороны, и как с единым объектом, — с другой. Строковые величины могут быть константами и переменными. 4
Строковая константа есть последовательность символов, заключенная в апострофы. Например: 'это строковая константа', ‘ 272’; str: =’Информация’; . l Строковая переменная описывается в разделе описания переменных следующим образом: Var <идентификатор> : string[<максимальная длина строки>]; l Параметр длины может и не указываться в описании. По умолчанию длина строки равна 255. l 5
Пример: l l l Var name: string[20]; slovo: string; Строка name имеет максимальную длину 20 символов, slovo – 255. Символы внутри строки нумеруются от 1 и к каждому символу можно обратиться по его номеру: name[5], slovo[k*2] (k должно быть переменной целого типа). [1] По отношению к отдельному символу строки возможны все те же операции, что и к переменной типа Char: pred, succ, ord. l [1] Строка похожа на одномерный массив символов: она имеет определенную длину (не больше некоторого числа), к каждому символу можно обратиться по его номеру (как в массиве) – slovo[i] – это обращение к i-ому элементу строки slovo. 6
l l В памяти строка занимает на 1 байт больше своей длины, так как существует символ с номером 0, в котором хранится длина строки. Операторы Write. Ln(Integer(v[0])) и Write. Ln(Ord(w[0])) обеспечивают вывод значения длины строки. [1]. Если строковой переменной не присвоено никакого значения, то ее текущая длина равна нулю. По мере заполнения строки символами ее текущая длина возрастает, но она не должна превышать максимальной по описанию величины. Если ввести больше символов, чем n - максимально возможное количество, то строка будет равна первым n символам, а остальные игнорируются. [1] Если Вы измените первый оператор на Write. Ln(v[0]), то вместо цифрового значения на экран выводится «непонятный» символ. Попробуйте объяснить этот результат и понять смысл преобразования Integer(v[0]). 7
l Переменные типа String выводятся на экран монитора с помощью стандартных процедур Write и Write. Ln и вводятся с помощью стандартных процедур Read и Read. Ln. Т. е. вводятся и выводятся не поэлементно, как массивы, а сразу целиком. 8
Стандартные процедуры и функции, применимые к строковому типу l 1) Сцепление (Склеивание, +). Применяется для соединения строк в одну: 1. ‘IBM’+’ ‘+’PC’=’IBM PC’ 2. Var Str 1, Str 2, Str 3: String [30] … Str 1: =’У Егорки’; Str 2: =’всегда отговорки’; Str 3: =Str 1+’ ‘+Str 2 Строка Str 3 имеет значение ‘У Егорки всегда отговорки’. В данном примере итоговая строка может состоять максимум из 30 символов. Если длина строки при склеивании превысит 30 символов, то в качестве значения будут взяты только первые 30, а остальные рассматриваться не будут. l. Concat(S 1, S 2, …SN) – сцепление N строк в одну. Строки S 1, S 2, …, SN записываются одна за другой. Если результат превысит 255 символов, строка обрывается. S: =concat(‘ли’, ’ней’, ’ка’); 9
l 2) Сравнение (Отношение). Применяются для сравнения двух строк. Сравнение строк происходит посимвольно слева направо: сравниваются коды соответствующих символов до тех пор, пока не нарушится равенство, при этом сразу делается вывод о знаке неравенства. Символ считается больше, если больше его номер в кодировочной таблице. Строки равны, если они совпадают по длине и содержат одни и те же символы. Можно использовать любые сравнения (>, <, =, <>, >=, <=) и их комбинации в условных операторах. Их результат – одно их двух значений: True или False. l ‘пол’<’полка‘ True Длина второй строки больше ‘nomer 3’<’nomer 2’ False Ord(‘ 3’) > Ord (‘ 2’) ‘Balkon’<’balkon’ True Ord(‘B’) < Ord (‘b’) True ‘A’<’ 1’False Ord(‘A’) > Ord (‘ 1’) ‘DOS’=’DOS’True l l l 10
l l l 3) Для определения реальной длины строки используется функция Length(S). Результат — значение целого типа. Под длиной строки понимается количество выделенных символов, но она не может превышать максимально возможной длины (в описательной части). S: =’компьютер’; k: =length(S); {9} 11
Пример 1. l Составить программу, которая выводит true, если в строке цифра 1 встречается чаще цифры 2 и false в противном случае. Program example 1; Var s: string[20]; i, k 1, k 2: byte; Begin Read. Ln(S); k 1: =0; k 2: =0; For i: =1 to Length(s) Do Begin If s[i]=’ 1’ Then k 1: =k 1+1; If s[i]=’ 2’ Then k 2: =k 2+1; End; If k 1>k 2 Then Write. Ln(true) Else Write. Ln(false); End. 12
Пример 2. l Дано слово S, перед которым и после которого могут стоять пробелы. Удалить из строки пробелы, если они присутствуют. Program example 2; Var s, s 1: string[20]; i: byte; Begin Read. Ln(S); S 1: =’’; For i: =1 to length(s) Do If s[i]<>’ ‘ Then S 1: =S 1+S[i]; Write. Ln(s 1) End. 13
Пример 3. l Подсчитать количество гласных латинских букв в строке. Program example 3; Var s: string[50]; I, k: byte; Begin Read. LN(s); K: =0; For i: =1 to length(s) Do If (s[i]=’a’) Or (s[i]=’e’) Or (s[i]=’i’) Or (s[i]=’o’) Or (s[i]=’y’) (s[i]=’u’) Or (s[i]=’A’) Or (s[i]=’E’) Or (s[i]=’I’) Or (s[i]=’O’) Or (s[i]=’Y’) Or (s[i]=’U’) Then k: =k+1; Write. Ln(k) End. Эту же задачу можно решить с использованием оператора варианта Case. Как? 14
Функции работы со строками: Копирование. l Copy(S, k, N) – выделяет из строки S подстроку длиной N, начиная с позиции k. Здесь k и N— целочисленные выражения. Исходная строка не меняется. Результат можно присваивать другой строке или сразу же выводить на экран. S: ='победа’; S: =copy(S, 2, 4); {‘обед’} l 15
2) Подстрока l Pos(S 1, S 2) – обнаруживает первое появление в строке S 2 подстроки S 1. Результат – номер позиции первого символа, с которого начинается совпадение. Если совпадений не обнаружено, то результат – 0. S: =’задача’; k: =Pos(‘дача’, S); {3} k: =Pos(‘дачи', S); {0} l 16
Процедуры: Удаление l Delete(S, k, N) – удаление N символов из строки S, начиная с позиции k. Сама строка изменяется, уменьшается текущая длина строки в переменной S. S: =’рокот’; delete(S, 1, 2); {кот} l 17
l. Вставка Insert(S 1, S 2, k) – вставка строки S 1 в строку S 2, начиная с позиции k. Первая строка остается такой же как и была, а вторая получает новое значение. S: =’сода’; Insert(‘воб’, S, 2); {свобода} 18
l. Число 13 и строка ‘ 13’ – это не одно и то же. Для работы с числами и строками применяются две процедуры. Перевод строкового значения в числовое, если данная строка действительно является записью числа (целого или вещественного) l. Val(S, N, Code) – преобразует строковое значение S в число N. Code – номер первого ошибочного символа. Если Code=0, то преобразование произошло успешно. Val(‘ 345’, N, k); {N=345, k=0} Val(‘ 345. 67’, N, k); {N=345. 67, k=0} Val(‘ 345, 67’, N, k); {k=4, т. к. разделительным знаком между целой и дробной частями является точка, а не запятая} 19
Перевод числового значения в строковое l Str(N, S) – преобразует число N в строку S. Для N можно указать формат. N: =345; Str(N, S); {S=’ 345’} l Пример. Что будет выведено на экран после выполнения следующих действий? S: =’космонавт’; Delete(S, 1, 2); Delete(S, 4, 3); S: =copy(S, 2, 2)+S[1]+S[4]; write(s); {мост} S[1]: =’р’; write(S); {рост} S[4]: =’а’; write(S); {роса} l 20
Пример 1. Даны две символьные строки A и B. Составить программу, проверяющую, можно ли из букв, входящих в слово A, составить слово B (каждую букву можно использовать не более одного раза и можно переставлять) ИНТЕГРАЛ -> АГЕНТ (да) ИНТЕГРАЛ -> ГРАФ (нет) l Алгоритм: 1) Завести счётчик количества совпадающих букв. 2) Брать из второй строки по букве и проверять, есть ли данный символ в первой строке. Если есть, то увеличивать счётчик на 1 и удалять символ из первого слова. 3) Если счётчик равен длине второго слова, то ответ – да, иначе – нет. l 21
Program slovo; Var A, B: string; S, i, k: integer; Begin Read. Ln(A); Read. Ln(B); S: =0; For i: =1 to length(B) Do Begin k: = Pos(B[i], A); If k<>0 then Begin S: =S+1; Delete(A, k, 1) end; If S=length(B) then Writeln(‘Да’) else Writeln(‘Нет’) End. 22
l Пример 2. Дана строка, состоящая из нескольких слов. Слова разделены одним или несколькими пробелами. Выделить все слова текста и записать их в массив. Вывести массив на экран. 23
Program example; Var Tstring: string[15]; A: array[1. . 20] of Tstring; S: string; K, i: integer; Begin Read. Ln(s); s: =s+’ ‘; While (s[1]=’ ‘) And (s<>’’) Do Delete(s, 1, 1); {удаление пробелов в начала строки} K: =0; While s<>’’ Do Begin {пока текст не пустой} k: =k+1; A[k]: =Copy(s, 1, Pos(‘ ‘, s)-1); {выделение слова} Delete(s, 1, Pos(‘ ‘, s); {удаление выделенного слова из строки} While (s[1]=’ ‘) And (s<>’’) Do Delete(s, 1, 1); {удаление пробелов в начала строки} End; For i: =1 to k Do Writeln(a[i]); End. 24
Множественный тип данных l Множество – совокупность однотипных значений, рассматриваемых как единое целое. Элементы множества, в отличие от элементов массива, не пронумерованы и не упорядочены. Нельзя обратиться к отдельному элементу множества. Все действия выполняются над множеством целиком. Множество в Паскале может содержать от 0 до 255 элементов, записанных в любом порядке. Тип элементов множества называется базовым. В качестве базового может выступать любой порядковый тип, размер которого не превышает 256 элементов. 25
Конкретные значения множества задаются в квадратных скобках: [3, 4, 8, 10], [1. . 10, 20. . 29], [‘f’, ’r’, ’q’], [] – пустое множество. l Каждый элемент множества учитывается только один раз, остальные повторные значения игнорируются. Не имеет значения порядок записи элементов. [1, 2, 3]=[3, 2, 1] [2, 3, 5, 2, 3]=[5, 3, 2] [1, 2, 3, 4, 5]=[1. . 3, 4, 5, 2] l Описание: Type <имя типа> = Set Of <тип элементов>; Var <имя переменной множественного типа> : <имя типа>; или Var <имя переменной множественного типа> : Set Of <тип элементов>; l 26
Пример 1 Type Mn_Char=Set Of Char; Var mnl: Set Of Char; mn 2: Mn_Char; mn 3: Set Of 'A'. . 'Z'; sl: Set Of Byte; s 2: Set Of 100. . 120; l Значениями переменных mn 1 и mn 2 являются множества, составленные из различных символов, mn 3 – множества из больших латинских букв; l sl – множества из целых чисел от 0 до 255 (тип Byte содержит целые числа от 0 до 255), l s 2 – множества из целых чисел от 100 до 120. В программе элементы множества задаются в квадратных скобках, через запятую. l Если элементы идут подряд друг за другом, то 27 используется обозначение интервала (две точки). l
Пример 2 Type Digit = Set Of 1. . 5; Var s: Digit; l Количество различных значений переменной s – 32: [] – пустое множество; [1], [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] – множество из всех элементов базового типа. l Значения множественного типа нельзя вводить и выводить. Возможно только присваивание множеству значений: l 28
Операции над множествами l 1) Объединением двух множеств называется множество, состоящее из элементов, входящих хотя бы в одно из этих множеств. Знак операции: +. [1, 2, 3, 5]+[7, 2, 4, 3]=[1, 2, 3, 4, 5, 7, ] 29
2) Пересечением двух множеств называется множество, состоящее из элементов, одновременно входящих в оба множества. Знак операции: *. [1, 2, 3, 5]*[6, 4, 3, 8]=[3] 30
3) Разностью называется множество, состоящее из элементов первого множества, не входящих во второе. Знак операции: –. [1, 2, 3, 5, 7]-[3, 8, 5, 4]=[1, 2, 7] [‘A’, ’K’]–[‘B’, ’D’]= [‘A’, ’K’] – нет общих элементов 31
4) Отношения. A=B – множества совпадают A<>B – множества не совпадают A<B, A<=B – все элементы множества A принадлежат B A>B, A>=B – все элементы множества B принадлежат A Примеры. [3, 4, 8, 7]=[8, 7, 3, 4, 7] [1, 3, 5, 6]<>[6, 5, 1, 4] [3, 5]<=[1, 3, 8, 5, 4] – проверка на вхождение 1 -го множества во 2 -е [1, 8, 7]>=[7, 8, 7] - проверка на вхождение 2 -го множества во 1 -е []<=[1, 2, 3] 32
5) Операция определения принадлежности элемента множеству (Вхождения). Устанавливает связь между множеством и скалярной величиной. Результат – истина, если скалярная величина входит в множество. Запись: x in M, где x – скалярная величина, M – множество. Примеры. 4 in [3, 8, 4, 1] - true ‘a’ in [‘b’. . ’z’] - false 33
Фрагмент программы: Операцию проверки принадлежности удобно использовать для исключения более сложных проверок. Var ch: Char; … repeat write (‘Продолжать? (Y/N)’); Read. Ln (ch); Until (ch=’N’) or (ch=’n’) or (ch=’Y’) or (ch=’y’); Последний оператор можно записать с использованием множества так: Until ch In [’N’, ’n’, ’Y’, ’y’]; 34
Пример. Даны две символьные строки, содержащие латинские буквы. Построить строку S 3, содержащую общие символы строк S 1 и S 2 в алфавитном порядке и без повторений. Program example; Type Mset=set of ‘a’. . ’z’; Var S 1, S 2, S 3: string; MS 1, MS 2, MS 3: Mset; c: char; i: integer; Begin Read(S 1); Read(S 2); MS 1: =[]; MS 2: =[]; For i: =1 to length(S 1) do MS 1: =MS 1+[S 1[i]]; For i: =1 to length(S 2) do MS 2: =MS 2+[S 2[i]]; MS 3: =MS 1*MS 2; S 3: =’’; For c: =’a’ to ‘z’ do If c in MS 3 then S 3: =S 3+c; Write. Ln(S 3) End. 35
Пример. Ввод элементов множества: … Write(‘Размер множества’); Read(N); M: =[ ]; for i: =1 to N do Begin write(i, ’ элемент’); Read. Ln(c); M: =M+[c] end; 36
Задача 1. Дано натуральное число n. Составить программу вывода цифр, не входящих в десятичную запись числа n (в порядке возрастания). Program z 1; Type Mn=Set Of 0. . 9; Var s: Mn; n: Long. Int; i: Integer; Begin Write. Ln('Введите число '); Read. Ln(n); s: =[0. . 9]; While n<>0 Do Begin s: =s-[n Mod 10]; (*Исключаем цифру. *) n: =n Div 10; End; For i: =0 To 9 Do If i In s Then Write(i: 2); Write. Ln; End. l Измените программу так, чтобы находились общие цифры в записи m чисел. l 37
l Задача 2. Подсчитать количество решений ребуса МУХА+МУХА=СЛОН. С использованием множественного типа данных программный код получается более компактным. Program z 2; Type Mn=Set Of 0. . 9; Var i, j, cnt: Integer; Sm, Se: Mn; (*M 3 цифр числа формируем множество. *) Procedure Change(t: Integer; Var S: Mn); Begin S: =[]; While t<>0 Do Begin S: =S+[t Mod 10]; t: =t Div 10; End; (*Подсчитываем количество элементов в множестве. *) Function Qw(S: Mn): Integer; Var i, cnt: Integer; Begin cnt: =0; For i: =0 To 9 Do If i In S Then Inc(cnt); Qw: =cnt; l End; 38
Begin cnt: =0; (*Счетчик числа решений. *) For i: =1000 To 4999 Do Begin {*Результат - четырехзначное число, поэтому слагаемое не превышает 4999. *} Change(i, Sm); If Qw(Sm)=4 Then Begin {*Если все цифры числа различны, то выполняем дальнейшие вычисления. *} j: =2*i; Change(j, Se); If (Sm*Se=[]) And (Qw(Se)=4) Then Inc(cnt); (*Числа состоят из различных цифр, и все цифры результата различны. *) End; Write. Ln(cnt); End 39
Тестовые задания В строковой переменной S хранится строка ‘аквалангист’. С помощью какого фрагмента программы можно получить слово ‘акула’. 1 S: =Copy(S, 1, 6); Insert(‘у’, S, 3); Delete(S, 3, 2); 2 S: =Copy(S, 1, 2)+’у’+S[1]+S[5]; 3 Delete(S, 3, 2); Delete(S, 5, 5); Insert(‘у’, S, 4); 4 Delete(S, 1, 4); Insert(‘y’, S, 1); S: =Copy(S, 1, 2)+S; 5 S: =Concat(‘ак’, Copy(S, 5, 2)); Insert(‘у’, S, 3); Ответ: 5 40
Определите какая(ие) из приведенных серий команд определяет(ют) место последнего вхождения символа ‘R’ в строку Str длины 8. Если такого символа в строке нет, должно возвращаться значение 0. Выберите наиболее полный ответ. (A) p: =0; for i: =1 to 8 do if Str[i]=’R’ then p: =i; (B) p: =9; repeat p: =p-1 until Str[p]=’R’; (C) p: =0; for k: =8 downto 1 do if Str[k]=‘R’ then p: =k; 1 (A) 2 (B) 3 (A) и (B) 4 (A) и (C) 5 (A), (B) и (С) l Ответ: 1 41
l l l Какие из следующих выражений ошибочны с точки зрения языка Паскаль (а) [13]<>[13, 13] (б) []<=[‘ 0’. . ’ 9’] (в) 7<>[7] (г) [‘m’, ’k’]=[‘k’. . ’m’] Ответ: в 42
Восстановить исходные данные (строку SL 1), если после выполнения оператора присваивания SL 2: =copy(SL 1, 7, 2)+copy(SL 1, 3, 4)+ SL 1[2] получается SL 2=’наличие’ A. величество B. величина C. наличник D. наличные E. навеличивание 43
Какой из указанных операторов недопустим в Паскале, если действует описание Var a: string[100]; b: string[5]; A. write(a, ’=’, b) B. a[length(a)]: =b[length(b)] C. write(length(a)>=length(b))]) D. a: =a+b[10] E. write(a<b) Ответ: D 44
Какую задачу решает данная программа? Program T; Var SL: string; i: integer; begin readln(SL); i: =1; while (i>=1) and (SL[i]<>’*’) and (i<=length(SL)) do begin SL: =SL+’*’; i: =i+1 end; writeln(SL) end. Ответ: ставит в конце строки столько ‘*’, сколько символов до первой ‘*’ 45
А и В – множества. Какое из приведенных ниже выражений тождественно данному: А*В – (А–В)*(В–А) l A. A*В B. A+В–А*В l C. [ ] D. A+B E. A–B Ответ: A 46
l l Дан фрагмент программы: S: = ‘’; For I: = ‘ 0’ to ‘ 9’ do S: =S+I; Какое значение получит переменная S после его исполнения? 47
Дан фрагмент программы. Type String 40 = String[40]; M = Array[1. . 100] Of String 40; Var A : M; I, J, Min, N : Byte; Vsp : String 40; Begin Write('N? '); Read. Ln(N); For I : = 1 To N Do Read. Ln(A[I]); For I : = 1 To N-1 Do Begin Min : = I; For J : = I + 1 To N Do If A[J] < A[Min] Then Min : = J; Vsp : = A[I]; A[I] : = A[Min]; A[Min] : = Vsp; End; Write. Ln('Ответ: '); For I : = 1 To N Do Write. Ln(A[I]) End. l Точно и однозначно сформулировать условие задачи, решение которой приведено в данном фрагменте. l 48
Язык программирования Паскаль 6.ppt