Объявление функций: прототипы функций
1 | returnDataType functionName( dataType argName1, dataType argName2, ..., dataType argNameN); |
где,
returnDataType — возвращаемый тип данных
functionName — имя функции
dataType — тип данных
argName1...N — имена параметров функции (количество параметров неограниченно)
Смотрим пример объявления функции:
|
В языках C и C++, функции должны быть объявлены до момента их вызова. Вы можете объявить функцию, при этом функция может возвращать значение или — нет, имя функции присваивает программист, типы данных параметров указываются в соответствии с передаваемыми в функцию значениями. Имена аргументов, при объявления прототипов являются необязательными:
1 | int sum(int , int ); // тот же прототип функции |
Иногда, объявление функции называют определением функции, хотя это не одно и то же.
|
Определение функций
|
Рассмотрим определение функции на примере функции sum.
Аргумент типа void.
В соответствии с ANSI С, отсутствие списка аргументов функции должно быть указано явно при помощи ключевого слова void. В C++ использование void пока не обязательно, но считается целесообразным. В следующей программе имеется простая функция voutput(), не имеющая параметров и не возвращающая никакого значения. Функция main() вызывает voutput(). При выходе из voutput() управление возвращается функции main(). Трудно придумать более простую функцию
/*08FVOID.C
Программа на С печатает сообщение при помощи функции.
В функции используются параметр типа void и стандартная
библиотечная функция С sqrt()*/
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
void voutput(void);
main()
{
/* Программа определяет квадратный корень */
printf("This programm will find the square root\n\n\n");
voutput();
printf ("\n\nPress any key to finish\n");
_getch();
return(0);
}
void voutput(void)
{
double dt=12345.0;
double du;
du=sqrt(dt);
printf("The squre root of %lf is %lf\n",dt,du);
}
Обратите внимание, что функция voutput() вызывает библиотечную функцию С, называемую sqrt(). Прототип sqrt() находится в файле math.h. У функции один параметр в формате числа двойной длины, и возвращает она результат извлечения квадратного корня тоже в виде числа двойной длины.
Символьные параметры.
Функции можно передавать символьные значения. В следующем примере в функции main() одиночный символ считывается с клавиатуры и передается функции voutput(). Символ считывается функцией getch(). В стандартной библиотеке С имеются другие функции, тесно связанные с функцией getch(): getc(), getcharQ и getcheQ Эти функции можно использовать и в C++, однако во многих случаях предпочтительнее пользоваться cm. Функция getch() получает символ от стандартного устройства ввода (клавиатуры) и возвращает символьное значение, не отображая его на экране:
//08FCHAR.C
/*Программа на С считывает символ с клавиатуры, передает его функции
и печатает сообщение, использующее этот символ*/
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
void voutput(char c);
main()
{
char cyourchar;
/* Введите один символ с клавиатуры */
printf("Enter one character from the keyboard. \n");
cyourchar=getch();
voutput(cyourchar);
printf ("\n\nPress any key to finish\n");
_getch();
return(0);
}
void voutput(char c)
{
int j;
for(j=0;j<=16;j++)
/* Введен символ ... */
printf("The character typed is %c \n",c);
}
Целочисленные параметры.
В следующем примере одно целое число вводится с клавиатуры при помощи функции С scanf() и передается функции vside(), в которой на основе полученного значения, означающего длину стороны, вычисляются и печатаются площадь квадрата, объем куба и площадь поверхности куба.
//08FINT.C
/*Программа на С вычисляет значения на основании введенной длины.
Функция получает параметр типа int, введенный с
клавиатуры при помощи функции scanf()*/
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
void vside(int is);
main()
{
int iyourlength=0;
/* Введите с клавиатуры длину как целое число */
printf("Enter the length, as an integer from the keyboard. \n");
scanf("%d",&iyourlength);
vside(iyourlength);
printf ("\n\nPress any key to finish\n");
_getch();
return(0);
}
void vside(int is)
{
int iarea, ivolume,isarea;
iarea=is*is;
ivolume=is*is*is;
isarea=6*iarea;
/* Длина стороны равна */
printf("The lenth of a side is %d \n",is);
/* Квадрат будет иметь площадь */
printf("The square would have an area of %d \n",iarea);
/* Куб будет иметь объем */
printf("The cube would have a volume of %d \n",ivolume);
/* Площадь поверхности куба */
printf("The surface area of the cub would have a square of %d \n",isarea);
}
82. Использование функций. Массивы в качестве параметров. Аргументы по умолчанию. Возвращение значения функцией: оператор return.
Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи.
Функция является подпрограммой, которая может содержаться в основной программе, а может быть создана отдельно (в библиотеке). Каждая функция выполняет в программе определенные действия.
Сигнатура функции определяет правила использования функции. Обычно сигнатура представляет собой описание функции, включающее имя функции, перечень формальных параметров с их типами и тип возвращаемого значения.
Семантика функции определяет способ реализации функции. Обычно представляет собой тело функции.
Определение функции
Каждая функция в языке Си должна быть определена, то есть должны быть указаны:
· тип возвращаемого значения;
· имя функции;
· информация о формальных аргументах;
· тело функции.
Определение функции имеет следующий синтаксис:
ТипВозвращаемогоЗначения ИмяФункции(СписокФормальныхАргументов)
{
ТелоФункции;
...
return(ВозвращаемоеЗначение);
}
Пример: Функция сложения двух вещественных чисел
float function(float x, float z)
{
float y;
y=x+z;
return(y);
}
Объявление функций: прототипы функций
1 | returnDataType functionName( dataType argName1, dataType argName2, ..., dataType argNameN); |
где,
returnDataType — возвращаемый тип данных
functionName — имя функции
dataType — тип данных
argName1...N — имена параметров функции (количество параметров неограниченно)
Смотрим пример объявления функции:
|
В языках C и C++, функции должны быть объявлены до момента их вызова. Вы можете объявить функцию, при этом функция может возвращать значение или — нет, имя функции присваивает программист, типы данных параметров указываются в соответствии с передаваемыми в функцию значениями. Имена аргументов, при объявления прототипов являются необязательными:
1 | int sum(int , int ); // тот же прототип функции |
Иногда, объявление функции называют определением функции, хотя это не одно и то же.
|
Определение функций
|
Рассмотрим определение функции на примере функции sum.
Массивы в качестве параметров.
В следующем примере содержимое некоторого массива передается в функцию в качестве параметра, вызываемого по ссылке. В этом случае адрес первого элемента массива передается через указатель.
//08FPNTR.C
/*Программа на С передает функции массив в качестве параметра.
Для передачи информации о массиве используется указатель*/
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
void voutput(int *pinums);
main()
{
int iyourarray[7]={2,7,15,32,45,3,1};
/* Передать информацию о массиве в функцию */
printf("Send array information to function. \n");
voutput(iyourarray);
printf ("\n\nPress any key to finish\n");
_getch();
return(0);
}
void voutput(int *pinums)
{
int t;
/* Результат равен */
printf("The result is:\n");
for(t=0;t<7;t++)
printf(" #%d %d\n",t,pinums[t]);
}
Обратите внимание на то, что при вызове функции указывается только имя iyourarray.
Также допустимо передать информацию по адресу и для безразмерного массива. В следующем примере показано, как это можно сделать на C++. (Такой же подход возможен и в С.) Информация, содержащаяся в массиве iyourarray, передается путем указания адреса его первого элемента.