哪个更适合做计算?切换大小写,if 语句?
Which is better for doing calcculations? Switch case, if-statment?
我的作业需要在不同的计量单位之间进行大量转换。除了数学部分,我已经完成了所有的作业。我的问题是,如果有人有更好的解决方案,最好使用 switch 或 if 语句进行这些计算吗?这是关于我的程序的一些背景信息。我有一个文本文件,其中包含 9 种不同的测量单位以及它们的长度(以英尺为单位,用逗号分隔),如下所示:
英寸,.083333
寻思,6
脚,1
弗隆,660
公里,3281.5
米,3.2815
英里,5280
杆,16.5
院子,3
所以,我已经成功地将所有信息转储到一个字符串数组中。从那里我将字符串数组拆分两次。第一次拆分字符串数组时,我创建了一个新的字符串数组,它只包含每个度量单位的名称。第二次拆分字符串数组时,我这样做是为了创建一个双精度数组来保存每个测量单位的所有数值。现在我需要做数学部分。我的程序将显示九种不同的计量单位,请求转换自的单位,请求转换为的单位,请求转换的数量(或总计量),然后显示转换后的数量。到目前为止,这就是我所拥有的:
private void SandC_Load(object sender, EventArgs e)
{
splitContainer1.Panel1Collapsed = false;
splitContainer1.Panel2Collapsed = true;
string[] lengths = File.ReadAllLines("Units.txt");
int count=0;
string[] unitName=new string[count];
while (!(count==10))
{
count++;
lbLengths.Items.Add(count+"."+" "+lengths[count-1].Split(new Char[]{','})[0]);
}
}
private void btnConvert_Click(object sender, EventArgs e)
{
string orginalunits = tborginalUnits.Text;
int orginalunits1;
string desiredunits = tbDesiredunits.Text;
int desiredunits1;
string lenghttoConvert = tbConvert.Text;
double lenghttoConvert1;
string[] lengths = File.ReadAllLines("Units.txt");
int count = lengths.Length;
double[] units = new double[lengths.Length];
for (int i = 0; i < lengths.Length;i++)
{
units[i] = Convert.ToDouble(lengths[i].Split(new Char[] { ',' })[1]);
}
if ((double.TryParse(lenghttoConvert, out lenghttoConvert1)) && (Int32.TryParse(orginalunits, out orginalunits1)) && (Int32.TryParse(desiredunits, out desiredunits1)))
{
if ((desiredunits1==3)&&(orginalunits1==1))
{
double answer;
answer = units[0] * lenghttoConvert1;
Math.Round(answer, 3);
mtbOutput.Text = Convert.ToString(answer);
lblConversion.Text = "Converted to foot length";
}
}
else
MessageBox.Show("In the'Orginal and Desired Units' boxes, please enter only the numbers 1 -9, and in the 'Length to Covert' Box, please enter only numbers");
}
正如您在按钮单击事件中看到的那样,我位于应该发生转换的部分。我的问题是,我应该使用什么方法来处理所有这些计算?我已经有 1 个 if 语句,如果我打算做 if 语句,我觉得它会非常乏味,并且想知道是否有更有效的方法来做这件事。谢谢你们的帮助,我真的很感激。
最好的方法是使用一点数学来完全避免条件。
无论原始单位和目标单位是什么,都可以通过将原始单位转换为英尺,然后将英尺转换为目标单位来进行转换。
假设您想要从索引 i
处的 X
单位增加到索引 j
处的单位。您需要做的就是将 X
除以 units[i]
,然后乘以 units[j]
。不需要条件或开关。
How would the program know which unit to choose?
这取决于您的程序的组织。如果您在 UI 中使用下拉框作为单位名称,这可能是一项非常简单的任务,因为所选项目的索引将与 units[]
中的转换率索引相同数组。
鉴于这个具体的例子,if 语句和 switch 语句都是多余的。
解决这个问题的另一种方法是创建一个映射 table(二维数组),您可以在其中指定两个单位之间的转换乘数,尤其是您的代码已经使用数字来表示单位而不是它们的实际名称.
例如
C[1][1] = 1;
C[1][2] = 3.1;
C[1][3] = 5;
C[1][4] = 0.33;
C[2][1] = 1/C[1][2];
....
....
C[4][1] = 1/C[1][4];
创建该数组后,您只需根据源货币和目标货币插入数字即可进行转换。
您可以通过创建一个或两个 if 语句来进一步改进上述内容,以检查数组的第一个参数是否小于第二个参数。如果是,则取原值,如果不是,则取该值的倒数。因此,您不必用以下值填充整个数组:
C[2][1] = 1/C[1][2];
C[4][1] = 1/C[1][4];
希望对您有所帮助。
我的作业需要在不同的计量单位之间进行大量转换。除了数学部分,我已经完成了所有的作业。我的问题是,如果有人有更好的解决方案,最好使用 switch 或 if 语句进行这些计算吗?这是关于我的程序的一些背景信息。我有一个文本文件,其中包含 9 种不同的测量单位以及它们的长度(以英尺为单位,用逗号分隔),如下所示:
英寸,.083333
寻思,6
脚,1
弗隆,660
公里,3281.5
米,3.2815
英里,5280
杆,16.5
院子,3
所以,我已经成功地将所有信息转储到一个字符串数组中。从那里我将字符串数组拆分两次。第一次拆分字符串数组时,我创建了一个新的字符串数组,它只包含每个度量单位的名称。第二次拆分字符串数组时,我这样做是为了创建一个双精度数组来保存每个测量单位的所有数值。现在我需要做数学部分。我的程序将显示九种不同的计量单位,请求转换自的单位,请求转换为的单位,请求转换的数量(或总计量),然后显示转换后的数量。到目前为止,这就是我所拥有的:
private void SandC_Load(object sender, EventArgs e)
{
splitContainer1.Panel1Collapsed = false;
splitContainer1.Panel2Collapsed = true;
string[] lengths = File.ReadAllLines("Units.txt");
int count=0;
string[] unitName=new string[count];
while (!(count==10))
{
count++;
lbLengths.Items.Add(count+"."+" "+lengths[count-1].Split(new Char[]{','})[0]);
}
}
private void btnConvert_Click(object sender, EventArgs e)
{
string orginalunits = tborginalUnits.Text;
int orginalunits1;
string desiredunits = tbDesiredunits.Text;
int desiredunits1;
string lenghttoConvert = tbConvert.Text;
double lenghttoConvert1;
string[] lengths = File.ReadAllLines("Units.txt");
int count = lengths.Length;
double[] units = new double[lengths.Length];
for (int i = 0; i < lengths.Length;i++)
{
units[i] = Convert.ToDouble(lengths[i].Split(new Char[] { ',' })[1]);
}
if ((double.TryParse(lenghttoConvert, out lenghttoConvert1)) && (Int32.TryParse(orginalunits, out orginalunits1)) && (Int32.TryParse(desiredunits, out desiredunits1)))
{
if ((desiredunits1==3)&&(orginalunits1==1))
{
double answer;
answer = units[0] * lenghttoConvert1;
Math.Round(answer, 3);
mtbOutput.Text = Convert.ToString(answer);
lblConversion.Text = "Converted to foot length";
}
}
else
MessageBox.Show("In the'Orginal and Desired Units' boxes, please enter only the numbers 1 -9, and in the 'Length to Covert' Box, please enter only numbers");
}
正如您在按钮单击事件中看到的那样,我位于应该发生转换的部分。我的问题是,我应该使用什么方法来处理所有这些计算?我已经有 1 个 if 语句,如果我打算做 if 语句,我觉得它会非常乏味,并且想知道是否有更有效的方法来做这件事。谢谢你们的帮助,我真的很感激。
最好的方法是使用一点数学来完全避免条件。
无论原始单位和目标单位是什么,都可以通过将原始单位转换为英尺,然后将英尺转换为目标单位来进行转换。
假设您想要从索引 i
处的 X
单位增加到索引 j
处的单位。您需要做的就是将 X
除以 units[i]
,然后乘以 units[j]
。不需要条件或开关。
How would the program know which unit to choose?
这取决于您的程序的组织。如果您在 UI 中使用下拉框作为单位名称,这可能是一项非常简单的任务,因为所选项目的索引将与 units[]
中的转换率索引相同数组。
鉴于这个具体的例子,if 语句和 switch 语句都是多余的。
解决这个问题的另一种方法是创建一个映射 table(二维数组),您可以在其中指定两个单位之间的转换乘数,尤其是您的代码已经使用数字来表示单位而不是它们的实际名称.
例如
C[1][1] = 1;
C[1][2] = 3.1;
C[1][3] = 5;
C[1][4] = 0.33;
C[2][1] = 1/C[1][2];
....
....
C[4][1] = 1/C[1][4];
创建该数组后,您只需根据源货币和目标货币插入数字即可进行转换。
您可以通过创建一个或两个 if 语句来进一步改进上述内容,以检查数组的第一个参数是否小于第二个参数。如果是,则取原值,如果不是,则取该值的倒数。因此,您不必用以下值填充整个数组:
C[2][1] = 1/C[1][2];
C[4][1] = 1/C[1][4];
希望对您有所帮助。