引用: /*Practise 8.1 */
//定义一个函数,给函数传送任意多个浮点数,计算出这些数的平均值。
//从键盘输入任意个值,并输出平均值,以说明这个函数的执行过程
首先明确这个题目:
给这个函数传送任意多个浮点数,而不是 多次调用——原来做的就是这样曲解了。
其次,这并不是要用 参数个数可变 的函数——参考答案中并未使用。
由此,这只能是按指针传递,而且,由于个数不定,需要动态为该指针分配内存。
由于是任意多个浮点数,所以需要一个输入来判断是否继续输入。
采用do-while循环,因为至少会进行一次(判断)。
但在实际操作中,我发现,do-while并不是好的选择——我得承认这可能和我残留的记忆有关系。
除第一次以外,判断应先于输入——其实都不是必须的,因为第一次有 是否需要(本次输入)的判断
鉴于上次的失误,对于判断是否继续输入的考虑。
由于scanf函数对输入的控制并不完善,但并非不可用。
我们只需判断’n’即可——如果用’y’判断,由于容易被参与数据影响,容易出现误判,而’n’,相比而言,被影响的可能性小很多——除非倒霉到家,残余一个’n’。
——当然,这种情形,则需另外考虑解决方法——不过,要分清楚是自己输入的和残余的数据中的’n’,也许只能用空格符分隔scanf的输入。
由此,我们可以写出这个函数的接口(声明)
double Average(double *buffer,unsigned char length);
因为传递的是指针,函数无法知道个数,所以需要传入长度。
这个程序另一个要解决的问题是 为指针动态分配内存。
需要两个数据块,一个用于存储,一个用于在动态分配时转存数据。
*value *buffer
使用时,value用于存储
buffer用于在value重新分配内存时,备份
继续鸡蛋里挑骨头哈
if(buffer == NULL)
{
printf(\"Allocation failed!\n\");
exit(-1);
}
if(list == NULL)
list = buffer;
这个地方没有必要做 list 判空的操作
直接写成
list = buffer;
即可
顺带提一句,按我的C语言设计风格,上述这段话,我会这样写:
if((list = buffer) == NULL)
{
printf(\"Allocation failed!\n\");
exit(-1);
}
[ 本帖最后由 能圈就圈 于 2012-1-4 14:02 编辑 ]