Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C While循环的Printf问题_C - Fatal编程技术网

C While循环的Printf问题

C While循环的Printf问题,c,C,我正在创建一个以C为单位的温度转换器。基本上,输入一个最小值和最大值,单位为摄氏度,以及一个步长,它会在一个列表中显示该信息,以及相当于华氏温度的值。在某些情况下,我注意到最后一个华氏温度条目在应该显示的时候没有显示出来。例如,当您输入下限10、上限30和步长4时,它会切断最后一个华氏温度。我知道这和上次while循环有关,但我就是搞不懂 #include <stdio.h> int main (int argc, const char * argv[]) { double l,

我正在创建一个以C为单位的温度转换器。基本上,输入一个最小值和最大值,单位为摄氏度,以及一个步长,它会在一个列表中显示该信息,以及相当于华氏温度的值。在某些情况下,我注意到最后一个华氏温度条目在应该显示的时候没有显示出来。例如,当您输入下限10、上限30和步长4时,它会切断最后一个华氏温度。我知道这和上次while循环有关,但我就是搞不懂

#include <stdio.h>

int main (int argc, const char * argv[]) {
double l, h, s;
double lf, hf, sf;
/* Number rows in tables */
int num1, num2;
num1 = 1;
num2 = 1;

/* Lower limit input */
printf("Please give a lower limit: ");
scanf("%4lf", &l);
while (l < 0) {
        printf("Lower limit must be greater than 0: ");
        scanf("%4lf", &l);
}

/* Stores value for Fahrenheit conversion */
lf = l;

/* Higher limit input */
printf("Please give a higher limit: ");
scanf("%4lf", &h);
while (h <= l) {
        printf("Higher limit must be greater than lower limit: ");
        scanf("%4lf", &h);
}

while (h >= 50000) {
        printf("Higher limit must be less than 50000: ");
        scanf("%4lf", &h);
}

hf = h;

/* Step input */
printf("Please input step: ");
scanf("%4lf", &s);
while (s <= 0) {
        printf("Step must be greater than 0: ");
        scanf("%4lf", &s);
}

while (s >= h - l) {
        printf("Step must be less than the difference in temperatures: ");
        scanf("%4lf", &s);
}

sf = s;

/* Celsius table */
printf("\nCelsius\n-------\n");
while (l <= h) {
    printf("%i. %4lf\n", num1, l);
    num1++;
    l = l + s;
}

/* Fahrenheit table */
printf("\nFahrenheit\n----------\n");
/* Converts Celsius to Fahrenheit */
lf = (lf * 1.8) + 32;
hf = (hf * 1.8) + 32;
sf = sf * 1.8;
printf("Lower input: %4lf\n", lf);
printf("Higher input: %4lf\n", hf);
printf("Step: %4lf\n----------\n", sf);
/* This while loop sometimes cuts off the last entry */
while (lf <= hf) {
    printf("%i. %4lf\n", num2, lf);
    num2++;
    lf = lf + sf;
}

return 0;

}
#包括
int main(int argc,const char*argv[]{
双l,h,s;
双低频、高频、高频;
/*表中的行数*/
int num1,num2;
num1=1;
num2=1;
/*下限输入*/
printf(“请给出一个下限:”);
扫描频率(“%4lf”、&l);
而(l<0){
printf(“下限必须大于0:”;
扫描频率(“%4lf”、&l);
}
/*存储华氏转换的值*/
lf=l;
/*上限输入*/
printf(“请给出更高的限制:”);
扫描频率(“%4lf”、&h);
而(h=50000){
printf(“上限必须小于50000:”;
扫描频率(“%4lf”、&h);
}
hf=h;
/*阶跃输入*/
printf(“请输入步骤:”);
扫描频率(“%4lf”和&s);
而(s=h-l){
printf(“步骤必须小于温差:”;
扫描频率(“%4lf”和&s);
}
sf=s;
/*摄氏度表*/
printf(“\nCelsius\n------------\n”);

while(l
while(lf
while)(lf问题在于比较双精度,您可能会遇到这样的情况,
10+1.8
的计算结果为
11.80000001
,因此缺少结束值

解决问题的方法是首先计算步骤数:

int steps = (h - l) / s + 1; //Might want to apply rounding
然后在整数变量上使用
for/while
循环:

for (int i = 0; i < steps; ++i) {
    double t = l + (h - l) * i / (steps - 1);
}

for (int i = 0; i < steps; ++i) {
    double tf = lf + (hf - lf) * i / (steps - 1);
}
for(int i=0;i
问题在于比较双精度,您可能会遇到类似
10+1.8
的计算结果为
11.80000001
的情况,因此缺少结束值

解决问题的方法是首先计算步骤数:

int steps = (h - l) / s + 1; //Might want to apply rounding
然后在整数变量上使用
for/while
循环:

for (int i = 0; i < steps; ++i) {
    double t = l + (h - l) * i / (steps - 1);
}

for (int i = 0; i < steps; ++i) {
    double tf = lf + (hf - lf) * i / (steps - 1);
}
for(int i=0;i
选择精度并将其与hf和lf之间的差值(abs值)进行比较。
另外,请记住,使用随机固定步长时,您不会始终达到间隔的最大值。如果步长除以h-l,可能会起作用,但如果不是这样,则不会起作用。

选择一个精度,并将其与hf和lf之间的差(abs值)进行比较。
还请记住,对于随机固定步长,您不会始终达到间隔的最大值。如果步长除以h-l,它可能会起作用,但如果不是这样,则不会起作用。

在上一次while循环之后,直接添加以下代码(不要忘了#包括assert.h):

您应该获得以下输出:

Celsius
-------
1. 10.000000
2. 14.000000
3. 18.000000
4. 22.000000
5. 26.000000
6. 30.000000

Fahrenheit
----------
Lower input: 50.000000
Higher input: 86.000000
Step: 7.200000
----------
1. 50.000000
2. 57.200000
3. 64.400000
4. 71.600000
5. 78.800000
lf = 86.000000, hf = 86.000000
Assertion failed: lf == hf, file randomdudescode.c, line 77
这是令人难以置信的困惑,因为很明显,lf==hf。
这说明了C和浮点运算的一个怪癖。您必须处理舍入错误和不精确性。

在上一个while循环之后,直接添加以下代码(不要忘记#包括assert.h):

您应该获得以下输出:

Celsius
-------
1. 10.000000
2. 14.000000
3. 18.000000
4. 22.000000
5. 26.000000
6. 30.000000

Fahrenheit
----------
Lower input: 50.000000
Higher input: 86.000000
Step: 7.200000
----------
1. 50.000000
2. 57.200000
3. 64.400000
4. 71.600000
5. 78.800000
lf = 86.000000, hf = 86.000000
Assertion failed: lf == hf, file randomdudescode.c, line 77
这是令人难以置信的困惑,因为很明显,lf==hf。
这说明了C和浮点运算的一个怪癖。你必须处理舍入误差和不精确性。

这个问题的解决方案是什么?为了增加这个问题,通常在精度方面,你需要与ε进行比较:一些小的值来显示公差。因此,在(lf@duedl0r:我用一个链接更新了答案,这将向您解释问题和解决方案。这解释了作者为什么在解决方案中使用整数(这是一本书中的编程挑战).我的代码很好用,但一点也不优雅。我喜欢Stefan Mai的建议。@Ben:你看过前面答案的链接了吗?实际上,它建议
abs(x-y)< Epsion < /C> >,这与斯特凡所建议的差不多,只是因为C++是C++的方式,所以它更像C++的方式。这个问题的解决方法是什么?要加上这个,一般来说,你要和一个ε比较:一些小的值,表示宽容。(lf@duedl0r:我用一个链接更新了答案,这将向您解释问题和解决方案。这解释了作者为什么在解决方案中使用整数(这是一本书中的编程挑战).我的代码很好用,但一点也不优雅。我喜欢Stefan Mai的建议。@Ben:你看过前面答案的链接了吗?实际上,它建议
abs(x-y)< EpSimon < /C> >,它或多或少与斯特凡所建议的一样,只是因为它是用C++来标记的,所以它更像是C++的方式。这就应该使用序数的整数,比如执行循环的次数。我理解计算步骤数的代码,但是for while循环不太清楚。结果不一致。例如,输入下限为10,上限为20,步长为2,显示10.000000、12.500000、15.000000等。@Ben应该是
步骤计算中的
+1
,这是固定的。你应该使用整数作为序数,比如执行循环的次数。我理解代码c计算步骤数,但for/while循环不太清晰。双t显示不一致的结果。例如,输入下限10、上限20和步骤2,显示10.000000、12.500000、15.000000等。在t中@Ben应该是
+1