zhukov000

Work with array C

Nov 13th, 2019
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.75 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<malloc.h>
  3.  
  4. // функция:
  5. // тип возвр.знач.  имя функции ( список параметров )
  6.  
  7. // a[i] => * (a + i) - т.е. сместиться от начала массива (от указателя на первый элемент) на i элементов
  8. // const double * - значение по этому указателю нельзя изменить
  9. double task1(const double *b, double Y, int * found, int k)
  10. {
  11.   double ans = 0.0;
  12.   *found = 0; // found = 0 - не найдено значение
  13.  
  14.   for(int i=0; i<k; ++i)
  15.   {
  16.     if ( fabs(b[i]) < Y && fabs(b[i]) > ans )
  17.     {
  18.       ans = fabs(b[i]);
  19.       *found = 1; // по адресу в переменной found записываем 1, т.е. значение найдено
  20.     }
  21.   }
  22.   return ans;
  23. }
  24.  
  25. // const double * - значение по этому указателю нельзя изменить
  26. double task2(const double *b, int * found, int k)
  27. {
  28.   int left, right;
  29.   left = right = k;
  30.   // последний элемент имеет индекс [k-1]
  31.   for(int i=0; i<k; ++i)
  32.   {
  33.     if ( b[i] > 0 ) // для каждого b[i] > 0
  34.     {
  35.       if (left == k) left = i; // индекс первого элемента массива больше 0, i < k - значит условие выполнится один раз
  36.       right = i; // индекс последнего элемента массива больше 0 - выполняется каждый раз
  37.     }
  38.   }
  39.  
  40.   double ans = 0.0;
  41.   *found = 0; // по-умолчанию не найдено
  42.  
  43.   if ( right - left > 1 ) // между первым и последним элементом есть хотя бы один
  44.   {
  45.     *found = 1;
  46.     for(int i = left + 1; i < right; ++i) ans += b[i]; // считаем сумму
  47.     ans = ans / (right - left - 1);
  48.   }
  49.   return ans;
  50. }
  51.  
  52. // функции вывода элементов массива
  53. void show(const double *b, int k)
  54. {
  55.     printf("\nArray:\n");
  56.     for(int i=0; i<k; ++i)
  57.   {
  58.     printf("%lf ", b[i]);
  59.   }
  60.   printf("\n");
  61. }
  62.  
  63. int main()
  64. {
  65.   int k;
  66.   double X, Y;
  67.  
  68.   printf("Input k - array size: ");
  69.   scanf("%d", &k);
  70.   printf("Input array elements:\n");
  71.  
  72.   // malloc, calloc - выделить память под массив: k элементов каждый типа double,
  73.   // sizeof(double) - число байт на одну переменную типа double
  74.   // calloc в отличии от malloc обнуляет (записывает нолики) выделенную память
  75.   // выделить память - это значит сказать, что я могу "использовать эти адреса"
  76.   double *a = calloc(k, sizeof(double)); // malloc(k * sizeof(double))
  77.   for(int i=0; i<k; ++i) scanf("%lf", a + i); // &a[i]
  78.  
  79.   show(a, k); // вывод массива
  80.  
  81.   printf("Input Y: ");
  82.   scanf("%lf", &Y);
  83.  
  84.   int found;
  85.   // вызываем task2 и вторым параметром передаем адрес found
  86.   // это делается для того, чтобы можно было изменить переменную внутри функции и изменения сохранились
  87.   double task1_ans = task1(a, Y, &found, k);
  88.   // в C 0 - это ложь, все остальное - это истина
  89.   if (found)
  90.     printf("Answer for task#1 is %.5lf\n", task1_ans);
  91.   else
  92.     printf("Not found\n");
  93.  
  94.   double task2_ans = task2(a, &found, k);
  95.  
  96.   if (found)
  97.     printf("Answer for task#2 is %.5lf\n", task2_ans);
  98.   else
  99.     printf("Not found\n");
  100.  
  101.   // for(int i=0; i<k; ++i) printf("%.3lf ", a[i]);
  102.   free(a); // освобождаем выделенную память
  103.   return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment