Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции инф.doc
Скачиваний:
10
Добавлен:
01.03.2025
Размер:
1.56 Mб
Скачать

13.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(s);I++)

if(find(gl,s[I])>0)k++;

printf(”%d”,k);

}

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

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

Рассмотрим функцию, которая решает задачу транспонирования квадратной матрицы (поворот матрицы на 90 градусов). Если определить заголовок функции как:

void transp(int a[][],int n){….},

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

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

//Транспонирование квадратной матрицы

#include<iostream.h>

/*глобальная переменная, задает количество строк и столбцов в матрице*/

const int N=10;

void transp(int a[][N],int n)

{

int r;

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

}

}

Также при передаче многомерных массивов можно интерпретировать их как одномерные и внутри функции пересчитывать индексы (рис.9 )

//передача матрицы как одномерного массива

#include <iosream.h>

//передаем указатель на первый элемент матрицы

void form_matr(int *matr, int n)

{

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

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

matr[i*n+j]=rand()%10;//пересчитываем индекс элемента

}

void print_matr(int *matr, int n)

{

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

{

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

cout<<matr[i*n+j]<<” “;

cout<<”\n”;

}

}

void main()

{

int matr[5][5];

/*передаем адрес первого элемента матрицы как фактический параметр*/

form_matr (&matr[0][0],5);

print_matr (&matr[0][0],5);

}

Вызов такой функции можно записать еще и следующим образом:

//выполняем приведение типов

form_matr ((int*)matr,5);

print_matr ((int*)matr,5);

matr[0]

Рис. 9 Размещение двумерного массива в памяти