LW1_ауд 2_Використання покажчиків у функціях. Зв'язок між покажчиками та масивами
Заняття 2. Використання покажчиків у функціях. Зв'язок між покажчиками та масивами.
Мета роботи. Опанувати практичні навички використання покажчиків у функціях мови C; навчитися передавати аргументи у функції за адресою, змінювати значення змінних і масивів у викликаних функціях, а також застосовувати покажчики для роботи з масивами (доступ до елементів, арифметика покажчиків, передавання масиву у функцію).
Хід виконання роботи
(Робота в аудиторії).
Завдання 1. Передавання даних у функцію за адресою (вибір цілі)
Середовище: https://www.codingame.com/ide/puzzle/onboarding
Обмеження:
- не використовувати динамічну пам’ять;
- не використовувати глобальні змінні;
- усі зміни значень виконувати через покажчики;
- виводити лише ті дані, які очікує ігровий рушій CodinGame (без довільних
printf).
У середовищі CodinGame Onboarding принцип передавання за адресою реалізується через вибір цілі у функції з параметрами-покажчиками.
Напишіть програму, яка у кожному кроці гри:
- Зчитує з стандартного введення:
- ім’я першого ворога та відстань до нього;
- ім’я другого ворога та відстань до нього.
- Реалізує окрему функцію
chooseTarget, яка:- повертає покажчик на рядок (
const char *); - приймає покажчики на відстані до ворогів;
- здійснює вибір найближчого ворога шляхом непрямого доступу до даних.
- повертає покажчик на рядок (
- Викликає функцію
chooseTargetз функціїmain, передаючи адреси змінних. - Виводить лише ім’я обраного ворога, відповідно до вимог CodinGame.

TODO-скелет програми
const char* chooseTarget(const char* e1, const int* d1,
const char* e2, const int* d2)
{
// TODO: якщо *d1 <= *d2 -> e1, інакше -> e2
}
int main(void){
while (1) {
char enemy1[257];
int dist1;
char enemy2[257];
int dist2;
// TODO: зчитати enemy1, dist1, enemy2, dist2
// TODO: викликати chooseTarget(), передавши:
// TODO: вивести РІВНО один рядок: назву цілі (enemy1 або enemy2)
}
return 0;
}
Завдання 2. Закріпити навички передавання масиву у функцію через покажчик, використання арифметики покажчиків та організації доступу до елементів масиву без індексації. Напишіть програму для звичайного консольного середовища (VS Code, OnlineGDB, Code::Blocks) , яка:
- У функції
main:- оголошує масив цілих чисел
valuesз 5 елементів; - ініціалізує масив довільними значеннями.
- оголошує масив цілих чисел
- Реалізує функцію
printArray, яка:- приймає покажчик на масив та його розмір;
- виводить усі елементи масиву в один рядок.
- Реалізує функцію
sumArray, яка:- приймає покажчик на масив та його розмір;
- обчислює та повертає суму елементів масиву.
- У функції
main:- викликає функцію
printArray; - викликає функцію
sumArray; - виводить обчислену суму елементів масиву.
- викликає функцію
Обмеження
-
- Заборонено використовувати індексацію виду
arr[i]у функціяхprintArrayтаsumArray; - доступ до елементів масиву здійснювати лише через арифметику покажчиків
*(ptr + i); - не використовувати динамічну пам’ять;
- не використовувати глобальні змінні.
- Заборонено використовувати індексацію виду
Вправи та питання для самоперевірки
(виконати письмово)
- Поясніть, що таке нелокальне присвоювання і як його реалізувати за допомогою аргументів типу покажчика (передавання за адресою). Наведіть короткий приклад (2–3 рядки коду).
-
Напишіть прототип функції
exchange, яка:
- не повертає значення;
- має два параметри-покажчики на змінні з плаваючою точкою;
- призначена для обміну значень змінних. - Напишіть функцію, яка отримує аргумент типу
int*та збільшує значення цілої змінної на 1 (через розіменування). (Потрібно лише тіло функції + приклад виклику.) - Напишіть функцію
orderPair, яка має два аргументиuтаvтипуfloat*і після виклику гарантує:*u <= *v(менше значення — в*u, більше — в*v). (Потрібно тіло функції.) - Обґрунтуйте (1–3 речення), чому функціям не слід повертати покажчики на свої локальні змінні. Наведіть приклад небезпечного коду (4–6 рядків).
- Відповісти коротко:
-
- Як масив передати до функції як аргумент?
- Чому, щоб обробляти будь-який елемент масиву, достатньо знати адресу першого елемента?
- Яку “масивну” операцію можна застосовувати до покажчика (пояснити на прикладі
ptr + i)?
При захисті роботи студенти відповідають на контрольні запитання, наведені в кінці кожної роботи.
Критерії оцінювання:
- Виконання аудиторних завдань - 5 балів.
Шрифти
Розмір шрифта
Колір тексту
Колір тла
Кернінг шрифтів
Видимість картинок
Інтервал між літерами
Висота рядка
Виділити посилання
Вирівнювання тексту
Ширина абзацу