应用题
2. 已知数据文件in.dat中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数加个位数上的数等于百位数上的数加十位数上的数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序。最后main()函数调用写函数writeDat()把数组b中的数输出到文件out.dat中。
例如:6712,6+2=7+1,则该数满足条件存入数组b中,且个数cnt=cnt+1。
8129,8+9!=1+2,则该数不满足条件忽略。
程序中已定义数组:a[300],b[300],已定义变量:cnt
请勿改动数据文件in.dat中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
int a[300], b[300], cnt=0;
void writeDat();
void readDat();
void 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+gw-bw-sw==0) //如果a[i]千位上数加上其个位上的数减去其百位上的数减去其十位上的数等于0
b[cnt++]=a[i];
}
for(i=0; i<cnt-1; i++)
for(j=i+1; j<cnt; j++)
if(b[i]>b[j])
{
tmp=b[j];
b[j]=b[i];
b[i]=tmp;
}
【答案解析】 千位+个位等于百位+十位个数,把所有满足此条件的数依次存入数组,按从小到大的顺序排序。
通过审题可以发现仅有一个不同点,即要求统计的四位数的条件是“个位+千位=百位+十位”,参考答案的第8条语句,修改if条件语句的判断条件即可,对于数据交换的整型变量tmp可以自定义其变量名。