【问题标题】:c - output is not changing after being put through a functionc - 通过函数后输出没有变化
【发布时间】:2018-10-12 16:10:23
【问题描述】:

这是我昨晚提交的作业问题的延伸。这个程序对我来说太混乱了,所以我退后一步,重新开始学习一些关于退货和路过的新知识。整个程序旨在获取任意数量的整数,首先找到总和和平均值,然后打印每个整数的平方根,然后如果任何整数小于 20,则打印布尔值 true 或 false,最后打印布尔值 true 或如果任何整数介于 10 和 90 之间,则为 false。

但现在我需要做的就是把我的头放在这个上面。目前我只打算解决这个问题的总和和平均部分。它必须使用传递引用来完成,据我所知,这是我在下面显示的代码中使用的:

#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;
}

我得到的想法是,您输入所需的整数数量,然后求和一个,将该总和添加到输出中,然后重复直到全部完成。之后它将打印出最终输出,即所有整数相加的结果。但相反,它打印为零。最初它打印出我认为是内存地址,一些大垃圾号码,所以我将它设置为零。但这只是一个创可贴的解决方案,并没有解决问题本身。

【问题讨论】:

  • int sum =+ sumAvgInput; 你觉得这有什么作用?
  • 添加 sum 和 sumAvgInput 并将结果设置为 sum
  • ...你在看哪本书?

标签: c function pass-by-reference


【解决方案1】:

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);

【讨论】:

    【解决方案2】:
       int output = functionSumAvg(number);
    

    创建一个新的临时output

     output = functionSumAvg(number);
    

    【讨论】:

      【解决方案3】:

      您的问题是您没有通过引用传递。你是按值传递的。

      您需要传入一个对总和的引用(C 中的指针),并(按值)传入要添加到总和的新值。然后调用例程将负责将总和初始化为零。

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

      其余的我不会告诉你,因为它会妨碍你的学习。

      注意:我的指针使用_pt 后缀,我不使用任何其他匈牙利符号。

      【讨论】:

      • 传递引用和引用值本身是不同的主题,更不用说指针了,尽管在定义上都重叠,并且可以在图灵机中使用来模仿相同的功能(这本质上是一个可能单子)。 C 没有按引用传递,尽管它确实有指针,您可以说它们是一种引用类型。需要明确的是,在 C 中,您总是按值传递。您可能按值传递引用类型,但这仍然是按值传递。区别在于swap(x, y); (同样的原因scanf 需要和号)...在C 中尝试;)
      • 哦,我想当我们谈论学习的时候,这个问题不是从读书的人身上产生的……对吧?我的意思是,这只是一个猜测。我的意思是,我从来没有见过书教过这个int sum =+ ... 的东西......我认为他/她只是在猜测,把语言当作黑匣子,通过观察来学习(这是不安全的),所以我们能做到的最好因为他/她的学习是让他/她读一本好书……话虽如此,他/她现在会读一本而不是问问题,对吧?他/她会读这个答案吗?
      • @Autistic 你有什么好书推荐吗? swap(ref x, ref y);swap(&amp;x, &amp;y) 有什么区别? (所有语言的所有通过引用实现,按值传递引用)
      • 不,我完全不看 cmets
      • @ctrl-alt-delor C11/6.5.2.2p4 声明“在准备调用函数时,会评估参数,并为每个参数分配相应参数的值”。这个描述正好对应于“按值传递”的定义。因此,C 总是按值传递。
      猜你喜欢
      • 2023-01-30
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      相关资源
      最近更新 更多