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

时间:2017-12-22 11:56:30

标签: c# loops variable-assignment do-while

我是编程新手,并且一直致力于将桑拿温度从华氏温度转换为摄氏温度的程序,然后告诉用户他/她是否应该根据原始输入数量来调高温度。我已经完成了大部分代码但现在我无法理解当我写一个低于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);
        }
    }
}

我也有一个关于我的任务的问题,老师说过,为了更高的年级,我应该研究将华氏温度转换为摄氏温度的公式,并使其成为双倍,但我根本不知道如何做这个改变。

提前致谢

4 个答案:

答案 0 :(得分:4)

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

您可能希望||在温度低于73或高于77时运行,但谁知道。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

欢迎使用StackOverflow!现在,让我们回答你的问题:

首先,请考虑您的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);

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

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

现在,我还要指出一些我认为应该修复的样式/一般事物&#39;:

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)这可能有争议,但一般的命名约定说函数名是用camelCase编写的。

3)虽然这在您的方案中没有特别的问题,但是当您扩展应用程序(或在更大的应用程序上工作)时,它可能会成为一个问题。 最好使用稍微更具描述性的命名(在更大的项目中,只是fahr可能会令人困惑)。同样,它不是一个大问题,只是你需要考虑的未来:)

P.S。我没有在我的示例中更改变量名,只是为了使它更易于阅读/与您展示的代码相关。

编辑:

根据请求,以下是如何将值保持为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类型的变量传递给函数,否则会出现类型错误。

提示:

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

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

提示#2:

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

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

您可以在此处详细了解类型和类型转换:Types and Type Casting

答案 3 :(得分:0)

当条件为真时,

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