Одномерный массив
При использовании массива как параметра функции в функцию передается указатель на его первый элемент, т.е. массив всегда передается по адресу. При этом теряется информация о количестве элементов в массиве, поэтому его размерность следует передавать в функцию как отдельный параметр. Т.к. в функцию передается указатель на начало массива, массив может быть изменен в теле функции.
#include <iostream>
using namespace std;
//Функция, формирующая массив
int form(int *arr){
int n;
cin >> n; //Ввод количества элементов в массиве
for (int i = 0; i < n; i++)
arr[i] = rand() % 100;
return n; //Возвращаем количество элементов массива
}
//Функция печати массива
void print(int *arr, int n) {
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
int main(){
int arr[100];
int n;
n = form(arr); //Вызов функции формирования массива и присвоение количества элементов
print(arr, n); //Печать массива
}
При использовании динамических массивов в функцию передается указатель на область динамической памяти, в которой размещаются элементы массива. Функция также может возвращать указатель на область динамической памяти, в которой размещаются элементы массива.
#include <iostream>
using namespace std;
//Функция, формирующая массив
int* form(int &n){
cin >> n; //Ввод количества элементов в массиве
int *arr = new int[n];
for (int i = 0; i < n; i++)
arr[i] = rand() % 100;
return arr; //Возвращаем указатель на динамический массив
}
//Функция печати массива
void print(int *arr, int n) {
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
int main(){
int* arr;
int n;
arr = form(n); //Вызов функции формирования массива
print(arr, n); //Печать массива
}
Строки
Строки, при передаче в функции, могут передаваться как одномерные массивы типа char или указатели типа char*. В отличие от обычных массивов в функциях не указывается длина строки, так как в конце строки присутствует признак ее окончания – ‘\0’.
#include <iostream>
using namespace std;
//Функция, формирующая массив
int find_vow(char* s, char c){
for (int i = 0; i < strlen(s); i++)
if (s[i] == c)
return i;
return -1;
}
int main(){
char s[255];
int k = 0;
cin.getline(s, strlen(s));
char vowels[] = "aouiey";
//Каждый символ введенной строки сравнивается с каждым
//символом из строки гласных
for (int i = 0; i < strlen(s); i++)
for (int j = 0; j < 6; j++) {
if (s[i] == vowels[j])
k++;
}
cout << endl << k;
}
Функции с переменным количеством параметров
В C++ допустимы функции, у которых при компиляции не фиксируется число параметров, а также может быть неизвестен их тип. Количество и тип становятся известны только тогда, когда явно задан список фактических параметров – в момент непосредственного вызова функции. Функция с переменным числом параметров обязана иметь хотя бы один явный параметр. Определение:
тип имя_функции(явные_параметры, …){
тело_функции;
}
После списка обязательных параметров ставится запятая и многоточие, указывающее, что дальнейший контроль количества и типов при обработке вызова функции не нужен. При вызове функции все параметры будут размещаться в памяти друг за другом. Таким образом, определив адрес обязательного параметра как * ptr = &k, где ptr – указатель, а k – обязательный параметр, через который можно получить адреса всех остальных параметров: оператор k++ осуществляет переход к следующему параметру. Сложность заключается в определении количества параметров, поэтому каждая такая функция должна иметь механизм определения количества и типов параметров. Способы:
1. Известно количество параметров, которое передается в функцию в качестве обязательного параметра
2. Известен признак конца списка параметров
#include <iostream>
using namespace std;
//Функция, вычисляющая среднее арифметическое заданного кол-ва чисел
float sum(int k,...){
int *ptr = &k;
int a = k;
float s = 0;
for (; k > 0; k--)
s += *(++ptr);
return s / a;
}
int main(){
cout << "\ns_ar1 = " << sum(2, 6, 8);
cout << "\ns_ar2 = " << sum(4, 1, 7, 8, 10);
}
Перегрузка функций
В классических языках программирования, таких как C, функции имеют свои оригинальные имена. В C++ существует возможность создать две функции с одинаковыми именами, т.е. создать перегруженные функции. Под перегрузкой функции понимается определение нескольких функций с одинаковым именем, но различными типами и различным числом фактических параметров. Компилятор при вызове функции связывает ее имя с соответствующим количеством и типом параметров и на основании параметров распознает, какая функция с каким вызовом связана. Если функции отличаются только типом возвращаемого значения, то функции не будут являться перегруженными – это будет считаться ошибкой.
#include <iostream>
using namespace std;
void show(int i){
cout << "int: " << i << endl;
}
void show(double f){
cout << "double: " << f << endl;
}
int main(){
show(12); // вызывает первую функцию (12 тип int)
show(2.5); // вызывает вторую функцию (2.5 тип float)
}
Использованная литература.
o Арнольд Виллемер "Программирование на С++"
o Стивен Скиена "Алгоритмы"
o О.Л. Викентьева, А.Н. Гусин, О.А. Полякова "Проектирование программ и программирование на C++"