已知数据文件IN.dat中存有300个四位数,并已调用读函数Rdata()把这些数存入数组a中,请编写函数primeCal(),其功能是:求出这些四位数中素数的个数count,再求出所有满足此条件的四位数的平均值Ave1以及不满足此条件的四位数的平均值Ave2。最后调用写函数Wdata(),把结果count、Ave1、Ave2输出到OUT.dat文件中。
例如,5591是素数,则该数满足条件计算平均值Ave1,且个数count=count+1。9812是非素数,则该数不满足条件计算平均值Ave2。
注意:部分源程序已经给出。程序中已定义数组a[300],已定义变量count、Ave1、Ave2。请勿改动主函数main()、读函数Rdata()和写函数Wdata()的内容。
#include <stdio.h>
int a[300], count = 0;
double Ave1 = 0.0, Ave2 = 0.0;
int isP(int m)
{ int i;
for (i=2; i<m; i++)
if (m%i == 0)
return 0;
return 1;
}
void primeCal()
{
}
void Rdata()
{ FILE *fp;
int i;
fp = fopen("in.dat", "r");
for (i=0; i<300; i++)
fscanf(fp, "%d,", &a[i]);
fclose(fp);
}
void Wdata()
{ FILE *fp;
fp = fopen("out.dat", "w");
fprintf(fp, "%d\n%
fclose(fp);
}
main()
{ Rdata();
primeCal();
Wdata();
printf("count=%d\n满足条件的平均值Ave1=%
}
试题答案及详解
【审题分析】分析题目可知,本题只要实现PrimeCal()函数的功能即可。PrimeCal()要实现的功能是:求出这些四位数中是素数的个数count,再求出所有满足此条件的四位数的平均值Ave1以及不满足此条件的四位数的平均值Ave2。因此解答本题的关键在于如何判断一个数为素数。
【解题思路】在for循环语句中当自变量1递增到299时,对数组a中的每一个元素a[i]调用函数isP(a[i])来判断元素a[i]是否为素数,如果是素数,则把a[i]加入Ave1上,count自加;否则把a[i]加入Ave2上。当退出循环时,用Ave1除以count就得到所有满足此条件的四位数的平均值,用Ave2除以300-count就得到所有不满足此条件的四位数的平均值。
【参考答案】
void primeCal()
{ int i;
for (i=0; i<300; i++)
if (isP(a[i]))
{ Ave1 += a[i];
count++;
}
else
{ Ave2 += a[i];
}
Ave1 = Ave1/count;
Ave2 = Ave2/(300-count);
}
【易错分析】退出for循环时,变量Ave1的值是所有满足条件的四位数的和;变量Ave2的值是所有不满足条件的四位数的和。
【考点链接】for循环语句、if else 条件判断语句。
责任编辑:小草