- •Лабораторна робота №4
- •1. Мета роботи:
- •2. Теоретичні відомості
- •2.1. Параметри функції
- •2.2. Локальні і глобальні змінні
- •2.3. Передача одновимірних масивів як параметрів функції
- •2.4. Передача рядків як параметрів функцій
- •2.5. Передача багатовимірних масивів у функцію
- •2.6. Рядки
- •Мал. 4. Представлення рядка і символу
- •3. Постановка задачі
- •4. Варіанти
- •5. Методичні вказівки
2.2. Локальні і глобальні змінні
Змінні, які використовуються всередині даної функції, називаються локальними. Пам'ять для них виділяється в стеку, тому після закінчення роботи функції вони віддаляються з пам'яті. Не можна повертати покажчик на локальну змінну, оскільки пам'ять, виділена для такої змінної, звільнятиметься.
Глобальні змінні – це змінні, описані поза функціями. Вони видні у всіх функціях, де немає локальних змінних з такими іменами.
2.3. Передача одновимірних масивів як параметрів функції
При використанні масиву як параметра функції, у функцію передається покажчик на його перший елемент, тобто масив завжди передається за адресою. При цьому втрачається інформація про кількість елементів в масиві, тому розмірність масиву слід передавати як окремий параметр.
void print(int а[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 а[4][5] – це масив з покажчиків int*, які містять імена однойменних масивів з 5 цілих елементів:
Мал.3 Виділення пам'яті під масив, елементами якого є масиви.
При передачі багатовимірних масивів у функцію всі розмірності повинні передаватися як параметри.
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];
а[I][j]=a[j][I];
а[j][I]=r;
}
}
2.6. Рядки
Рядок в C++ – це масив символів, що закінчується нуль-символом – ’\0’ (нуль-термінатором). За розміщенням нуль-термінатора визначається фактична довжина рядка. Кількість елементів в такому масиві на 1 більше, ніж зображення рядка.
А |
\0 |
|
А |
”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*. На відміну від звичайних масивів у функції не вказується довжина рядка, оскільки в кінці рядка є ознака кінця рядка \.
