问题 问答题

己知数据文件in55.dat中存有300个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函grisValue(),其功 能是:求出千位数上的数减百位数上数减十位数上的数减个位数上的数大于零的个数cnt,再求出所有满足此条件的4位数平均值pjzl,以及所有不满足此条件的4位数平均值pjz2,最后调用函数writeDat()把结果cnt,pjz1,pjz2输出到out55.dat文件中。
例如:9123,9-1-2-3>0,则该数满足条件,计算平均值pjzl,且个数cnt=cnt+1。
9812,9-8-1-2<0,则该数不满足条件,计算平均值pjz2。
注意:部分源程序已给出。
程序中已定义数组:a[300],已定义变量:cnt。
请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
试题程序:
#include<stdio.h>
int a[300], cnt=0;
double pjzl=0.0,pjz2=0.0;
jsValue()


main()

int i;
readDat();
jsValue();
writeDat();
print f ("cnt =%d\n满足条件的平均值pjz1=%7.21 f\n不满足条件的平均值
pjz2=%7.21f\n",cnt,pjz1,pjz2);

readDat ()

FILE *fp;
int i;
fp=fopen("in55.dat","r");
for(i=0;i<300;i++)
fscanf(fp,"%d,",&a[i]);
fclose(fp);

writeDat ()

FILE *fp;
int i;
fp=fopen("out55.dat","w");
fprintf(fp,"%d\n%7.21f\n%7.21f\n",cnt ,pjz1,pjz2);
fclose(fp);

答案

参考答案:

jsValue ( )

{

int i, thou, hun, ten, data, n=0;

for (i=0; i<C00; i++)

{

thou=a[i]/A000; /*求四位数的千位数字*/

hun=a[i]%A000/A00; /*求四位数的百位数字*/

ten=a[i]%A00/A0; /*求四位数的十位数字*/

data=a[i]%A0; /*求四位数的个位数字*/

if (thou-hun-ten-data>0) /*如果千位数字减百位数字减十位数字减个位数字大于零*/

{

cnt++; /*统计满足条件的数的个数*/

pjzA+=a[i]; /*将满足条件的数求和*/

}

else

{

n++; /*统计不满足条件的数的个数*/

pjzB+=a [i]; /*将不满足条件的数求和*/

}

}

pjzA /=cnt; /*求满足条件的数的平均值*/

pjzB /=n; /*求不满足条件的数的平均值*/

}

解析:

本题考查的知识点如下:

(1)将4位数各位上的数拆分为独立的数字。

(2)循环结构的使用。

在本题中,首先要将4位数各位上的数字拆分为独立的数字,这要借助运算符“%”(取余)与“/”(整除)。将一个4位数整除1000则可得到其千位上的数字,除以1000取余再整除100则可得百位上的数字,除以100取余再整除10则可得十位上的数字,除以10取余则得个位上的数字。求得各位上的数字后,就可以进行比较了。

填空题
单项选择题