【问题标题】:Converting Celsius degrees to Fahrenheit degrees using switch in c#使用c#中的switch将摄氏度转换为华氏度
【发布时间】:2021-02-13 22:21:32
【问题描述】:

我是一名初学者 C# 程序员,试图编写一个向用户显示菜单的简单应用程序。当用户在运行时选择选项 1 时,程序会列出从 0 到 100 摄氏度转换为华氏度的值。选择选项 2 时,程序会计算并显示一个以华氏度为单位的 0 到 212 度之间的值列表,转换为摄氏度。在相关方法中为值 100 和 212 使用常量。

问题是我只输入了选项而不是转换后的结果。这是我到目前为止所做的: {

class TemperatureConverter
{
    private const int columns = 1;
    /// <summary>
    ///
    ///
    /// 
    /// </summary>

    public TemperatureConverter()
    {
        Start();
    }

    /// <summary>
    /// 
    /// </summary>
    public void Start()

    {

        while (true)

        {
            int choice = ShowMenu();
            switch (choice)
            {
                case 0:
                    return;
                case 1:

                    Console.WriteLine();
                    while (true)
                    {

                        Console.Write("Enter Celsius:");

                        Console.WriteLine();
                        if (double.TryParse(Console.ReadLine(), out double celsius))
                        {
                            Console.WriteLine(ShowTableCelsiusToFahrenheit(celsius));
                            Console.WriteLine();
                            break;
                        }
                        
                    }
                    break;
                case 2:
                    Console.WriteLine();
                    while (true)
                    {
                        Console.Write("Enter Fahrenheit:");
                        if (double.TryParse(Console.ReadLine(), out double fahrenheit))
                        {
                            Console.WriteLine(ShowTableFahrenheitToCelsius(fahrenheit));
                            Console.WriteLine();
                            break;
                        }
                    }
                    break;
                default:
                    Console.WriteLine("You must enter 1 to convert to Celsius or 2 to convert to Fahrenheit or 0 to exit!");
                    break;
            }
        }
    }

    private double CelsiusToFarenheit(double celsius) => celsius * 9.0 / 5.0 + 32.0;
    private double FahrenheitToCelsius(double fahrenheit) => (fahrenheit - 32.0) * 5.0 / 9.0;
    private string ShowTableCelsiusToFahrenheit(double celsius) => $"{celsius}°C is {CelsiusToFarenheit(celsius)}°F";
    private string ShowTableFahrenheitToCelsius(double fahrenheit) => $"{fahrenheit}°F is {FahrenheitToCelsius(fahrenheit)}°C";

    public int ShowMenu()
    {
        int width = 28;
        while (true)
        {
            Console.WriteLine("MAIN MENU");
            Console.WriteLine("".PadLeft(width, '-'));
            Console.WriteLine("Celsius to Fahrenheit".PadRight(width - 3) + ": 1");
            Console.WriteLine("Fahrenheit to Celsius".PadRight(width - 3) + ": 2 ");
            Console.WriteLine("Exit the program".PadRight(width - 3) + ": 0 ");
            Console.WriteLine("".PadLeft(width, '-'));
            Console.WriteLine();
            Console.WriteLine("Your choice: ");
            string line = Console.ReadLine();
            if (int.TryParse(line, out int choice))
            {
                return choice;
            }
        }
    }

}

}

【问题讨论】:

  • 你如何建议它应该跳出循环while (choice != 0) ShowMenu();你在这里没有写任何逻辑。您是否缺少循环代码上的大括号?我注意到您可以将 ShowTable... 函数合并为一个,因为它们做同样的事情

标签: c# visual-studio console-application


【解决方案1】:

我为您做了一些重构,以便您了解如何编写这种代码。我试图从逻辑上提取这些部分,以便程序的每个部分都有明确的责任和流程。

我还从构造函数中删除了代码的自动运行。在构造函数中运行代码而不是设置类的初始条件的代码是个坏主意。

这是重构后的代码:

void Main()
{
    var tc = new TemperatureConverter();
    tc.Start();
}

class TemperatureConverter
{
    public void Start()
    {
        while (true)
        {
            int choice = ShowMenu();
            switch (choice)
            {
                case 0:
                    return;
                case 1:
                    Console.WriteLine();
                    while (true)
                    {
                        Console.Write("Enter Celsius:");
                        if (double.TryParse(Console.ReadLine(), out double celsius))
                        {
                            Console.WriteLine(GetCelsiusToFahrenheitLine(celsius));
                            Console.WriteLine();
                            break;
                        }
                    }
                    break;
                case 2:
                    Console.WriteLine();
                    while (true)
                    {
                        Console.Write("Enter Fahrenheit:");
                        if (double.TryParse(Console.ReadLine(), out double fahrenheit))
                        {
                            Console.WriteLine(GetFahrenheitToCelsiusLine(fahrenheit));
                            Console.WriteLine();
                            break;
                        }
                    }
                    break;              
                default:
                    Console.WriteLine("You must enter 1 to convert to Celsius or 2 to convert to Fahrenheit or 0 to exit!");
                    break;
            }
        }
    }

    private double CelsiusToFarenheit(double celsius) => celsius * 9.0 / 5.0 + 32.0;
    private double FahrenheitToCelsius(double fahrenheit) => (fahrenheit - 32.0) * 5.0 / 9.0;
    private string GetCelsiusToFahrenheitLine(double celsius) => $"{celsius}°C is {CelsiusToFarenheit(celsius)}°F";
    private string GetFahrenheitToCelsiusLine(double fahrenheit) => $"{fahrenheit}°F is {FahrenheitToCelsius(fahrenheit)}°F";

    public int ShowMenu()
    {
        int width = 28;
        while (true)
        {
            Console.WriteLine("MAIN MENU");
            Console.WriteLine("".PadLeft(width, '-'));
            Console.WriteLine("Celsius to Fahrenheit".PadRight(width - 3) + ": 1");
            Console.WriteLine("Fahrenheit to Celsius".PadRight(width - 3) + ": 2 ");
            Console.WriteLine("Exit the program".PadRight(width - 3) + ": 0 ");
            Console.WriteLine("".PadLeft(width, '-'));
            Console.WriteLine();
            Console.WriteLine("Your choice: ");
            string line = Console.ReadLine();
            if (int.TryParse(line, out int choice))
            {
                return choice;
            }
        }
    }
}

现在,这并不能满足您在问题文本中的要求。我会把它留给你。一个提示 - 无需读取任何温度作为用户输入。

【讨论】:

  • 感谢您的帮助!我尝试按如下间隔编写一个从 0-100 的 for 循环: for (int i = 0; i
  • @SadeerThaer - GetCelsiusToFahrenheitLine((double)i).
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
相关资源
最近更新 更多