Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Процедури, підпрограми та параметриСодержание книги
Поиск на нашем сайте
Розглянемо задачу: довільні значення трьох змінних a, b, c переставити за необхідності так, щоб вони були упорядковані за неспаданням, тобто щоб мали місце нерівності a£ b£ c. Алгоритм розв'язання цієї задачі простий: якщо a>b, то обміняти значення змінних a і b; {гарантовано, що a£ b} якщо b>c, то обміняти значення змінних b і c; {гарантовано, що b£ c і a£ c; але нерівність a£ b не гарантована, тому:} якщо a>b, то обміняти значення змінних a і b. Обмін значень двох змінних, наприклад, a і b, задається трьома операторами з допоміжною змінною: t:=a; a:=b; b:=t. Мовою Паскаль алгоритм записується так: program sort3(input, output); var a, b, c, t: integer; Begin writeln('задайте три цілих'); readln(a, b, c); if a>b then begin t:=a; a:=b; b:=t end; if b>c then begin t:=b; b:=c; c:=t end; if a>b then begin t:=a; a:=b; b:=t end; writeln('упорядкування: ', a, ' ', b, ' ', c) End. Проте три майже однакові складені оператори, що задають ті самі дії, тільки з різними змінними – це нудно. Аналогічно функціям, можна один раз описати обмін значень двох змінних, представлених параметрами, дати ім'я цьому опису, а потім тільки позначати його, тобто вказувати ім'я опису й змінні, чиї значення повинні обмінятися. На відміну від функцій, при обміні відбувається не обчислення якогось одного значення, а змінюється стан пам'яті програми (недарма обмін заданий складеним оператором). Тому такий опис оформляється й використовується інакше. Опис обміну задається процедурою, а її виклик являє собою окремий оператор. Процедура має загальний вигляд procedure ім'я (означення параметрів); означення імен Begin послідовність операторів end; Процедура, як і функція, є означенням імені і записується серед означень програми. На відміну від функції, в її заголовку немає імені типу для значень, породжуваних у результаті виклику, тому що ніякі значення не породжуються. За цією ж причиною в тілі процедури не може бути операторів присвоювання з її ім'ям у лівій частині. Виклик процедури складається з імені й аргументів у дужках і записується як окремий оператор, наприклад, readln(x, y). Отже, напишемо інший варіант програми упорядкування трьох значень: program sort31(input, output); var a, b, c: integer; procedure swap(xx, yy: integer); var t: integer; begin t:=xx; xx:=yy; yy:=t end; Begin writeln('задайте три цілих:'); readln(a, b, c); if a>b then swap(a, b); if b>c then swap(b, c); if a>b then swap(a, b); writeln('упорядкування: ', a, ' ', b, ' ', c) End. КРАСИВО, АЛЕ НЕПРАВИЛЬНО! Справа в тім, що при виконанні виклику, наприклад, swap(a, b), змінні xx і yy одержать значення змінних a і b, потім ці значення поміняються місцями, виконання виклику закінчиться, а в змінних a і b залишаться ті ж самі значення, що були перед викликом. Наприклад, якщо змінним a, b, c присвоїти "з зовнішнього світу" значення відповідно 3, 1, 2, то буде надруковано упорядкування: 3 1 2. Слушність цього напису дуже сумнівна. Отже, при виконанні виклику процедури (чи функції) спочатку параметри одержують значення аргументів, а потім їх зміни ніяк не відбиваються на аргументах (рис.3.3). Тому параметри, що дотепер розглядалися, називаються параметрами-значеннями. Мова Паскаль допускає в заголовках процедур і функцій означати параметри іншого виду. Вони називаються параметрами - змінними і означаються зі словом var попереду. Так, процедура swap набуває вигляду: procedure swap(var xx, yy: integer); var t: integer; Begin t:=xx; xx:=yy; yy:=t end; Таке означення параметрів забезпечує, що при виконанні виклику процедури або функції іменам параметрів ставляться у відповідність змінні, тобто ділянки пам'яті, уже зіставлені аргументам. При виконанні виклику зміна значення параметра-змінної насправді є зміною значення аргументу (рис.3.4).
Якщо в програмі sort31 означити параметри процедури як параметри-змінні, то за виконання виклику swap(a, b) імені xx зіставляється та ж сама ділянка пам'яті, що й змінній a, а імені yy – та ж, що b. У результаті обмін місцями значень xx і yy є обміном a і b. Що й було потрібно. Таким чином, якщо в змінні a, b, c програми було прочитано значення 3, 2, 1 відповідно, то результати виконання викликів процедури swap можна подати станами пам'яті програми, як на рис.3.5. Функції та процедури в мові Паскаль мають загальну назву: підпрограми. У заголовках підпрограм можна означати як параметри-значення, так і параметри-змінні. Означення однотипних параметрів того самого виду називається секцією, і означення параметрів насправді є послідовністю секцій. Секція параметрів-значень – це список імен, за яким після двокрапки записано ім'я типу, наприклад, a1, a2: real. Секція параметрів-змінних починається словом var, за яким записано список імен параметрів таім'я типу, наприклад, var xx, yy: integer. Секції розділяються ";". За необхідності ми могли б написати, наприклад, procedure qq(x, y: integer; var z, t: integer). Як ми вже говорили, у викликах підпрограм вказуються аргументи – вирази, однотипні з параметрами. Але є суттєва відмінність між аргументами, що можуть відповідати параметрам-значенням і параметрам-змінним. Аргументом для параметра-значення може бути будь-який вираз, тип якого сумісний за присвоюванням із типом параметра. Аргументом для параметра-змінної може бути тільки ім'я змінної того ж типу, що й параметр. У літературі часто параметри підпрограм називаються формальнимипараметрами, а аргументи у викликах – фактичними. Задачі 3.18. * Як Ви гадаєте, процедури readln і writeln мають параметри-значення або параметри-змінні? 3.19. * Як відомо, будь-які дві різні точки площини задають єдину пряму, що проходить через них. Рівняння прямої ax + by + c =0 називається нормалізованим, якщо (b=1) або (b=0 і a=1). Пряма може бути задана не єдиним рівнянням, але її нормалізоване рівняння єдине. Написати процедуру обчислення коефіцієнтів нормалізованого рівняння прямої за координатами двох різних точок. Написати функцію перевірки, чи лежать дві точки площини по один бік прямої, заданої коефіцієнтами нормалізованого рівняння. З використанням цих підпрограм написати програму читання координат точки і вершин трикутника і перевірки, чи лежить точка всередині його. 3.20. Прочитати координати двох пар точок, якими задано два відрізки, та визначити, чи мають вони хоча б одну спільну точку. 3.21. Прочитати координати точок A, B, C, D. Обчислити довжину найкоротшого шляху з точки A в точку B з урахуванням того, що відрізок CD перетинати не можна. 3.22. Прочитати координати точок A, B, C, D і визначити, чи є замкнена ламана ABCDA: а) чотирикутником; б) неопуклим чотирикутником; в) опуклим чотирикутником.
|
||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2017-02-07; просмотров: 122; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.225.117.89 (0.008 с.) |