为什么我不退出while循环?

时间:2019-12-20 06:26:12

标签: c while-loop

我正在尝试编写一些程序以计算标准偏差以进行练习。我的问题似乎是主函数中的第一个while语句。

对此我有点不满意,我无法弄清楚为什么在用户按下Enter键后不留下while语句。

别介意我的绿色。还在学习。

#include <stdio.h>
#include <math.h>
#define arraySize 100
double standardDeviation(int, double*);
int main(void){
    double array[arraySize];
    double result;
    int i=0;
    int count=0;
    printf("Enter up to %d data separated by spaces then hit enter:\n\n",arraySize);
    while(i<arraySize && array[i]!='\n'){
        scanf("%lf",&array[i]);
            i++;
            count++;
            }

    result=standardDeviation(count, array);

    printf("The standard deviation of your data is: %lf",result);

    return 0;
}

double standardDeviation(int count, double* firstDatum){
    int i=0,j=0;
    double standDev=0;
    double standDevArray[arraySize];
    double sum=0,sum2=0;
    double mean=0,variance=0;
    while(i<count){
        sum=sum + firstDatum[i]; 
        //printf("%lf", sum);
        i++;
    }
    mean=sum/count;
    //printf("The mean is: %lf", mean);

    while(j<count){
           standDevArray[j] = (mean  - firstDatum[j]) * (mean - firstDatum[j]);
           sum2=sum2+standDevArray[j];
           j++;
    }   
    variance=sum2/count;
    standDev=sqrt(variance);
    return standDev;
 }

3 个答案:

答案 0 :(得分:1)

没有理由要求用户输入条目的数量。您要求用户输入一行,您使用fgets(或POSIX getline)将输入行读入缓冲区,然后浏览缓冲区将输入的数字转换为{{1} }值使用double(首选),或使用strtod和要读取的下一个值的偏移量。

使用sscanf保护数组边界已经做得很好,您需要做的就是添加第二个条件,同时执行有效的转换。例如:

while (i < arraySize ...

现在,您只需显示提示,用户最多输入#define MAXC 2048 ... int main(void) { char buf[MAXC]; /* buffer to hold line of input */ double array[arraySize], result; /* your array and result */ int i = 0, offset = 0, used; /* i, offset in buf, chars used */ printf ("Enter up to %d data separated by spaces then hit enter:\n\n", arraySize); if (!fgets (buf, MAXC, stdin)) { /* read/validate line of input */ fputs ("(user canceled input)\n", stderr); return 1; } while (i < arraySize && /* while in bounds && valid conversion */ sscanf (buf + offset, "%lf%n", &array[i], &used) == 1) { offset += used; /* update offset with chars used in conversion */ i++; /* increment index */ } result = standardDeviation (i, array); /* compute/display result */ printf ("The standard deviation of your data is: %lf\n",result); return 0; } 个值,然后将这些值读入数组并执行计算。在这里,2K的缓冲区大小允许每个值〜19个字符。如果那还不够,请使用4K缓冲区并为每个值提供约40个字符。

此外,不需要100或在stdDevArray函数中声明单独的循环计数器变量。从C99开始,您可以将循环变量声明为循环定义的一部分。使用standardDeviation()并没有错,这是完全不需要的。以一致的方式间隔代码也有助于提高可读性。如果消除了单独的循环变量和不需要的stdDevArray,则可以按以下方式调整函数:

stdDevArray

请注意,double standardDeviation (int count, double *firstDatum) { double standDev = 0, sum = 0, sum2 = 0, mean= 0, variance = 0; for (int i = 0; i < count; i++) sum += firstDatum[i]; mean = sum / count; for (int i = 0; i < count; i++) sum2 += (mean - firstDatum[i]) * (mean - firstDatum[i]); variance = sum2 / count; standDev = sqrt(variance); return standDev; } 运算符只是速记便利运算符。不用写+=,只需写sum = sum + firstDatum[i];

如果您还有其他问题,请告诉我。

答案 1 :(得分:0)

这段代码中出现

2个错误,其中一个导致未定义行为

首先,您将double(array [i])与char('\ n')进行比较。

第二个是索引“ i”。在while循环中,您首先执行scanf并分配数组的第i个元素,然后用操作i++ e分配增量i,然后在下一次迭代中,将数组中未初始化的第i个元素与某物进行比较。 比较时请注意,索引已增加,并且您未对该元素分配任何内容,这会导致行为未定义

答案 2 :(得分:0)

我对主要功能进行了以下调整。我只是根据用户输入预先确定了数据条目的数量,并且效果很好。 很高兴得知我的功能已经完成 第一次打电话给我,给我标准偏差的正确值。

但是有些不高兴的是,我不得不向用户询问条目的数量。 我认为该程序将更加人性化 如果我可以输入数据,然后在到达列表末尾时终止。特别是对于较大的数据集,人们不知道他们要输入多少数据。使用数组以终止于边界之外的值作为选项会有些困难,因为限制条目的值也会限制函数的功能。是否认为如果有人想制作这样的程序,链接列表会更适合于此吗?

#include <stdio.h>
#include <math.h>
#define arraySize 100
double standardDeviation(int, double);
int main(void){
    double array[arraySize];
    double result;
    int userSize;
    int i=0;
    int count=0;
    printf("Enter how many data will be entered up to a maximum of %d\n\n",arraySize);
    scanf("%d",&userSize);
    printf("Enter your data:\n\n");
        while(i<userSize && i<arraySize){
        scanf("%lf",&array[i]);
            i++;
            count++;
            }


    result=standardDeviation(count, array);

    printf("The standard deviation of your data is: %lf",result);


    return 0;
}

    double standardDeviation(int count, double* firstDatum){
        int i=0,j=0;
        double standDev=0;
        double standDevArray[arraySize];
        double sum=0,sum2=0;
        double mean=0,variance=0;
        while(i<count){
            sum=sum + firstDatum[i]; 
            //printf("%lf", sum);
            i++;
        }
        mean=sum/count;
        //printf("The mean is: %lf", mean);

        while(j<count){
               standDevArray[j] = (mean  - firstDatum[j]) * (mean - firstDatum[j]);
               sum2=sum2+standDevArray[j];
               j++;
        }   
        variance=sum2/count;
        standDev=sqrt(variance);
        return standDev;
     }