Ім'я файлу: Лаб 6 Функції.pdf
Розширення: pdf
Розмір: 526кб.
Дата: 25.11.2023
скачати

Лабораторна робота № 6
Функції Мета роботи: вивчити принципи побудови функцій користувача, основні складові функцій, прототипи, оголошення та опис функцій. Навчитися розробляти і використовувати на практиці власні функції для вирішення завдань, які стоять перед розробником програм.
Теоретичні відомості
Функція – поіменована послідовність описів і операторів, яка виконує деяку закінчену послідовність дій. Будь-яка функція складається із заголовка
(оголошення функції) і тіла (визначення функції).
Кожна програма у своєму складі повинна мати головну функцію main(). Крім функції main(), в програму може входити будь - яка кількість функцій. З поняттям функції у мові С+ повязано три наступних терміна:
 опис функції;
 прототип функції;
 виклик функції.
Опис функції складається з двох частин: заголовка та тіла. Опис функції має наступну форму запису:
/* заголовок функції*/ тип _ результату < ім’ я >([ список _ параметрів])
{
/* оголошення і оператори */
тіло_ функції Тип результату — це тип значення, яке може повертати функція. При відсутності специфікатора типу передбачається, що функція повертає ціле значення (int). Якщо функція не повертає ніякого значення, тона місці типу записується специфікатор void. У списку параметрів для кожного параметра
повинен бути зазначений тип. При відсутності параметрів список може бути порожнім або мати специфікатор void.
Тіло функції — це послідовність оголошень і операторів, які описують визначений алгоритм. Важливим оператором тіла функції є оператор повернення в точку виклику: return [ вираз]. Оператор return має подвійне призначення. Він забезпечує негайне повернення у зовнішню функцію і може використовуватися для передачі обчисленого у функції значення. У тілі функції може бути декілька операторів return, але може не бути й жодного. В останньому випадку повернення у місце виклику буде здійснено після виконання останнього оператора тіла функції. Прототип функції
може вказуватися до виклику функції замість опису функції для того, щоб компілятор міг виконати перевірку відповідності типів аргументів і параметрів. Прототип функції за синтаксисом подібний заголовку функції, але наприкінці його ставиться крапка з комою. Параметри функції в прототипі можуть мати імена, які не є обов’язковими.
Компілятор використовує прототип функції для порівняння типів аргументів з типами параметрів. Мова Сне передбачає автоматичного перетворення типів у випадках, коли аргументи не співпадають за типами з відповідними їм параметрами. Тобто мова С+ забезпечує строгий контроль типів.
Виклик функції може бути оформлений у вигляді
ім' я _ функції (список _ аргументів);
наприклад
f(x);
якщо у функції відсутнє значення, що повертається, або у вигляді виразу
h=f(x);
якщо таке значення існує. У наведених прикладах f — це ім’я функції, х — її фактичний параметр що передається при виклику, h — ім’я змінної, якій буде присвоєно значення, отримане за допомогою оператора return.
Кількість і типи формальних аргументів повинні співпадати з кількістю і типом фактичних параметрів функції. При виклику функції фактичні параметри підставляються замість формальних аргументів.
Передача аргументів за замовчуванням
Значення формальних параметрів можуть бути задані за замовчуванням.
Зазвичай це константа, яка часто використовується при виклику функції. При цьому при описі функції перелік параметрів за замовчуванням повинен міститися в кінці списку формальних змінних функції. Нижче наведено декілька прикладів:
void function (int i, int j = 7); // коректно
void function (int i = 3, int j); //
некоректно
void function (int i, int j = 7, int k = 8); // коректно
void function (int i = 1, int j = 7, int k = 8); // коректно
void function (int i, int j = 7, int k); //
некоректно
Рекурсивні функції В інженерній практиці доводитися часто реалізовувати рекурсивні алгоритми. Така необхідність виникає при роботі з динамічними структурами даних, таких як стеки, дерева, черги, тощо. Для реалізації рекурсивних алгоритмів у С ++ передбачена можливість створення рекурсивних функцій.
Рекурсивна функція — це функція, у тілі якої здійснюється виклик цієї ж функції. Приклад 1. Програма для обчислення факторіала додатнього числа
int x = 5; void setup()
{
Serial.begin(9600);
} void loop()
{
Serial.println(fact(x)); delay (2000);
} int fact(int n)
{ int a;
if (n<0) return 0; if (n==0) return 1; a =n * fact(n-1); // виклик цієї ж функції для n-1 return a;
} Для від’ ємного аргументу факторіала не існує, тому функція в цьому випадку повертає нульове значення. Оскільки за означенням факторіал нуля дорівнює 1, тов тілі функції передбачений і цей варіант. У випадку, коли аргумент функції fact() відмінний від 0 та 1, функцію fact() викликається із зменшеним на одиницю значенням параметра, а результат множиться на значення поточного параметра. Таким чином, в результаті вбудованих викликів функцій буде отримано наступний результат
n * (n-l) * (n-2) *... * 2 * 1 * 1 Приклад 2. Обчислити периметр трикутника на площині, заданого координатами його вершин
Нехай (x1, y1), (x2, y2), (x3, y3) – координати вершин трикутника. Щоб обчислити його периметр, потрібні довжини сторін (відрізків із кінцями у вершинах) Вони обчислюються, по суті, однаково, лише з різними парами точок. Однак ці доволі громіздкі й дуже схожі вирази писати тричі не будемо, оскільки всі вони описують конкретні розв'язання такої загальної підзадачі: обчислити довжину відрізка за чотирма координатами його кінців. Довжина залежить від чотирьох величин – параметрів підзадачі. Коли розв'язується підзадача, параметри мають конкретні значення-координати – аргументи в цьому конкретному розв'язанні.

Опишемо розв'язання вказаної підзадачі у вигляді окремої функції з іменем
dist, параметрами якої є чотири дійсні величини, позначені іменами. У головній же функції напишемо три виклики функції dist, в яких укажемо координати потрібних нам точок.
// обчислення периметра трикутника double x1 = 5, y1 = 5; double x2 = 6, y2 = 6; double x3 = 7, y3 = 7; void setup()
{
Serial.begin(9600);
} void loop()
{
Serial.print("Perimeter of triangle = ");
Serial.println(dist(x1,y1,x2,y2) + dist(x1,y1,x3,y3) + dist(x2,y2,x3,y3)); delay (2000);
} double dist (double a1, double b1, double a2, double b2) // відстань від (a1,b1) до
(a2,b2)
{ return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
} Тип значень, що повертаються, указано в її заголовку перед іменем функції
(
double
). Після імені в круглих дужках оголошено параметри функції – дійсні змінні з іменами a1, b1, a2, b2. У головній функції виклики функції dist записано у виразі «
dist(x1,y1,x2,y2) + dist(x1,y1,x3,y3) + dist(x2,y2,x3,y3)»
– значення, що повертаються з викликів, додаються, і ця сума виводиться. Приклад 3. Функція для обчислення максимума з двох чисел

// обчислення максимума з двох чисел int x = 5, y = 6, z; void setup()
{

Serial.begin(9600);
} void loop()
{ z = maximum(x, y);
Serial.print("Maximum = ");
Serial.println(z); delay (2000);
} int maximum (int a, int b) // формальні аргументи
{ int c; // робоча змінна if (a >= b) c = a; else c = b; return c;
} Приклад 4. Функція для зчитування значення на аналоговому порті

//names pin int analogPin0 = A0; int analogPin1 = A1;
//variables int value; void setup()
{
Serial.begin(9600);//display rate to monitor
} void loop()
{
Serial.print("Pin 0 value: "); // print out the value you read
Serial.print(readAnalogPin(analogPin0));
Serial.print('\t');
Serial.print("Pin 1 value: "); // print out the value you read
Serial.println(readAnalogPin(analogPin1)); delay(6000);
}

//function int readAnalogPin(int analogPin){ value = analogRead(analogPin);// get a reading from the potentiometer on A0 return value;
} Схема підключення потенціометра: Приклад 5. Вивід в серійний плотер графіка декількох змінних
//names pin int analogPin0 = A0; int analogPin1 = A1;
//variables int value; void setup()
{
Serial.begin(9600);//display rate to monitor
} void loop()
{
Serial.println(readAnalogPin(analogPin0));
Serial.print(',');
Serial.println(readAnalogPin(analogPin1));
delay(300);
}
//function for pot0 int readAnalogPin(int analogPin){ value = analogRead(analogPin);// get a reading from the potentiometer on A0 return value;
}
Завдання до лабораторної роботи: У програмі повинно бути визначено та використано 3 функції:
1 – функція для розв’язку поставленого завдання (математичного обчислення за заданою формулою
2 – функція для отримання значення напруги на аналоговому порті (або функція для введення значень змінних з клавіатури);
3 – функція для виведення інформації на дисплей.
Варіант
Завдання
1
Напишіть функцію, що обчислює y за формулою. При
y=nan, замінити значенням y=0. а
x – величина напруги на аналоговому порті А. Виведіть значення a, x та y на дисплей.
2
Напишіть функцію, що повертає для заданих чисел x та y результат обчислення z = x y
x та y – величини напруг на аналогових портах А та А.
Виведіть значення x, y, z на дисплей.
3
Напишіть функцію y з дійсним параметром x, яка повертає:
-1, 0, 1, відповідно, якщо x < 2.5, x = 2.5, x > 2.5.
x – величина напруги на аналоговому порті А. Виведіть значення x та y на дисплей.

4
Напишіть функцію, яка повертає модуль заданого вектора на площині. Використайте цю функцію у програмі, яка обчислює модуль вектора, координати якого вводяться з клавіатури. Виведіть координати вектора та його модуль на дисплей.
5
Напишіть функцію, що за значеннями дійсних змінних x та
y обчислює значення z за формулою
x та y – величини напруг на аналогових портах А та А.
Виведіть значення x, y, z на дисплей.
6
Напишіть функцію, що обчислює y за формулою. При y=nan, замінити значенням y=0. а
x – величина напруги на аналоговому порті А. Виведіть значення a, x та y на дисплей.
7
Напишіть функцію z, яка за дійсними значеннями x та y
обчислює значення z = log
x
y , якщо це можливо, інакше повертає 0.
x та y – величини напруг на аналогових портах А та А.
Виведіть значення x, y, z на дисплей.
8
Напишіть функцію, яка повертає відстань між двома точками на площині Використайте цю функцію у програмі, що обчислює відстань між двома точками, координати яких вводяться з клавіатури. Виведіть координати точок та відстань між ними на дисплей.
9
Напишіть функцію, що обчислює y за формулою. При y=nan, замінити значенням y=0.
x та z – величини напруг на аналогових портах А та А.
Виведіть значення x, z, y на дисплей.
10
Напишіть функцію, що за заданими координатами точки визначає, в якому квадранті вона знаходиться. Координати точки x та y вводяться з клавіатури. Виведіть значення x, y та номер квадранту на дисплей.
11
Напишіть функцію, що за заданими відрізками з довжинами a, b, c, d визначає, чи утворюють вони ромб. a, b, c,
d вводяться з клавіатури. Виведіть значення a, b, c, d та
інформацію, чи утворюють відрізки ромб на дисплей.

12
Напишіть функцію для обчислення площі кола S для заданого радіуса R.
R – величина напруги на аналоговому порті А. Виведіть значення R та S на дисплей.
13
Напишіть функцію знаходження суми цифр числа.
Використайте цю функцію у програмі, яка виводить суми цифр введених з клавіатури чисел на дисплей.
14
Напишіть функцію, що обчислює площу прямокутного трикутника S за довжинами двох його катетів a тата величини напруг на аналогових портах А та А.
Виведіть значення a, b, S на дисплей.
15
Напишіть програму пошуку найменшого з пяти чисел, використовуючи функцію пошуку мінімального з двох чисел. Числа вводяться з клавіатури. Виведіть результат на LCD- дисплей.
Контрольні питання
1. Що таке функція?
2. З чого складається опис функції?
3. Що таке тип результату
4. Що таке тіло функції?
Зміст звіту
1. Титульна сторінка, що повинна містити номер, тему та варіант лабораторної роботи, а також групу, прізвище та ім’я студента, що виконав дану роботу.
2. Мета роботи.
3. Завдання до лабораторної роботи.
4. Схема, тексти програм з коментарями.
5. Відповіді на контрольні питання.
6. Висновки.

скачати

© Усі права захищені
написати до нас