Передача параметров в функцию: одномерные массивы, строки




Одномерный массив

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

 

#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++"

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-30 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: