КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Різновиди підпрограмПідпрограми поділяються на стандартні і визначені користувачем. Перші входять до складу мови програмування і викликаються для виконання за строго фіксованими іменами. Другі розробляються самим користувачем. Всі стандартні засоби знаходяться у стандартних бібліотеках, які, зазвичай, повинні бути підключені в тексті програми. Наприклад, у мові С для цього служать директиви препроцесора include. Підпрограми користувача описуються або в програмі, або в бібліотеках користувача, які за необхідності теж підключаються до тексту програми. При цьому для кожної підпрограми задається своє ім'я, а також описуються дії, що становлять зміст підпрограми. У мові Рascal для декларації (оголошення) підпрограм користувача служить розділ опису процедур і функцій. Реалізація підпрограм може різнитися в залежності від мови програмування і залежить, в основному, від можливостей повернення ними значень. Хоча синтаксис деяких мов програмування не залежить від того, повертаються значення підпрограмами чи не повертаються. Наприклад, Maple не звертає на це увагу; у мові С вважається, що значення повертається підпрограмою завжди, тільки інколи воно може мати так званий пустий тип (void); в Pascal розрізняють підпрограми-функції, що повертають значення, та підпрограми-процедури, що можуть не повертати значень. Досить часто результатом роботи підпрограми має бути не одне, а декілька різних значень. В такому випадку використовуються різноманітні спеціалізовані методи повернення комплексу значень. Найпростіший із них - використання параметрів-змінних, найефективніший - утворення блоку результатів і повернення адреси цього блоку, як результату роботи програми. В Maple використовується саме останній метод, тоді як Pascal і C/C++ — використовують і перший, і другий методи. Розглянемо більш детально реалізацію підпрограм у мовах програмування. Реалізація підпрограм у C/C++. На відміну від інших мов програмування високого рівня в мові С/C++ немає поділу підпрограм на процедури і функції. Вся програма на С/C++ будується тільки із функцій. Функції забезпечують зручний спосіб окремого оформлення деяких обчислень з можливістю їх подальшого використання по імені (без турботи про те, як виконана реалізація). Функції у мові С/C++можна: - визначати (описувати дії, що виконуються функцією), - оголошувати (задавати форми звертання до функції), - викликати. Визначення функції задає тип значення, що повертається, ім'я функції, типи і число формальних параметрів, а також оголошення змінних і оператори, що називаються тілом функції і визначають дію функції. Формат визначення функції: [тип_результату] ім'я_функції([список_формальних_параметрів]) { тіло_функції } Типи формальних параметрів можуть описуватися в заголовку функції або після нього, але до тіла функції:
Допускається використання функцій, які не мають параметрів, але дужки у цьому випадку все рівно ставляться. Функція у C/С++ може мати змінне число формальних параметрів. Тоді їх список у заголовку функції закінчується комою із трикрапкою (, ...). Наприклад, float prim (int a, b, float s, … ); У цьому випадку вважається, що функція має, принаймні, стільки обов'язкових аргументів, скільки формальних параметрів задано перед останньою комою в списку параметрів. При передачі такій функції більшої кількості аргументів над додатковими аргументами не проводиться контроль їх типів. Тип значення, що повертається функцією, повинен відповідати типу в оголошенні цієї функції. Якщо тип результату функції не заданий, то вважається, що за замовчуванням функція повертає значення типу int. Повернення значення із функції виконується операторомreturn наступного формату: return [вираз]. Зазначений вираз обчислюється, перетворюється, якщо необхідно, до необхідного типу, і повертається в точку виклику функції як результат. Наприклад, return p1>=p2 ? p1 : p2 Якщо внаслідок використання конструкцій розгалуження виконання функції може завершуватися різними операторами, то операторів повернення значень виразів має бути декілька. Наприклад, fact (int n) //обчислення факторіала числа { if (n>0) return n*fact(n-1); else return 1; } Функція може не повертати жодного значення. Дія таких функцій може полягати, наприклад, у зміні значень деяких змінних, виведенні на друк деяких текстів тощо. Тоді тип результату функції задається ключовим словом void, що вказує на відсутність значення, яке повертається функцією. Наприклад, void print( ) { cout<< “Печать строки” << endl; } У цьому випадку керування із функції повертається: a) по досягненні кінця тіла функції ( символа «}» ); b) при виконанні пустого оператора return. Функція, як і змінна, повинна бути визначена (описана згідно формату) або оголошена (заданий прототип функції) до першого її використання. Прототип функції – це її попереднє оголошення шляхом вказання тільки заголовка функції. Імена формальних параметрів у прототипі функції можна не вказувати. Функцію, що має прототип, можна визначати в будь-якому місці програми. Якщо прототип функції не заданий, а зустрівся виклик функції, то з аналізу форми виклику функції будується неявний прототип. При цьому тип результату створеного прототипу-int, а список типів і число параметрів функції формується на підставі типів і числа фактичних параметрів, що використовуються при даному виклику. Вкладеність оголошень функцій не допускається, але прототип функції може розміщуватися всередині іншої функції. Виклик функції може здійснюватися окремим оператором виклику або бути операндом виразу. Приклад. Знаходження факторіалу введеного числа.
|