Використання підпрограм та функцій користувача при роботі з масивами

Вступ


Головним інструментом при застосуванні електронно обчислювальних машин є програми, на які покладено завдання вирішення прикладних проблем. Засобом створення як невеликих програм користувача, так і потужних пакетів прикладних програм є спеціалізовані середовища для написання, редагування, компіляції, виконання, та відлагодження програм. Такі інтегровані середовища розробки та проектування (IDE - Integrated Design Environment) зазвичай орієнтуються на певну мову програмування. Серед оболонок для створення програмного коду мовою Паскаль вирізняється середовище Борланд-паскаля від корпорації Borland International, Inc. Воно є не просто швидким компілятором Паскаля, а і ефективним компілятором мови програмування Паскаль із інтегрованим інтерактивним середовищем для розробки програм, яке легко опанувати і зручно використовувати у роботі. При роботі з Борланд-паскалем немає необхідності використовувати окремий редактор, компілятор і редактор зв'язків (компонувальник) для створення і виконання програм на Паскалі (хоча можна використовувати і варіант компілятора з командними рядками). Всі ці програмні засоби вбудовані в середовище, і до всіх з них є швидкий та зручний доступ.

Застосування мови програмування базується на використанні змінних, значень та операторів. Для різних потреб застосовують різноманітні типи даних: цілочисельні, рядкові, дійснозначні, файлові, вказівникові, обєктні тощо. Нерідко виникає потреба оперувати не з окремими змінними, а із їхніми наборами (колекціями, масивами). У такому випадку декілька значень обєднують у одну змінну. Якщо ці значення одного типу і для їх нумерації в рамках змінної використовують цілочисельний індекс, то отримуємо масив. Для одного індекса маємо одновимірний масив, якщо індексів декілька - то багатовимірний, котрий можна трактувати як одновимірний масив, елементами якого є масиви. Специфіка масивів вимагає дотримуватись певних правил при роботі із ними. Наприклад, не можна присвоїти значення масиву за допомогою одного оператора присвоєння, значення потрібно присвоювати покомпонентно.

Для спрощення структури програми та зменшення її коду принципи структурного програмування вимагають виділяти фрагменти коду, що повторюються, у процедури та функції для їх повторного використання.

У даній курсовій роботі розглянуто використання підпрограм та функцій користувача при роботі з масивами.


1. Масиви


.1 Опис типу


Масив (array) - це скінченний набір елементів одного (базового) типу, які зберігаються в послідовно розташованих комірках оперативної памяті і мають спільну назву.

У математиці поняттю масив відповідають поняття вектор та матриці. Розрізняють одновимірні та багатовимірні масиви. Двовимірний масив даних- це таблиця, що складається з декількох рядків. Можна розглядати також масиви вищої розмірності - тривимірні, чотиривимірні тощо. Зазначимо, що зростання розмірності масиву приводить до швидкого (експоненційного) зростання оперативної памяті, потрібної для зберігання цього масиву.

Загальний вигляд конструкції опису типу масиву такий:

[<розмір>] of <назва базового типу> ;


Масиви містять фіксоване число елементів одного типу, так званого типу елемента.

Для нумерації елементів масиву використовують індексний тип. При заданні індексних типів, окремо для кожної розмірності масиву указується число елементів. Допустимими індексними типами являются всі порядкові типи, за винятком довгого цілого і піддіапазонів довгого цілого. У паскалі є десять попередньо означених порядкових типів (Shortint, Integer, Longint, Byte, Word, Boolean, WordBool, LongBool, ByteBool, Char). Масив може бути проиндексованим по кожної розмірності всіма значеннями відповідного індексного типу; тому кількість елементів дорівнює числу значень у кожному индексному типі. Число размірностей не обмежено (проте є обмеження на максимальний розмір усієї структури масиву).

Наведемо приклад типу масив:

[1..100] of Real


Якщо тип елемента в типі масив також є масивом, то результат можна розглядати як масив масивів або як один багатовимірний масив. Наприклад

[boolean] of array[1..100] of array[Size] of Real


інтерпретується компілятором точно так, як і масив:

[boolean,1..10,Size] of Real


Крім того, можна записати вираз:


расked array[1..10] of расked array[1..8] of Boolean

як

расked array[1..10,1..8] of Boolean


Для доступу до елементів масиву необхідно вказати ідентификатор масиву з одним або декількома індексами в дужках.

Тип масив, вигляд, що має:


расked array[M..N] Char


де M менше N, називається упакованим рядковим типом (зарезервоване слово packed може бути префіксом опису масиву. Проте, це не має ніякого ефекту в Borland/Turbo Pascal, оскільки тут пакування відбувається автоматично). Упакований рядковий тип має деякі властивості, не характерні для інших типів масив.

Масив вигляду:

[0..X] of Char


де X - позитивне ціле число, називають масивом з нульовою базою. Масиви з нульовою базою використовуються для зберігання рядків з завершальним нулем, і коли дозволений розширений синтаксис (за директиви компілятора {$X+}), символьний масив з нульовою базою сумісний із значенням типу PChar.

Параметр, описаний за допомогою синтаксису array T, називається відкритим рядковим параметром. Відкриті рядкові параметри дозволяють передавати одній і тій же процедурі або функції рядкові змінні розміру, що змінюється.

Розмір (кількість елементів) масиву найчастіше задають у вигляді діапазону або назви деякого перерахованого типу даних. Ця кількість фіксується при описі і в процесі виконання програми не міняється.

Описати масив можна у розділі опису типів type, у розділі констант const, або у розділі оголошення змінних var. Назви типів масивів і змінних-масивів придумує користувач відповідно до визначених правил.

Доступ до кожного окремого елемента здійснюється шляхом індексації елементів масиву. Індекси масиву тотожні поняттю індексів елемента вектора у математиці.

Приклади опису масиву:

) опис типу масивів (назва типу mymasyv),

) оголошення сталого масиву (масиву-константи) vydatky типу mymasyv

) оголошення змінних-масивів а, а1 типу mymasyv та масивів: b (він має 7 елементів цілого типу), с (має 100 елементів символів, тобто даних типу char).

type= array [ 1.. 10] of real;= (mon, tue, wed, the, fri, sat, sun);vydatky: mymasyv =(1.2, 1, 1, 2, 18, 2.4, 8.97, 3, 7, 1.3);a,al: mymasyv;: array[day] of integer;: array [1..100] of char;


.2 Дії над масивами


Для роботи з масивом як єдиним цілим використовується ідентифікатор масиву без вказівки індексу в квадратних дужках. Масив може брати участь тільки в операціях відношення "рівно", "не рівно", та в операторі присвоєння. Масиви, що беруть участь в цих діях, повинні бути ідентичні по структурі, тобто мати однакові типи індексів і однакові типи компонентів. Наприклад, якщо масиви А і В описані, як Var А, В : array[1. .20] of real; то застосування до них допустимих операцій дасть наступний результат


вираз результат

А = В True, якщо значення кожного елементу масиву А рівне відповідному значенню елемента масиву В.

А <> В True, якщо хоч би одне значення елементу масиву А не рівне значенню відповідному елементу масиву В.

А := В Всі значення елементів масиву В прирівнюються відповідним елементам масиву А. Значення елементів масиву В залишаються незмінними.


1.3 Дії над елементами масиву


Після оголошення масиву кожен його елемент можна обробити, вказавши ідентифікатор (ім'я) масиву і індекс елементу в квадратних дужках. Наприклад, запис Mas[2], vektorZ[10] дозволяє звернутися до другого елементу масиву Mas і десятого елементу масиву vectorZ. При роботі з двовимірним масивом вказуються два індекси, з n-мірним масивом - n індексів. Наприклад, запис MATRU[4,4] робить доступним для обробки значення елементу, що знаходиться в четвертому рядку четвертого стовпця масиву MATRU.

Індексовані елементи масиву називаються індексованими змінними і можуть бути використані так само, як і прості змінні. Наприклад, вони можуть знаходитися у виразах як операнди, використовуватися в операторах for, while, repeat, входити як параметри до операторів read, readln, write, writeln; їм можна присвоювати будь-які значення, відповідні їх типу.

Розглянемо типові ситуації, що виникають при роботі з даними типу array. Для цього опишемо три масиви і чотири допоміжні змінні:

A, D : array [1..4] of real;: array[1..10,1..15] of integer;, J : integer;: integer;: real;


Ініціалізація масиву полягає в приcвоєнні кожному елементу масиву одного і того ж значення, відповідного базовому типу, найефективніше ця операція виконується за допомогою оператора for:

I := 1 to 4 do A[I]:= 0;

Для ініціалізації двомірного масиву зазвичай використовується вкладений оператор for:

I := 1 to 10 doJ := 1 to 15 do B[I, J] := 0;


Мова Паскаль не має засобів введення-виведення елементів масиву відразу, тому введення і виведення значень проводиться по-елементно.

Значення елементам масиву можна присвоїти за допомогою оператора присвоєння, як показано в прикладі ініціалізації, проте найчастіше вони вводяться з екрану за допомогою оператора read або readln з використанням оператора організації циклу for:

І:=1 to 4 do readln (A[I]);


Значення двомірного масиву вводяться за допомогою вкладеного оператора for:

I := 1 to 10 doJ := 1 to 15 do readln (B[I, J]);


Аналогічним чином здійснюються вивід значень елементів масиву.

Копіювання масивів називається присвоєнням значення всіх елементів одного масиву всім відповідним елементам другого масиву (аналог операції присвоєння масиву).

Інколи необхідно здійснювати пошук в масиві деяких елементів, що задовільняють певні умови.

Наприклад треба зясувати скільки елементів масиву А мають нульове значення:

K:=0;I:=1 to 4 doA[I]=0 then K:=K+1;


Перестановка значень елементів масиву відбувається за допомогою змінної того ж типу, що і базовий тип масиву. Наприклад треба поміняти значення першого та пятого елементів масиву A:

:=A[5];[5]:=A[1];[1]:=Vs;


Елементи масиву можуть виступати фактичними параметрами при звертанні до процедур та функцій.


2. Ідентифікатори


Ідентифікатори виступають як імена констант, типів змінних, процедур, модулів, програм і полів в записах.

Ідентифікатор може мати будь-яку довжину, проте тільки перші його 63 символи є значущими. Ідентифікатор повинен починатися з букви і не може містити пропусків. Після першого символу ідентифікатора можна використовувати букви, цифри і символи підкреслення (значення ASCII $5F). Як і в зарезервованих словах, в ідентифікаторах можна використовувати як рядкові, так і прописні букви (компілятор їх не розрізняє).

Коли є декілька місць з вказівкою одного і того ж ідентифікатора, для завдання потрібного ідентифікатора необхідно уточнити цей ідентифікатор за допомогою ідентифікатора модуля. Наприклад, для уточнення ідентифікатора Ident за допомогою идентификатора модуля UnitName слід записати UnitNamt.Ident. Такий комбінований ідентифікатор називається уточненим ідентифікатором.

Вбудований асемблер дозволяє у виразах асемблера отримати доступ до всіх ідентифікаторів Паскаля, включаючи мітки, константи, типи, змінні, процедури і функції.

Крім того, в вбудованому асемблері реалізовані наступні спеціальні ідентифікатори:


Ідентифікатори Code і Data представляють поточні сегменти коду і даних відповідно. Їх слід використовувати тільки в поєднанні з операцією SEG:

asmах,SEG Datads,ax;


Ідентифікатор Result в операторній частині функції змінну-результат функції. Наприклад, у функції:

Sum(X, У: Integer): Integer;:= X + У;;


в операторі, що привласнює результат функції змінної Sum, можна було б при записі на вбудованому асемблері використовувати змінну Result:

Sum(X, У: Integer): Integer;ах,Xах, УResult,ax;;


У виразах вбудованого асемблера не можна використовувати наступні ідентифікатори:

стандартні процедури і функції (наприклад, Writeln, Chr);

спеціальні масиви Mem, MemW, MemL, Port, PortW;

- рядки, значення з плаваючою крапкою і константи множинного типу;

- мітки, які не описані в поточному блоці;

ідентифікатор Result поза функцією.

Локальні змінні (змінні, описані в процедурах і функціях) завжди розподіляються в стеку і доступні відносно SS:BP, а значення ідентифікатора локальної змінної представляє собою її зсув із знаком від SS:BP. Асемблер автоматично додає [BP] до посилань на локальні змінні. Наприклад, з обліком описів:

Test;: Integer;


інструкції:

ах,Count;


асемблюються в MOV АХ,[BP-2].


Вбудований асемблер завжди інтерпретує параметр-змінну, як 32 розрядний покажчик, а розмір параметра-змінної завжди рівний 4 (розміру 32 розрядного покажчика). В Паскалі синтаксис для доступу до параметра змінній і до значення параметра однаковий. У разі вбудованого асемблера це не так. Тому для доступу до вмісту параметра-змінної вам спочатку доведеться завантажити 32-розрядний покажчик, а потім звернутися до осередку, на яку він указує.

Наприклад, якщо X і У - параметри-змінні приведеної вище функції Sum, то вона може виглядати наступною чином:

function Sum(var X, У: Integer): Integer;bx,Xах,es:[bx]bx,Yах,es:[bx]Result,ax;;


Деякі ідентифікатори, такі, як змінні типу запис мають область дії, що дозволяє поводитися до них з допомогою операції вибору елементи структури-крапки (.).

Наприклад, з обліком описів:

= record, У: Integer;;= record

А, B: Point;;: Point;: Rect;


для доступу до полів в змінних P і R можна використовувати наступны конструкції:

asmах,P.Xdx,P.Ycx,R.A.Xbx,R.B.Y;


Для безпосередньої побудови змінної можна використовувати ідентифікатор типу. Кожна з приведених нижче інструкцій генерує один і той же машинний код, що завантажує в АХ ES:[DI+4]:

ах,(Rect PTR es:[di]).B.Xах,Rect(es:[di].B.Xах,es:Rect[di].B.Xах,Rect[es:di].B.Xах,es:[di].Rect.B.X;


Область дії задається типів, полем і ідентифікатором перемінної типу запису або об'єктного типу. Крім того, идентификатора модуля відкриває область дії конкретного модуля (як повністю уточнень ідентифікатор в Паскалі).


3. Підпрограми


Підпрограми призначені для реалізації алгоритмів опрацювання окремих частин деякої складної задачі. Вони дають змогу реалізовувати концепцію структурного програмування, суть якого полягає в розкладанні складної задачі на послідовність простих підзадач і в складанні для алгоритмів розв'язування кожної підзадачі відповідних підпрограм. Розрізняють два види підпрограм - підпрограми-процедури та підпрограми-функції. Підпрограми поділяються на стандартні та підпрограми користувача. Стандартні підпрограми створювати не потрібно - вони містяться у стандартних модулях System, Crt, Dos, Graph тощо. Підпрограма користувача - це пойменована група команд, яку створюють і описують в основній програмі в розділах procedure або function і до якої звертаються з будь-якого місця програми потрібну кількість разів.Паскалі є два типи підпрограм: процедури і функції. Основна відмінність між ними полягає в тому, що функція повертає значення і може використовуватися у виразах, наприклад:

:= Sin(A);


тоді як процедура викликається для виконання однієї або більше задач:

(Це провірка);


Опис процедур та функцій займає визначене місце у структурі програми, тому, перш ніж знайомитися з процедурами і функциями, необхідно розглянути структуру програми на Паскалі.


4. Структура програми

стандартному Паскалі програми мають строгий формат:

Ім'я-програми

мітки;

опис констант;

визначення типів даних;

описи змінних;і functions;


основне тіло програми.


З п'яти секцій опису - label, const, type, var і procedures і functions - не всі повинні бути присутній в кожній програмі. Проте, в стандартному Паскалі, якщо вони присутні, то вони повинні слідувати у вказаному порядку і кожна секція повинна з'являтися тільки один раз. За секцією описи можуть слідувати процедури і функції, і тільки тоді - основне тіло програми, що складається з деякого числа операторів.уpбo-паскаль забезпечує значно більш гнучку структуру програми. Bce, що вимагається, - це, щоб оператор program (якщо такий є) був першим, а основне тіло програми - останнім. Між ними можна мати скільки завгодно багато секцій опису, у будь-якому порядку і як завгодно змішаними з процедурами і функціями. Ho перш, ніж що-небудь використовувати, це повинне бути визначено, інакше на етапі компіляції з'явиться повідомлення про помилку.


5. Процедури і функції


Як згадувалося раніше, процедури і функції, відомі як підпрограми, можуть з'явитися в будь-якому місці до основного тіла програми.

Процедури і функції дозволяють включати в основній програмний блок додаткові блоки. Кожний опис процедури або функції містить заголовок, за яким слідує програмний блок. Процедура активізується за допомогою оператора процедури. Функція активізується при обчисленні виразу що містить виклик функції і що повертається функцією значення підставляється в цей вираз. Для процедур використовується наступний формат:

ім'я-процедури(параметри);

мітки;

описи констант;

визначення типів даних;

описи змінних;і functions;


основне тіло процедури;.


.1 Описи процедур


Опис процедури дозволяє зв'язати ідентифікатор з процедурним блоком. Процедуру можна потім активізувати з допомогою оператора процедури. B заголовку процедури вказується ім'я процедури і описується список формальних параметрів (якщо він присутній):

Запуск процедури здійснюється за допомогою оператора процедури, в якому містяться ім'я процедури і необхідні параметри. Оператори, які повинні виконуватися при запуску процедури, містяться в операторній частині модуля процедури. Якщо в що міститься в процедурі операторі усередині модуля процедури використовується ідентифікатор процедури, то процедура виконуватиметься рекурсивно (буде при виконанні звертатися сама до себе).

Наведемо приклад опису процедури:

NumString(N: integer; var S: string);: integer;:= Abs(N);:= '';:= Chr(N mod 10 + Ord('0'))+ S;:= N div 10;N = 0;N < 0 then S := '-' + S;;

описі процедури перед блоком операторів може вказується директива переривання (interrupt). Процедура в цьому випадку розглядається, як процедура переривання. Повний опис процедур переривання приводиться у спеціальній та довідковій літературі по паскалю. B даний момент відзначимо що процедури обробки переривання не можна викликати з допомогою операторів процедури, і що в кожній з них задається список параметрів, який обов'язково повинен мати наступний вигляд:

MyInt( Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP): word); interrupt;


Замість блоку операторів в описі процедури або функції можна записати випереджаючий опис (опис forward), зовнішній опис (опис external) або внутрішній опис (опис inline).

Приклад програми

Нижче приводиться варіант програми DORATIO.PAS, в якому використовується процедура для отримання двох значень і функція для обчислення коефіцієнта:

DoRatio;,B : integer;: real;

GetData(var X,Y : integer);('Введіть два числа: ');(X,Y);

GetRatio(I,J : integer): real;:= I/J;

(A,B);:= GetRatio(A,B);(' Відношення рівне ',Ratio).


Ця програма, звичайно, не є чимось особливим, оскільки вона має більший розмір і повільніше виконується, ніж аналогічна програма без викликів функцій, проте вона ілюструє використання процедур та функцій.

При компіляції і запуску програми першим в тілі програми виконується оператор GetData(A,B). Цей тип оператора називається викликом процедури. При обробці цього виклику програма виконує оператори в GetData, замінюючи X і У (формальні параметри) на А і B (фактичні параметри). Ключове слово var перед X і У в операторі виклику процедури GetData вказує, що фактичні параметри повинні бути змінними і що значення змінних можуть бути змінені і передані назад програмі, що їх викликала. Тому процедурі GetData не можна передавати, константи, вирази і так далі. При завершенні виконання GetData управління передається в основне тіло програми оператору, наступному за викликом GetData.

Цим наступним оператором є виклик функції GetRatio. Відзначимо тут деякі важливі відмінності. По-перше, GetRatio повертає значення, яке потім повинне бути де-небудь використано; в даному випадку це значення присвоюється Ratio. Пo-друге, в основному тілі функції значення привласнюється GetRatio. Taким чином функція визначає яке значення слід повернути. По-третє, перед формальними параметрами I і J тут відсутнє ключове слово var. Це означає, що фактичні параметри можуть бути довільними цілочисельними виразами, наприклад, Ratio:= GetRatio(A+B,300), і що навіть якщо значення формальних параметрів в тілі функції буде змінено, нові значення не будуть передані назад програмі. Це, до речі, не є відмінністю між процедурами і функціями; можна використовувати обидва типи параметрів із будь-яким видом підпpoгpaм.

Функції мають такий же формат, що і процедури за виключенням того, що вони починаються із заголовка function і закінчуються типом даних для значення функції, що повертається:

імя функції (параметри): тип даних;


Як бачимо, тут є тільки дві відмінності від структури звичайної програми: процедури і функції починаються із заголовка procedure або function, а не із заголовка program і закінчуються не крапкою, а крапкою з комою. Процедури і функції можуть мати свої власні константи, типи даних змінні і навіть власні процедури і функції. Але всі ці елементи можуть використовуватися тільки в тих процедурах і функціях, в яких вони визначені.


.2 Описи функцій


Опис функції визначає частину програми, в якій обчислюються і повертається значення.заголовку функції визначається ідентифікатор функції формальні параметри (якщо вони є) і тип результату функції.

Функція активізується при виклику функції. При виклику функції указується ідентифікатор функції і які-небудь параметри, необхідні для обчислення функції. Виклик функції мoже включатися у вирази як операнд. Коли вираз обчислюється, функція виконується і значенням операнда стає значення, що повертається функцією.операторній частині блоку функції задаються оператори, які повинні виконуватися при активізації функції. B модулі повинен міститися принаймні один оператор присвоєння, в якому ідентифікатору функції привласнюється значення. Результатом функції є останнє привласнене значення. Якщо такий оператор привласнення відсутній або він не був виконаний, те значення, що повертається функцією, невизначено.

Якщо ідентифікатор функції використовується при виклику функції усередині модуля-функції, то функція виконується рекуpсивно.

Наведемо далі приклади описів функції:

Max(а: Vector; n: integer): extended;: extended;: integer;:= а(1);i := 2 to n do if x < а[i] then x := а[i];:= x;;

таPower(x: extended; у: integer): extended;: extended;: integer;:= 1.0; i := у;i > 0 doOdd(i) then z := z*x;:= Sqr(x);;:= z;;


Аналогічно до процедур, функції можуть описуватися, як випереджаючі, зовнішні або внутрішні. Проте функції переривань не допускаються.

Параметриописі процедури або функції задається список формальниx параметрів. Кожний параметр, описаний в списку формальниx параметрів, є локальним по відношенню до описуваної процедурі або функції і в модулі, пов'язаним з даною процедурою або функцією на нього можна посилатися за допомогою його ідeнтификaтopа.

Існує три типи параметрів: значення, змінна і нетипізoвaнa змінна.

Вони характеризуються наступним:

. Група параметрів, перед якими відсутнє ключове слово var і за якими слідує тип, є списком параметрів-значень.

. Група параметрів, перед якими слідує ключове слово var і за якими слідує тип, є списком параметрів-змінних.

. Група параметрів, перед якими стоїть ключове слово var і за якими не слідує тип, є списком нетипізoвaниx параметрів-змінних.

оператор масив паскаль алгоритм

6. Модулі


Програма Borland Pascal може використовувати блоки коду в програмних модулях. Модуль (unit) можна розглядати як міні-программу, яку може використовувати ваша прикладна программа. Як і програма, він має заголовок (який називається заголовком модуля) і основний блок, обмежений begin і end.

Основний блок будь-якої програми Borland Pascal може включати в себе рядок, що дозволяє програмі використовувати один або більш модулів. Наприклад, якщо ви пишете програму DOS з ім'ям Colors і хочете змінювати кольори що виводиться на екран тексту, то ваша програма може використовувати стандартний модуль Crt, що є частиною бібліотеки виконуючої системи Borland Pascal:

Colors;Crt;.


Рядок uses Crt повідомляє Borland Pascal, що потрібно включити модуль Crt у виконувану програму. Крім всього іншого, модуль Crt містить весь необхідний код для зміни кольору у вашій програмі. Шляхом простого включення uses Crt ваша програма може використовувати весь код, що міститься в модулі Crt. Тому оператор uses називають також оператором використовування. Якби ви помістили весь код, необхідний для реалізації функціональних можливостей Crt, в свою програму, це зажадало б величезні зусиль і відвернуло б вас від основної мети програми.

Бібліотеки виконуючої системи Borland Pascal включають в себе декілька модулів, які ви знайдете вельми корисними. Наприклад, завдяки використовуванню модулів Dos або WinDos, ваша програма може отримати доступ до декількох підпрограм операційної системи і підпрограмам роботи з файлами.

Ви можете також писати свої власні модулі. Застосовуйте їх для розділення великих програм на логічні зв'язані фрагменти. Програмний код, який ви поміщаєте в модуль, може використовуватися будь-якою програмою. Результатом компіляції модуля є не файл із розширенням exe, а файл із розширенням tpu. Вам потрібно написати початковий код тільки один раз, а потім ви зможете багато раз його використовувати.


.1 Модуль Crt


Модуль Crt реалізує ряд могутніх програм, що надають вам повну можливість управління засобами комп'ютера ПК, такими, як управління режимом екрану, розширені коди клавіатури, кольори, вікна, звукові сигнали. Модуль Crt може використовуватися тільки в програмах, що працюють на персональних комп'ютерах IBM РС, РС AT, РS/2 фірми IBM і повністю сумісних з ними.

Однією з основних переваг використовування модуля Crt является велика швидкість і гнучкість при виконанні операцій роботи з екраном. Програми, що не працюють з модулем Crt, виводять на екран інформацію за допомогою засобів операційної системи DOS, що зв'язано з додатковими непродуктивними витратами. При використанні модуля Crt інформація, що виводиться, посилається безпосередньо в базову систему уведення-виведення, або, для ще більш швидких операцій, безпосередньо у відеопамять.


.2 Модуль Strings


Модуль Strings забезпечує обробку нових рядків, що закінчуються порожнім символом (символ номер 0). Рядки, стандартні для Паскаля обробляються модулем System.


.3 Модуль Graph


Модуль Graph забезпечує доступ до низки швидких і потужних графічних підпрограм. Він реалізує незалежний від пристроїв графічний драйвер Borland, що підтримує графіку CGA, EGA, VGA, Hercules AT&T 400, MCGA, 3270PC і 8514. Модуль Graph не вбудований в TURBO.TPL, він знаходиться на тому ж диску, що і файли .BGI (графічний інтерфейс Borland) і .CHR (шрифти).


7. Оператори


Оператори описують ті алгоритмічні дії, які повинні виконуватися. Операторам можуть передувати мітки, які можна використовувати для посилань в операторах переходу goto.

Мітка - це послідовність цифр в діапазоні від 0 до 9999 або ідентифікатор.

Існує два основні види операторів: прості оператори і структурні оператори.


.1 Прості оператори


Простим оператором є такий оператор, який не містить в собі інших операторів.


.2 Оператор привласнення


Оператор привласнення замінює поточне значення змінної новим значенням, яке визначається виразом, або визначає вираз, значення якого повинен повертатися функцією.

Вираз повинен бути сумісний по привласненню з типом змінної або типом значення, що повертається функцією в якості результату.

Наведемо деякі приклади операторів привласнення:

:= У + Z:= (I >= 1) and (I < 100);:= [blue, Succ(C)];:= Sqr(J) - I * До;


7.3 Привласнення об'єктного типу


Правила сумісності по привласненню об'єктних типів дозволяють привласнювати екземпляру об'єкту екземпляр будь-якого з його дочірніх типів. Таке привласнення є проекцією нащадка на простір його предка.


.4 Оператори процедури


Оператор процедури визначає активізацію процедури, позначену за допомогою ідентифікатора процедури. Якщо відповідне опис процедури містить список формальних параметрів, то оператор процедури повинен містити в собі відповідний йому список фактичних параметрів (параметри, список яких приводиться у визначенні, є формальними параметрами, а в операторі виклику процедури вони є фактичними параметрами). При виклику відбувається передача фактичних параметрів формальним параметрам.

Наведемо деякі приклади операторів процедур:

;(A,N,M);(Name,Address);


.5 Оператори переходу


Оператор переходу goto викликає передачу управління оператору, якому передує мітка, вказана в даному операторі переходу.

При використовуванні оператора переходу повинні дотримуватися наступні правила:

. мітка, яка указується в операторі переходу, повинна знаходитися в тому ж блоці або модулі, що і сам оператор переходу. Іншими словами, не допускаються переходи з процедури або функції або в середину неї.

. перехід ззовні всередину структурного оператора (тобто перехід на більш глибокий рівень вкладеності) може визивати непередбачувані ефекти, хоча компілятор не видає повідомлення про помилку. Наприклад, ви не повинні переходити в тіло циклу for.


.6 Структурні оператори


Структурні оператори будуються з інших операторів, порядок виконання яких повинен бути послідовним (складові оператора і оператори над записами), визначуваним умовною передачею управління (умовні оператори) або що повторюється (оператори циклу).


.7 Складові оператори


Складові оператори задають порядок виконання операторів є їх елементами. Вони повинні виконуватися в тому порядку, в якому вони записані. Складові оператори обробляються, як один оператор, що має вирішальне значення там, де синтаксис Паскаля допускає використовування тільки одного оператора. Оператори полягають в обмежувачі begin і end, і відділяються один від одного крапкою з комою.

Наведемо приклад складового оператора:

:= X;:= У;

У := Z;;


7.8 Умовні оператори


Умовні оператори дозволяють вибрати для виконання один з складових операторів (або не вибрати жодного).


.8.1 Оператор умови (if)

У виразі повинен виходити результат, стандартний, що має булевий тип. Якщо результатом виразу є істинне значення (True), то виконується оператор, наступний за ключовим словом then.

Якщо результатом виразу є значення False і присутнє ключове слово else, то виконаються оператор, наступний за ключовим словом else. Якщо ключове слово else відсутнє, то ніякий оператор не виконується.

Синтаксична неоднозначність, що виникає в конструкції:

e1 then e2 else e3


дозволяється шляхом наступної інтерпретації цієї конструкції:

e1 thene2 then


В загальному випадку ключове слово else зв'язується з найближчим ключовим словом if, яке ще не пов'язане з ключовим словом else.

Наведемо два приклади оператора if:

if X < 1.5 then:= X+Y:= 1.5;

P1 <> nil then:= P1^.father;


.8.2 Оператор варіанту (case)

Оператор варіанту (case) складається з виразу (переключателя) і списку операторів, кожному з яких передує одна або більш констант (вони називаються константами вибору) або ключове слово else. Перемикач (селектор) повинен мати порядковий тип (розміром в байт або слово). Таким чином, рядковий тип і довгий цілий тип є неприпустимими типами перемикача. Все константи вибору повинні бути унікальними і мати порядковий тип сумісний з типом перемикача.

Оператор варіанту case приводить до виконання оператора, якому передує константа вибору, рівна значенню переключателя або діапазону вибору, в якому знаходиться значення переключателя. Якщо такої константи вибору або такого діапазону вибору не існує і присутній гілка else, то виконаються оператор наступний за ключовим словом else. Якщо ж гілка else відсутня, то ніякий оператор не виконується.

Наведемо деякі приклади оператора варіанту:

Operator: X := X+Y;: X := X-Y;: X := X*Y;;I

, 2, 4, 6, 8: Writeln(' Парна цифра');

, 3, 5, 7, 9: Writeln('Не парна цифра');

..100: Writeln('Між 10 і 100');;


.9 Оператор циклу


Оператор циклу задає повторне виконання визначених операторів.

Якщо число повторень наперед відоме, то відповідною конструкцій є оператор for. В осоружному випадку слідує використовувати оператори while або repeat.

Для управління повторенням операторів можна використовувати стандартні процедури Break і Continue. Break завершує оператор циклу, а Continue продовжує з наступної ітерації цього оператора.


.9.1 Оператор циклу з післяумовою (repeat)

В операторі циклу з післяумовою (що починається із слова repeat) вираз, який управляє повторним виконанням послідовності операторів міститься усередині оператора repeat.

Результат виразу повинен бути булевого типу. Оператори розташовані між ключовими словами repeat і until, виконуються послідовно до тих пір, поки результат виразу не прийме значення True. Послідовність операторів виконається по крайній мірі один раз, оскільки обчислення виразу проводиться після кожного виконання послідовності операторів.

Наведемо приклади оператора циклу з післяумовою:


До := I mod J;:= J;:= ДО;J = 0;

('Введіть значення (0..9):');(I);(I >= 0) and (I <= 9);


.9.2 Оператори циклу з передумовою (while)

Оператор циклу з передумовою (що починається з ключового слова while) містить в собі вираз, який управляє повторним виконанням оператора (який може бути складовим оператором).

Вираз, за допомогою якого здійснюється управління повторенням оператора, повинен мати булевий тип. Обчислення його проводиться до того, як внутрішній оператор буде виконаний. Внутрішні оператори виконуються повторно до тих пір, поки вираз приймає значення Тruе. Якщо вираз з самого початку приймає значення False, то оператор, що міститься усередині оператора циклу з передумовою, не виконується.

Прикладами операторів циклу з передумовою можуть служити наступні оператори:

Data[I]<> X do I := I + 1;

I > 0 doOdd(I) then Z := Z * X;:= I div 2;:= Sqr(X);;

not Eof(InFile) do(InFile,Line);(Line);;


.9.3 Оператори циклу з параметром (for)

Оператори циклу з параметром (які починаються із слова for) викликає виконання оператора, що повторюється (який може бути складовим оператором) поки управляючої змінної присвоюється зростаюча послідовність значень.

Як управляюча змінна повинен використовуватися ідентифікатор зміною (без якого-небудь кваліфікатора), який позначає змінну, оголошену локальній в блоці, в якому міститься оператор for. Управляюча змінна повинна мати перелічувальний тип. Початкове і кінцеве значення повинні мати тип сумісний по привласненню з перелічувальним типом.

Коли починає виконуватися оператор for, початкове і кінцеве значення визначаються один раз, і ці значення зберігаються на протязі всього виконання оператора for.

Оператор, який міститься в тілі оператора for, виконується один раз для кожного значення в діапазоні між початковим і кінцевим значенням. Управляюча змінна завжди ініціалізувалася початковим значенням. Коли працює оператор for, значення управляючої змінній (лічильника циклів) збільшується при кожному повторенні на одиницю. Якщо початкове значення перевищує кінцеве значення, то що міститься в тілі оператора for оператор не виконаються. Коли в операторі циклу використовується ключове слово downto, значення управляючої змінної зменшується при кожному повторенні на одиницю. Якщо початкове значення в такому операторі менше ніж кінцеве значення, то що міститься в тілі оператора циклу оператор не виконаються.

Якщо оператор, що міститься в тілі оператора for, змінює значення управляючої змінної, то це є помилкою. Після виконання оператора for значення управляючої змінної становится невизначеним, якщо тільки виконання оператора for не було перерване за допомогою оператора переходу.

Якщо взяти до уваги ці обмеження, то оператор

V := Expr1 to Expr2 do Body;


еквівалентний оператору:

:= Expr1;:= Expr2;Temp1 <= Temp2 then:= Temp1;;V <> Temp2 do:= Succ(V);;;;;


і оператор циклу:

V := Expr1 downto Exp2 do Body;


еквівалентний операторам::= Expr1;:= Expr2;Temp1 >= Temp2 then:= Temp1;;V <> Temp2 про:= Pred(V);;;;;


де Temp1 і Temp2 - допоміжні змінні, тип яких збігається з основним типом змінної V і які не зустрічаються в іншому місці програми.

Наведемо приклади оператора циклу з параметром:

I := 2 to 63 doData[I]> Max then Max := Data[I]

I := 1 to 10 doJ := 1 to 10 do:= 0;До := 1 to 10 do:= X + Mat1[I,K]*Mat2[K,J];[I,J]:= X;;З := red to blue do Check(C);


.10 Оператор with


В операціях над записами оператор with зручно використовувати для короткого звернення до полів запису. В операторі with до полів однієї або більш конкретних змінних типу запис можна звертатися, використовуючи тільки ідентифікатори полів.

Візьмемо наступний опис:

= record: Integer:: Integer;: Integer:;

OrderDate: TDate;


З урахуванням даного опису наведемо приклад оператора with:

OrderDate doMonth = 12 then:= 1;:= Year + 1else:= Month + 1;


Це еквівалентно наступному:OrderDate.Month = 12 then.Month := 1;.Year := TDate.Year + 1.month := TDate.Month + 1;


В операторі with спочатку проводиться перевірка кожного посилання на змінну, а саме: чи можна її інтерпретувати, як поле записей. Якщо це так, то вона завжди інтерпретується саме таким чином, навіть якщо є доступ до змінної з тим же ім'ям.

Допустимо описати наступні тип та змінні:

= record,y: Integer;;: Point;

у: Integer;


В цьому випадку і до x, і до у можна звертатися, як до змінної або як до поля запису. В операторі:

x do:= 10;

у := 25;;між ключовими словами with і dо відноситься до змінної типу покажчик, а в складовому операторі x і у посилаються на x.x і y.y.

Оператор:

V1,V2...Vn do s;


еквівалентний операторам:

V1 doV2 do

...Vn do;


В двох випадках, якщо Vn є полем і v1, і v2, то вона інтерпретується як v2.Vn, а не як v1.Vn.

Якщо вибірка змінної типу запис пов'язана з індексацією масиву або покажчика, то ці дії проводяться до того, як виконуватиметься складовий оператор.

Постановка задачі

1. Обчислити елементи квадратної матриціза формулою:

. Використовуючи елементи матриці обчислити елементи вектора .

. Обчислити значення функції G за формулою


Алгоритм розвязання задачі

Частина 1:

1.Складемо блок-схему обчислення елементів матриці за формулою



2. Складемо блок-схему підпрограми формування вектора , кожен елемент якої визначається, як різниця максимальних і мінімальних елементів рядків матриці.

При цьому процедури M (m) знаходження максимального (мінімального) елементів i-о рядка матриці A винесено для наглядності на окрему блок-схему.



. Складемо блок-схему підпрограми обчислення значення функції G за формулою


Програмні реалізації алгоритму

Програма написана на мові Паскаль. Дана програма призначена для обчислення елементів матриці, вектора та значення функції за формулами згідно варіанту. Результатами виконання програми є відповідні значення елементів матриці, вектора та значення функції.

kursova;

Crt;


type matrix = array[1..5, 1..5] of real;

type vector = array[1..5] of real;

m_init(var B: matrix);i,j: byte;i:=1 to 5 doj:=1 to 5 do[i,j]:=ln (i*i+j*j*j)-ln(abs(sin(i)+cos(i)))/ln(10);;

m_print (B: matrix);i,j: byte;writeln;j:=1 to 5 doj:=1 to 5 do write('a[',i,',',j,']=',B[i,j]:4:2); writeln; writeln;;;v_max(k:byte; B: matrix): real;m: real; i: byte;:=B[k,1];i:=2 to 5 dom< B[k,1] then m:= B[k,1];_max:=m;

v_min(k:byte; B: matrix): real;m: real; i: byte;:=B[k,1];i:=2 to 5 dom>B[k,1] then m:= B[k,1];_min:=m;

m_print (Y:vector);i,j: byte;writeln;i:=1 to 5 do writeln(' x[',i,']',Y[i]:7:4);;

prod(i:byte; Y:vector): real;k: byte; p:real;;:=Y[1];k:=2 to i do p:=p* Y[1];:=p;;A: matrix;,j: byte;: vector;,s: real;

;;_init(A);_print(A);i:=1 to 5 do X[i]:=v_max(i,A)-v_min(i,A);_print(X);

:=0;i:=1 to 5 do s:=s+abs(X[i]*X[i]-prod(i,X));

;:=exp(ln(s)/3);(' G =',G:7:4);

.


Результати виконання програми

Елементи матриці

[1,1]=0.55 a[1,2]=2.06 a[1,3]=3.19 a[1,4]=4.03 a[1,5]=4.70[2,1]=1.92 a[2,2]=2.79 a[2,3]=3.74 a[2,4]=4.53 a[2,5]=5.17[3,1]=2.37 a[3,2]=2.90 a[3,3]=3.65 a[3,4]=4.36 a[3,5]=4.97[4,1]=2.68 a[4,2]=3.03 a[4,3]=3.61 a[4,4]=4.23 a[4,5]=4.80[5,1]=3.43 a[5,2]=3.67 a[5,3]=4.12 a[5,4]=4.66 a[5,5]=5.18

Елементи вектора

[1] 4.1431[2] 3.2504[3] 2.5953[4] 2.1155[5] 1.7525


Значення функції= 6.2154


Висновки


Під час виконання даної курсової роботи я ознайомився із використанням підпрограм та функцій користувача при роботі з масивами на прикладі написаних мною програм на мові Паскаль, набувши таким чином певних навиків програмування. Написані програми та отримані результати наведено вище під час опису виконання роботи. виконання роботи складалось із кількох етапів. Спершу було здійснено постановку задачі та опрацьовано відповідний матеріал із літератури. На наступному етапі розроблено алгоритми вирішення поставлених задач. Це питання розвязувалось паралельно із їх програмним вирішенням. На останньому етапі під час підготовки звіту було вивчено методи та вимоги оформлення звіту, засоби перенесення результатів із програми Паскаля в редактор Word, навики побудови ілюстрацій до блок-схем програм. Результати представлено у вигляді даного звіту.


Список використаних джерел


1.Бородич Ю.С., Вальвачев А.Н., Кузьмич А.И. Паскаль для персональных компьютеров: Справ. пособие - Мн.: Выcш. шк.: БФ ГИТМП «Наука», 1991. 365 с.

.Глинський Я.М., Анохін В.Є., Ряжська В.А. Паскаль. Turbo Pascal i Delphi. 3-тє вид. - Львів: «Деол», 2002. - 144 с.

3.Глинський Я.М. Інформатика: 8-11 класи. Навч. посібник для загальноосвітніх навчальних закладів: У 2-х кн. - Кн. 1. Алгоритмізація і програмування. Мова Паскаль. 2-е вид. - Львів: «Деол», 2002. - 200 с.

.Глинський Я.М. Практикум з інформатики. - Львів: Деол, 2001. - 224 с.

.Дибкова Л.М. Інформатика та компютерна техніка: Посібник. - К.: Академія, 2002. - 320 с.


Теги: Використання підпрограм та функцій користувача при роботі з масивами  Курсовая работа (теория)  Информационное обеспечение, программирование
Просмотров: 7883
Найти в Wikkipedia статьи с фразой: Використання підпрограм та функцій користувача при роботі з масивами
Назад