Рядки та засоби їх обробки.
Короткі теоретичні відомості. Рядки і засоби їх обробки. Значенням рядкового типу даних є рядки. Стандарт мови передбачає використання рядків тільки як констант, що використовуються в операторах виведення Write, Writeln. У розширенні мови Turbo-Pascal рядковий тип даних визначений більш повно. Визначення рядкового типу слідує діаграмі:
Тут ціле належить діапазону 1..255 і означає максимальну кількість символів у рядку цього типу. Якщо описання типу String використовується без вказівки максимальної кількості символів, це (за замовченням) означає, що під цей тип резервується 255 символів.
Наприклад: Type Name = String[20]; { рядки з 20-ти символів } Post = String; { рядки з 255-ти символів } Процедури і функції типу String. Над рядками визначена операція конкатенації “+”, результат якої - рядок, в якому операнди з’єднанні в порядку їх слідування у виразі. Наприклад: 'Turbo' + 'Pascal' = 'TurboPascal'; 'Turbo_' + 'Pascal ' + 'System' = 'Turbo_Pascal System'; Тому результатом виконання серії операторів X:= ' Приклад'; У:= ' додавання '; Z:= ' рядків'; Writeln(X + Y + Z); Writeln(Y + ' ' + Z + ' ' + X) будуть виведені на екран рядки Прикладдодаваннярядків додавання рядків Приклад
Тип String допускає і пустий рядок - рядок, який не містить символів: EmptyStr:= '' {лапки, що йдуть підряд}. Вона грає роль нуля (нейтрального елемента) операції конкатенації: EmptyStr + X = X + EmptyStr = X Над рядками визначені також відношення (операції логічного типу) " = ", " <> ", " < ", " > ", " <= ", " >= ". Таким чином, кожний із рядкових типів упорядкований, причому лексикографічно. Це означає, що а) порядок на рядках погоджений з порядком, заданим на символьному типі (Char); б) порівняння двох рядків здійснюється посимвольно, починаючи з перших символів;
в) якщо рядок А є початком рядка В, то А < В; г) пустий рядок - найменший елемент типу.
Наприклад:
а) 'с' < 'k', так як Ord(‘c’) < Ord(‘k’); б) 'abс' < 'abk', так як перші два символи рядків співпадають, а порівняння третіх дає Ord(‘c’) < Ord(‘k’); в) 'abс' < 'abkd', так як перші два символи рядків співпадають, а порівняння третіх дає Ord(‘c’) < Ord(k); г) 'ab' < 'abсd', так як рядок 'ab'- початок рядка 'abсd'. На рядковому типі даних визначені:
Функції: a) Length(X: String): Byte; - довжина рядка X; { Length(EmptyStr) = 0 } б) Pos(Y:String; X:String):Byte; - позиція першого символу першого зліва входження підрядка Y у рядок X. Якщо X не містить Y, Pos(Y, X) = 0. в) Copy(X:String; Index, Count: Integer):String - підрядок рядка X, що починається з позиції Index і містить Count символів. г) Concat(X1, X2,.., Xk: String): String; - конкатенація рядків Х1, X2,.., Xk. Інша форма запису суми X1+X2+.. +Xk.
Процедури: д) Delete(var X: String; Index, Count: Integer); З рядка X видаляється Сount символів, починаючи з позиції Index. Результат поміщується в змінну X. e) Insert(Y:string; var X: String; Index: Integer); В строку X вставляється рядок Y, причому вставка здійснюється починаючи з позиції Index. Стандартні процедури введення-виведення Паскаля розширені для введення-виведення рядків. Відмітимо, однак, що для введення декількох рядкових даних треба користуватись оператором Readln. Оператор Read у цих випадках може вести себе непередбачено.
Приклад 2. Дано масив A[1..n] of string[20]. Скласти програму заміни всіх перших входжень підрядка L в A[i] на підрядок R. Рядки L і R вводяться з клавіатури в виді рівності L = R. Результат замін відобразити у масив, елементи якого - рівності виду: A[i]=результат заміни L на R в A[i]. Program RewriteArray; Const n = 100; Single = 20; Double = 41; Type Sitem = string[Single]; Ditem = string[Double]; SWordArray = array[1..n] of Sitem; DWordArray = array[1..n] of Ditem; Var A: SWordArray; B: DWordArray; L, R: Sitem; X: Sitem; i, Index: Integer; Procedure InpWord(var U, V: Sitem); Var X: Ditem; j: Integer; Begin Writeln('________ Введення рівності L = R __________');
Read(X); j:= Pos('=', X); U:= Copy(X, 1, j - 1); V:= Copy(X, j + 1, Length(X)) End;
Procedure InpArray; begin Writeln('====== Введення масиву слів ======'); For i:=1 to n do Readln(A[i]) end; Procedure OutArray; begin Writeln('====== Виведення масиву слів ===='); For i:=1 to n do Writeln(B[i]) end; Begin InpArray; {введення масиву слів з клавіатури} InpWord(L, R); {введення і аналіз рівності L = R} For i:= 1 to n do begin X:= A[i]; Index:= Pos(L, X); If Index <> 0 then begin Delete(X, Index, Length(L)); Insert(R, X, Index) end; B[i]:= A[i] + '=' + X end; OutArray; {виведення масиву слів до друку} End.
Хід роботи 1. Виконати свій варіант завдання 1. 2. Записати її як файл в бібліотеку. 3. Відкомпелірувати її і запустити на виконання для кількох значень, щоб перевірити всі описані варіанти значення функції. 4. Записати відкоректовану програму, вихідні данні та результати роботи.
Контрольні питання.
Завдання 1. 1. Дана строка символов. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2.
Завдання 2 1. Даны две строки: S1 и S2. Проверить, содержится ли строка S2 в строке S1. Если да, то вывести номер позиции, начиная с которой S2 содержится в S1, если нет, то вывести 0. 2. Даны две строки: S1 и S2. Определить количество вхождений строки S2 в строку S1.
3. Дана строка S и символ C. Удвоить каждое вхождение символа C в строку S. 4. Даны строки S1, S2 и символ C. Перед каждым вхождением символа C в строку S1 вставить строку S2. 5. Даны две строки: S1 и S2. Удалить из строки S1 первую подстроку, совпадающую с S2. Если таких подстрок нет, то вывести S1 без изменений. 6. Даны две строки: S1 и S2. Удалить из строки S1 последнюю подстроку, совпадающую с S2. Если таких подстрок нет, то вывести S1 без изменений. 7. Даны две строки: S1 и S2. Удалить из строки S1 все подстроки, совпадающие с S2. Если таких подстрок нет, то вывести S1 без изменений. 8. Даны три строки: S1, S2, S3. Заменить в строке S1 первое вхождение строки S2 на S3. 9. Даны три строки: S1, S2, S3. Заменить в строке S1 последнее вхождение строки S2 на S3. 10. Даны три строки: S1, S2, S3. Заменить в строке S1 все вхождения строки S2 на S3. 11. Дана строка, содержащая полное имя файла, то есть имя диска, список каталогов (путь), собственно имя и расширение. Выделить из этой строки имя файла. 12. Дана строка. Вывести подстроку, расположенную между первой и последней точками исходной строки. Если в строке менее двух точек, то вывести всю исходную строку. 13. Дана строка S и число N. Преобразовать строку S в строку длины N следующим образом: если длина строки S больше N, то отбросить первые символы, если длина строки S меньше N, то в ее начало добавить символы "." (точка). 14. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов, которые начинаются и заканчиваются одной и той же буквой. 15. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов, которые содержат хотя бы одну букву "А". 16. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов, которые содержат ровно три буквы "А". 17. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить длину самого короткого слова. 18. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить длину самого длинного слова. 19. Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова (разделенные одним пробелом), но расположенные в алфавитном порядке. 20. Дана строка, содержащая полное имя файла, то есть имя диска, список каталогов (путь), собственно имя и расширение. Выделить из этой строки расширение файла.
Читайте также: D. Антикампілобактерні засоби Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|