Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Алгоритмізація та програмування 1: Базові концепції програмування
ЗВІТ
до лабораторної роботи № 5
«Рекурсивний виклик функції»
Варіант 15
Дата «23» листопада 2021
Завдання на лабораторну роботу:
1. Ознайомитись з рекурсивним викликом функції.2. Розробити алгоритмом розрахунку значення функції за її розкладенням у ряд за умови отримання результату з заданою точністю. Врахувати діапазон дозволених значень для змінної x.3. У якості індивідуального завдання необхідно написати програмний код, що реалізує алгоритм розрахунку значень функцій за їх розкладенням в ряд із заданою користувачем точністю.Завдання обрати згідно свого варіанта (див. Додаток 5).
Завдання варіанту 15 у додатку 5:
/
РЕЗУЛЬТАТ РОБОТИ ПОТРІБНО:1. Роздрукувати (вивести на екран) точне значення функції, її приблизне значення та точність розрахунку.2. Відкритий для редагування програмний код розмістити на сайті https://replit.com/ (посилання через кнопку «+ Share»).3. Звіт до комп’ютерного практикуму № 5 додати в свій Клас на ресурсі https://classroom.google.com/.
Теоретичні відомості та хід виконання завдання:
Для виконання даної лабораторної роботи №5 був використаний сайт replit.com . На цьому сайтів був написаний код програми на мові С. Саму програму можна переглянути за посиланням:
https://replit.com/join/wobhxkwjyc-tr-15fundamient
Для виконання поданого завдання спочатку було написано функцію factorial(), для обрахунку факторіала. На початку програми користувачем вводиться точність(кількість елементів рядку(N)) та кут у градусах(Xd), який пізніше переводиться у радіани(Xr).
Наступним кроком є створення власних змінних sin та cos за допомогою обчислення суми ряду. Для цього був використаний цикл for() і формули, дані у завданні до роботи:
/
Далі використовуючи створені змінні та формули дані у завданні ми обраховуємо потрібні нам значення x2 та y2.
Після цього, створюємо змінні x1 та y1, які обраховуємо за допомогою даних формул і бібліотеки math.h , у яку вже влаштовані функції sin() та cos(). І обраховуємо помилку вираховуючи різницю між x1 та x2, y1 та y2 (значеннями отриманими після обрахунку за допомогою суми ряду та отриманими після обрахунку за допомогою бібліотеки)
Блок схема програми:
/
Скріншот програми:
/
/
Результат обрахунків програми:
Для N = 3:
/
Для N=10:
/
Висновок:
Під час виконання даної лабораторної роботи було удосконалено навички роботи з рекурсійними функціями. Набуто досвід з написання коду для обчислення суми ряду. Також було розроблено програмний код, що реалізує розрахунок значень функції за їх розкладенням в ряд із заданою користувачем точністю. Цей алгоритм було перевірено через різницю із функціями даними в математичній бібліотеці.
Посилання на Repl:
https://replit.com/join/wobhxkwjyc-tr-15fundamient
Копія коду:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define M_PI 3.14159265358979323846
double factorial(double number);
int main(){
// к-сть елементів ряду
int N;
printf("Введіть потрібну к-сть елементів ряду(чим більшою є к-сть елементів ряду, тим більшою є точність розрахунків):\n");
scanf("%d", &N);
double Xr, Xd;
printf("Введіть кут(у градусах):\n");
scanf("%lf", &Xd);
// перевод в радіани
Xr = Xd * M_PI / 180.0;
printf("Значення в радіанах:\nXr = %lf\n\n", Xr);
// Значення будь-яке, тому що за умовою ОДЗ: (from -infinity to +infinity)
// Cтворення змінних cos та sin за допомогою суми ряду
double sinFi , cosFi;
for(int i = 0; i < N; i++) {
sinFi += pow(-1, i) * pow(Xr, 2*i+1)/factorial(2*i+1);
cosFi += pow(-1, i) * pow(Xr, 2*i)/factorial(2*i);
}
printf("Значення sin та cos, обраховані за допомогою суми ряду:\nsinFi = %lf\t cosFi = %lf\n\n",sinFi, cosFi);
//Введення радіуса кола у програму
double k;
printf("Введіть потрібний радіус кола:\n");
scanf("%lf", &k);
double x1, y1, x2, y2;
//Обчислення х та у за допомогою математичної бібліотеки
x1 = k * (cos(Xr) + sin(Xr));
y1 = k * (sin(Xr) - cos(Xr));
// Обчислення х та у за допомогою суми ряду
x2 = k * (cosFi + sinFi);
y2 = k * (sinFi - cosFi);
// Обрахунок похибки в обрахунках
double ex, ey;
ex = fabs(x2-x1);
ey = fabs(y2-y1);
printf("\nРезультати виконання програми:\nx1 = %lf,\ty1 = %lf\n", x1, y1);
printf("\nРезультати виконання програми:\nx2 = %lf,\ty2 = %lf\n", x2, y2);
printf("\nПохибка обчислення значень:\nex = %lf,\tey = %lf", ex, ey);
}
// Метод для обрахування факторіалу
double factorial(double number) {
if(number <= 0)
return (1.0);
else
return (number * factorial(number - 1));
}