已知数据文件IN.DAT中存有300个四位数 并已调用读函数ReadDat() 把这些数存入数组a中。请编制函数
已知数据文件IN.DAT中存有300个四位数,并已调用读函数ReadDat() 把这些数存入数组a中。请编制函数jsValue(),其功能是:求出符合“千位上的数加个位上的数等于百位上的数加十位上的数”这一条件的四位数的个数cnt,再求出所有满足此条件的四位数的平均值pjz1以及不满足此条件的四位数的平均值pjz2,最后调用写函数把结果输出到文件OUT.DAT中。例如:6712,6+2=7+1,则该四位数满足条件,计算平均值pjz1,且个数cnt=cnt+1;8129,8+9¹1+2,则该四位数不满足条件,计算平均值pjz2。部分源程序已给出。程序中已定义数组a[300],已定义变量cnt、pjz1、pjz2。请勿改动主函数main()、读函数ReadDat() 和写函数writeDat() 的内容。 #include <stdio.h>int a[300],cnt=0;double pjz1=0.0,pjz2=0.0; void jsValue(){ } void main(){ int i; readDat(); jsValue(); writeDat(); printf("cnt=%d 满足条件的平均值pzj1=%7.21f 不满足条件的平均值pjz2= %7.21f " , 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; int i; fp=fopen(" out.dat" ," w" ); fprintf(fp," %d %7.21f %7.21f " ,cnt,pjz1,pjz2); fclose(fp);}
-
参考答案:参考试题解析【解析及答案】本题的任务是把函数jsValue() 补充完整。本题要求求出满足条件的数的个数cnt及平均值pjz1和pjz2。求解本题,首先要知道如何取出一个数的个、十、百、千位上的数。在这里,可以用取模和整除相结合的方法实现。a[i]%10对10取模的结果为a[i] 的个位数;a[i]%100/10先对100取模,得出后两位数,然后再将后两位数除以10,结果为a[i] 的十位数;以此类推。编程时首先设一个计数器k来存储不满足条件的数的个数,k的初始值为0。然后扫描数组a,如果数组元素满足条件,那么计数器cnt的值将增加1,同时把该元素加到平均值pjz1中;否则,计数器k的值将增加1,同时把该元素加到平均值pjz2中,继续下一次的扫描。最后,用pjz1/=cnt和pjz2/=k这两条语句得到平均值pjz1和pjz2。综上所述,完整的函数jsValue() 如下。void jsvalue(){ int i,g,s,b,q,k=0; for(i=0;i<300;i++){ g=a[i]%10; s=a[i]%100/10; b=a[i]/100%10; q=a[i]/1000; if((q+g)==(s+b)) { cnt++;pjz1+=a[i]; } else { k++; pjz2+=a[i]; }} pjz1/=cnt; pjz2/=k;}
