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

问题描述 投票:3回答:4

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

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

提前致谢

c# loops variable-assignment do-while
4个回答
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 :)

现在,我还要指出一些我觉得应该“修复”的造型/一般事物:

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)虽然这在您的方案中不是特别的问题,但是当您扩展应用程序(或在更大的应用程序上工作)时,它可能会成为一个问题。最好使用稍微更具描述性的namings(在更大的项目中,只是fahr可能会令人困惑)。再说一遍,这不是什么大问题,只是为了你未来考虑的事情:)

附:我没有在我的示例中更改变量名称,只是为了使其更易于阅读/与您展示的代码相关联。

编辑:

根据要求,以下是如何将值保持为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


4
投票

tempCels < 73 && tempCels > 77从来都不是真的!

很可能你想要||这样在温度低于73或大于77时运行,但谁知道。


2
投票

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

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.