问答题 将文件in.dat中的200个整数读至数组xx中。请编制jsValue()函数,要求:求出数组xx中的数值为奇数的个数cnt1和数值为偶数的个数cnt2以及数组xx下标为偶数(包括下标为0的元素)的元素值的算术平均值pj。
结果cnt1,cnt2,pj输出到out.dat中。
请勿改动数据文件in.dat中的任何数据、主函数main()、读函数read_dat()和输出函数writeDat()的内容。
#include <stdio.h>
#define N 200//定义宏变量N, 其值等于200
int cntl, cnt2, xx[N];//定义全局变量cnt1, cnt2, 以及数组xx[N]
float pj; //平均值
void writeDat();
void jsValue()
{
}
/*read_dat(int xx[N])函数将文件in.dal中的200个整数读至数组xx中*/
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]); //从文件in.dat中读取一个整数存入数组元素xx[i*10+j]中
printf("%d", xx[i*10+j]);
}
printf("\n");
}
fclose(fp); //关闭文件in.dat
}
void main()
{
read_dat(xx);
jsValue();
printf("\n\ncnt1=%d, cnt2=%d, pj=%6.2f\n", cnt1, cnt2, pj);
writeDat();
}
/*writeDat()函数将计算结果cnt1, cnt2, pj输出到out.dat中*/
void writeDat()
{
FILE *fw;
fw=fopen("out.dat", "w");
fprintf(fw, "%d\n%d\n%6.2f\n", cnt1, cnt2, pj); //将cnt1, cnt2, pj输出到out.dat中
fclose(fw);
}
【正确答案】
【答案解析】int i; cnt1=0; cnt2=0; pj=0;
/*for循环语句计算数组xx中的数值为奇数的个数cnt1和数值为偶数的个数cnt2以及数组xx下标为偶数的元素值的和*/
for(i=0; i<N; i++) //循环变量i从0开始,每次递增1,直到其值小于N
{
if(xx[i] %2) cnt1++; //如果xx[i]的值为奇数,变量cnt1加1
else cnt2++; //否则,xx[i]的值为偶数,变量cnt2加1
if(i%2==0)pj+=xx[i]; //如果数组xx下标i为偶数,则把xx[i]的值累加到变量pj
}
pj/=100.0; //变量pj除以100.0得到数组xx下标i为偶数的元素值的平均值pj [解析] 读入数值,奇数个数,偶数个数,数组下标为偶数的平均值。
①首先定义循环变量i,并对全局变量cnt1、cnt2和pj赋初值0。
②在for循环语句中,将数组xx中的每个数组元素xx[i]对2求余数,如果余数非零,则说明xx[i]是奇数,奇数的个数变量cnt1加1,否则,偶数的计数变量cnt2加1;接着将数组xx下标i对2求余,如果余数等于0,则把xx[i]的值累加到变量pj。
③退出循环时,变量pj的值除以100.0就得到数组xx下标i为偶数的元素值的算术平均值pj(因为数组中共有200个数组,下标为奇偶数的元素各占一半,因此直接将累加变量pj的值直接除100即可得到这些数的平均值)。