Advertisement
Sailein

library polynoms

Apr 16th, 2018
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.38 KB | None | 0 0
  1. /
  2. // Created by Sailein on 18.04.2018.
  3. //
  4.  
  5. #ifndef DOKKAEBI_SNAKE_H
  6. #define DOKKAEBI_SNAKE_H
  7. #include <stddef.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <stddef.h>
  11. #include <string.h>
  12. #include <mm_malloc.h>
  13. #include <math.h>
  14. typedef struct Polynom
  15. {
  16.     int max; // макс степень многочлена
  17.     size_t size; // размер элемента в байтах
  18.     void* content; // сам элемент
  19. } PM;
  20. // >>>technical solutions<<< //
  21. PM* Create (int, size_t); //создание целочмсленного массива
  22. void Enter (PM*, void*, int); //запись элемента в массив
  23. void Get (PM*, int, void*); // считывание элемента из массива
  24. void Free (PM*); // освобождение памяти
  25. void Sum_int (void*, void*, void*); // сумма интовых числел - без привязки к массиву
  26. void Sum_float (void*, void*, void*); // сумма флоутовых числел - без привязки к массиву
  27. void Mul_int (void*, void*, void*); //произведение интовых числел - без привязки к массиву
  28. void Mul_float (void*, void*, void*); //произведение флоутовых числел - без привязки к массиву
  29. void Sum (void (*sum) (void* , void* , void* ), PM*, PM*, PM*, int); //сумма коэффициентов массива
  30. void Smart (void (*sum) (void*, void*, void*), PM*, void*, int); // прибавление к элементу массива числа в помощь умножению
  31. PM* Max (PM* , PM*); // макс из 2х элементов
  32. PM* Min (PM* , PM* ); // мин из 2х элементов
  33. // >>>operations<<< //
  34. PM* Summa (void (*sum)(void*, void*, void*) ,PM*, PM*, PM*); //сумма многочленов
  35. PM* Mul (void (*mul) (void*, void*, void*), void(*sum) (void*, void*, void*), PM* p1, PM* p2, PM* p3); // произведение многочленов
  36. PM* Skalar (void (*mul) (void*, void*, void*), PM* p, void* A); // умножение на скаляр
  37. void* Subst (void (*mul) (void*, void*, void*), void(*sum) (void*, void*, void*), PM*, void*, void*); // подстановка х, на выходе некое число нужного типа
  38. PM* Composition (void (*mul) (void*, void*, void*), void(*sum) (void*, void*, void*), PM*, PM*, PM*);
  39. // >>>interface<<< //
  40. void Printer (PM* , void(*f)(PM*, int));
  41. void Scanner (PM* , void(*f)(PM*, int), size_t);
  42. void Scan_int(PM* , int );
  43. void Scan_float(PM* , int );
  44. void Print_int(PM* , int );
  45. void Print_float(PM* , int );
  46. #endif //DOKKAEBI_SNAKE_H
  47.  
  48.  
  49. #include "Snake.h"
  50.  
  51.  
  52. PM* Create (int n, size_t size) // n - макс степень многочлена, ф-ция создания нулевого массива
  53. {
  54.     PM* p = (PM*) malloc (sizeof(PM));
  55.     p -> max = n;
  56.     p -> size = size; // всегда 4
  57.     p -> content = calloc ((size_t) p->max, p->size);
  58.     return p;
  59. }
  60. void Enter (PM* array, void* el, int k) //это наш set, array - массив, el - вводимый с клавы элемент, k - степень х при коэффициенте
  61. {
  62.     memcpy (array -> content + k * array -> size, el, array -> size); // char - 1 байт
  63. }
  64. void Get (PM* p1, int k, void* el)
  65. {
  66.     memcpy (el, p1 ->content + k * p1 -> size, p1 -> size);
  67. }
  68. void Free (PM* array) // освобождение памяти
  69. {
  70.     free(array->content);
  71.     free(array);
  72. }
  73. void Sum_int (void* first, void* second, void* third) // сумма интовых числел - без привязки к массиву
  74. {
  75.     *((int*) third) = *((int*) first) + *((int*) second);
  76. }
  77. void Sum_float (void* first, void* second, void* third) //сумма флоутовых чисел без привязки к массиву
  78. {
  79.     *((float*) third) = *((float*) first) + *((float*) second);
  80. }
  81. void Mul_int (void* first, void* second, void* third) //произведение интовых числел - без привязки к массиву
  82. {
  83.     *((int*)first) = *((int*)second) * (*((int*)third));
  84. }
  85. void Mul_float (void* first, void* second, void* third) //произведение флоутовых числел - без привязки к массиву
  86. {
  87.     *((float*)first) = *((float*)second) * (*((float*)third));
  88. }
  89. void Sum (void (*sum) (void* , void* , void* ), PM* p1, PM* p2, PM* p3, int i) //сумма коэффициентов массива
  90. {
  91.     void* c1 = malloc(p1 -> size);
  92.     void* c2 = malloc(p2 -> size);
  93.     void* cr = malloc(p3 ->size);
  94.     Get (p1, i, c1); //вытащили 1 коэффициент
  95.     Get (p2, i, c2); //вытащили второй
  96.     // Get (p3, i, cr); //вытащили 0 из третьего массива
  97.     sum (c1, c2, cr); // сложили их некой функцией с таким синтаксисом, которую мы в интерфейсе конткретно дадим
  98.     Enter (p3, cr, i); // записали результатин
  99.     free(c1);
  100.     free(c2);
  101.     free(cr);
  102. }
  103. void Smart (void (*sum) (void*, void*, void*), PM* array, void* el, int k) // array - массив (мешки с картохой), el - элемент который надо добавить (картоха новая), k - степень (номер мешка)
  104. {
  105.     void* coeff = malloc(array -> size); //конкретный мешок
  106.     Get(array, k, coeff); //взяли мешок с номером k
  107.     sum (coeff, el , coeff);
  108.     Enter(array, coeff, k); //поставили мешок на место k
  109.     free(coeff);
  110. }
  111. PM* Max (PM* p1, PM* p2) // многочлен макс степени
  112. {
  113.     if (p1 -> max > p2 -> max)
  114.     {
  115.         return p1;
  116.     }
  117.     else
  118.     {
  119.         return p2;
  120.     }
  121. }
  122.  
  123. PM* Min (PM* p1, PM* p2) // многочлен мин степени
  124. {
  125.     if (p1-> max > p2 -> max)
  126.     {
  127.         return p2;
  128.     }
  129.     else
  130.     {
  131.         return p1;
  132.     }
  133. }
  134. PM* Summa (void (*sum)(void*, void*, void*) ,PM* p1, PM* p2, PM* p3) // сумма  многочленов
  135. {
  136.     PM* lion = Max(p1, p2);
  137.     PM* finka = Min(p1, p2);
  138.     int power = lion -> max;
  139.     int lower = finka ->max;
  140.     for (int i = 0; i <= lower; ++i) // сумма коэффициентов до меньшей степени
  141.     {
  142.         Sum (sum, p1, p2, p3, i);
  143.     }
  144.     for (int i = lower + 1; i <= power; ++i) // проверить тестами min ,не ясно брать + 1 или +2
  145.     {
  146.         Sum (sum, lion, p3, p3, i);
  147.     }
  148.     return p3;
  149. }
  150. PM* Mul (void (*mul) (void*, void*, void*), void(*sum) (void*, void*, void*), PM* p1, PM* p2, PM* p3) // произведение многочленов
  151. {
  152.     void* c1 = malloc(p1->size);
  153.     void* c2 = malloc(p2 ->size);
  154.     void* mcr = malloc(p3 ->size);
  155.     for (int j = 0; j <= p1->max; ++j) // меньше или меньше/равно? тесты?
  156.     {
  157.         Get(p1, j, c1);
  158.         for (int i = 0; i <= p2->max; ++i)
  159.         {
  160.             Get(p2, i, c2);
  161.             mul (c1, c2, mcr);
  162.             int m = i + j;
  163.             Smart (sum, p3, mcr, m);
  164.         }
  165.     }
  166.     free(c1);
  167.     free(c2);
  168.     free(mcr);
  169.     return p3;
  170. }
  171. PM* Skalar (void (*mul) (void*, void*, void*), PM* p, void* A) // умножение на скаляр
  172. {
  173.     void* coeff = malloc(p ->size);
  174.     for (int i = 0; i <= p->max; ++i)
  175.     {
  176.         Get(p, i, coeff);
  177.         mul (coeff, A, coeff);
  178.         Enter(p, &coeff, i);
  179.     }
  180.     free(coeff);
  181.     return p;
  182. }
  183. void* Subst (void (*mul) (void*, void*, void*), void(*sum) (void*, void*, void*), PM* p, void* x, void* res) // подстановка х, на выходе некое число нужного типа
  184. {
  185.     void* coeff = malloc(p->size);
  186.     res = calloc ((size_t) p->max, p->size);
  187.     for (int i = 0; i <= p->max; ++i)
  188.     {
  189.         Get(p, i, coeff);
  190.         for (int j = 1; j <= i; ++j) // для 0 степени цикла нэ будэт
  191.         {
  192.             mul (coeff, coeff , coeff);
  193.         }
  194.         sum(res, coeff, res);
  195.     }
  196.     free(coeff);
  197.     return res;
  198. }
  199. PM* Composition (void (*mul) (void*, void*, void*), void(*sum) (void*, void*, void*), PM* p1, PM* p2, PM* p3) // подстановка р2 в р1
  200. {
  201.     void* coeff  = malloc(p3 ->size);
  202.     void* first = malloc(p1->size);
  203.     void* second = malloc(p2->size);
  204.     int f1= 0;
  205.     Get(p1, f1, first); // 0 степень мы обработали вручную, просто вписали коэффициент в результат
  206.     Smart(sum, p3, first, f1); // вписали коэфф в ответ
  207.     Get(p1, f1 + 1, second); // взяли второй коэфф-т
  208.     Summa(sum, p3, Skalar(mul,p2, second), p3); // сложили ответ с р2 умнож. на второй коэфф-т
  209.     for (int j = 2; j <= p1->max; ++j) // с первого многочлена берем степень и коэффициент
  210.     {
  211.         Get(p1, j, coeff); //взяли коэффициент
  212.         PM* p = Create(j, sizeof(p3->size)); // выделяю и чищу на одном уровне вложенности
  213.         Summa(sum, p, p2, p); //это задет начальное значение p = p2. а дальше мы его уже множим.
  214.         for (int i = 2; i <= j; ++i) // возведение многочлена p2 в текущую степень j, начиная со второй степени
  215.         {
  216.             Mul(mul, sum, p, p2, p); // в цикле умножаем многочлен изначально равный р2 i раз
  217.         }
  218.         Skalar(mul, p, coeff); // умножим возведенный в степень j многочлен на текущий коэффициент;
  219.         p3 = Summa (sum, p, p3, p3); //сложим умноженный и возведнный р2 с финальным
  220.         Free(p);
  221.     }
  222.     free(coeff);
  223.     free(first);
  224.     free(second);
  225.     return p3;
  226. }
  227. void Printer (PM* p, void(*f)(PM*, int)) //общий вывод на экран
  228. {
  229.     int i;
  230.     for (i = p->max; i >= 0; --i)
  231.     {
  232.         f(p, i);
  233.         if (i != 0)
  234.             printf(" + ");
  235.     }
  236.     printf("\n");
  237. }
  238. void Scanner (PM* p, void(*f)(PM*, int), size_t memory) // общий считыватель
  239. {
  240.     printf("Максимальная степень многочлена : ");
  241.     scanf("%d", &p->max);
  242.     Create(p ->max, sizeof(memory));
  243.     while (p->max < 0)
  244.     {
  245.         printf("ошибка\n");
  246.         scanf("%d", &p->max);
  247.     }
  248.     p->size = memory;
  249.     p->content = malloc(p->size*(p->max + 1)); // how to free it?
  250.     printf("Коэффициенты :\n");
  251.     for (int i = 0; i <= p->max; i++)
  252.     {
  253.         printf("x^%d  ", i);
  254.         f(p, i);
  255.     }
  256. }
  257. void Scan_int(PM* p, int i) // запись i-го элемента в массив
  258. {
  259.     scanf("%d", (int*) p->content);
  260.     Enter(p, p->content, i);
  261. }
  262. void Scan_float(PM* p, int i) // запись i-го элемента в массив
  263. {
  264.     scanf("%f", (float*)p->content);
  265.     Enter(p, p->content , i);
  266. }
  267. void Print_int(PM* p, int i) //считываение i-го элемента из массива
  268. {
  269.     printf("%d*x^%d", *(int*)p->content, i);
  270.     Get(p,i,p->content);
  271. }
  272. void Print_float(PM* p, int i) //считываение i-го элемента из массива
  273. {
  274.     printf("%f*x^%d", *(float*)p->content, i);
  275.     Get(p,i,p->content);
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement