Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Алгоритмізація та програмування 1: Базові концепції програмування
ЗВІТ
до лабораторної роботи № 5
«Рекурсивний виклик функції»
Варіант 7
Дата «24» листопада 2021
Завдання:
1. Ознайомитись з рекурсивним викликом функції.
2. Розробити алгоритмом розрахунку значення функції за її розкладенням у ряд за умови отримання результату з заданою точністю. Врахувати діапазон дозволених значень для змінної x.
3. У якості індивідуального завдання необхідно написати програмний код, що реалізує алгоритм розрахунку значень функцій за їх розкладенням в ряд із заданою користувачем точністю.
/
Короткий опис рішення
На початку програми створено функцію для обчислення факторіалу.
Далі у методі main реалізовано введення значень функції з клавіатури. Нижче градуси переводяться у радіани.
Далі створюються змінні x1, y1 та q1, вони обчислюються за допомогою бібліотечних формул косинуса та синуса( косинуси та синуси вставляються в формули, що зазначені у завданні).
Нижче створено цикл, який обраховує значення косинуса та синуса за допомогою їх формули розкладу в ряд. Точність обрахунку залежить від того, наскільки велике значення N.
/
Далі створюються змінні x2, y2 та q2, вони вже обраховуються використовуючи нові значення косинуса та синуса.
Далі створено змінні, які обраховують різницю між двома значеннями x, y, q. Нижче реалізовано вивід результатів програми.
У випадку, якщо введене значення градусів не відповідає необхідним умовам, програма видає відповідне повідомлення.
Блок-схема
/
/
Результати роботи
/
/
Висновки: було створено програму, яка обчислює значення геометричної фігури кардіоїди. Це було реалізовано двома шляхами: завдяки бібліотечним значенням косинуса та синуса, а також обрахувавши значення цих тригонометричних функцій завдяки формулам розкладення в ряд.
Код програми:
https://replit.com/join/ajqisgqqch-vladsosiedskii
#include <stdio.h>
#include <math.h>
#define M_PI 3.14159265358979323846
double factorial(double n){
if(n <= 1.0){
return 1.0;
}
else{
return (n*factorial(n-1));
}
}
int main(void) {
double fi, a, N, x2 = 0, y2 = 0, q2 = 0, cosr=0, sinr=0;
printf("Введіть значення градусів: ");
scanf("%lf", &fi);
if(fi<=360 && fi>=0){
printf("Введіть значення коефіцієнту a: ");
scanf("%lf", &a);
printf("Введіть значення N(від нього залежить точність обчислення функції): ");
scanf("%lf", &N);
double r = (fi/180)*M_PI;
printf("У радіанах: %lf\n", r);
double x1 = a*cos(r)*(1+cos(r));
double y1 = a*sin(r)*(1+cos(r));
double q1 = a*(1+cos(r));
for(int k = 0; k < N; k++){
cosr = cosr + (pow(-1,k) * (pow(r, 2 * k)/factorial(2 * k)));
sinr = sinr + (pow(-1, k)*(pow(r, 2 * k + 1)/(factorial(2 * k + 1))));
}
x2=a*cosr*(1+cosr);
y2=a*sinr*(1+cosr);
q2=a*(1+cosr);
double ex = x2 - x1;
double ey = y2 - y1;
double eq = q2 - q1;
printf("\n\nx1 = %.15lf\tx2 = %.15lf\ny1 = %.15lf\ty2 = %.15lf\nq1 = %.15lf\tq2 = %.15lf\n", x1,x2,y1,y2,q1,q2);
printf("\nex = %.15lf\ney = %.15lf\neq = %.15lf", ex,ey,eq);
}
else{
printf("Значення градусів повинно бути більше 0 та менше 360");
}
return 0;
}