问答题 请编写程序,要求:将文件IN.DAT中的200个整数读入数组xx中,求出数组xx中奇数的个数cnt1和偶数的个数cnt2,以及数组xx下标为偶数的元素值的算术平均值pj(保留2位小数),将结果cnt1、cnt2和pj输出到OUT.DAT中。
[试题程序]
#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 cnt1,cnt2,xx[N];
float pj;
FILE* fw;
int i,k=0;
long j;
system("CLS");
fw=fopen("OUT.DAT","w");
read_dat(xx);
printf("\n\ncnt1=%d,cnt2=%d,pj=
%6.2f\n",cnt1,cnt2,pj);
fprintf(fw,"%d\n%d\n%6.2f\n",cnt1,
cnt2,pj);
fclose(fw);
}
【正确答案】
【答案解析】void main()
{
int cnt1,cnt2,xx[N];
float pj;
FILE *fw;
int i,k=0;
long j;
system("CLS");
fw=fopen("out.dat","w");
read_dat(xx);
for(i=0,j=0,cnt1=0,cnt2=0;i<N;i++) /*初始化计数器变量,依次取数组中的数进行统计*/
{
if(xx[i]%2!=0) /*如果是奇数*/
cnt1++; /*统计数组xx中奇数的个数cnt1*/
else /*如果是偶数*/
cnt2++; /*统计偶数的个数cnt2*/
if(i%2==0) /*如果下标是偶数*/
{
j+=xx[i]; /*求数组xx下标为偶数的元素值的总和*/
k++; /*统计下标为偶数的元素的个数,以进一步求平均值*/
}
}
pj=(float)(j*100/k)/100; /*求数组xx下标为偶数的元素值的算术平均值pj*/
printf("\n\ncnt1=%d,cnt2=%d,pj=%6.2f\n",cnt1,cnt2,pj);
fprintf(fw,"%d\n%d\n%6.2f\n",cnt1,cnt2,pj);
fclose(fw);
} [考点] 本题考查对指定范围内数的筛选和计算。考查的知识点主要包括:if条件判断结构,逻辑表达式,平均值计算方法。
此题属于数学类问题。分析题干,本题存在2个关键点:关键点1如何判断一个数是奇数还是偶数;关键点2如何计算所有下标为偶数的元素的平均值。
本题的解题思路为:使用循环控制逐个访问数组中的每个数据,通过if else结构判断该数的奇偶性,并分别统计个数,同时累加所有下标为偶数的元素的和值,最后由和值计算出平均值。
通过一个数被2除的结果可以判断该数的奇偶性,如果可以整除则表示该数是偶数,反之为奇数。