Krudener

Untitled

Oct 1st, 2019
546
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define ERROR -1
  6. #define OK 0
  7. #define CORRECT_SCAN 1
  8. #define QUANTITY_OF_MU2 3
  9. #define MIN_SIZE_OF_N 1
  10. #define MIN_SIZE_OF_P 0
  11.  
  12. void task_one(double *array, double **array_end, double mu)
  13. {
  14.     double *ptr = array;
  15.     int flag = 0;
  16.     double temp;
  17.     while (ptr < *array_end)
  18.     {
  19.         if (fabs(*ptr) < fabs(mu))
  20.         {
  21.             flag = 1;
  22.             /*printf("task done %lf %lf \n ", *ptr, mu);*/
  23.             double *swap_ptr = ptr;
  24.             while (swap_ptr < *array_end)
  25.             {
  26.                 temp = *(swap_ptr + 1);
  27.                 *(swap_ptr + 1) = *swap_ptr;
  28.                 *swap_ptr = temp;
  29.                 swap_ptr++;
  30.             }
  31.             --(*array_end);
  32.         }
  33.         if (flag == 0)
  34.         {
  35.             ptr++;
  36.         }
  37.         else
  38.         { flag = 0; }
  39.     }
  40. }
  41.  
  42. void task_two(double *array, double *array_end, double mu_2, int p)
  43. {
  44.     double *ptr = (array_end - QUANTITY_OF_MU2);
  45.     *(array_end - 1) = mu_2;
  46.     double temp;
  47.     double temp_2;
  48.     double old_ptr;
  49.     while (ptr > array)
  50.     {
  51.         *ptr = *(ptr - 1);
  52.         ptr--;
  53.     }
  54.     *(array) = mu_2;
  55.     ptr = array;
  56.     int position = 0;
  57.     while (ptr < array_end)
  58.     {
  59.         if (position == p)
  60.         {
  61.             old_ptr = *ptr;
  62.             *ptr = mu_2;
  63.             temp = *(ptr + 1);
  64.             *(ptr + 1) = old_ptr;
  65.             ptr++;
  66.             while (ptr < (array_end - 2))
  67.             {
  68.                 temp_2 = *(ptr + 1);
  69.                 *(ptr + 1) = temp;
  70.                 temp = temp_2;
  71.                 ptr++;
  72.             }
  73.             break;
  74.         }
  75.         ptr++;
  76.         position++;
  77.     }
  78. }
  79.  
  80. double average_cubic_modules(double *array, double *array_end)
  81. {
  82.     double mu = 0;
  83.     int length = array_end - array;
  84.     for (double *ptr = array; ptr < array_end - 1; ptr++)
  85.     {
  86.         mu += pow(fabs(*ptr), 3) / length;
  87.         /*printf("mu = %lf \n", mu);*/
  88.     }
  89.     mu = cbrt(mu);
  90.     return mu;
  91. }
  92.  
  93. double min_element_of_array(double *array, double *array_end)
  94. {
  95.     double mu_2 = *array;
  96.     for (double *ptr = array; ptr < array_end; ptr++)
  97.     {
  98.         if (*ptr < mu_2)
  99.         {
  100.             mu_2 = *ptr;
  101.         }
  102.     }
  103.     return mu_2;
  104. }
  105.  
  106. int input_array(double *array, double *array_end)
  107. {
  108.     printf("Please input array elements:");
  109.     if (array)
  110.     {
  111.         for (double *ptr = array; ptr < array_end; ptr++)
  112.         {
  113.             if (scanf("%lf", ptr) != CORRECT_SCAN)
  114.             {
  115.                 return ERROR;
  116.             }
  117.         }
  118.     }
  119.     else
  120.     {
  121.         return ERROR;
  122.     }
  123.     return OK;
  124. }
  125.  
  126. int main()
  127. {
  128.     printf("Please input n:");
  129.     int n;
  130.     if ((scanf("%d", &n) != CORRECT_SCAN) || ((n < MIN_SIZE_OF_N)))
  131.     {
  132.         return ERROR;
  133.     }
  134.  
  135.     double *array = malloc(n * sizeof(double));
  136.     if (array == NULL)
  137.     {
  138.         free(array);
  139.         return ERROR;
  140.     }
  141.     double *array_end = array + n;
  142.     if (input_array(array, array_end) == ERROR)
  143.     {
  144.         free(array);
  145.         return ERROR;
  146.     }
  147.  
  148.     double mu = average_cubic_modules(array, array_end);
  149.     /*printf("mu = %lf \n", mu);*/
  150.     task_one(array, &array_end, mu);
  151.     printf("\n");
  152.     /*for (double *ptr = array; ptr < array_end; ptr++)
  153.     {
  154.         printf("%lf ", *ptr);
  155.     }*/
  156.  
  157.     double mu_2 = min_element_of_array(array, array_end);
  158.     /*printf("\n");
  159.     printf("mu2 = %lf \n", mu_2);*/
  160.  
  161.     printf("Please input p:");
  162.     int p;
  163.     if ((scanf("%d", &p) != CORRECT_SCAN) || (p < MIN_SIZE_OF_P) || ((array_end - array) < (p + 1)))
  164.     {
  165.         free(array);
  166.         return ERROR;
  167.     }
  168.     int length = array_end - array + QUANTITY_OF_MU2;
  169.     if (array != NULL)
  170.     {
  171.         double *array_new = realloc(array, length * sizeof(double));
  172.         if (array_new != NULL)
  173.         {
  174.             array = array_new;
  175.             array_new = NULL;
  176.         }
  177.     }
  178.     array_end = array + length;
  179.     task_two(array, array_end, mu_2, p);
  180.     for (double *ptr = array; ptr < array_end; ptr++)
  181.     {
  182.         printf("%lf ", *ptr);
  183.     }
  184.     free(array);
  185.     return OK;
  186. }
Add Comment
Please, Sign In to add comment