问答题 已知数据文件in.dat中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从大到小的顺序进行排序。最后main()函数调用写函数writeDat()把数组b中的数输出到文件out.dat中。
例如:7153,7+1=5+3,则该数满足条件存入数组b中,且个数cnt=cnt+1。
8129,8+1!=2+9,则该数不满足条件忽略。
程序中已定义数组:a[300],b[300],已定义变量:cnt
请勿改动数据文件in.dat中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
int a[300], b[300], cnt=0;
void readDat();
void writeDat();
jsValue()
{

}
main()
{
int i;
readDat();
jsValue();
writeDat();
printf("cnt=%d\n", cnt);
for(i=0; i<cnt; i++)
printf("b[%d]=%d\n", i, b[i]);
}
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\n", cnt);
for(i=0; i<cnt; i++)
fprintf(fp, "%d\n", b[i]);
fclose(fp);
}
【正确答案】
【答案解析】int i, j, qw, bw, sw, gw, tmp;
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(qw+bw-sw-gw==0) //如果a[i]千位上的数字加上其百位上的数字减去其十位上的数字减去个位上的数字等于零
b[cnt++]=a[i];
}
for(i=0; i<cnt; i++)
for(j=i+1; j<cnt; j++)
if(b[i]<b[j]) //如果b[i]的值小于b[j]的值, 则两者进行互换, 对数组b进行降序排列
{
tmp=b[j];
b[j]=b[i];
b[i]=tmp;
} [解析] 千位+百位等于十位+个位的数的个数,把所有满足此条件的四位数依次存入数组,然后对数组按从大到小的顺序进行排序。
通过审题可以发现有两个不同点:①要求统计的四位数的条件是“千位+百位=十位+个位”,参考答案的第8条语句修改if语句的判断条件即可。②将统计结果按从大到小的顺序排序,参考答案的第13条语句,修改两数组元素的大小比较符即可。另外,对于数据交换的整型变量tmp可以自定义其变量名。