已知在文件IN.dat中存有若干个(少于200个)四位数字的正整数,函数ReadDat()读取这若干个正整数并存入数组number中。请编写函数CalValue(),其功能要求是:①求出文件中共有的正整数个数totNum;②求这些数右移1位后,产生的新数是

admin2010-09-05  22

问题 已知在文件IN.dat中存有若干个(少于200个)四位数字的正整数,函数ReadDat()读取这若干个正整数并存入数组number中。请编写函数CalValue(),其功能要求是:①求出文件中共有的正整数个数totNum;②求这些数右移1位后,产生的新数是奇数的数的个数totCnt以及满足此条件的这些数(右移前的值)的算术平均值totAve。最后调用函数writeDat()把所求的结果输出到OUT.dat文件中。
   注意:部分源程序已经给出。请勿改动主函数main()、读函数ReadDat()和写函数writeDat()的内容。
#include <stdio.h>
#include <conio. h>
#define  MAXNUM 200
int  number [MAXNUM];
int totNum = 0;         /* 文件IN.dst 中共有的正整数个数*/
int totCnt = 0;               /* 符合条件的正整数的个数*/
double  totAve = 0.0;  /* 平均值 */
int ReadDat (void);
void writeDat(void);
void CalValue(void)
{

}
void main ()
{  int  i;
  for (i=0; i<MAXNUM; i++)
     number = 0;
  if (ReadDat())
  {  printf (" 数据文件 IN.dst 不能打开! \007\n");
     return;
  }
  CalValue ();
  printf(" 文件 IN.dst 中共有的正整数个数=%d个\n", totNum);
  printf (" 符合条件的正整数的个数 =%d个\n", totCnt);
  printf("平均值=%.2f\n", totAve);
  writeDat ();
}
  int ReadDat (void)
{  FILE  *fp;
  int  i = 0;
  if ((fp = fopen("IN.dat", "r")) == NULL)
     return 1;
  while  (!feof(fp))
     fscanf(fp,  "%d,",  &number [i++]);
  fclose (fp);
  return 0;
}
void writeDat (void)
{  FILE  *fp;
  fp = fopen("OUT.dat",  "w");
  fprintf(fp,  "%d\n%d\n%6.2f\n", totNum, totCnt, totAve);
  fclose (fp);
}

选项

答案void CalValue(void) { int i, data; for (i=0; i<MAXNUM; i++) { if (!number[i]) break; if (number[i] > 0) totNum++; data = number[i]>>1; if (data%2) { totCnt++; totAve += number[i]; } } totAve /= totCnt; } [解题思路] 在for循环语句中,自变量i从0递增到MAXNUM对数组number中的每个数进行判断,如果number[i]的值大于0,说明number[i]的值为正整数,统计正整数个数的变量totNum加1;然后number[i]右移1位得到data的值;再对data的值除2求余数,如果其值为1,则统计变量totCnt加1,同时把number[i]的值加到totAve上,得到这些数的和。退出循环后,用totAve的值除以totCnt,就得到了这些数的算术平均值totAve。

解析
转载请注明原文地址:https://kaotiyun.com/show/iuvZ777K
0

最新回复(0)