[C]非常郁闷的一个问题

  • From: "Thomas X. Iverson" <txi@xxxxxxxxxxxxx>
  • To: ghostunix@xxxxxxxxxxxxx
  • Date: Thu, 29 May 2008 12:39:41 +0800

在做一道指针的习题,要求输入任意多个浮点数进行平均数的计算,动态分配内存
书上的代码如下:
/* Exercise 7.1 Calculating a floating-point average using pointers */
/*********************************************************************
 * In this solution we allocate a some memory and when it is full    *
 * allocate a new, larger amount of memory and copy the contents of  *
 * the old memory to the new. We then free the old memory. This      *
 * process repeats as often as necessary.                            *
 *********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void)
{
  double *values = NULL;     /* Pointer to memory holding data values       */
  double *temp = NULL;       /* Pointer to newly allocated memory           */
  double sum = 0.0;          /* Sum of values                               */
  int capacity = 0;          /* Maximum number of values that can be stored */
  int increment = 5;         /* Capacity increment for dynamic allocation   */
  int count = 0;             /* Number of values read                       */
  int i = 0;                 /* Index to array                              */
  char answer = 'n';

  do
  {
    if(count == capacity)    /* Check if there is spare memory */
    {
      capacity += increment; /* Increase the capacity of memory by increment */
      temp = (double*)malloc((capacity)*sizeof(double)); /* and allocate it  */
      if(temp == NULL)       /* If memory was not allocated */
      {                      /* Output a message  and end   */
        printf("Memory allocation failed. Terminating program.");
        exit(1);
      }
      if(values == NULL)     /* Are there any values?                  */
        values = temp;       /* No - so just copy address of new memory */
      else                   /* Yes - so copy data from old to new      */
      {
        for(i = 0 ; i<count ; i++)
          *(temp+i) = *(values+i);
        free(values);        /* Free the old memory */
        values = temp;       /* Copy address of new */
      } 
      temp = NULL;           /* Reset pointer       */
    }

    printf("Enter a value: ");
    scanf("%lf", values+count++);

    printf("Do you want to enter another(y or n)? ");
    scanf(" %c", &answer);
  }while(tolower(answer) == 'y');

  /* Now sum the values */
  for(i = 0 ; i<count ; i++)
    sum += *(values+i);

  /* Output the average */
  printf("\n The average of the the values you entered is %.2lf.\n", sum/count);
  free(values);     /* We are done - so free the memory */
}

在理解了这个算法后,我自己重新实现了一遍(算是默写性质的复习):

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

int main(void)
{
        double *temp=NULL;
        double *value=NULL;
        double sum=0.0;
        int i;
        int count=0;
        int capa=0;
        int incre=5;
        char answer='n';

        do
        {
                if(count==capa)
                {
                        capa+=incre;
                        temp=(double *)malloc((capa)*sizeof(double));
                        if(temp==NULL)
                        {
                                printf("Failed\n");
                                return 1;
                        }
                        if(value==NULL)
                                value=temp;
                        else
                        {
                                for(i=0;i<count;i++)
                                {
                                        *(temp+i)=*(value+i);
                                }
                                free(value);
                                value=temp;
                        }
                        temp=NULL;
                }
                printf("Enter a value:");
                scanf("%lf",value+count++);
                printf("Enter another?:");
                scanf(" %c",&answer);
        }while(tolower(answer)=='y');

        for(i=0;i<count;i++);
        {
                sum+=*(value+i);
        }
        printf("%.2lf",sum/count);
        free(value);
}

问题出现了,这两段代码我怎么看都没有觉得有问题,可是就是有两个问题:
1.我自己写的这个代码无法很好的处理scanf输入缓冲问题
2.我自己写的这个代码计算出的平均值总是0,我后来加了个printf查看sum和count的值,sum总是为0,count没有问题,不知道为什么


-- 
Keep It Simple Stupid
http://blog.ghostunix.org
ghosTM55

Other related posts: