Как передать в подпрограмму указатель на 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 происходит следующее:
- Создается переменная sum, которая будет использоваться для хранения суммы элементов массива.
- Переменная positive инициализируется нулем. Она будет использоваться для подсчета количества положительных чисел в массиве.
- Начинается цикл for, который проходит по всем элементам массива.
- В каждой итерации цикла происходит чтение элемента массива с помощью функции scanf и добавление его к переменной sum, если он больше нуля.
- Если количество положительных чисел больше нуля, то переменная average вычисляется как сумма всех положительных чисел, деленная на их количество.
- По завершении цикла, функция возвращает void, то есть ничего не возвращает. В функции main происходит следующее:
- Создается переменная size, которая содержит размер массива.
- Создается переменная arr, которая будет использоваться для хранения адреса начала массива.
- Создаются две переменные: average и positive. Они будут использоваться для хранения значений, которые будут получены из функции procedure.
- Функция procedure вызывается с аргументами arr, size, &positive, &average.
- После выхода из функции procedure, переменные positive и average содержат результаты работы функции.
- Массив arr освобождается с помощью функции free.
- Выводится значение переменных positive и average с помощью функции printf.
- Программа возвращает 0, что означает успешное завершение работы.