Оператори алгоритмічної мови Паскаль. Стандартні функції і оператори роботи з рядками
Оператори алгоритмічної мови Паскаль. Стандартні функції і оператори роботи з рядками
Житомирський Військовий Інститут Національного Авіаційного Уніврситету Реферат на тему:Оператори алгоритмічної мови Паскаль. Стандартні функції і оператори роботи з рядкамиЖитомир 2010План 1. Прості оператори 2. Структурні оператори 3. Символьні масиви 4. Визначення рядкового типу даних 5. Основні операції над рядковими даними 6. Стандартні засоби обробки рядків: процедури і функції 1. Прості оператори Оператори мови Паскаль - це синтаксичні конструкції, які призначені для запису алгоритму (перетворення даних, порядок виконання операцій) в стилі структурного програмування. Всі оператори повинні розділятись символом - ";". Оператори мови Паскаль умовно поділяють на дві групи: 1) прості оператори; 2) структурні оператори, які містять один або декілька операторів, або структурних операторів. Оператор присвоювання; Оператори звертання до процедури (функції); Оператор безумовного переходу. Оператор присвоювання призначений для обчислення нового значення змінної, а також для визначення значення функції, що повертається. Формат оператора: Оператор виконується так: обчислюється вираз (права частина) і отримане значення надається (присвоюється) ідентифікатору (змінній). При цьому тип виразу (тип даних та операції над ними) повинен бути сумісним з типом ідентифікатора (змінної), якому присвоюється результат обчислення. Наприклад: якщо var a, b, x: integer, то оператор присвоювання виконувати не можна. Треба так: var a, b : integer; x : real; Тоді буде вірно: . Приклади: var name: string; . . . name : = `Іванов`; var x, y: real; . . . x: = 5; y: = x + 2; Оператори звертання до процедури (функції) - призначені для активізації процедури (функції) та передачі їй заданих параметрів. Формат оператора: Розглянемо процедури введення та виведення даних, які можна викликати за допомогою операторів: read, readln, write, writeln. write (вираз), writeln (вираз) - оператори запису або виведення; read (список змінних), readln (список змінних) - читання або введення. Приклади виведення: x : = 1; writeln(1+x); writeln(x <=1); на екрані з'явиться: 2 true x: = 2; writeln(1, x, x*x, x*x >2); на екрані : 1 2 4 true Використання рядкових констант, наприклад: `x =', `12' і т.п. x : = 2; writeln(`x = `, x,'; y = `, x*x); На екрані: x = 2; y = 4. Можна указати розмір поля для виводу значень виразу. Якщо кількість символів менше, то виводяться пробіли, а якщо більше - то виводяться усі символи. x: =12; writeln(`x =', x : 4,'; y = `, x*x : 1); На екраніx =_ _ 12; y = 144 .Приклади введення.Як правило, для зручності перед оператором введення ставиться оператор виведення на екран запрошення:writeln (`Ввести два цілих числа:');readln (x1, x2);На екрані запрошення:Ввести два цілих числа:Приклад програми привітання.Program Privit;var name: string;beginwrite(`Введіть ваше ім`я');readln(name);writeln(`Привіт,', name);end.Оператор безумовного переходу.Мітка описується на початку програми (label 1, 2, lb1) і використовується в програмі наступним чином:Але використання цього оператора в програмі не бажане, бо порушується її структурна цілісність і читабельність. 2. Структурні оператори Структурні оператори містять один або декілька операторів. Вони поділяються на три види: 1. складений оператор; 2. умовні оператори; 3. оператори циклу. Складений оператор представляє собою послідовність операторів, які розділяються ";" і обмежуються службовими словами begin та end. Вони відіграють роль дужок обмеження - операторні дужки початку і кінця складеного оператора). BEGINоператор 1;……………оператор NEND.Складений оператор сприймається як єдине ціле.Умовні оператори - організовують вибір між альтернативними варіантами обчислень (операцій)Структура оператора: if <умова (вираз)> then <оператор1> else <оператор2> Семантика оператора: 1. обчислюється умова, тобто вираз після службового слова if (результат повинен мати логічний тип, булевий); 2. якщо результат умови - TRUE (істина) то виконується then <оператор1>; якщо результат умови FALSE - то виконується else <оператор2>. Оператори 1, 2 можуть бути будь-якого типу: умовні, складені, прості. Умова може бути операцією відношення або логічною. Операції відношення:= , <>, >, <, >=, <=. Логічні оператори: Not - заперечення; And - логічне "і"; Or - логічне "або"; Xor - "або", що виключає. Приклад: Вибір максимального із двох чисел: if x>y then max := xelse max := y!Особливість:! При використанні вкладених умовних операторів може виникнути синтаксична неоднозначність. Тому необхідно пам'ятати: службове слово else зв'язане з найближчим до нього словом if.Приклад: var a, b, c: integer; a:=1; b:=2; c:=3; d:=4; if a>b then if c<d then if c<0 then c:=0 else a:=b; На екрані виведеться {a = 1}. if a>b then if c<d then if c<0 then c:=0 else else else a:=b; На екрані виведеться {a = 2}. Оператор вибору: CASE. Він дозволяє вибрати одну з N можливих операцій. Синтаксична діаграма: Список альтернатив: Приклад: Program month(input, output); var mon: integer; begin writeln (`Введіть N місяця'); readln (mon); if mon < 1 or mon > 12 then writeln (`Нема такого місяця') else case mon of 1: writeln (`січень`); 2: writeln (`лютий`); . . . 12: writeln (`грудень`); end end. !Особливість:! значення селектора не може мати тип: real; string; частину else можна опускати. 3. Оператори циклу. Існують три різних оператора: 1. Оператор циклу з параметром For , To , Do (для , до , виконати ) Семантика: 1. Обчислюється вираз < пз > 2. Присвоювання < пц > : = < пз > 3. Перевірка умови < пц > <= (=>) < кз > , якщо не виконується , то for закінчує роботу ; 4. Виконання < оператора >; 5. Змінна < пц > на + 1 (to) або - 1 (down to) Приклад: програма введення вільного цілого числа N та обчислення суми цілих чисел від 1 до N. Program summaInteger; var i, n, s: integer; begin write ( ` n = ` ); readln ( n ); { ввести n } S: = 0; { початкове значення суми } for i: = 1 to n do s : = s + i; writeln (`Сума дорівнює ', S) end. . . . . . . S:=0 if n >=1 then for:=1 to n do s:= s+i else for i:= -1 down to n do s:= s+i 2.Оператор циклу з передумовою. {поки (виконується), робити } < умова>- вираз логічного типу; якщо результат умови - TRUE, то виконується оператор, після чого знову перевірка умови. Якщо - FALSE , оператор WHILE закінчує свою роботу. Приклад: обчислити суму перших 25 цілих чисел. Program summa; var sum, n: integer; begin sum:=0; n:=1; while n<26 do begin sum:= sum+ n; n:=n+1; end; writeln (`Сума перших 25 цілих чисел', sum) end. 3.Оператор циклу з постумовою. Семантика: 1.Виконується оператор циклу; 2.Перевірка умови: - якщо false => наступне виконання оператора; - якщо true => оператор циклу не виконується. Приклад (для попереднього прикладу): repeat sum:=sum+n; n:=n+1 until n>=26 3. Символьні масиви Символьний тип даних дозволяє працювати з окремими символами тексту. Для обробки більшої кількості текстових одиниць використовують символьні масиви або рядкові типи даних. Розглянемо одномірні масиви, які складаються з елементів символьного типу (char). Наприклад: var S : array [ 1..12] of char; Паскаль містить деякі додаткові засоби роботи з такими масивами: Конкретні значення символьних масивів записують за допомогою зображення рядка та використання їх в присвоюванні та передачі параметрів: S := `Приклад рядка'; Зображення рядка будується з символів масиву і обмежується апострофами. Якщо необхідно задати апостроф, то його подвоюють {` " '}. Допускають формування рядків з використанням десяткових кодів символів і спеціальних позначень: ( #7#17C^A^B…) Для символьних масивів допускають операцію "+" - конкатенації (зчеплення, поєднання). Смисл операції полягає у формуванні нового символьного масиву, кількість елементів якого дорівнює сумі розмірів масивів - операндів, а значення елементів - елементи масивів, які розміщюються послідовно один за одним. Приклад: var S1 : array [1..8] of char; S2 : array [1..5] of char; begin S1 := 'рядковий'; S2 := 'масив'; writeln (S1+' '+S2); {результат на екрані: Рядковий масив} end. !Особливість:! 1. в операторах присвоювання рядків символьним масивам необхідна точна відповідність довжини рядків і розмірів масивів; 2. операція конкатенації для символьних масивів не допускається у правій частині присвоювання. Наприклад: S := S1+' '+S2; {помилка} У таких випадках необхідно використовувати рядки, тобто рядкові типи даних. 4. Визначення рядкового типу даних Рядкові типи даних є одним з розширень мови Паскаль, які найбільш використовуються. Рядковий тип узагальнює поняття символьних масивів, дозволяє динамічно змінювати довжину рядка. При використанні у виразах рядок обмежується апострофами. Кількість символів в рядку (довжина рядка) може динамічно змінюватись від 0 до 255. Для визначення рядкових даних використовується ідентифікатор STRING, за яким у квадратних дужках вказується максимальна довжина рядка. Якщо значення не вказане, то по замовченню довжина рядка встановлюється 255 байт. Приклад: Line : string [80]; Line1 : string ; Line2 : string [255]. В приведеному прикладі змінна Line може мати будь-яку послідовність символів (кожен з яких має стандартний тип char) довільної довжини в межах від 0 до 80 символів; Line1 і Line2 - від 0 до 255 символів. Таким чином, важливіша різниця між рядками і символьними масивами, що рядки можуть динамічно змінювати свою довжину. Змінну рядкового типу визначають у розділі опису типів, або безпосередньо у розділі опису змінних. Рядкові дані також можна використовувати у програмі як константу. Формат: 1. type <ім'я типа > = string [max довжина рядка]; var < ідентифікатор > : <ім'я типа >; Або 2. var < ідентифікатор > : string [max довжина рядка]; Приклад: const address = `пл. Соборна, 1'; type line = string [125]; var S1 : Line; S2 : string; S3 : string [50]; Механізм динамічних рядків реалізований в мові Турбо-Паскаль достатньо просто. Для рядкових змінних пам'ять виділяється відповідно максимального значення, а використовується лише частина, яка реально зайнята символами рядка у даний час, тобто для N символів виділяється N+1 байт пам'яті, із яких N байт призначено для зберігання символів рядка, а 1 байт - для значення поточної довжини цього рядка: Елементи рядка нумеруються цілими числами, починаючи з 1. Це іноді використовують для визначення поточної довжини рядка, наприклад: line := ` '; {пустий рядок} writeln (ORD (line [0] )); {на екрані число 0} line : =`ABCD'; writeln (ORD (line [0] )); {на екрані число 4} Однак, для визначення поточної довжини рядка, як правило, використовують стандартну функцію length, яке повертає ціле значення поточної довжини рядка. Але це ми розглянемо далі. У разі присвоювання рядковій змінній виразу з довжиною більше ніж максимально допустимо для даної змінної, то символи за межами максимальної довжини не використовуються (вилучаються). Ця ситуація не є помилковою, тому переривання виконання програми у даному випадку не відбувається. Наприклад: var line : string [4]; begin line := `дуже довгий рядок'; {на екрані: дуже} writeln (line); end. Таким чином рядки можуть динамічно змінювати свою довжину. 5. Основні операції над рядковими даними Над рядковими даними виконують такі операції: 1. присвоювання (:=); 2. введення (Read); 3. виведення (Write); 4. поєднання (зчеплення, конкатенації - „+"); 5. порівняння (відношення). Перші три операції виконуються стандартно, без особливостей. Тому розглянемо дві останні операції. Операція конкатенації. Використовується для зчеплення декількох рядків в один, причому довжина результуючого рядка не повинна перевищувати 255 символів (або вказану довжину N). Інакше останні символи будуть відкинуті. Приклади: st := `a'+'b'; st := st + `c'; writeln (`st = `, st) {результат st =abc} var st : string [2]; begin st :='1' + `2' + `3'; writeln (st) {на екрані 12} end. Операція порівняння (відношення). Проводить порівняння двох рядкових операндів за допомогою стандартних операторів: = , <>, >, <, >=, <=. Правила порівняння: 1. Порівняння проводиться зліва-направо з урахуванням внутрішнього кодування символів таблиці ASCII. Рядок буде більшим, якщо перший не співпадаючий символ має більший номер. 2. У менший по довжині рядок додаються символи значення CHR(0). Тому при однакових, символах короткий рядок завжди менше довгого рядка. Результат виконання операції завжди має логічний тип і приймає значення TRUE або FALSE. Приклади: 1) ` " ` < `.' TRUE 2) `A' > `1' TRUE 3) `AB' = `A' FALSE 4) `ABC' > `AB' TRUE 5) `12' <'2' TRUE 6. Стандартні засоби обробки рядків: процедури і функції Функції: 1. CONCAT(S1,S2,…,SN) - функція типу STRING. Виконує послідовне поєднання рядків S1,S2,…,SN , кожен з яких є вираз рядкового типу (STRING). Результатом є рядок не більше 255 символів. Дана функція еквівалентна операції конкатенації: `S1' + `S2' + `S3'… 2. COPY(st : STRING; index : INTEGER; count : INTEGER): STRING або COPY (st, index, count). Функція копіює (повертає) частину рядка, виділеного з рядка st, довжиною count символів, починаючи з символу під номером index. 3. LENGTH(st : STRING) функція типу INTEGER повертає довжину рядка. 4. POS(subst, st : STRING): BYTE. Функція шукає у рядку st рядок subst. Результатом є номер позиції, де рядок subst зустрічається перший раз. Якщо рядок subst не знайдено, то результатом буде 0 (нуль). 5. UPCASE(ch) - функція типу CHAR. Повертає для символьного виразу ch, яке повинно представляти собою рядкову (маленьку) латинську букву, відповідно їй велику букву. Якщо значенням функції ch є будь-який інший символ (в тому числі рядкова буква російського алфавіту), функція повертає його без змін. Процедури: 1. DELETE(st : STRING; index, count : INTEGER) або DELETE(st, index, count) - процедура вилучає (знищує) count символів у рядку st починаючи з символу під номером index. 2. INSERT(subst: STRING; st: STRING; index: INTEGER) або INSERT(subst, st, index). - процедура вставляє рядок subst у рядок st, починаючи з символу під номером index. 3. STR(X [:width[:decimals]]; st: STRING) - процедура перетворює число Х (real або integer) в рядок символів st так, як це робить це робить процедура WRITELN перед виводом. Параметри width і decimals (якщо вони присутні, тобто дужки [ ] показують на необов'язковість цих параметрів) задають формат перетворення: загальну ширину поля для представлення числа Х (width) та кількість символів дрібної частини (decimals), якщо X : REAL. 4. VAL(st, x, code) - процедура перетворює рядок символів st в значення числової змінної X (визначеного типу). Параметр code = 0, якщо перетворення пройшло успішно, тоді X дорівнює результату перетворення. Якщо виявляється помилковий символ у рядку st, то значення Х не змінюється, а code дорівнює номеру позиції з помилковим символом. !Особливість!: Недопустимими є пропуски (пробіли) праворуч числа у рядку st! val (`123_ _', x, k) {помилка, x - не змінюється, k=4 }; val (`_ _123', x, k) {вірно, x=123, k=0 }; Приклади: var x : real; y : integer; st, st1 : string; begin st := concat (`12', `345'); {рядок st містить 12345} st1 := copy (st, 3, Length(st)-2); {st1 містить 345} insert(`-' , st1, 2); {рядок st1 містить 3-45} delete(st, pos(`2', st), 3); {рядок st містить 15} str(pi : 6 : 2, st ); {рядок st містить 3,14} val (`3.1415', x, y); {y містить 2, х без змін} end. Висновок: таким чином над рядками можна виконувати операції присвоювання, порівняння, з'єднання (конкатенації), введення та виведення. Для цього використовують широкий набір процедур та функцій.
|