不知道为什么我的循环不循环

Don't know why my loop does not loop

我是编程新手,一直在开发一个程序,将桑拿温度从华氏度转换为摄氏度,然后告诉用户 he/she 是否应该根据原始输入调高或调低温度数字。我已经完成了我的大部分代码,但现在我不明白为什么当我写一个低于 73 度或超过 77 度的数字时它不循环。谁能看出我的眼睛好像没有发现的问题?

using System;

namespace BastunKP
{
    class Program
    {
        public static int FahrToCels(int fahr)
        {
            int tempCels = (fahr - 32) * 5 / 9;
            return tempCels;
        }

        public static void Main(string[] args)
        {
            Console.WriteLine("Skriv in Fahrenheit: ");
            int fahr = int.Parse(Console.ReadLine());
            int tempCels = FahrToCels(fahr); 

            do
            {
                if (tempCels < 73)
                {
                    Console.WriteLine("Temperaturen är för kallt, skruva upp lite!");
                }
                else if (tempCels > 77)
                {
                    Console.WriteLine("Temperaturen är för varmt, skruva ner lite!");
                }
                else
                {
                    Console.WriteLine("Temperaturen är nu lagom, hoppa in!");
                    return;
                }

                fahr = int.Parse(Console.ReadLine());
                tempCels = FahrToCels(fahr);
            }           
            while (tempCels < 73 && tempCels > 77);
        }
    }
}

我也有一个关于我的作业的问题,老师说为了获得更高的年级,我应该研究将华氏度转换为摄氏度并将其设为双倍的公式,但我不知道如何在全部.

提前致谢

tempCels < 73 && tempCels > 77 永远不会是真的!

当温度小于 73 或大于 77 时,您很可能想要 || 以便 运行,但谁知道呢。

while会在条件为真时循环,但是tempCels不能同时为<73>77!修复该条件,它将起作用。

tempCels(或任何数字,就此而言)不能同时小于 73 和大于 77。您应该使用逻辑 || 运算符,而不是逻辑 && 运算符:

do {
    // code
} while (tempCels < 73 || tempCels > 77);
// Here ---------------^

欢迎使用 Whosebug!现在,让我们开始回答您的问题:

首先,考虑您的 do-while 循环。

do {
    if (tempCels < 73) {
        // Temperature too high
        Console.WriteLine("Temperaturen är för kallt, skruva upp lite!");
    } else if (tempCels > 77) {
        // Temperature too low
        Console.WriteLine("Temperaturen är för varmt, skruva ner lite!");
    } else {
        // Temperature just right, hop in!
        Console.WriteLine("Temperaturen är nu lagom, hoppa in!");
        return;
    }

    fahr = int.Parse(Console.ReadLine());
    tempCels = FahrToCels(fahr);

}
while (tempCels < 73 || tempCels > 77);

如您所见,我删除了不必要的 else 条件。现在发生的是检查所有可能的条件(temp < 73temp > 7773 < temp < 77)。

你有一个错误,在其他答案中也指出,你有 && (AND) 而不是 || (OR)。当然,一个值不能同时低于 73 和高于 77 :)

现在,我还想指出一些我认为您应该做的样式/一般事项 'fix':

1) 您的临时转换方法包含不必要的变量创建和赋值。你可以让它在没有它的情况下也能正常工作,就像这样:

    public static int fahrToCels(int fahr) {
        // It returns just the same, without needing to create a new, 
        // temporary temperature variable! 
        return (fahr - 32) * 5 / 9;
    }

2) 这可能值得商榷,但一般的命名约定表明函数名称是用驼峰命名的。

3) 虽然这在您的具体场景中不是问题,但当您扩展应用程序(或处理更大的应用程序)时,它可能会成为一个问题。 最好使用稍微更具描述性的命名(在更大的项目中,只是 fahr 可能会造成混淆)。同样,这不是什么大问题,只是供您以后考虑的问题:)

P.S。我没有在我的示例中更改变量名称,只是为了使其更符合您显示的代码 readable/relateable。

编辑:

根据要求,以下是如何将值保持为 double 类型。

    // Notice the return type and the property types are both double.
    public static double fahrToCels(double fahr) { 
        return (fahr - 32) * 5 / 9;
    }

这样,值不必只是整数,并且在除法时会产生奇怪的结果 - 它们也可以是双精度类型!

现在,请记住,您需要将 double 类型的变量传递给函数,否则会出现类型错误。

提示:

double fahr = int.Parse(Console.ReadLine());

会让用户传递一个非整数值(比如 17.7),它会被正确存储。

提示#2:

如果你真的想进行即时转换,你可以这样实现(示例值):

int ourInteger = 4;
double ourNewDoubleNumber = (double)ourInteger / 23;

您可以在此处阅读有关类型和类型转换的更多信息:Types and Type Casting