c#实现三角形面积计算器

作者:袖梨 2022-06-25

前言

上星期人机交互课老师布置了一个作业,让我们实现一个三角形面积计算器,有界面的那种,编程语言不限,并且透露说用c#实现比较方便。由于之前也没有学过c#,抱着试一试的态度开始了c#的“Hello World”之旅。

WinForm or WPF?

装好了VS2015打算写c#,建工程的时候却不知道建c#的什么工程好,上网查了一下,基本上有两个选择,WinForm和WPF,稍微了解了一下两者的区别,WPF晚于WinForm出现,比WinForm对线程的处理更加成熟,同时绘图能力也大有提升。答案似乎显而易见了,我最初是用WPF的,不过到了最后一步画三角形的时候,由于没有找到对应的控件,迫使我转向了WinForm,也许有别的解决办法,暂时不去研究了。

界面设计&添加事件

看着微软的c#教程,就开始编写代码了。果然简单,控件都是直接从工具箱拽入页面的,然后在属性窗口可以设置各种属性,相比于上学期学的java GUI设计,实在是太方便,大大提高了开发效率。

拖拽几个简单的控件,设计好布局,下面要做的就是为控件添加事件。用于输入的三个TextBox我都添加了Textchanged事件,用于判断用户当前输入是否合法等,Button控件添加了Click事件,点击之后可以计算三角形的面积,同时在控件PictureBox中绘出大致的三角形。

关于绘制三角形这一块,倒是浪费了我不少时间。一开始是System.Drawing这个命名空间找不到,搞了半天发现要自己添加引用,还有就是从WPF转向WinForm的原因,WPF下没找到合适的存放绘制好的三角形的控件,但发现了WinForm下的Picturebox控件可以解决这个问题,遂转向了WinForm。另外则是绘制三角形的函数通常需要知道点的坐标,而我们给出的是边长,这里我采用了固定最长边在某一水平线的方法,计算出三个点的坐标,然后绘图。

具体实现效果如下:
输入边长不合法的情况
输入边长不能构成三角形的情况
计算出面积的情况

部分事件代码:

 

 代码如下 复制代码

using System;
using System.Drawing;
using System.Windows.Forms;

namespace triangle_area
{
    public partial class title : Form
    {
        public title()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(len_a.Text.Trim()) && !string.IsNullOrEmpty(len_b.Text.Trim()) && !string.IsNullOrEmpty(len_c.Text.Trim()))
            {
                double a, b, c;
                a = double.Parse(len_a.Text);
                b = double.Parse(len_b.Text);
                c = double.Parse(len_c.Text);

                if (a + b > c && a + c > b && b + c > a)
                {
                    pictureBox1.Refresh();
                    double p = (a + b + c) / 2;
                    double s = Math.Sqrt(p * (p - a) * (p - b) * (p - c));
                    result.Text = "三角形面积为:" + s.ToString("f3");

                    double max_len = Math.Max(Math.Max(a, b), c);
                    double min_len = Math.Min(Math.Min(a, b), c);
                    double mid_len = a + b + c - max_len - min_len;
                    double cos_theda = (Math.Pow(max_len, 2) + Math.Pow(min_len, 2) - Math.Pow(mid_len, 2))/(2*max_len*min_len);
                    double sin_theda = Math.Sqrt(1 - Math.Pow(cos_theda, 2));
                    double h = 2 * s / max_len;
                    double pos = min_len * cos_theda;

                    double factor = 300/max_len;
                    double left_margin = 200 - max_len / 2 * factor;
                    double right_margin = 200 + max_len / 2 * factor;

                    Graphics g = pictureBox1.CreateGraphics();
                    SolidBrush blueBrush = new SolidBrush(Color.Blue);

                    Point point1 = new Point((int)left_margin, 270);
                    Point point2 = new Point((int)(right_margin), 270);
                    Point point3 = new Point((int)(left_margin + pos*factor), (int)(270 - h * factor));
                    Point[] curvePoints = { point1, point2, point3 };

                    g.FillPolygon(blueBrush, curvePoints);


                }
                else
                {
                    result.Text = "输入的边长不合法!";
                }
            }
            else
            {
                result.Text = "请输入三角形三边长!";
            }
        }

        private void len_a_TextChanged(object sender, EventArgs e)
        {
            result.Text = "";
            System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex(@"^[+]?d*[.]?d+$");
            if (!rex.IsMatch(len_a.Text))
            {
                result.Text = "请输入数字!";
            }
            else if (!string.IsNullOrEmpty(len_a.Text.Trim()) && !string.IsNullOrEmpty(len_b.Text.Trim()) && !string.IsNullOrEmpty(len_c.Text.Trim()))
            {
                double a, b, c;
                a = double.Parse(len_a.Text);
                b = double.Parse(len_b.Text);
                c = double.Parse(len_c.Text);

                if (a + b <= c || a + c <= b || b + c <= a)
                {
                    result.Text = "输入的边长不合法!";
                }
            }
        }

        private void len_b_TextChanged(object sender, EventArgs e)
        {
            result.Text = "";
            System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex(@"^[+]?d*[.]?d+$");
            if (!rex.IsMatch(len_b.Text))
            {
                result.Text = "请输入数字!";
            }
            else if (!string.IsNullOrEmpty(len_a.Text.Trim()) && !string.IsNullOrEmpty(len_b.Text.Trim()) && !string.IsNullOrEmpty(len_c.Text.Trim()))
            {
                double a, b, c;
                a = double.Parse(len_a.Text);
                b = double.Parse(len_b.Text);
                c = double.Parse(len_c.Text);

                if (a + b <= c || a + c <= b || b + c <= a)
                {
                    result.Text = "输入的边长不合法!";
                }
            }
        }

        private void len_c_TextChanged(object sender, EventArgs e)
        {
            result.Text = "";
            System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex(@"^[+]?d*[.]?d+$");
            if (!rex.IsMatch(len_c.Text))
            {
                result.Text = "请输入数字!";
            }
            else if (!string.IsNullOrEmpty(len_a.Text.Trim()) && !string.IsNullOrEmpty(len_b.Text.Trim()) && !string.IsNullOrEmpty(len_c.Text.Trim()))
            {
                double a, b, c;
                a = double.Parse(len_a.Text);
                b = double.Parse(len_b.Text);
                c = double.Parse(len_c.Text);

                if (a + b <= c || a + c <= b || b + c <= a)
                {
                    result.Text = "输入的边长不合法!";
                }
            }
        }
    }
}


最后还是要吐槽一下vs里面的c#代码规范,大括号换行什么的看得好不习惯呢

相关文章

精彩推荐