ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 23.06.2021
Просмотров: 1698
Скачиваний: 3

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];
}

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;

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;

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”;
}
}

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