Advertisement
damn_ghad

Untitled

Dec 11th, 2019
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.43 KB | None | 0 0
  1. #include <stdio.h> // ввід - вивід
  2. #include <stdlib.h> //для виділення пам'яті динамічно
  3. #include <math.h> // для функцій (тригоном.)
  4.  
  5. typedef struct{ //структура для значень функції
  6.   double x; //аргумент
  7.   double y; //значення
  8. } Data; // тайпдеф визначає її коротку назву для використання
  9.  
  10. double extrapolate(Data* d, double x) // основна ф-ція
  11. {
  12.     double y;
  13.     y = d[0].y
  14.         + (x - d[0].x)
  15.               / (d[1].x - d[0].x)
  16.               * (d[1].y - d[0].y);  // реалізація ф-ції лінійної
  17.                                     //екстраполяції
  18.  
  19.     return y; // повертає отримане значення
  20. }
  21.  
  22. double yx(double x){
  23.   return x; // для ф-ціх у = х
  24. }
  25.  
  26. double sqr(double x){
  27.   return pow(x, 2); // для функції :х квадрат:
  28. }
  29.  
  30. double cot(double x){
  31.   return 1./tan(x); //для котангенса
  32. }
  33.  
  34. int main(void) {
  35.   Data fData[2]; //де будуть зберігатись 2 точки, які використовуються для обрахунку
  36.  
  37.   int useEnteredData = 0; // змінна, щоб тримати вибір про введення даних
  38.                         // 0 - автоматичні дані,
  39.                         // 1 - свої
  40.   printf("Do you want to enter you own data of form it automatically?\n1: own\n2: auto\n");
  41.   if (getchar() - '0' == 1){ // якщо ввів 1
  42.     useEnteredData = 1; // присвоїти 1
  43.   }
  44.   else{
  45.     useEnteredData = 0; // в іншому випадку 0
  46.   }
  47.  
  48.   getchar(); // зчитати '\n' після попереднбого введення, щоб далі були коректні дані
  49.  
  50.   double (*f)(double);
  51.   printf("Choose function:\n1: sin\n2: cos\n3: tg\n4: ctg\n\
  52.  5: e^x\n6: log\n7: x^2\n"); // вивести пов про вибір
  53.   int c = getchar() - '0';
  54.   //в залежності від вводу присвоїти вказіквнику на функцію адрес відповідної функції
  55.   switch(c){
  56.     case 1:
  57.     f = &sin;
  58.     break;
  59.     case 2:
  60.     f = &cos;
  61.     break;
  62.     case 3:
  63.     f = &tan;
  64.     break;
  65.     case 4:
  66.     f = &cot;
  67.     break;
  68.     case 5:
  69.     f = &exp;
  70.     break;
  71.     case 6:
  72.     f = &log;
  73.     break;
  74.     case 7:
  75.     f = &sqr;
  76.     break;
  77.     default: // по замовчуванню у = х
  78.     f = &yx;
  79.   }
  80.  
  81.   getchar();
  82.  
  83.   double start, end, step;
  84.   printf("Enter start, end, step: ");
  85.   scanf("%lf %lf %lf", &start, &end, &step);
  86.  
  87.   // на проміжку, вказаному у циклі ітерувати
  88.   for (double val = start; val < end; val+=step){ // boundaries are changable
  89.     if (useEnteredData == 0){ // якщо режим зчитування з клав.
  90.       fData[0].x = val - 2 * step; // зчитати х1
  91.       fData[1].x = val - 1 * step; // х2
  92.       fData[0].y = f(val - 2); // отримати значення ф-ції в цих точках
  93.       fData[1].y = f(val - 1); // та додати до даних
  94.     }
  95.     else{
  96.       printf("Value is %.2lf. Enter x1, x2: ", val); // в іншому випадку згенерувати дані
  97.       scanf("%lf %lf", &fData[0].x, &fData[1].x);
  98.       fData[0].y = f(fData[0].x);
  99.       fData[1].y = f(fData[1].x);
  100.     }
  101.     //вивести результати
  102.     printf("f(%.2lf) = %.2lf || %.2lf\n", val, extrapolate(fData, val), f(val));
  103.   }
  104.  
  105.   return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement