Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h> // ввід - вивід
- #include <stdlib.h> //для виділення пам'яті динамічно
- #include <math.h> // для функцій (тригоном.)
- typedef struct{ //структура для значень функції
- double x; //аргумент
- double y; //значення
- } Data; // тайпдеф визначає її коротку назву для використання
- double extrapolate(Data* d, double x) // основна ф-ція
- {
- double y;
- y = d[0].y
- + (x - d[0].x)
- / (d[1].x - d[0].x)
- * (d[1].y - d[0].y); // реалізація ф-ції лінійної
- //екстраполяції
- return y; // повертає отримане значення
- }
- double yx(double x){
- return x; // для ф-ціх у = х
- }
- double sqr(double x){
- return pow(x, 2); // для функції :х квадрат:
- }
- double cot(double x){
- return 1./tan(x); //для котангенса
- }
- int main(void) {
- Data fData[2]; //де будуть зберігатись 2 точки, які використовуються для обрахунку
- int useEnteredData = 0; // змінна, щоб тримати вибір про введення даних
- // 0 - автоматичні дані,
- // 1 - свої
- printf("Do you want to enter you own data of form it automatically?\n1: own\n2: auto\n");
- if (getchar() - '0' == 1){ // якщо ввів 1
- useEnteredData = 1; // присвоїти 1
- }
- else{
- useEnteredData = 0; // в іншому випадку 0
- }
- getchar(); // зчитати '\n' після попереднбого введення, щоб далі були коректні дані
- double (*f)(double);
- printf("Choose function:\n1: sin\n2: cos\n3: tg\n4: ctg\n\
- 5: e^x\n6: log\n7: x^2\n"); // вивести пов про вибір
- int c = getchar() - '0';
- //в залежності від вводу присвоїти вказіквнику на функцію адрес відповідної функції
- switch(c){
- case 1:
- f = &sin;
- break;
- case 2:
- f = &cos;
- break;
- case 3:
- f = &tan;
- break;
- case 4:
- f = &cot;
- break;
- case 5:
- f = &exp;
- break;
- case 6:
- f = &log;
- break;
- case 7:
- f = &sqr;
- break;
- default: // по замовчуванню у = х
- f = &yx;
- }
- getchar();
- double start, end, step;
- printf("Enter start, end, step: ");
- scanf("%lf %lf %lf", &start, &end, &step);
- // на проміжку, вказаному у циклі ітерувати
- for (double val = start; val < end; val+=step){ // boundaries are changable
- if (useEnteredData == 0){ // якщо режим зчитування з клав.
- fData[0].x = val - 2 * step; // зчитати х1
- fData[1].x = val - 1 * step; // х2
- fData[0].y = f(val - 2); // отримати значення ф-ції в цих точках
- fData[1].y = f(val - 1); // та додати до даних
- }
- else{
- printf("Value is %.2lf. Enter x1, x2: ", val); // в іншому випадку згенерувати дані
- scanf("%lf %lf", &fData[0].x, &fData[1].x);
- fData[0].y = f(fData[0].x);
- fData[1].y = f(fData[1].x);
- }
- //вивести результати
- printf("f(%.2lf) = %.2lf || %.2lf\n", val, extrapolate(fData, val), f(val));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement