Как передать в подпрограмму указатель на i-тый элемент массива - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Итак, есть главная программа, есть подпрограмма, в главной программе осуществляется только вывод и инициализация переменных, в подпрограмме заполнение массива, вычисление количества положительных элементов, и их среднего значения.Тоесть: 1.главная программа(инициализация, первоначальное обьявление) 2.подпрограмма функция 3.главная программа(вывод) Вопрос, как передать в подпрограмму указатель на i-тый элемент массива X?Динамически выделить память я могу только в главной программе, так веть?Или если использовать malloc в подпрограмме, и в конце подпрограммы не очистить память командой free, память не удалится?Вот интересует как можно организовать передачу итого элемента динамически выделенного массива, или может можно подругому както занести массив в подпрограмму, выполнить операции некоторые с ним, и вытащить потом в гл прогу, и вывести?
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <alloc.h>
void podprog(float x, SX, KX);
void main(void)
{
int SX, KX, i;
float *x;
SX=0;
KX=0;
x=(float *)malloc(3*sizeof(float));
printf("Massiv X");
for(i=0;i<3;i++)
 podprog(&x[i], &SX, &KX, i);
for(i=0;i<3;i++)
 printf("%d ", x[i]);
free(x);
getch();
}
void podprog(float **x, *SX, *KX, i)
{
*x=1+i;
*SX=*SX+1;
*KX++;
}
В примере нерабочая программа, нужно чтобы заработала, необязятельно подходить именно методом который предложил я, любой подойдётЖду помощи, спасибо большое заранее

Решение задачи: «Как передать в подпрограмму указатель на i-тый элемент массива»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
void procedure(const float* x, int size, int* positive, float* average) {
    float sum = 0;
    *positive = 0;
    for (int i=0; i < size; ++i) {
           scanf("%f", x+i);
           if (x[i] > 0) {
            ++(*positive);
            sum += x[i];
        }
        if (*positive > 0) *average = sum / *positive;
    }
}
int main() {
    int size = 3;
    float* arr = (float*)malloc(size*sizeof(*arr));
    float average;
    int positive;
    procedure(arr, size, &positive, &average);
    free(arr);
    printf("%d %f\n", positive, average);
    return 0;
}

Объяснение кода листинга программы

В этом коде есть две переменные-указателя: positive и average. Они указывают на место в памяти, где хранятся значения, которые будут использоваться в функции. В функции procedure происходит следующее:

  1. Создается переменная sum, которая будет использоваться для хранения суммы элементов массива.
  2. Переменная positive инициализируется нулем. Она будет использоваться для подсчета количества положительных чисел в массиве.
  3. Начинается цикл for, который проходит по всем элементам массива.
  4. В каждой итерации цикла происходит чтение элемента массива с помощью функции scanf и добавление его к переменной sum, если он больше нуля.
  5. Если количество положительных чисел больше нуля, то переменная average вычисляется как сумма всех положительных чисел, деленная на их количество.
  6. По завершении цикла, функция возвращает void, то есть ничего не возвращает. В функции main происходит следующее:
  7. Создается переменная size, которая содержит размер массива.
  8. Создается переменная arr, которая будет использоваться для хранения адреса начала массива.
  9. Создаются две переменные: average и positive. Они будут использоваться для хранения значений, которые будут получены из функции procedure.
  10. Функция procedure вызывается с аргументами arr, size, &positive, &average.
  11. После выхода из функции procedure, переменные positive и average содержат результаты работы функции.
  12. Массив arr освобождается с помощью функции free.
  13. Выводится значение переменных positive и average с помощью функции printf.
  14. Программа возвращает 0, что означает успешное завершение работы.

Оцени полезность:

10   голосов , оценка 4.4 из 5
Похожие ответы