问答题 已知数据文件in.dat中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:依次从数组a中取出一个四位数,如果该四位数均大于该四位数以前的连续五个数且该数是偶数(该四位数以前不满五个数,则不统计),则统计出满足此条件的个数cnt,并把这些四位数按从大到小的顺序存入数组b中,最后调用写函数WriteDat()把结果cnt以及数组b中符合条件的四位数输出到out.dat文件中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件in.dat中的任何数据、主函数main()、读函数readDat()和写函数WriteDat()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], cnt=0;
void writeDat();
void jsVal()
{
}
/*readDat()从数据文件in.dat中读取200个四位数存入数组a中*/
void readDat()
{
int i;
FILE *fp;
fp=fopen("in.dat", "r");
for(i=0; i<MAX; i++)
fscanf(fp, "%d", &a[i]);
fclose(fp);
}
void main()
{
int i;
readDat();
jsVal();//调用jsVal()函数, 实现题目要求的功能
printf("满足条件的数=%d\n", cnt);
for(i=0;i<cnt; i++)
printf("%d", b[i]);
printf("\n");
writeDat();
}
/*函数wdteDat()把结果cnt以及数组b中符合条件的四位数输出到out.dat文件中*/
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, ab;
for(i=5; i<MAX; i++)
{
if((a[i]%2==0) && a[i]>a[i-1]&&a[i]>a[i-2]&&a[i]>a[i-3]&&a[i]>a[i-4]
&& a[i]>a[i-5]) //判断a[i]连续大于该四位数以前的五个数且该数是偶数
b[cnt++]=a[i]; //把满足此条件的四位数a[i]存入数组元素b[cnt],同时数组下标变量cnt加1
}
/*对数组b进行降序排序*/
for(i=0; i<cnt-1; i++)
for(j =i+1; j<cnt; j++)
if(b[i]<b[j]) //如果数组元素b[i]小于b[j], 则两者进行互换
{
ab=b[j];
b[j]=b[i];
b[i]=ab;
} [解析] 大于前连续5个数,偶数,从大到小排序。
通过审题可以发现主要有3个不同点:①要求进行比较的元素大于连续前5个数,因此在设置for循环条件语句时,应该从第6个元素开始,即数组下标i的值等于5,参考答案的第2条语句;②当前元素连续大于前5个数时,前5个元素的数组下标表示也有所不同,判断表达式也不一样,参考答案的第4条语句;③统计结果按从大到小的方式进行排序,即参考答案的第9条语句。