Advertisement
Nikmosi

pz1 5b v3

Mar 13th, 2021 (edited)
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. /*
  2. 2. Алгоритм решения задачи
  3.  
  4. функция Input(указатель на указатель l, указатель на имя файла n)
  5.    открыть файл n
  6.    если доступ к файлу не получен:
  7.       вернуть EXIT_FAILURE
  8.    создание первого элемента
  9.    пока не достугнут конец файла:
  10.       создание и запись нового элемента
  11.    закрыть файл n
  12.    вернуть EXIT_SUCCESS
  13.  
  14. функция GetResult(указатель l)
  15.    Переменная для хранения результата r
  16.    Создание указателя последний элемент списка e
  17.    Вычислять r = r * (Xi + X(n - i + 1))*(X(n - i + 1) + Xi) пока: (n - i + 1) не равен i и e на равен l -> предыдущий элемент
  18.    Если после вычисления e равен l:
  19.       умножить r на 2 и на значения элемента на который указывает l
  20.    вернуть r
  21.  
  22. процедура main()
  23.    объявление указателя на список l
  24.    если Input(&l, "l.txt") не равен EXIT_FAILURE:
  25.       вывести в консоль значение GetResult(l)
  26.    вернуть 0
  27. */
  28.  
  29.  
  30. #include <cstdio>
  31. #include <stdlib.h>
  32.  
  33. struct list
  34. {
  35.    double v{};
  36.    list* n = NULL;
  37.    list* p = NULL;
  38. };
  39.  
  40.  
  41. /// Формирует list из файла l.txt
  42. int Input(list** l, const char* n);
  43.  
  44. /// Вычисляет значение (X1 + Xn)(X2 + X(n - 1))...(X(n - 1) + X2)(Xn + X1)
  45. double GetResult(list* l);
  46.  
  47. int main()
  48. {
  49.    list* l;
  50.    if (Input(&l, "l.txt") != EXIT_FAILURE)
  51.       printf_s("%s: %lf%c", "result", GetResult(l), '\n');
  52.    return 0;
  53. }
  54.  
  55. int Input(list **l, const char* n)
  56. {
  57.    FILE* f;
  58.    fopen_s(&f, n, "r");
  59.  
  60.    if (f == NULL)
  61.       return EXIT_FAILURE;
  62.  
  63.    (*l) = new list;
  64.    list *p = *l; // создание первого элемента
  65.    p->n = p->p = p;  // настройка первого элемента
  66.    fscanf_s(f, "%lf", &p->v); // чтение и запись первого элемента
  67.  
  68.    double d;
  69.    while (fscanf_s(f, "%lf", &d) != EOF) // чтение элемента
  70.    {  //создание и запись элемента
  71.       (p->n = new list)->v = d;
  72.       p->n->n = *l;
  73.       p->n->p = p;
  74.       (*l)->p = p->n;
  75.       p = p->n;
  76.    }
  77.  
  78.    fclose(f);
  79.  
  80.    return EXIT_SUCCESS;
  81. }
  82.  
  83. double GetResult(list* l)
  84. {
  85.    double r = 1;
  86.  
  87.    list* e = l->p;
  88.    do
  89.    {  // обрабатка произведения (Xi + X(n - i + 1))(X(n - i + 1) + Xi)
  90.       r *= (l->v + e->v) * (l->v + e->v);
  91.    } while ((e = e->p) != (l = l->n) && (l->p) != e);
  92.  
  93.    if (e == l) // обработка случая когда кол-во элементов не четно
  94.       r *= 2 * l->v;
  95.  
  96.    return r;
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement