问题 问答题

试题要求如图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是要计算右移前的数的算数平均值,因此要对××进行累加。

单项选择题
单项选择题