【问题标题】:Switch case statement切换案例语句
【发布时间】:2013-09-18 14:17:57
【问题描述】:

我正在尝试在 C# 中创建一个应用程序,它将文本框中的数字转换为标签控件中的罗马数字,并且需要使用 case 语句。但是,我的一个变量 Roman 收到错误消息:使用未分配的局部变量 'Roman'。

这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Roman_Numeral_Converter
 {
  public partial class Form1 : Form
  {   
     public Form1()
    {
        InitializeComponent();
    }

    private void btnCalc_Click(object sender, EventArgs e)
    {

        int Number=int.Parse(txtNum.Text); // To hold Number
        string Roman; // To hold Roman Numeral 

        if (Number>=1 && Number <=10)
        {
            switch (Roman)
            {
                case "Number==1":
                lblRoman.Text = "I";
                break;
                case "Number==2":
                lblRoman.Text = "II";
                break;
                case "Number==3":
                lblRoman.Text = "III";
                break;
                case "Number==4":
                lblRoman.Text = "IV";
                break;
                case "Number==5":
                lblRoman.Text = "V";
                break;
                case "Number==6":
                lblRoman.Text = "VI";
                break;
                case "Number==7":
                lblRoman.Text = "VII";
                break;
                case "Number==8":
                lblRoman.Text = "VIII";
                break;
                case "Number==9":
                lblRoman.Text = "IX";
                break;
                case "Number==10":
                lblRoman.Text = "X";
                break;
            }
        }
        else
        {
            MessageBox.Show("Error: Invalid Input");
        }

    }

    private void btnExit_Click(object sender, EventArgs e)
    {
        // Close the form.
        this.Close();
    }

    private void btnClear_Click(object sender, EventArgs e)
    {
        txtNum.Text = "";
        lblRoman.Text = "";
    }
}

}

【问题讨论】:

  • case "Number==1": 应该和case 1: 一样,其余情况也一样,变量Roman 应该在使用前初始化。
  • 你的变量 Roman 没有赋值,switch 的使用也不对
  • 如果这不是家庭作业或者你不需要使用switch,我会考虑为这项任务设计不同的设计。

标签: c#


【解决方案1】:

你的结构有点不对劲。

private void btnCalc_Click(object sender, EventArgs e)
{

    var Number = int.Parse(txtNum.Text); // To hold Number

    switch (Number)
    {
            case 1:
              lblRoman.Text = "I";
              break;
            case 2:
              lblRoman.Text = "II";
              break;
            case 3:
              lblRoman.Text = "III";
              break;
            case 4:
              lblRoman.Text = "IV";
              break;
            case 5:
              lblRoman.Text = "V";
              break;
            case 6:
              lblRoman.Text = "VI";
              break;
            case 7:
              lblRoman.Text = "VII";
              break;
            case 8:
              lblRoman.Text = "VIII";
              break;
            case 9:
              lblRoman.Text = "IX";
              break;
            case 10:
              lblRoman.Text = "X";
              break;
            default:
              MessageBox.Show("Error: Invalid Input");
              break;
    }

}

您正在使用lblRoman 来保存结果,因此您的Roman 变量是不必要的。此外,由于您正在查询switch 中所有可能的有效数字,因此您可以使用default 替换您的if/else 结构。

我假设您这样做是为了进行学术练习。话虽这么说,我不指出你Mosè Bottacini's solution to this problem.

【讨论】:

  • 我的点击事件下已经有一个 roman 的值。
【解决方案2】:

这是因为 Roman 变量实际上是未赋值的。你应该在输入语句之前分配它

【讨论】:

  • 澄清这是家庭作业,所以我必须使用 switch case 语句。
【解决方案3】:

试试这个,

当你的数字值像1 所以罗马数字是I

private void btnCalc_Click(object sender, EventArgs e)
{
        int Number = int.Parse(txtNum.Text); // To hold Number
        string Roman; // To hold Roman Numeral

        if (Number >= 1 && Number <= 10)
        {
            switch (Number)
            {
                case 1:
                    lblRoman.Text = "I";
                    break;

                case 2:
                    lblRoman.Text = "II";
                    break;

                case 3:
                    lblRoman.Text = "III";
                    break;

                case 4:
                    lblRoman.Text = "IV";
                    break;

                case 5:
                    lblRoman.Text = "V";
                    break;

                case 6:
                    lblRoman.Text = "VI";
                    break;

                case 7:
                    lblRoman.Text = "VII";
                    break;

                case 8:
                    lblRoman.Text = "VIII";
                    break;

                case 9:
                    lblRoman.Text = "IX";
                    break;

                case 10:
                    lblRoman.Text = "X";
                    break;
            }
        }
        else
        {
            MessageBox.Show("Error: Invalid Input");
        }
}

【讨论】:

  • 我认为您的意思是 switch (Number) 而不是 switch (Roman),因为 Roman 没有被初始化,甚至没有被使用。
  • 这不起作用,因为您不能将 int 隐式转换为字符串,然后当他们在文本框中输入数字 1-10 时,它不会显示为相应的罗马数字
  • 检查我是否已更新我的答案。当您的文本值为 1-10 时,它会在您的 lblRoman.Text 中返回罗马值。
  • 要修复它,如果其他人有同样的问题,我必须使用 switch (Roman=Number)。
  • 你想要什么我无法理解。它正在工作。
【解决方案4】:

您可以使用Linq 来代替switch,这样会更好。

int Number=int.Parse(txtNum.Text);
var romanList = new List<string> {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"};
if (Number >= 1 && Number <= 10)
lblRoman.Text = romanList.Select((r, i) => new { Roman = r, Index = i+1}).FirstOrDefault(x=> x.Index == Number).Roman;

【讨论】:

    【解决方案5】:

    您可以通过这种方式替换您的 switch 语句。当然你需要在使用它之前分配一个变量。

    public string GetNum(string val)
    {
        string res = ""; // Assign it an empty string. 
        var numToRom = new Dictionary<string, string>
                           {
                               {"1","I"},
                               {"2","II"}
                               //so on
                           };
    
            numToRom.TryGetValue(val, out res);
            return res;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-04-20
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多