c - вывод не меняется после прохождения через функцию - PullRequest
0 голосов
/ 12 октября 2018

Это продолжение домашнего задания, которое я задал вчера вечером.Программа стала слишком запутанной для меня, поэтому я сделал шаг назад и начинаю заново с некоторыми новыми знаниями о возвратах и ​​обходах.Вся программа предназначена для получения любого числа целых чисел, сначала найдите сумму и среднее значение, затем выведите квадратный корень каждого целого числа, затем выведите логическое значение true или false, если любое целое число меньше 20, и, наконец, выведите логическое значение true илиfalse, если любое целое число находится в диапазоне от 10 до 90.

Но сейчас все, что мне нужно сделать, это обернуть голову вокруг этого.В настоящее время я собираюсь заняться только суммой и средней частью этого.Это должно быть сделано с помощью передачи по ссылкам, что, насколько мне известно, я использовал в коде, показанном ниже:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int functionSumAvg(int sumAvgInput);

void main()
{
  int amountOfNumbers,number,x,output;

  output = 0;

  printf("Enter how many numbers you want: ");
  scanf("%d",&amountOfNumbers);
  printf("Input each number, separated by a space: ");

  for(x = 0; x < amountOfNumbers; ++x){
    scanf("%d",&number);
    int output = functionSumAvg(number);

  }
  printf("output: %d",output);
}


int functionSumAvg(int sumAvgInput){
  int sum =+ sumAvgInput;
  return sum;
}

Идея, которую я получил, заключается в том, что вы кладете количество целых чиселВы хотите, затем он проходит суммирование, добавляя эту сумму к выводу и повторяя, пока все не будет сделано.После этого он будет распечатывать окончательный результат, результат суммирования всех целых чисел.Но вместо этого он печатает ноль.Первоначально он распечатал то, что я предположил, было адресом памяти, каким-то большим номером мусора, поэтому я установил его на ноль.Но это было только решение о помощи группы, и не решило саму проблему.

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Ваша проблема в том, что вы не передаете по ссылке.Вы передаете по значению.

Вам необходимо передать ссылку (указатель в C) на сумму и передать (по значению) новое значение, которое будет добавлено к сумме.Тогда вызывающая подпрограмма будет отвечать за инициализацию суммы до нуля.

int functionSumAvg(int *sum_pt, int input){…}

Я не скажу вам об остальном, потому что это помешает вашему обучению.

Примечание: Я использую _pt post-fix для своих указателей, я не использую другие венгерские обозначения.

0 голосов
/ 12 октября 2018

fuctionSumAvg не вычисляет сумму или среднее значение чего-либо.Он просто устанавливает локальную переменную sum в число, которое он получил, и возвращает тот же номер.Это не добавляет его к предыдущему итогу.А вычисление среднего требует деления суммы на количество элементов, но вы никогда ничего не суммируете и не подсчитываете.

Вы можете использовать статические переменные для хранения промежуточной суммы и количества.Но поскольку функция может возвращать только одно значение, вам нужно будет использовать параметр указателя для возврата второго значения.

int functionSumAvg(int sumAvgInput, int *avg){ // return value is sum
  static int sum = 0;
  static int count = 0;
  sum += sumAvgInput;
  count++;
  *avg = sum/count;
  return sum;
}

Затем вы вызываете его так:

int sum, average;
sum = functionSumAvg(number, &average);
printf("Sum = %d Average = %d\n", sum, average);
0 голосов
/ 12 октября 2018
   int output = functionSumAvg(number);

создает новый временный output

do

 output = functionSumAvg(number);
...