[英]Printf Problem with While Loop
我正在用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;
}
问题在于比较双打,您可能会遇到这样的情况,例如10 + 1.8
值11.800000001
,因此缺少最终值。
解决您的问题的方法是先计算步骤数:
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);
}
选择一个精度,并将其与hf和lf(绝对值)之间的差异进行比较。 另外请记住,随机的固定步骤将不会总是达到间隔的最大值。 如果step除hl可能会起作用,否则就不会起作用。
在您的上一个while循环之后,直接添加以下代码(并且不要忘记#include assert.h):
printf("lf = %f, hf = %f\n", lf, hf);
assert(lf == hf);
您应该得到以下输出:
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和浮点tomfoolery的怪癖之一。 您必须处理舍入错误和不精确性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.