c语言 求平均数 设计求n个整数平均值的函数int average(int *p , int n),计算并返回指针p指向的存储区域

#include <stdio.h>
#include<malloc.h>
int average( int *p, int n )
{
int i, sum, a;
for(i=0;i<n;i++)
sum = sum+*(p+i);
a = sum/n;
return a;
}
int main()
{
int n = 0, i, *q, s[10000];
printf("input the number of numbers:\n");
scanf("%d", n);
FILE *fp = fopen("data.in","r");
if(fp == NULL){
printf("Error 1\n") ;
return 1;
}
q = (int *)malloc((n+1)*sizeof(int));
for(i=0;i<n;i++)
fscanf(fp,"%d",q+i);
printf("%d\n", average(q, n));
fclose(fp);
free(q);
return 0;
}
请问错在哪?

#include <stdio.h>
#include<malloc.h>

void average( float *p, int n )
{
int i,sum = 0,num;

for(i=0;i<n;i++)
{
printf("input the %d number:\n",i+1);
scanf("%d",&num);
sum += num;
}
*p = (float)sum/(float)n;

return ;
}

int main()
{
int n;
float num;

printf("input the number of numbers:\n");
scanf("%d",&n);
average(&num,n);
printf("the final average is %.2f\n",num);

return 0;
}
按照你的题目意思,稍微改了下,题目是要用*p指针来返回结果,所以只要在average函数内对*p赋值,那么main函数就能得到这个值,不知道你要打开文件做什么的,没看到题目有这个要求,就去掉了,既然先输入数字个数,那么接下来肯定要输入对应个数的数字,既然average没有这个参数进行传递,只能到average内部去接收了,另外题目并不需要保留输入的数字,所以也不用定义数组,用一个变量不停地替换接收就行了,回到主函数打印最后结果就可以了。。。
平均值用float类型,打印%.2f意思是保留小数点后2位。。。追问

题目要求从data.in读入数据,请问如何可以知道data.in中有多少个数?fscanf是不是不会读入空格到数组中的··

追答

那你的data.in是谁存的数据?
通过判断读取的值是否等于EOF来判定是否读到文件尾。。并不能直接获得文件内数据个数。
至于空格和你读取时用的数据类型有关,你如果用%c来读取文件,是可以读到空格的,不过这里你肯定用%d读取,所以不用担心空格问题。。

追问

通过判断读取的值是否等于EOF来判定是否读到文件尾。 这个该怎么写程序??

追答

给你一段程序吧,比较直观,这是我之前写毕业设计时的一段程序,打开一个保存售货员信息的文件,读取显示文件内容:
int Sales_man_Show()
{
FILE *fp;
int i = 0; //控制 SYSTEM 输出
int j = 0; //控制分行

if((fp = fopen("./salesman.db","rb")) == NULL)
{
perror("Sales_man_Show fopen salesman.db");
exit(-1);
}

while(1)
{
memset(&sales2,0,sizeof(sales2));
fread(&sales2,sizeof(sales2),1,fp);
if(feof(fp) != 0)//读到文件尾跳出循环
{
break;
}
if(ferror(fp) != 0)//读错误退出程序
{
perror("Sales_man_Show fread");
exit(-1);
}
if(0 == sales2.sales_index)//判断读到的信息
{
if(0 == i)
{
i = 1;
printf("SYSTEM: 销售员信息:");
}
j++;
printf("%d:%s\t",j,sales2.name);//格式输出显示
if(j%4 == 0)
{
printf("\n");
}
}
}
fclose(fp);//关闭文件
if(0 == i)
{
printf("SYSTEM: 不存在销售员用户!\n");
return -1;
}else
{
printf("\nSYSTEM: 销售员数量:%d\n",j);
return -1;
}
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-31
给你改了一下。
#include <stdio.h>
#include<malloc.h>
int average( int *p, int n )
{
int i, sum=0, a; // sum 给初值0
for(i=0;i<n;i++) sum = sum+p[i]; // 可以用 p[i] 形式,也便于理解阅读
a = sum/n;
return a;
}
int main()
{
int n = 0, i, *q;
FILE *fp;
fp = fopen("data.in","r");
if(fp == NULL){
printf("Error 1\n") ;
return 1;
}
// 试读数据,统计数据个数
while(1){
fscanf(fp,"%d",&i);
if (feof(fp)) break; // 判断文件结束
n=n+1;
}
rewind(fp); // 文件指针回到文件开始
q = (int *)malloc(n*sizeof(int)); //动态分配数组
if (!q) {
printf("no enough memory for q\n"); return 1;
}
for(i=0;i<n;i++) fscanf(fp,"%d", &q[i]); //读入数据
printf("%d\n", average(q, n));
fclose(fp);
free(q);
return 0;
}
====
平均值计算,最好用 float 或 double 型,当数据量大时,累加和 很大,整型可能存放不下。
另外,整型除以整型误差大。
第2个回答  2012-05-29
average () sum 的初始值没有 ,加上 sum = 0;试一下
相似回答