Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<malloc.h>
- // функция:
- // тип возвр.знач. имя функции ( список параметров )
- // a[i] => * (a + i) - т.е. сместиться от начала массива (от указателя на первый элемент) на i элементов
- // const double * - значение по этому указателю нельзя изменить
- double task1(const double *b, double Y, int * found, int k)
- {
- double ans = 0.0;
- *found = 0; // found = 0 - не найдено значение
- for(int i=0; i<k; ++i)
- {
- if ( fabs(b[i]) < Y && fabs(b[i]) > ans )
- {
- ans = fabs(b[i]);
- *found = 1; // по адресу в переменной found записываем 1, т.е. значение найдено
- }
- }
- return ans;
- }
- // const double * - значение по этому указателю нельзя изменить
- double task2(const double *b, int * found, int k)
- {
- int left, right;
- left = right = k;
- // последний элемент имеет индекс [k-1]
- for(int i=0; i<k; ++i)
- {
- if ( b[i] > 0 ) // для каждого b[i] > 0
- {
- if (left == k) left = i; // индекс первого элемента массива больше 0, i < k - значит условие выполнится один раз
- right = i; // индекс последнего элемента массива больше 0 - выполняется каждый раз
- }
- }
- double ans = 0.0;
- *found = 0; // по-умолчанию не найдено
- if ( right - left > 1 ) // между первым и последним элементом есть хотя бы один
- {
- *found = 1;
- for(int i = left + 1; i < right; ++i) ans += b[i]; // считаем сумму
- ans = ans / (right - left - 1);
- }
- return ans;
- }
- // функции вывода элементов массива
- void show(const double *b, int k)
- {
- printf("\nArray:\n");
- for(int i=0; i<k; ++i)
- {
- printf("%lf ", b[i]);
- }
- printf("\n");
- }
- int main()
- {
- int k;
- double X, Y;
- printf("Input k - array size: ");
- scanf("%d", &k);
- printf("Input array elements:\n");
- // malloc, calloc - выделить память под массив: k элементов каждый типа double,
- // sizeof(double) - число байт на одну переменную типа double
- // calloc в отличии от malloc обнуляет (записывает нолики) выделенную память
- // выделить память - это значит сказать, что я могу "использовать эти адреса"
- double *a = calloc(k, sizeof(double)); // malloc(k * sizeof(double))
- for(int i=0; i<k; ++i) scanf("%lf", a + i); // &a[i]
- show(a, k); // вывод массива
- printf("Input Y: ");
- scanf("%lf", &Y);
- int found;
- // вызываем task2 и вторым параметром передаем адрес found
- // это делается для того, чтобы можно было изменить переменную внутри функции и изменения сохранились
- double task1_ans = task1(a, Y, &found, k);
- // в C 0 - это ложь, все остальное - это истина
- if (found)
- printf("Answer for task#1 is %.5lf\n", task1_ans);
- else
- printf("Not found\n");
- double task2_ans = task2(a, &found, k);
- if (found)
- printf("Answer for task#2 is %.5lf\n", task2_ans);
- else
- printf("Not found\n");
- // for(int i=0; i<k; ++i) printf("%.3lf ", a[i]);
- free(a); // освобождаем выделенную память
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment