C 为什么我不退出这个while循环?
我正试着做一个小程序来计算标准偏差以供实践。我的问题似乎是主函数中的第一个C 为什么我不退出这个while循环?,c,while-loop,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];
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;
}
#包括
#包括
#定义数组化100
双标准差(int,double*);
内部主(空){
双阵列[阵列化];
双重结果;
int i=0;
整数计数=0;
printf(“输入最多%d个由空格分隔的数据,然后点击回车键:\n\n”,arraySize);
虽然(i2个错误出现在这段代码中,但其中一个错误会导致未定义的行为
首先,将double(数组[i])与char('\n')进行比较
第二个是索引“i”。在while循环中,首先扫描并分配数组的第i个元素,然后在下一次迭代中,使用操作i++
e将数组中未初始化的第i个元素与某个元素进行比较。请注意,在比较时,您的索引已经增加,并且不分配任何内容g到该元素,这会导致未定义的行为我对主函数进行了以下调整。我只是根据用户输入预先确定了数据条目的数量,它工作正常。
知道我的函数在它的
第一次打电话给我,给了我标准偏差的正确值
但知道我不得不向用户询问条目数量有点令人不安。
我认为这个程序会更方便用户
如果我可以输入数据,然后在到达列表末尾时终止。尤其是对于较大的数据集,人们不知道他们输入了多少数据。使用带有终止值超出范围选项的数组有点困难,因为限制条目的值也会限制func的功能你认为如果有人想制作这样的程序,链表会更适合吗
#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;
}
#包括
#包括
#定义数组化100
双标准差(int,double);
内部主(空){
双阵列[阵列化];
双重结果;
int用户大小;
int i=0;
整数计数=0;
printf(“输入最多可输入%d的数据量\n\n”,arraySize);
scanf(“%d”、&userSize);
printf(“输入数据:\n\n”);
虽然(i没有理由要求用户输入条目数。您要求用户输入一行,您可以使用fgets
(或POSIXgetline
)将输入行读入缓冲区,然后使用strtod
(首选)将输入的数字转换为双值,或使用sscanf
和要读取的下一个值的偏移量
您使用保护数组边界做得很好,而(i
)只需在执行有效转换时添加第二个条件即可。例如:
#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;
}
请注意,+=
运算符只是一个简写方便的运算符。您不必编写sum=sum+firstDatum[i];
,只需编写sum+=firstDatum[i];
如果您还有其他问题,请告诉我。看看i的值,因此在与换行符比较时,数组[i]的值。数组[i]
是一个双。虽然将其与'\n'
进行比较并没有错,但这是奇怪和不寻常的-可能是写13.0
而不是'\n'
(但更可能的是,该测试是多余的。)此外,i
的值超出了数组中最后一个初始化项的值-您的代码中有未定义的行为(UB)。您应该检查scanf()的结果
调用。用户按enter键不会终止循环,因为%lf
格式跳过空白,包括换行符。如果键入13作为值,您可能(可能会)退出循环。在scanf()
中检测换行符很困难。您必须进行字符输入(%c
,%s
,%s
)[…]
)在程序的数据中换行。同时(i@JonathanLeffler'\n'
通常是10,而不是13。('\r'
通常是13。)比较double
和char
不会导致未定义的行为;因为char
是一个整数类型,它被转换为double
。是的,我解释得很糟糕。我的意思是程序通常会导致第二个错误导致未定义的行为。因此,对于第一个错误,尽管没有定义,“\n”是从不通过scanf读取double数组,因此我需要找到另一种方法从用户输入中退出循环?第二个错误,你是说我应该将i++更改为++i吗?为什么?我确实将i初始化为0。请看几行。@exnihilo一句俏皮话:'\n'
的类型是int
,而不是char
。(这并不影响行为。)@KeithThompson——当然了;我太马虎了;)
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;
}