我正在尝试制作一个小程序来练习计算标准偏差。我的问题似乎在主函数中的第一个while
语句。
我有点生疏,无法弄清楚为什么用户按下回车后我不能离开 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;
}
array[i]
是一个double
。虽然将其与'\n'
进行比较并不是错误的,但这很奇怪和不寻常 - 最好写13.0
而不是'\n'
,也许(但更有可能的是,这个测试是多余的)。此外,i
的值超出了array
中最后一个初始化条目的范围 - 你的代码存在 未定义行为 (UB)。你也应该检查scanf()
调用的结果。 - Jonathan Leffler%lf
格式会跳过空白字符,包括换行符。如果以 13 作为值输入,您可能会(很可能)退出循环。在scanf()
中检测换行符很困难。您必须使用字符输入(%c
、%s
、%[…]
)将换行符传递给程序数据。 - Jonathan Lefflerwhile(i<arraySize && scanf("%lf",&array[i]) == 1) { ... }
- David C. Rankin'\n'
通常是10,而不是13。('\r'
通常是13。) - Keith Thompson