ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 23.06.2021

Просмотров: 1698

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

56 

Глобальные переменные также можно использовать для передачи данных между 

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

11.5.Функции и массивы 

 
11.5.1. Передача одномерных массивов как параметров функции 

При использовании массива как параметра функции, в функцию передается 

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

Пример1: 
Удалить из массива все четные элементы 
#include <iostream.h> 
#include <stdlib.h> 
 
int form(int a[100]) 

int n; 
 

cout<<"\nEnter n"; 

cin>>n; 

 
 

for(int i=0;i<n;i++) 

a[i]=rand()%100; 

return n; 


void print(int a[100],int n) 

 

for(int i=0;i<n;i++) 

cout<<a[i]<<" "; 

cout<<"\n"; 


 
void Dell(int a[100],int&n) 

 

int j=0,i,b[100]; 

for(i=0;i<n;i++) 

if(a[i]%2!=0) 

b[j]=a[i];j++; 

n=j; 

for(i=0;i<n;i++)a[i]=b[i]; 

 

 


background image

57 

void main() 

 

int a[100]; 

int n; 

n=form(a); 

print(a,n); 

Dell(a,n); 

print(a,n); 


Пример 2 
Удалить из массива все элементы, совпадающие с первым элементом, используя 

динамическое выделение памяти. 

#include <iostream.h> 
#include <stdlib.h> 
int* form(int&n) 

 
 

cout<<"\nEnter n"; 

cin>>n; 

int*a=new int[n];//указатель на динамическую область памяти 

for(int i=0;i<n;i++) 

a[i]=rand()%100; 

return a; 


void print(int*a,int n) 

 

for(int i=0;i<n;i++) 

cout<<a[i]<<" "; 

cout<<"\n"; 


 
int*Dell(int *a,int&n) 

 

int k,j,i; 

for(k=0,i=0;i<n;i++) 

if(a[i]!=a[0])k++; 

int*b; 

b=new int [k]; 

for(j=0,i=0;i<n;i++) 

if(a[i]!=a[0]) 

b[j]=a[i];j++; 

n=k; 

return b; 


 
void main() 

 

int *a; 


background image

58 

int n; 

a=form(n); 

print(a,n); 

a=Dell(a,n); 

print(a,n); 

11.5.2. Передача строк в качестве параметров функций 

Строки при передаче в функции могут передаваться как одномерные массивы 

типа char или как указатели типа    char*. В отличие от обычных массивов в функции не 
указывается длина строки, т. к. в конце строки есть признак конца строки /0.  

Пример: Функция поиска заданного символа в строке 
int  find(char *s,char c) 

for (int I=0;I<strlen(s);I++) 
if(s[I]==c) return I; 
return –1 

С помощью этой функции подсчитаем количество гласных букв в строке. 
void main() 

char s[255]; 
gets(s) 
char gl=”aouiey”; 
for(int I=0,k=0;I<strlen(gl);I++) 
if(find(s,gl[I])>0)k++; 
printf(“%d”,k); 

 

11.5.3.

Передача многомерных массивов в функцию 

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

передаваться в качестве параметров. По определению многомерные массивы в Си и 
СИ++ не существуют. Если мы описываем массив с несколькими индексами, например, 
массив int mas[3][4], то это означает, что мы описали  одномерный массив mas, 
элементами которого являются указатели на одномерные массивы int[4]. 

Пример: Транспонирование квадратной матрицы 
Если определить заголовок функции: 
void transp(int a[][],int n){…..} – то получится, что мы хотим передать в функцию 

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

Самый простой вариант решения этой проблемы определить функцию 

следующим образом: 

void transp(int a[][4],int n), тогда размер каждой строки будет 4, а размер массива 

указателей будет вычисляться. 

#include<iostream.h> 
const int N=4;//глобальная переменная 
void transp(int a[][N],int n) 

int r; 


background image

59 

for(int I=0;I<n;I++) 
for(int j=0;j<n;j++) 
if(I<j) 

r[a[I][j];a[I][j]=a[j][I];a[j][I]=r; 


void main() 

int mas[N][N]; 
for(int I=0;I<N;I++) 
for(int j=0;j<Nlj++) 
cin>>mas[I][j]; 
for(I=0;I<N;I++) 

for(j=0;j<N;j++) 
cout<<mas[I][j] 
cout<<”\n”; 

transp(N,mas); 
for(I=0;I<N;I++) 

for(j=0;j<N;j++) 
cout<<mas[I][j] 
cout<<”\n”; 


background image

60 

12. Функции с начальными (умалчиваемыми) значениями 

параметров

 
В определении функции может содержаться начальное (умалчиваемое) значение 

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

Пример: 
void print(char*name=”Номер дома: ”,int value=1) 
{cout<<”\n”<<name<<value;} 
Вызовы: 
1. print(); 
Вывод: Номер дома: 1 
2. print(“Номер квартиры”,15); 
Вывод: Номер квартиры: 15 
3. print(,15); - ошибка, т. к. параметры можно пускать только с конца 
Поэтому функцию лучше переписать так: 
void print(int value=1, char*name=”Номер дома: ”) 
{cout<<”\n”<<name<<value;} 
Вызовы: 
1. print(); 
Вывод: Номер дома: 1 
2. print(15); 
Вывод: Номер дома: 15 
3. print(6, “Размерность пространства”);  
Вывод: Размерность пространства: 6