Примеры программ на c функции

Возможно, Вы уже знакомы с понятием функций и процедур и встречали их в других языках программирования. Если нет, то кратко опишу, что это такое. Функция в языке C++ — это по сути группа операторов, которые объединены вместе и выполняют какую-то определённую задачу. Функция всегда имеет имя и опционально может иметь входные параметры. Также для функции всегда задаётся тип возвращаемого значения — это тип данных для того результата вычислений, который функция в буквальном смысле возвращает после выполнения группы входящих в неё операторов.

Давайте закрепим в сознании вышесказанное и посмотрим на формат определения функции на псевдоязыке:

Формат определения функции в C++

([ ])

В квадратных скобках [ и ] заключены опциональные части определения функции — как видим, это список входных параметров (т.е. он может быть, а может отсутствовать), а также оператор return в самом конце определения функции перед закрывающей фигурной скобкой >. В большинстве случаев оператор return является обязательным оператором возврата результата функции: если типом возвращаемого значения для Вашей функции не является void, то Вы обязаны указывать оператор return вместе с тем выражением, которое возвращает функция. Если же Ваша функция имеет тип возвращаемого результата void, то писать оператор return не обязательно.

Функции в языке Си

Каждая программа на C++ должна иметь как минимум одну функцию с именем main(), которая является точкой входа в программу. На усмотрение программиста можно также объявлять и свои собственные функции — с целью структуризации кода программы, группировки операторов программы в отдельные логические части, выполняющие конкретную задачу.

Все операторы, которые заключены между фигурными скобками и > называются телом функции.

Пример определения функций в программе на C++

Давайте посмотрим на пример определения собственных функций:

#include using namespace std; // Функция, вычисляющая площадь прямоугольника double rectangle_area(double side_a, double side_b) < return side_a * side_b; >// Функция, вычисляющая площадь прямоугольного треугольника double right_triangle_area(double leg_a, double leg_b) < return 0.5 * leg_a * leg_b; >// Функция, вычисляющая площадь параллелограмма double parallelogram_area(double side_a, double height) < return side_a * height; >// Главная функция, точка входа в программу на C++ int main() < // Ввод параметров и расчёт площади прямоугольника double rect_side_a, rect_side_b; cout > rect_side_a; cout > rect_side_b; // здесь идёт вызов функции rectangle_area cout > leg_a; cout > leg_b; // здесь идёт вызов функции right_triangle_area cout > para_side_a; cout > para_height; // здесь идёт вызов функции parallelogram_area cout

В этом примере мы определили три функции, возвращающие какое-то значение с типом данных double:

  • rectangle_area(doubleside_a, doubleside_b) — для вычисления площади прямоугольника. Входными параметрами являются длины сторон прямоугольника — side_a и side_b. Если длины сторон прямоугольника равны side_a и side_b, то площадь вычисляется по формуле S = side_a × side_b
  • right_triangle_area(doubleleg_a, doubleleg_b) — для вычисления площади прямоугольного треугольника. Входными параметрами являются длины сторон катетов leg_a и leg_b. Площадь прямоугольного треугольника равна половине произведения длин его катетов, т.е. S = ½ × leg_a× leg_b
  • parallelogram_area(doubleside_a, doubleheight) — для вычисления площади параллелограмма. Площадь параллелограмма равна произведению его стороны side_a на высоту height, перпендикулярную этой стороне, т.е. S = side_a× height

В основной функции main() запрашивается ввод значений с клавиатуры для всех параметров этих трёх функций и происходит вызов каждой из функции с отображением результата вычисления площади конкретной фигуры на экране консоли.

Язык Си — Как создать и открыть окно с помощью функций WinAPI.

Ниже показан пример возможного ввода данных и результаты вычисления площадей фигур на основании введённых значений:

1. Calculating the area of Rectangle.
Enter ‘side_a’: 2.5
Enter ‘side_b’: 3.5
Area of Rectangle is: 8.75
2. Calculating the area of Right Triangle.
Enter ‘leg_a’: 5.2
Enter ‘leg_b’: 3.1
Area of Right Triangle is: 8.06
3. Calculating the area of Parellelogram.
Enter ‘side_a’: 10
Enter ‘height’: 3.7
Area of Parallelogram is: 37

Тип возвращаемого значения функции не обязательно должен быть double. Вы можете определить функцию, возвращающую char, int, bool или любой другой поддерживаемый тип данных, включая собственные типы данных, при условии, что Вы определите их в своей программе. То же самое относится к параметрам функций — они могут иметь любые допустимые типы данных — от встроенных в язык C++, до Ваших собственных — опять же, при условии если Вы определите какие-то свои типы данных в программе.

Читайте также:
Как сканировать QR код на Андроид с экрана телефона без программ

Объявление и определение функции

В программировании на C++ существует два разных термина: объявление и определение функции. Давайте рассмотрим разницу между ними:

  • Объявление (англ. declaration) функции говорит компилятору C++ о том, как называется функция, какой у неё возвращаемый тип данных и какие параметры она принимает — т.е. всю информацию о том, как именно вызывать эту функцию. Самое же тело функции может быть определено отдельно от объявления функции (например, в отдельном файле).
  • Определение (англ. definition) функции включает в себя помимо имени функции, возвращаемого типа данных и входных параметров также и само тело функции. Таким образом, основная разница между определением функции и объявлением функции заключается в том, что определение сразу содержит и само тело функции. В примере, что мы рассматривали выше у нас было 3 определения функций parallelogram_area, parallelogram_area, parallelogram_area

Типы передачи параметров при вызове функции

Функции в языке C++ могут по-разному принимать значения для своих входных параметров:

  • передача параметров по значению
  • передача параметров по указателю
  • передача параметров по ссылке

Эта тема может занять время и место в статье на объяснение, поэтому пока не буду вдаваться в такие детали. Если моим читателям будет интересно, я напишу про специфику передачи параметров в функции на C++ в отдельной статье. Пока лишь скажу, что в примерах выше мы передавали параметры в наши функции по значению.

Формальные и актуальные параметры функции

Напоследок также скажу, что параметры в определении или в объявлении функции называют ещё формальными параметрами. Когда происходит вызов функции, то в функцию передаются какие-то значения — это могут быть константы, переменные соответствующего типа, выражения или вообще другие функции. Эти значения являются актуальными параметрами в вызове функции.

Разницу легко запомнить: формальные называются так оттого, что они формально говорят какие именно типы данных принимает в себя функция и с какими именами и в каком порядке идут параметры функции. Актуальные параметры называются так оттого, что при вызове функции в неё передаются вполне конкретные, т.е. актуальные, значения.

Заключение

В этой статье мы рассмотрели с Вами понятие функции в языке C++, поняли разницу между объявлением и определением функции. Также посмотрели на пример программы, которая использует три различных функции для вычисления площадей геометрических фигур и усвоили, чем формальные параметры функции отличаются от актуальных параметров. За рамки статьи вышла отдельная тема о типах передачи параметров в функции на C++. По возможности и при наличии интереса к этой теме у моих читателей, я напишу отдельную статью про это.

Как говорится, теория бесполезна без подкрепления практикой. Поэтому предлагаю моим читателям выполнить небольшую практику и написать свои функции на языке C++. В качестве упражнения попробуйте написать свои варианты функций, которые вычисляют:

  • Площадь круга (формула: S = π× r 2 , где S — вычисляемая площадь круга, r — это радиус круга, а π — константа, приблизительно равная 3,1415926535)
  • Площадь трапеции (формула: S =½ × (a + b) * h, где S — вычисляемая площадь трапеции, a — длина верхнего основания трапеции, b — длина нижнего основания трапеции, h — высота трапеции).
  • Площадь квадрата (формула S = a 2 , где S — вычисляемая площадь квадрата, a — длина стороны квадрата).

Поделитесь своими результатами или задайте вопросы, если они остались, в комментариях к статье.

Источник: allineed.ru

Вызовы функций

Вызовом функции называется выражение, которое передает функции управление и аргументы (если они есть). Такие выражения имеют следующую форму:

где expression — это имя функции или выражение, результатом которого является адрес функции, а expression-list содержит список выражений, разделенных запятыми. Значения этих выражений являются аргументами, которые передаются функции. Если функция не возвращает значения, то при ее объявлении необходимо указать, что она возвращает тип void .

Если объявление указывается до вызова функции, однако информация о ее параметрах не приводится, то для любых необъявленных аргументов выполняются обычные арифметические преобразования.

Выражения в списке аргументов функции могут оцениваться в любом порядке, поэтому аргументы, значения которых могут изменяться в качестве побочного эффекта других аргументов, имеют неопределенные значения. Точка следования, определяемая оператором вызова функции, гарантирует только то, что все побочные эффекты в списке аргументов будут оценены до того, как управление будет передано вызванной функции. (Обратите внимание, что порядок, в котором аргументы отправляются в стек, — это отдельная тема.) Дополнительные сведения см. в разделе Точки следования.

Читайте также:
Стали долго открываться программы

Единственное требование к любому вызову функции заключается в том, что выражение перед скобками должно иметь своим результатом адрес функции. Это означает, что функцию можно вызвать любым выражением, значением которого является указатель функции.

Пример

В следующем примере представлен вызов функций, совершаемый из оператора switch :

int main() < /* Function prototypes */ long lift( int ), step( int ), drop( int ); void work( int number, long (*function)(int i) ); int select, count; . . . select = 1; switch( select ) < case 1: work( count, lift ); break; case 2: work( count, step ); break; case 3: work( count, drop ); /* Fall through to next case */ default: break; >> /* Function definition */ void work( int number, long (*function)(int i) )

В этом примере вызов функции располагается в функции main :

work( count, lift );

Он передает функции count целочисленную переменную lift , а также адрес функции work . Обратите внимание, что адрес функции передается просто в виде идентификатора функции, поскольку он равен выражению указателя. Чтобы идентификатор функции можно было использовать таким образом, функцию необходимо объявить и определить до того, как будет использован идентификатор; в противном случае идентификатор не будет распознан. В этом случае прототип функции work задан в начале функции main .

Параметр function в функции work объявлен как указатель на функцию, принимающую один аргумент типа int и возвращающую значение типа long . Скобки вокруг имени параметра являются обязательными. Без них это объявление будет означать, что функция возвращает указатель на значение типа long .

Функция work вызывает выбранную функцию из цикла for , используя следующий вызов:

( *function )( i );

Вызываемой функции передается один аргумент, i :

Источник: learn.microsoft.com

Функции в Си

Функции в Си применяются для выполнения определённых действий в рамках общей программы. Программист сам решает какие именно действия вывести в функции. Особенно удобно применять функции для многократно повторяющихся действий.

Простой пример функции в Cи

Пример функции в Cи:

Это очень простая программа на Си. Она просто выводит строку «Functions in C». В программе имеется единственная функция под названием main. Рассмотрим эту функцию подробно. В заголовке функции, т.е. в строке

int main(void)

int – это тип возвращаемого функцией значения;

main — это имя функции;

(void) — это перечень аргументов функции. Слово void указывает, что у данной функции нет аргументов;

return – это оператор, который завершает выполнение функции и возвращает результат работы функции в точку вызова этой функции;

EXIT_SUCCESS — это значение, равное нулю. Оно определено в файле stdlib.h;

часть функции после заголовка, заключенная в фигурные скобки

<
puts(«Functions in C»);
return EXIT_SUCCESS;
>

называют телом функции.

Итак, когда мы работаем с функцией надо указать имя функции, у нас это main, тип возвращаемого функцией значения, у нас это int, дать перечень аргументов в круглых скобках после имени функции, у нас нет аргументов, поэтому пишем void, в теле функции выполнить какие-то действия (ради них и создавалась функция) и вернуть результат работы функции оператором return. Вот основное, что нужно знать про функции в C.

Как из одной функции в Cи вызвать другую функцию?

Рассмотрим пример вызова функций в Си:

Function in C

Запускаем на выполнение и получаем:

В этом примере создана функция sum, которая складывает два целых числа и возвращает результат. Разберём подробно устройство этой функции.

int sum(int a, int b)

здесь int — это тип возвращаемого функцией значения;

sum — это имя функции;

(int a, int b) — в круглых скобках после имени функции дан перечень её аргументов: первый аргумент int a, второй аргумент int b. Имена аргументов являются формальными, т.е. при вызове функции мы не обязаны отправлять в эту функцию в качестве аргументов значения перемнных с именами a и b. В функции main мы вызываем функцию sum так: sum(d, e);. Но важно, чтоб переданные в функцию аргументы совпадали по типу с объявленными в функции.

В теле функции sum, т.е. внутри фигурных скобок после заголовка функции, мы создаем локальную переменную int c, присваиваем ей значение суммы a плюс b и возвращаем её в качестве результата работы функции опрератором return.

Теперь посмотрим как функция sum вызывается из функции main.

Вот функция main:

Сначала мы создаём две переменных типа int

int d = 1; int e = 2;

их мы передадим в функцию sum в качестве значений аргументов.

Читайте также:
Vipnet csp как зарегистрировать программу

Далее создаём переменную f:

int f = sum(d, e);

её значением будет результат работы функции sum, т.е. мы вызываем функцию sum, которая возвратит значение типа int, его-то мы и присваиваем переменной f. В качестве аргументов передаём d и f. Но в заголовке функции sum

int sum(int a, int b)

аргументы называются a и b, почему тогда мы передаем d и f? Потому что в заголовке функций пишут формальные аргументы, т.е. НЕ важны названия аргументов, а важны их типы. У функции sum оба аргумента имеют тип int, значит при вызове этой функции надо передать два аргумента типа int с любыми названиями.

Ещё одна тонкость. Функция должна быть объявлена до места её первого вызова. В нашем примере так и было: сначала объявлена функция sum, а уж после мы вызываем её из функции main. Если функция объявляется после места её вызова, то следует использовать прототип функции.

Прототип функции в Си

Рассмотрим пример функциив Си:

В этом примере функция sum определена ниже места её вызова в функции main. В таком случае надо использовать прототип функции sum. Прототип у нас объявлен выше функции main:

int sum(int a, int b);

Прототип — это заголовок функции, который завершается точкой с запятой. Прототип — это объявление функции, которая будет ниже определена. Именно так у нас и сделано: мы объявили прототип функции

int sum(int a, int b);

далее в функции main вызываем функцию sum

int f = sum(d, e);

а ниже функции main определяем функцию sum, которая предварительно была объявлена в прототипе:

Чем объявление функции в Си отличается от определения функции в Си?

Когда мы пишем прототип функции, например так:

int sum(int a, int b);

то мы объявляем функцию.

А когда мы реализуем функцию, т.е. записываем не только заголовок, но и тело функции, например:

то мы определяем функцию.

Оператор return

Оператор return завершает работу функции в C и возвращает результат её работы в точку вызова. Пример:

Эту функцию можно упростить:

здесь оператор return вернёт значение суммы a + b.

Операторов return в одной функции может быть несколько. Пример:

Если в примере значение аргумента a окажется больше двух, то функция вернет ноль (первый случай) и всё, что ниже комментария «// Первый случай;» выполнятся не будет. Если a будет меньше двух, но b будет меньше нуля, то функция завершит свою работу и всё, что ниже комментария «// Второй случай;» выполнятся не будет.

И только если оба предыдущих условия не выполняются, то выполнение программы дойдёт до последнего оператора return и будет возвращена сумма a + b.

Передача аргументов функции по значению

Аргументы можно передавать в функцию C по значению. Пример:

Function in C

В примере, в функции main, создаём переменную int d = 10. Передаём по значению эту переменную в функцию sum(d). Внутри функции sum значение переменной увеличивается на 5. Но в функции main значение d не изменится, ведь она была передана по значению. Это означает, что было передано значение переменной, а не сама переменная. Об этом говорит и результат работы программы:

т.е. после возврата из функции sum значеие d не изменилось, тогда как внутри функции sum оно менялось.

Передача указателей функции Си

Если в качестве аргумента функции передавать вместо значения переменной указатель на эту переменную, то значение этой переменной может меняться. Для примера берём программу из предыдущего раздела, несколько изменив её:

В этом варианте программы я перешел от передачи аргумента по значению к передаче указателя на переменную. Рассмотрим подробнее этот момент.

printf(«sum = %dn», sum(

в функцию sum передается не значение переменной d, равное 10-ти, а адрес этой переменной, вот так:

Теперь посмотрим на функцию sum:

Аргументом её является указатель на int. Мы знаем, что указатель — это переменная, значением которой является адрес какого-то объекта. Адрес переменной d отправляем в функцию sum:

Внутри sum указатель int *a разыменовывается. Это позволяет от указателя перейти к самой переменной, на которую и указывает наш указатель. А в нашем случае это переменная d, т.е. выражение

Function in C

Результат: функция sum изменяет значение переменной d:

На этот раз изменяется значение d после возврата из sum, чего не наблюдалось в предыдущм пункте, когда мы передавали аргумент по значению.

C/C++ в Eclipse

Все примеры для этой статьи я сделал в Eclipse. Как работать с C/C++ в Eclipse можно посмотреть здесь. Если вы работаете в другой среде, то примеры и там будут работать.

Источник: sbp-program.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru