试题要求如图10.6所示。
部分源程序内容如下:
#include<stdio.h>
#define MAXNUM 200
int xx[MAXNUM];
int totNum=0;/*文件IN.DAT中共有多少个正整数*/
int totCnt=0;/*符合条件的正整数的个数*/
double totPjz=0.0;/*平均值*/
int ReadDat(void);
void WriteDat(void);
void CalValue(void)
void main()
int i;
for(i=0; i<MAXNUM; i++)xx[i]=0;
if(ReadDat())
printf("数据文件IN.DAT不能打开!\007\n");
return;
CalValue();
printf("文件IN.DAT中共有正整数=%d个\n", totNum);
printf("符合条件的正整数的个数=%d个\n", totCnt);
printf("平均值=%.2lf\n", totPjz);
WriteDat();
int ReadDat(void)
FILE *fp;
int i=0;
if((fp=fopen("K:\\k06\\35010005\\in.dat", "r"))==NULL) return i;
while(!feof(fp))
fscanf(fp, "%d, ", &xx[i++]);
fclose(fp);
return 0;
void WriteDat(void)
FILE *fp;
fp=fopen("K:\\k06\\35010005\\OUT.DAT", "w");
fprintf(fp, "%d\n%d\n%.2lf\n", totNum, totCnt, totPjz);
fclose(fp);
参考答案:
void CaiValue(void)
{
int i, x;
for(i=0; i<MAXNUM; i++){
if(xx[i]>0)totNum++;
x=xx[i]>>A;
if(x%B!=0){
totCnt++;
totPjz=totPjz+xx[i];
}
totPjz=totPjz/totCnt;
}
解析:
此题中要用到对一个数右移一位二进制位,在C语言中,>>运算符就可以完成此功能,它是把xx[i]转换成二进制数后,向右移一位舍掉一个二进制位,再把该二进行制位化成十进制位。注意,题目要求是记录右移后的数为奇数的个数,因此if条件要用右移得到的数进行判断。totPjz是要计算右移前的数的算数平均值,因此要对××进行累加。