Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Різновиди підпрограм




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

Всі стандартні засоби знаходяться у стандартних бібліотеках, які, зазвичай, повинні бути підключені в тексті програми. Наприклад, у мові С для цього служать директиви препроцесора include.

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

Реалізація підпрограм може різнитися в залежності від мови програмування і залежить, в основному, від можливостей повернення ними значень. Хоча синтаксис деяких мов програмування не залежить від того, повертаються значення підпрограмами чи не повертаються. Наприклад, Maple не звертає на це увагу; у мові С вважається, що значення повертається підпрограмою зав­жди, тільки інколи воно може мати так званий пустий тип (void); в Pascal розрізняють підпрограми-функції, що по­вертають значення, та підпрограми-процедури, що можуть не повертати значень.

Досить часто результатом роботи під­програми має бути не одне, а декілька різних значень. В такому випадку ви­користовуються різноманітні спеціалізовані методи повернення комплексу значень. Найпростіший із них - використання параметрів-змінних, найефе­ктивніший - утворення блоку результатів і повернення адреси цього блоку, як результату роботи програми. В Maple використовується саме останній метод, тоді як Pascal і C/C++ — використовують і перший, і другий методи.

Розглянемо більш детально реалізацію підпрограм у мовах програмування.

Реалізація підпрограм у C/C++. На відміну від інших мов програмування високого рівня в мові С/C++ немає поділу підпрограм на процедури і функції. Вся програма на С/C++ будується тільки із функцій. Функції забезпечують зручний спосіб окремого оформлення деяких обчислень з можливістю їх подальшого використання по імені (без турботи про те, як виконана реалізація).

Функції у мові С/C++можна:

- визначати (описувати дії, що виконуються функцією),

- оголошувати (задавати форми звертання до функції),

- викликати.

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

[тип_результату] ім'я_функції([список_формальних_параметрів])

{

тіло_функції

}

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

float fun (float p1, float p2) { … } float fun (p1, p2) float p1; float p2; { … }

Допускається використання функцій, які не мають параметрів, але дужки у цьому випадку все рівно ставляться.

Функція у 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, а список типів і число параметрів функції формується на підставі типів і числа фактичних параметрів, що використовуються при даному виклику.

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

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

Приклад. Знаходження факторіалу введеного числа.

Варіант 1 Варіант 2
#include <stdio.h> #include <conio.h> int fact(int n) { if (n>0) return n*fact(n-1); else return 1; } main( ) { int x; printf("x:"); scanf(“%d”, x); printf("\n%d! =%d",x,fact(x)); getch( ); } #include <stdio.h> #include <conio.h> int fact(int); main( ) { int x; printf("x:"); scanf(“%d”, x); printf("\n%d! =%d",x,fact(x)); getch( ); } int fact(int n) { if (n>0) return n*fact(n-1); else return 1; }

 


Поделиться:

Дата добавления: 2015-08-05; просмотров: 142; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты