自学:初学者试图制作温度转换器

时间:2011-01-27 13:00:20

标签: c# converter

我正在尝试构建一个温度转换器来帮助自己学习C#。我只知道大部分基础知识,这是我迄今为止所提出的。我坚持使用的是获取用户输入的数字,并将其转换为用户先前输入的选项,即farenheit或者摄氏度。同样,我只知道基础知识,但非常感谢帮助。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("What sort of temperature would you like to convert?");
            string tempType = Console.ReadLine();
            ConvertChoice(tempType.ToLower());
            Console.WriteLine("Please enter a temperature to convert: ");
            string temperatureString = Console.ReadLine();
            int temperature = int.Parse(temperatureString);
            Console.ReadLine();   
        }

        static void ConvertChoice(string tempType)
        {
            switch (tempType)
            {
                case "farenheit":
                    Console.WriteLine("Farenheit it is!");
                    return;
                case "celsius":
                    Console.WriteLine("Celsius it is!");
                    return;
                default:
                    Console.WriteLine("Invalid type, please type farenheit or celsius.");
                    return;
            }
        }
    }
}

5 个答案:

答案 0 :(得分:0)

假设你输入类似“Celsius,20”的意思,你想要将20ºC转换为华氏温度,你需要一些这样的逻辑

if type == fahrenheit
    result = [formula from fahrenheit to celsius, using 'temperature']
    restype = "celsius"
else
    result = [formula from celsius to fahrenheit, using 'temperature']
    restype = "fahrenheit"

print "The result is", result, "degrees", restype

不确定这是否能回答你的问题。

更好的方式是支持开尔文。根据用户输入的内容将输入温度转换为开尔文,然后将开尔文转换为用户想要的任何值。然后,您可以支持转换为/从任何类型的单位转换,而无需单独处理每个案例:

any unit -> kelvin -> any other unit

如果你没有看到这个优势,想象一下如何为5个或10个不同单位而不是2个单位编码。

答案 1 :(得分:0)

你已经将他们的选择存储在tempType中。使用它。

static double GetTemp(string tempChoice, int temperature)
{
   double convertedTemp = 0.0;

   if(tempChoice.Equals("farenheit", StringComparison.CurrentCultureIgnoreCase))
   {
       convertedTemp = ((double)temperature * 9.0/5.0) + 32.0;
   }
   else
   {
       convertedTemp = ((double)temperature -32.0) * 5.0/9.0;
   }

   return convertedTemp;
}

只需从您的main()调用此函数。

(注意:是的,我意识到这在功能上有限,并且假设只有两种可能的温标.OP表示他正在学习编程,所以我选择了最简单的例子。)

修改 的 修正了我的算法。现在,逻辑实际上按预期工作。

答案 2 :(得分:0)

这是怎么回事?

namespace ConsoleApplication1
{
    // Using an enum to store the result of 
    // parsing user input is good practice.
    public enum Scale
    {
      Unknown,
      Celsius,
      Farenheit
    }


    class Program
    {

        static void Main(string[] args)
        {
            Console.WriteLine("What sort of temperature would you like to convert?");
            string tempType = Console.ReadLine();

            switch(ConvertChoice(tempType))
            {
              case Scale.Celsius:
                // do celsius work here
              break;
              case Scale Farenheit:
                // do farenheit work here
              break;
              default:
                // invalid input work here  
            }
            Console.ReadLine();   
        }

        static Scale ConvertChoice(string tempType)
        {
          // use the framework.  also, when dealing with string equality, its best
          // to use an overload that uses the StringComparison enum.
          if(tempType.StartsWith("f", StringComparison.CurrentCultureIgnoreCase))
            return Scale.Farenheit;
          if(tempType.StartsWith("c", StringComparison.CurrentCultureIgnoreCase)))
            return Scale.Celsius;
          return Scale.Unknown;
        }
    }

}

答案 3 :(得分:0)

使用对象方法....原谅一些可能的语法/样式错误,通常不使用c#本...

class TempConverter 
{
  public string degreeType {get; set;}
  public double userTemp {get; set;}

  public TempConverter(){}

  public double convert()
  { 
    switch(this.degreeType)
    {
       case "F":
          return this.convertToF();
       case "C":
          return this.convertToC();
       default:
          return null;  
    }

  }
  public double convertToF()
  {
       return //user temp converted to F
  }

  public double convertToC()
  {
       return //user temp converted to C
  }
}

然后你的主要类看起来像:

class Program
    {
        static void Main(string[] args)
        {
        TempConverter converter = new TempConverter();
            Console.WriteLine("What sort of temperature would you like to convert?");
            converter.degreeType = Console.ReadLine();
            ConvertChoice(converter.degreeType);
            Console.WriteLine("Please enter a temperature to convert: ");
            converter.userTemp = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine(Double.ToString(converter.convert());  
        }

        static void ConvertChoice(string tempType)
        {
            switch (tempType)
            {
                case "farenheit":
                    Console.WriteLine("Farenheit it is!");
                    return;
                case "celsius":
                    Console.WriteLine("Celsius it is!");
                    return;
                default:
                    Console.WriteLine("Invalid type, please type farenheit or celsius.");
                    return;
            }
        }
    }

答案 4 :(得分:0)

你的程序有一些缺点;首先,您需要保存用户想要执行的转换类型,以便在他/她输入需要转换的温度时实际执行该转换。由于你只使用两种温度类型(华氏温度和摄氏温度(是的,那么,无论如何都使用Réaumur?))你可以将用户选择存储为表示是否选择了华氏温度的布尔值。您可能还想接受十进制数字。

所以,说了这些,你可以改变你的计划以反映我的建议:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            bool isFahrenheit;
            bool temperatureTypeHasBeenDetermined = false;
            while(!temperatureTypeHasBeenDetermined){
                Console.WriteLine("What sort of temperature would you like to convert?");
                string tempType = Console.ReadLine();
                temperatureTypeHasBeenDetermined = ConvertChoice(tempType.ToLower(), out isFahrenheit);
            }
            decimal temperature;
            bool temperatureEnteredCorrectly = false;
            while(!temperatureEnteredCorrectly){
                Console.WriteLine("Please enter a temperature to convert: ");
                string temperatureString = Console.ReadLine();
                temperatureEnteredCorrectly = decimal.TryParse(temperatureString, out temperature);
            }
            //Now we are ready to do the conversion
            decimal convertedTemperature = isFahrenheit ?
                                           ConvertFromFahrenheitToCelsius(temperature) :
                                           ConvertFromCelsiusToFahrenheit(temperature);
            string from = isFahrenheit ? "F" : "C";
            string to = isFahrenheit ? "C" : "F";

            Console.WriteLine("{0}{1} = {2}{3}", temperature, from, convertedTemperature, to);                

            Console.ReadLine();   
        }

        static decimal ConvertFromFahrenheitToCelsius(decimal temperature)
        {
             //Implement properly
             return 60m;
        }

        static decimal ConvertFromCelsiusToFahrenheit(decimal temperature)
        {
             //Implement properly
             return 42m;
        }

        static bool ConvertChoice(string tempType, out bool isFahrenheit)
        {
            isFahrenheit = false;
            switch (tempType)
            {
                case "fahrenheit":
                    Console.WriteLine("Fahrenheit it is!");
                    isFahrenheit = true;
                    return true;
                case "celsius":
                    Console.WriteLine("Celsius it is!");
                    return false;
                default:
                    Console.WriteLine("Invalid type, please type fahrenheit or celsius.");
                    return false;
            }
        }
    }
}

请注意,我已确保通过循环输入正确的温度类型和温度值,直到获得有效值。

我希望这能引导你朝着正确的方向进一步自我学习。如果您对上述内容有任何疑问,请随时询问。作为免责声明,我必须说我没有编译上面的代码,但我的心理语法检查器通常非常可靠; - )