- •Лабораторная работа №5
- •1. Цель работы:
- •2.1. Параметры функции
- •2.2. Локальные и глобальные переменные
- •2.3. Передача одномерных массивов как параметров функции
- •2.4. Передача строк в качестве параметров функций
- •2.5. Передача многомерных массивов в функцию
- •2.6. Строки
- •4. Варианты
- •5. Методические указания
- •6. Содержание отчета
- •3. Постановка задачи
2.2. Локальные и глобальные переменные
Переменные, которые используются внутри данной функции, называются локальными. Память для них выделяется в стеке, поэтому после окончания работы функции они удаляются из памяти. Нельзя возвращать указатель на локальную переменную, т. к. память, выделенная такой переменной, будет освобождаться.
Глобальные переменные – это переменные, описанные вне функций. Они видны во всех функциях, где нет локальных переменных с такими именами.
2.3. Передача одномерных массивов как параметров функции
При использовании массива как параметра функции, в функцию передается указатель на его первый элемент, т. е. массив всегда передается по адресу. При этом теряется информация о количестве элементов в массиве, поэтому размерность массива следует передавать как отдельный параметр.
void print(int a[100],int n) //вывод массива на печать
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<"\n";
}
Так как в функцию передается указатель на начало массива (передача по адресу), то массив может быть изменен за счет операторов тела функции.
2.4. Передача строк в качестве параметров функций
Строка в Си++ - это массив символов, заканчивающийся нуль-символом – ‘\0’ (нуль-терминатором). По положению нуль-терминатора определяется фактическая длина строки. Количество элементов в таком массиве на 1 больше, чем изображение строки.
Для работы со строками существуют специальные библиотечные функции, которые содержатся в заголовочном файле string.h.
Строки при передаче в функции могут передаваться как одномерные массивы типа 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
}
2.5. Передача многомерных массивов в функцию
Многомерный массив – это массив, элементами которого служат массивы. Например, массив int a[4][5] – это массив из указателей int*, которые содержат имена одноименных массивов из 5 целых элементов:

Рис. Выделение памяти под массив, элементами которого являются массивы.
При передаче многомерных массивов в функцию все размерности должны передаваться в качестве параметров.
const int N=4;//глобальная переменная
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;
}
}
2.6. Строки
Строка в C++ – это массив символов, заканчивающийся нуль-символом – ’\0’ (нуль-терминатором). По положению нуль-терминатора определяется фактическая длина строки. Количество элементов в таком массиве на 1 больше, чем изображение строки.
|
A |
\0 |
|
A | ||
|
”A” строка (2 байта) |
|
’A’ символ (1 байт) | |||
Рис. 4. Представление строки и символа
Присвоить значение строке с помощью оператора присваивания нельзя. Поместить строку в массив можно либо при вводе, либо с помощью инициализации.
char s1[10]="string1";//инициализация
char s2[]="string2";//инициализация
char s3[10];
cin>>s3;//ввод
//выделение памяти под динамическую строку
char *s4=new char[strlen(s3)+1];
strcpy(s4,s3);//копирование строки s3 в строку s4
Для работы со строками существуют специальные библиотечные функции, которые содержатся в заголовочном файле string.h.
|
Прототип функции |
Краткое описание |
Примечание |
|
unsigned strlen(const char* s); |
Вычисляет длину строки s. |
|
|
int strcmp(const char* s1, const char* s2); |
Сравнивает строки s1 и s2. |
Если s1<s2, то результат отрицательный, если s1==s2, то результат равен 0, если s2>s1 – результат положительный. |
|
int strcnmp(const char* s1, const char* s2); |
Сравнивает первые n символов строк s1 и s2. |
Если s1<s2, то результат отрицательный, если s1==s2, то результат равен 0, если s2>s1 – результат положительный. |
|
char* strcpy(char* s1, const char* s2); |
Копирует символы строки s1 в строку s2. |
|
|
char* strncpy(char* s1, const char* s2, int n); |
Копирует n символов строки s1 в строку s2. |
Конец строки отбрасывается или дополняется пробелами. |
|
char* strcat(char* s1, const char* s2); |
Приписывает строку s2 к строке s1 |
|
|
char* strncat(char* s1, const char* s2); |
Приписывает первые n символов строки s2 к строке s1 |
|
|
char* strdup(const char* s); |
Выделяет память и переносит в нее копию строки s |
При выделении памяти используются функции |
Строки при передаче в функции могут передаваться как одномерные массивы типа char или как указатели типа char*. В отличие от обычных массивов в функции не указывается длина строки, т. к. в конце строки есть признак конца строки \0.
