问答题 请编写程序,要求:将文件IN.DAT中的200个整数读入数组xx中,求出数组xx中的最大数max及最大数的个数cnt和数组xx中能被3或7整除的数的算术平均值pj(保留两位小数),并将结果max,cnt,pj输出到OUT.DAT中。
勿改动主函数main()、读函数read_dat()的内容。读函数read_dat(int xx[200])及输出格式已给出。
[试题程序]
#include<stdlib.h>
#include<stdio.h>
#define N 200
void read dat(int xx[N])
{
int i, j;
FILE*fp;
fp=fopen{"IN.DAT", "r");
for(i=0; i<20; i++)
{
for(j=0; j<10; j++)
{
fscanf(fp, "%d,", &xx[i*10+j]);
printf("%d", xx[i*10+j]);
}
printf("\n");
}
fclose(fp);
}
void main()
{
int i, k, cnt, xx[N], max;
float pj;
FILE*fw;
long j=0;
system("CLS");
fw=fopen("OUT.DAT", "w");
read_dat(xx);
printf("\n\nmax=%d, cnt=%d, pj=%6.2f\n", max, cnt, pj);
fprintf(fw, "%d\n%d\n%6.2f\n", max, cnt, pj);
fclose(fw);
}
【正确答案】
【答案解析】void main()
{
int i, k, cnt, xx[N], max;
float pj;
FILE*fw;
long j=0;
system("CLS");
fw=fopen("out.dat", "w");
read_dat(xx);
max=xx[0];
for(i=1, k=0; i<N; i++)
{
if(xx[i]>max)
max=xx[i]; /*求出数组xx中最大数max*/
if(xx[i]%3==0 ||xx[i]%7==0)
{
j+=xx[i]; /*求出数组xx中值能被3整除或能被7整除的数的总和*/
k++;
}
}
for(i=0, cnt=0; i<N; i++)
if(xx[i]==max)
cnt++; /*求出数组xx中最大数max的个数*/
pj=(float)(j*100/k)/100; /*求出数组xx中值能被3整除或能被7整除的数的平均值*/
printf("\n\nmax=%d, cnt=%d, pj=%6.2f\n", max, cnt, pj);
fprintf(fw, "%d\n%d\n%6.2f\n", max, cnt, pj);
fclose(fw);
} [考点] 本题考查对多个整数的筛选、统计以及计算平均值,考查的知识点只要包括:多位整数的数位分解算法,逻辑表达式,计算平均值的算法。
首先通读题目,得知此题属于4位数的筛选题型;其次分析题干要求,本题要求补充main中空白部分,进一步分析,可以归纳出3个关键点:关键点1如何找出数组中最大数的值并统计其个数;关键点2如何通过条件“可以被7或3整除”在数组中筛选出满足条件的数;关键点3如何计算平均值。接着分析每一步的解决方法,对于关键点1通过循环使用起泡法找出其中最大的数,同时统计其个数;关键点2通过if判断结构和逻辑表达式可以实现;关键点3通过之前找到满足条件的数的和及其个数计算出平均值。