已知数据文件IN.dat中存有200个四位数,并已调用读函数RData()把这些数存入数组a中,请编写函数evenVal(),其功能是:依次从数组a中取出一个四位数,如果该四位数连续大于该四位数以前的5个数且该数是偶数(该四位数以前不满5个数,则不统计),则统计出满足此条件的个数count并把这些四位数按从大到小的顺序存入数组b中。最后调用写函数WData(),把结果count以及数组b中符合条件的四位数输出到OUT.dat文件中。
注意:部分源程序已经给出。程序中已定义数组a[200]、b[200],已定义变量count。请勿改动数据文件IN.dat中的任何数据及主函数main()、读函数RData()和写函数WData()的内容。
#include <stdio.h>
#define MAX 200
int a[MAX], b[MAX], count = 0;
void evenVal()
{
}
void RData()
{ int i;
FILE *fp;
fp = fopen("IN.dat", "r");
for (i=0; i<MAX; i++)
fscanf(fp, "%d,", &a[i]);
fclose(fp);
}
void WData()
{ FILE *fp;
int i;
fp = fopen("OUT.dat", "w");
fprintf(fp, "%d\n", count);
for (i=0; i<count; i++)
fprintf(fp, "%d\n", b[i]);
fclose(fp);
}
void main()
{ int i;
RData();
evenVal();
printf("满足条件的数=%d\n", count);
for (i=0; i<count; i++)
printf("%d ", b[i]);
printf("\n");
WData();
}
试题答案及详解
【审题分析】分析题目可知,本题只要实现evenVal()函数的功能即可。evenVal()要实现的功能是:依次从数组a中取出一个四位数,如果该四位数连续大于该四位数以前的五个数且该数是偶数(该四位数以前不满五个数,则不统计),则统计出满足此条件的个数count并把这些四位数按从大到小的顺序存入数组b中。因此解答本题的关键在于比较几个四位数的大小。
【解题思路】对数组a中的数据从第六个到最后一个进行逐个扫描判断其前面连续5个数是否都小于此数,如果这个条件成立,则设标志变量flag的值为1,否则设置标志变量flag的值为0,并退出循环,进入下一轮循环。当标志变量flag的值为1,并且这个数对2的余数为0时,这个数即是符合题目条件的数,将其输入到数组b中,同时计数变量count加1。最后利用两重循环语句对数组b进行从大到小的排序。
【参考答案】
void evenVal()
{ int i, j, flag = 0;
for (i=5; i<MAX; i++)
{ for (j=i-5; j<i; j++)
if (a[i] > a[j])
{ flag = 1;
}
else
{ flag = 0;
break;
}
if (flag==1 && a[i]%2==0)
{ b[count] = a[i];
count++;
}
}
for (i=0; i<count-1; i++)
for (j=i+1; j<count; j++)
if (b[i] < b[j])
{ flag = b[i];
b[i] = b[j];
b[j] = flag;
}
}
【易错分析】因为一个四位数要大于其前面连续五个数,所以对数组a中的数据扫描应该从第六个数开始。为了记录数据a[i]前面连续5个数都小于此数,采用标志变量flag进行标记。
【考点链接】C语言for循环语句、数组排序算法。
责任编辑:小草