2015-04-18 1 views
0

У меня есть задание, требующее много конверсий между различными единицами измерения. У меня есть вся работа, кроме математической части. Мой вопрос в том, и если у кого-то есть лучшее решение для всех ушей, было бы лучше сделать эти вычисления с помощью оператора switch или if? Вот небольшая информация о моей программе. У меня есть текстовый файл, который содержит 9 различных единиц измерения, а также их длины в плане ног, разделенных запятой, который выглядит следующим образом:Что лучше делать калькуляции? Корпус выключателя, если-statment?

дюйма, .083333
Fathom, 6
стопу, 1
фарлонг, 660
км, 3281,5
метр, 3,2815
мили, 5280
стержень, 16,5
двор, 3

Итак, у меня есть SUC без всякой информации в массив строк. Оттуда я дважды разбил массив строк. В первый раз, когда я разделил массив строк, я создал новый массив строк, который будет содержать только имена для каждой единицы измерения. Во второй раз, когда я разделил строковый массив, я сделал это, чтобы создать двойной массив для хранения всех числовых значений для каждой единицы измерения. Теперь мне нужно сделать математическую часть. Моя программа будет отображать девять разных единиц измерения, запросить устройство для конвертирования, запросить устройство для преобразования, запросить количество (или общее измерение) для преобразования, а затем отобразить преобразованное количество. До сих пор это то, что у меня есть:

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, и если я собираюсь делать это, если мне кажется, что это будет очень утомительно, и мне интересно, был ли более эффективный способ сделать это. Спасибо за помощь, ребята, я действительно ценю это.

+0

Многие хорошие вопросы порождают определенное мнение, основанное на опыте экспертов, но ответы на этот вопрос будут, как правило, почти полностью основанными на мнениях, а не на фактах, ссылках или конкретном опыте. –

+1

Многие из них должны быть заменены на 'switch' просто для удобства чтения. В обоих случаях компилятор, вероятно, оптимизирует его примерно так же, и в любом случае вам стоит подумать только о производительности после того, как вы знаете, что он попал в хит. Сначала заработайте свой код и не беспокойтесь об этом. – SimpleVar

ответ

2

Лучший подход - использовать небольшую математику, чтобы избежать условностей вообще.

Независимо от того, что является исходным и целевым единицами, вы можете выполнить преобразование путем преобразования исходных единиц в ножки, а затем преобразования ножек в целевое устройство.

Предположим, вы хотите перейти от X единиц по индексу i к единицам по индексу j. Все, что вам нужно сделать, это разделить X на units[i] и умножить на units[j]. Никакие условные обозначения или переключатели не требуются.

Как программа узнает, какой блок выбрать?

Это зависит от организации вашей программы. Это может быть очень простой задачей, если вы используете раскрывающиеся окна для имен узлов в вашем пользовательском интерфейсе, потому что индекс выбранного элемента будет таким же, как индекс коэффициента конверсии в массиве units[].

+0

, так что вы говорите, что если я хочу идти от дюймов "единиц [0]" до ножек "единиц [2]", мне нужно разделить "lenghttoConvert1" на "units [0], а затем умножить это на единицы [ 2]? Если да, то как это будет закодировано? Я не вижу, как это делается без использования какого-либо условного оператора. Как программа узнает, какое устройство выбрать? – Spr89

+0

@ Spr89 Ответ на этот вопрос во многом зависит от организация вашего пользовательского интерфейса. Я сделал одно предложение в редактировании, но другие подходы, безусловно, возможны. – dasblinkenlight

0

Учитывая этот конкретный пример, если утверждения и операторы switch являются избыточными.

Еще один способ решить эту задачу - создать таблицу сопоставления (двухмерный массив), в которой вы указываете множитель преобразования между обоими блоками, особенно если ваш код уже использует цифры для представления единиц вместо их фактических имен.

Например

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]; 

Надеюсь, что это помогло.

Смежные вопросы