我正在尝试编写一些程序以计算标准偏差以进行练习。我的问题似乎是主函数中的第一个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;
}
答案 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;
}