2012-10-12 96 views
2

我必须编写一个三角形计算器,它可以从三个给定值计算所有其他缺少的信息。我知道如何计算价值 - 这不是问题。 但我不知道,我该如何编程,以一种很好的方式。编程一个三角形计算器

界面看起来像这样:

enter image description here

利用该12输入字段有许多可能的组合。我的第一个想法是为每个组合使用if/else语句。但这不是非常有效。 我确定,有更好的解决方案,但我不知道如何。 任何人都可以帮助我吗?

编辑 我的代码如下此刻这样:

protected void FlaecheBerechnen_Click(object sender, EventArgs e) 
    {  
     WerteAuslesen(); 
     Berechnen(); 
    } 

    protected void WerteAuslesen() 
    { 
     //Sides 
     string strSeite_a = this.txt_a.Text; if (strSeite_a == string.Empty) { i++; } else { if ((double.TryParse(strSeite_a, out seite_a) == false)) { GenerateErrorReport("Seite a"); } } 
     string strSeite_b = this.txt_b.Text; if (strSeite_b == string.Empty) { i++; } else { if ((double.TryParse(strSeite_b, out seite_b) == false)) { GenerateErrorReport("Seite b"); } } 
     string strSeite_c = this.txt_c.Text; if (strSeite_c == string.Empty) { i++; } else { if ((double.TryParse(strSeite_c, out seite_c) == false)) { GenerateErrorReport("Seite c"); } } 

     //Angles 
     string strWinkel_a = this.txtAlpha.Text; if (strWinkel_a == string.Empty) { i++; } else { if ((double.TryParse(strWinkel_a, out winkel_a) == false)) { GenerateErrorReport("Winkel Alpha"); } } 
     string strWinkel_b = this.txtBeta.Text; if (strWinkel_b == string.Empty) { i++; } else { if ((double.TryParse(strWinkel_b, out winkel_b) == false)) { GenerateErrorReport("Winkel Beta"); } } 
     string strWinkel_y = this.txtGamma.Text; if (strWinkel_y == string.Empty) { i++; } else { if ((double.TryParse(strWinkel_y, out winkel_y) == false)) { GenerateErrorReport("Winkel Gamma"); } } 

     //Height 
     string strHoehe_a = this.txt_ha.Text; if (strHoehe_a == string.Empty) { i++; } else { if ((double.TryParse(strHoehe_a, out hoehe_a) == false)) { GenerateErrorReport("Höhe a"); } } 
     string strHoehe_b = this.txt_hb.Text; if (strHoehe_b == string.Empty) { i++; } else { if ((double.TryParse(strHoehe_b, out hoehe_b) == false)) { GenerateErrorReport("Höhe b"); } } 
     string strHoehe_c = this.txt_hc.Text; if (strHoehe_c == string.Empty) { i++; } else { if ((double.TryParse(strHoehe_c, out hoehe_c) == false)) { GenerateErrorReport("Höhe c"); } } 

     //ErrorReport: 
     if (ErrorMessage != null) 
     { 
      Page.ClientScript.RegisterStartupScript(this.GetType(), "ErrorAlert", "alert('Folgende Angaben sind fehlerhaft: " + ErrorMessage + "');", true); 
      return; 
     } 

     //Logic 
     //If more than 3 values.... 

     string AlertText; 

     if (i < 6) 
     { 
      AlertText = "Es dürfen nur 3 Angaben gemacht werden!"; 
      Page.ClientScript.RegisterStartupScript(this.GetType(), "ErrorAlert", "alert('" + AlertText + "');", true); 
      return; 
     } 
     if (i > 6) 
     { 
      AlertText = "Es müssen mindestens 3 Angaben gemacht werden!"; 
      Page.ClientScript.RegisterStartupScript(this.GetType(), "ErrorAlert", "alert('" + AlertText + "');", true); 
      return; 
     } 
    } 

    protected void Berechnen() 
    { 
     //Höhensatz 

     if (seite_a != 0 && seite_b != 0 && seite_c != 0) 
     { 
      //Calculate missing angles 

       //Winkel Gamma 
       cos_y = (seite_a * seite_a) + (seite_b * seite_b) - (seite_c * seite_c); //Zähler berechnen 
       cos_y = cos_y/(2 * seite_a * seite_b); //Durch Nenner teilen 
       winkel_y = Math.Acos(cos_y); //Bogenradius berechnen 
       winkel_y = winkel_y * 180/Math.PI; //In Winkel umrechnen 

       //Winkel Beta 
       cos_b = (seite_c * seite_c) + (seite_a * seite_a) - (seite_b * seite_b); //Zähler berechnen 
       cos_b = cos_b/(2 * seite_c * seite_a); //Durch Nenn teilen 
       winkel_b = Math.Acos(cos_b); //Bogenradius berechnen 
       winkel_b = winkel_b * 180/Math.PI; //In Winkel umrechnen 

       //Winkel Alpha 
       double winkel_a = 180 - winkel_b - winkel_y; 

       //Werte eintragen 
       txtAlpha.Text = Convert.ToString(winkel_a); 
       txtBeta.Text = Convert.ToString(winkel_b); 
       txtGamma.Text = Convert.ToString(winkel_y); 

      //Flächen berechnen 

       //Mit Satz des Heron 
       Heron heron = new Heron(seite_a, seite_b, seite_c); 
       double FlaecheHeron = heron.Area; 
       Page.ClientScript.RegisterStartupScript(this.GetType(), "ErrorAlert", "alert('" + FlaecheHeron + "');", true);  
     } 
    } 

的问题是,有这么多的可能的组合。 如果(seite_a!= 0 & & seite_b!= 0 & & seite_c!= 0),等等等等....

+0

这实际上可能是http://ux.stackexchange.com上的一个更好的问题:“角度计算器的推荐界面” - “当只有y( JDB

+0

@ Cyborgx37,我没有理会OP,接口不是问题,但它背后的逻辑是。 – MvG

回答

2

你可以写下所有你可能用它来执行你的计算规则。我想你会用角度和,正弦律,余弦定律等等。将每个规则写成一个类,并为每个可能的标签创建一个实例(即,是否使用余弦定律来计算γ或β)。你最终应该得到一个对象列表,所有对象都共享一个通用接口,你可以使用它来计算一些其他值。然后,您可以遍历该列表以查看哪些规则适用,并使用它们计算附加值。一旦缺失值的计数达到零,就完成了。

如果您遍历所有规则而未找到要应用的规则,那么您的可能规则集不够完整。我相信编写一个unit test是一个非常好的主意,它会尝试所有220种可能的方式来填充12个输入中的3个,以确保您有足够的规则来处理所有这些输入。只需从一组完整的12个值开始,计算所有三元素子集,将它们提供给您的应用程序代码,并将结果与​​期望值进行比较,并将数值误差考虑在内。

上述方法既未针对性能进行优化,也未针对数字稳定性进行了优化。如果其中任何一个都是您的问题,则采用不同的方法可能更适合。