问答题 已知数据文件in.dat中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:依次从数组a中取出一个四位数,如果该四位数小于该四位数以后的连续五个数且该数是偶数(该四位数以后不满五个数,则不统计),则统计出满足此条件的个数cnt,并把这些四位数存入数组b中,而后对数组b进行升序排序,最后调用写函数writeDat()把结果cnt以及数组b中符合条件的四位数输出到out.dat文件中。
程序中已定义数组:a[200],b[200],已定义变量:cnt
请勿改动数据文件in.dat中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>
#define MAX 200 //定义宏变量MAX其值等于200
int a[MAX], b[MAX], cnt=0; //其初始值为0, 定义全局整型一维数组a[MAX], b[MAX]和变量cnt
void writeDat(); //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();
}
/*函数wnteDat()把结果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=0; i<MAX-5; 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个数,偶数,从小到大排序。
①首先定义两个循环整型变量i、j和一个用于数据交换的整型变量ab。
②然后在for循环语句中,先指定循环变量i从0开始,依次递增到MAX-5(到MAx-5的原因是因为从倒数第5个数开始,其后面的数都不满5个数,与题目要求不符,因此可以省略最后5个数),接着对每个数组元素a[i]判断其是否为偶数且小于其后面连续的5个数,然后把满足此条件的数组元素a[i]赋给数组元素b[cnt],同时数组的下标变量cnt加1。
③最后,用双重for循环语句对数组b中的数组元素两两比较大小,如果前一个数组元素大于后一个数组元素,则两者进行互换,实现对数组b进行升序或降序的排列。