- Газета «Вісник Переяславщини»
- 10 клас
- 11 клас
- Pascal
« Квітень 2024 » | ||||||
Пн | Вт | Ср | Чт | Пт | Сб | Нд |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 2016 Вересень
- 2016 Жовтень
- 2016 Листопад
- 2017 Лютий
- 2017 Березень
- 2017 Червень
- 2017 Вересень
- 2017 Жовтень
- 2017 Листопад
- 2017 Грудень
- 2018 Лютий
- 2018 Червень
- 2018 Листопад
- 2018 Грудень
- 2019 Червень
- 2019 Вересень
- 2019 Листопад
- 2019 Грудень
- 2020 Січень
- 2020 Лютий
- 2020 Березень
- 2020 Вересень
- 2022 Жовтень
- 2023 Березень
- 2024 Березень
« попередня |
наступна » |
Урок 28
Тема уроку: "Вказівки
і функції опрацювання рядкових величин та їх опис мовою програмування."/font>
Лекційний.
Теоретичний матеріал:
Рядок - це послідовність символів кодової таблиці ПЕОМ (ASCII таблиця).
При використанні у виразах рядок береться в одинарні лапки.
Кількість символів у рядку (довжина рядка) може динамічно змінюватися від
0 до 255. Для опису даних рядкового типу використовується ідентифікатор string,
за яким вказується в квадратних дужках значення максимально допустимої довжини
даного рядка. Якщо значення не вказується, то вважається довжина рядка 255
байт.
Змінну рядкового типу можна визначити безпосередньо в розділі опису змінних.
Рядкові дані можуть використовуватися в програмі також у якості констант.
Опис рядкового типу встановлює максимальну кількість символів, що може вмістити
рядок.
Формат опису:
var
<ідентифікатор,...> : string [<максимальна довжина рядка>];
Приклад:
ST : string; {опис рядка довжиною 255 символів (відсутня довжина рядка
в описі)}
ST1 : string[50]; {опис рядка довжиною 50 символів}
Вирази, в яких операндами служать рядкові дані, називаються рядковими. Вони
складаються із рядкових констант, змінних, покажчиків функцій і знаків операцій.
Над рядками дозволяється виконувати операції зчеплення й операції відношення.
Операція зчеплення (+) застосовується для з'єднання декількох рядків
в один результуючий рядок. Наприклад,
'П'+'Е'+'О'+'М'='ПЕОМ'
Довжина результуючого рядка не повинна перевищувати 255 символів.
Операції відношення (=, <, >, <>, <=, >=) здійснюють
порівняння двох рядкових операндів і мають пріоритет нижчий, ніж операції
зчеплення. Порівняння рядків робиться зліва направо до першого не співпадаючого
символу. Довжина того рядка вважається більшою, у якого перший неспівпадаючий
символ буде мати більший номер у кодовій таблиці ASCII. Якщо рядки мають різну
довжину, але в загальній частині збігаються, вважається, що той рядок менший,
у якого довжина менше. Рядки вважаються рівними, якщо вони рівної довжини
і містять однакові символи.
Для присвоєння рядковій змінній значення результату рядкового виразу використовується
оператор присвоювання (:=).
Якщо довжина змінної після виконання оператора присвоювання перевищує максимально
допустимий при описі розмір, усі зайві символи праворуч усікаються.
Допускається змішування в одному виразі операндів рядкового і літерного типів.
Якщо при цьому літерній змінній присвоюється значення рядкового типу, довжина
рядка повинна дорівнювати одиниці, інакше виникає помилка виконання.
До окремих символів у рядку можна звернутися за номером (індексом) даного
символу в рядку. Індекс визначається виразом цілого типу, що записується в
квадратних дужках за ідентифікатором рядкової змінної або константи.
Для обробки рядкових даних використовуються наведені нижче стандартні процедури
та функції.
Процедури для роботи з рядками.
Delete(Str,Poz,N) - вилучення N символів рядка Str, починаючи
з позиції Poz. Якщо Poz>255, виникає програмне переривання.
Insert(Str1,Str2,Poz) - вставка рядка Str1 у Str2, починаючи
з позиції Poz.
Str(Number,St) - перетворення числового значення величини Number
і занесення результату в рядок St. Після Number може записуватися
формат, аналогічний формату виведення. Якщо у форматі зазначена недостатня
кількість розрядів, поле виведення розширюється до потрібної довжини.
Значення Number
|
Вираз
|
Результат
|
1500 | Str(Number:6,Str) | '__1500' |
4.8E+03 | Str(Number:10,Str) | '______4800' |
76854 | Str(-Number:3,Str) | '-76854' |
Val(St,Number,Cod) - перетворює значення St у величину цілого
або дійсного типу і розміщує результат у Number. Значення St
не повинно містити зайвих проміжків на початку і наприкінці рядка. Cod
- ціла змінна, значення якої не дорівнює нулю, якщо під час операції перетворення
виявлена помилка. Cod буде містити номер позиції першого помилкового
символу, а Number не буде визначено.
Значення Str
|
Вираз
|
Результат
|
'1450' | val(Str,Number,Cod) | 1450 Cod=0 |
'14.2E+02' | val(Str,Number,Cod) | 1420 Cod=0 |
'14.5A+01' | val(Str,Number,Cod) | ? Cod=5 |
Функції для роботи з рядками.
Lenght(St) - обчислює поточну реальну довжину в символах рядка St.
Результат має цілий тип.
Copy(St,Poz,N) - копіює з St підрядок довжиною N символів,
починаючи з позиції Poz. Якщо Poz>Lenght(St), то результатом
буде проміжок; якщо Poz>255, то виникне помилка при виконанні.
Pos(St1,St2) - виявляє першу появу в рядку St2 рядка St1.
Результат має цілий тип і дорівнює номеру тієї позиції, де знаходиться перший
символ рядка St1. Якщо в St2 рядок St1 не знайдений,
результат дорівнює 0.
UpCase(Ch) - перетворює малу літеру в велику. Параметр і результат
мають літерний тип. Обробляються тільки літери латинського алфавіту.
Розглянемо тепер кілька задач, що потребують обробку рядкових величин.
Задача №377.
Умова: Нехай дано деякий текст. Обчислити, скільки разів повторюється
наперед заданий символ a.
Для розв'язання даної задачі, по-перше, необхідна рядкова величина для зберігання
тексту. Правда, відомо, що рядок не може мати довжину, більшу за 255 символів,
але мова програмування Паскаль дозволяє створювати масиви однотипних даних,
в тому числі і структурованих. Таким чином, можна зарезервувати масив рядків
для зберігання тексту достатньо великого об'єму. Для спрощення задачі будемо
вважати, що текст має довжину не більше 255 символів, тобто для його зберігання
достатньо одного рядка. Крім цього, нам необхідна змінна символьного типу
для зберігання заданого символу а, кількість яких ми будемо обчислювати.
Так як рядок фактично можна вважати масивом символьних величин, для його обробки
необхідно організувати цикл від першого до останнього символу рядка (length(St)),
що буде переглядати кожен елемент рядка та порівнювати його з шуканим символом.
У випадку співпадання елементів, що порівнюються, лічильник збільшується на
одиницю.
Програма, що реалізує описаний алгоритм, має наступний вигляд:
Program Example_377; Uses crt; Var i,count:word; {i - змінна циклу, count - кількість знайдених символів} a:char; {a - шуканий символ} St:string; {St - даний текст} Begin Clrscr; Write ('Введіть текст: '); Readln (St); Write ('Введіть шуканий символ: '); Readln(a); Count:=0; {Початкове значення лічильника} For i:=1 to length(St) do If St[i] = a Then count:=count+1; Writeln ('Шуканих символів в тексті ',count); Readkey; {Затримка зображення на екрані} End.
Задача №379.
Умова: Обчислити загальну кількість символів "+",
"-" та "*" у даному тексті.
Розв'язок цієї задачі нічим не відрізняється від попередньої, тільки розшукувати
тепер необхідно не один, а кілька символів.
Програма, що реалізує описаний алгоритм, має наступний вигляд:
Program Example_379; Uses crt; Var i,count:word; {i - змінна циклу, count - кількість знайдених символів} St:string; {St - даний текст} Begin Clrscr; Write ('Введіть текст: '); Readln(St); Count:=0; {Початкове значення лічильника} For i:=1 to length(St) do If (St[i] = "+") or (St[i] = "-") or (St[i] = "*") Then count:=count+1; Writeln ('Шуканих символів в тексті ',count); Readkey; {Затримка зображення на екрані} End.Задача №381.
Умова: У даному тексті замінити всі символи ":" на символи "-" і навпаки.
Для виконання заміни в тексті одного символу іншим необхідно знайдений символ (або групу символів) спочатку вилучити процедурою insert, а потім з тієї ж самою позиції вставити бажаний символ (або групу символів).
Зверніть увагу на те, що команди розгалуження повинні бути обов'язково вкладеними, тому що, якщо ми знайдемо символ ":" і виконаємо заміну, то на його місці з'явиться символ "-", який теж підлягає заміні . В результаті текст після закінчення роботи програми відтвориться у початковому вигляді.
Програма, що реалізує описаний алгоритм, має наступний вигляд:
Program Example_381; Uses crt; Var i:word; {i - змінна циклу} St:string; {St - даний текст} Begin Clrscr; Write ('Введіть текст: '); Readln(St); For i:=1 to length(St) do If St[i] = ':' Then Begin Delete (St,i,1); Insert ('-',St,1); End Else If St[i]='-' Then begin Delete (St,i,1); Insert (':',St,1); End; Writeln ('Результуючий рядок: '); Writeln (St); Readkey; {Затримка зображення на екрані} End.Задача №382.
Умова: У даному тексті замінити всі символи "." на послідовність символів "...". Якщо у тексті зустрічаються підряд три крапки, то залишати їх без змін.
Ця задача відрізняється від попередньої тим, що після виконання замін збільшується довжина рядка, причому після шуканого символу становиться такий самий. Тому, якщо цикл організувати так само, як і в попередньому випадку, весь текст, починаючи з першої крапки, заміниться на крапки (подумайте чому).
Пропоную в цій задачі скористатися циклом з передумовою, що дозволяє змінну циклу змінювати на будь-який крок (а не тільки на одиницю, як в циклі з параметром). Причому для оптимізації алгоритму не будемо вилучати знайдену крапку, а тільки допишемо ще дві, починаючи з позиції, що знаходиться після поточної.
Для того, щоб не виконувати заміну у випадку наявності трьох крапок в тексті, будемо перевіряти не тільки поточну, а й наступну за нею позицію (не забудьте при цьому про можливість виходу за межі рядка!!!). Останній символ рядка при цьому буде перевіряти окремо.
Зверніть увагу, що у випадку перебільшення довжини результуючого рядка 255 зайві символи будуть втрачатися. Для спрощення задачі ми їх не враховуємо, але для сильних учнів можна запропонувати організувати збереження цих символів у додатковому рядочку.
Програма, що реалізує описаний алгоритм, має наступний вигляд:
Program Example_382; Uses crt; Var i:word; {i - змінна циклу} St:string; {St - даний текст} Begin Clrscr; Write ('Введіть текст: '); Readln(St); i:=1; While i<length(St) do Begin If (St[i]='.') and (St[i+1]<>'.') Then Begin Insert ('..',St,i+1); i:=i+2; End; i:=i+1; End; If St[length(St)]='.' Then St:=St+'..'; Writeln ('Результуючий рядок: '); Writeln (St); Readkey; {Затримка зображення на екрані} End.
- Прочитати сторінки 120 - 123 запропонованого підручника;
- Задачі №378, №380, №385.
« попередня |
наступна » |