问答题
已知数据文件in.dat中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出个位数上的数减千位数上的数减百位数上的数减十位数上的数大于零的个数cnt,再求出所有满足此条件的四位数平均值pjz1,以及所有不满足此条件的四位数平均值pjz2。最后main()函数调用写函数writeDat()把结果cnt,pjz1,pjz2输出到out.dat文件。
例如:1239,9-1-2-3>0,则该数满足条件,参加计算平均值pjz1,且个数cnt=cnt+1。
8129,9-8-1-2<0,则该数不满足条件,参加计算平均值pjz2。
程序中已定义数组:a[300],己定义变量:cnt,pjz1,pjz2
请勿改动数据文件in.dat中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
int a[300], cnt=0; //定义全局一维整型数组a[300]和整型cnt变量, 并且变量cnt的初值为0
double pjz1=0.0, pjz2=0.0;//定义全局双精度型变量pjz1和pjz2, 并且初值为0.0,
void readDat();
void writeDat();
jsValue()
{
}
main()
{
int i;
readDat();
jsValue();
writeDat();
printf("cnt=%d\n满足条件的平均值pzj1=%7.2lf\n不满足条件的平均值pzj2=%7.2lf\n",cnt, pjz1, pjz2);
}
void readDat()
{
FILE *fp;
int i;
fp=fopen("in.dat", "r");
for(i=0; i<300;i++)
fscanf(fp, "%d,", &a[i]);
fclose(fp);
}
void writeDat()
{
FILE *fp;
fp=fopen("out.dat", "w");
fprintf(fp, "%d\n%7.2lf\n%7.2lf\n", cnt, pjz1, pjz2);
fclose(fp);
}
【正确答案】
【答案解析】int i, qw, bw, sw, gw;
for(i=0; i<300; i++)
{
qw=a[i]/1000;
bw=(a[i]-qw*1000)/100;
sw=(a[i]-qw*1000-bw*100)/10;
gw=a[i]%10;
if(gw-qw-bw-sw>0) //如果a[i]的个位数减去千位数减去百位数减去十位的数大于零
{
pjz1+=a[i]; //把a[i]的值累加到变量pjz1
cnt++; //变量cnt加1
}
else pjz2+=a[i]; //如果a[i]的个位数减去千位数减去百位数减去十位的数小于等于零, 把a[i]的值累加到变量pjz2
}
pjz1/=cnt;//变量pjz1的值除以变量cnt的值, 得到所有满足条件的四位数的平均值并赋给变量pjz1
pjz2/=(300-cnt); //变量pjz2的值除以300减去变量cnt的差, 得到所有不满足条件的四位数的平均值并赋给变量pjz2
[解析] 个位-千位-百位-十位,结果大于零的数的个数,求满足此条件以及不满足此条件的四位数平均值ave1和ave2。
①首先定义一个循环变量i,以及分别用来存放四位数分解之后各位数的变量qw(千位)、bw(百位)、sw(十位)和gw(个位)。
②通过for循环依次对数组中的每个四位数进行分解,每分解一个四位数,则根据题目要求,判断其“个位-百位-十位-千位>0”的条件是否满足,当满足条件时,则将a[i]的值累加到变量pjz1中,同时计数变量cnt的值加1;如果不满足判断条件,则将四位数累加到变量pjz2中。当for循环结束之后,就能等到所有满足条件的四位数之和pjz1和个数,以及所有不满足条件的四位数之和pjz2。
③最后将变量pjz1的值除以变量cnt的值,得到所有满足条件的四位数的平均值并赋给变量pjz1,将变量pjz2的值除以300减去变量cnt的差,得到所有不满足条件的四位数的平均值并赋给变量pjz2。
本题中,piz1、piz2和cnt三个变量在源程序中已经定义,在该子程序中就不需要再重新定义了。