| 本课是C#编程入门的第2讲,主要讲如何用Visual Studio下的C#语言,制作一个“一元二次方程”的计算窗体。前言 (本课程是一个2.0的版本,之前讲过一次一元二次方程的制作,姑且称之为1.0的版本,讲的相对比较繁琐和粗糙,因此重新录制了2.0版本。) 和1.0的版本相比,本课程有2个知识点的升级: 1.增加了过程封装和调用2.改进了窗体输入的方法
 这两处改进能让这个一元二次方程的案例程序更加简洁健壮,比之前的“简陋”技术有很明显的进步。 本课程主要讲的就是这两处改进。 课成分四个部分: 1.课程目的 2.设计要求 3.窗体制作 4.代码编写  第1部分 课程目的
 总体上,让学员熟练掌握用C#语言制作一个一元二次方程软件的方法。 具体来说,有两项技术需要掌握:1.掌握文本框调用 熟悉从文本框textBox调取数据的正确步骤,在窗体中数据输入输出很常见,因此调用要熟练。2.熟悉过程调用 理解过程调用的意义和作用,掌握调用的技巧。跟本课第1个版本相比,本案例的过程调用是本质性的变化。第2部分 设计要求 
 总体要求在窗体里,自动化完成一元二次方程计算、而且不报错。1.窗体要求 要求用Visual Studio做一个窗体,做5个文本框,其中前3个文本框输入一元二次方程的三个系数,后2个文本框输出两个根。2.自动化要求 改动3个文本框的时候,自动显示计算结果。注意观察我的动图演示,你也可以采用别的自动化方式,比如加一个按钮,都可以。第3部分 窗体制作 制作过程分成两步:制作窗体和控件、编写控制代码。 窗体制作的方法:直接从工具箱拉5个文本框进窗体, textBox1、textBox2、textBox3、textBox4、textBox5(VS默认边拉边自动排号) 其余的控件没有了。这一步比较简单,很容易做。第4部分 代码编写 本案例的窗体类里,分为四个部分: 1.计算代码 2.textBox1控制代码 3.textBox2控制代码 4.textBox3控制代码 整体计算过程单独放在计算代码里,作为一个子类。 更改三个文本框的时候,自动调用计算代码。1.完整代码 2.代码解释复制代码using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /*
        C#编程入门第2课(version2)课程要点:
        本课主要有2个知识点
        1.TryParse函数的应用:
        TryParse函数这个函数返回类型为bool类型,
        用以判断作为参数A[参数A必须为字符串]是否可以转换为前面的类型。
        如果可以转换,那么则将转化结果以out类型参数的方式返回。
        <>为什么要强调呢,因为直接在文本框里输入数字,再删除容易报错。
        <>textBox文本框里输入数字要经常用这个方法,要死记硬背。
        2.尝试调用函数
        本案例要更改三个文本框,每次文本框都调用相同的函数Yiyuanercifangcheng(),
        如果不把计算过程单独拿出来,就要把相同计算过程重复三次。
        熟悉调用的方式。
        */
        public void Yiyuanercifangcheng()
        {
            double a = 0;//变量先设为0再从textBox里取值,非常使用,避免报错
            double b = 0;
            double c = 0;
            double x1, x2;
            double.TryParse(textBox1.Text, out a);
            double.TryParse(textBox2.Text, out b);
            double.TryParse(textBox3.Text, out c);
            if (b * b - 4 * a * c >= 0)
            {
                x1 = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2 * a);
                x2 = (-b - Math.Sqrt(b * b - 4 * a * c)) / (2 * a);
                string x11 = x1.ToString();
                string x22 = x2.ToString();
                textBox4.Text = x11;
                textBox5.Text = x22;
            }
            else
            {
                textBox4.Text = "根不存在呦~老铁";
                textBox5.Text = "根不存在呦~老铁";
            }
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            Yiyuanercifangcheng();//直接调用,非常简洁
            textBox1.SelectAll();
        }
        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            Yiyuanercifangcheng();
            textBox2.SelectAll();
        }
        private void textBox3_TextChanged(object sender, EventArgs e)
        {
            Yiyuanercifangcheng();
            textBox3.SelectAll();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text = "1";
            textBox2.Text = "2";
            textBox3.Text = "1";
            Yiyuanercifangcheng();
        }
    }
 }
计算代码部分 这段代码“Yiyuanercifangcheng()”,是整个计算过程,相当于一个没有返回值的函数,所以加了Void,可以给别的过程调用,前面是Public(不加应该也行)。 这个功能把计算过程固化了,优点很多,非常值得小白深入理解。 听过我第一个版本课程的知道,那个版本的课程,我并没有单独做一个计算代码,因此3个文本输入框内,每个框都要写一模一样的计算代码。这样做的后果是,一旦要修改,3个文本框都要改,比较麻烦而且容易犯错。 把计算过程封装起来可以减少代码行数、降低维护成本、代码也更有层次更清晰。 复制代码public void Yiyuanercifangcheng()
        {
            double a = 0;//变量先设为0再从textBox里取值,非常使用,避免报错
            double b = 0;
            double c = 0;
            double x1, x2;
            double.TryParse(textBox1.Text, out a);
            double.TryParse(textBox2.Text, out b);
            double.TryParse(textBox3.Text, out c);
            if (b * b - 4 * a * c >= 0)
            {
                x1 = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2 * a);
                x2 = (-b - Math.Sqrt(b * b - 4 * a * c)) / (2 * a);
                string x11 = x1.ToString();
                string x22 = x2.ToString();
                textBox4.Text = x11;
                textBox5.Text = x22;
            }
            else
            {
                textBox4.Text = "根不存在呦~老铁";
                textBox5.Text = "根不存在呦~老铁";
            }
        }
下面这一段代码是输入代码,将三个文本框里的数字输入程序。
    double a = 0;//变量先设为0再从textBox里取值,非常使用,避免报错
    double b = 0;
    double c = 0;
    double x1, x2;
            double.TryParse(textBox1.Text, out a);
            double.TryParse(textBox2.Text, out b);
            double.TryParse(textBox3.Text, out c);
知识点:TryParse函数 这个函数返回类型为bool类型,用以判断作为参数A(参数A必须为字符串)是否可以转换为前面的类型。如果可以转换,那么则将转化结果以out类型参数的方式返回。 这段代码里用到的TryParse函数,是被微软官方文档推荐的文本输入转换函数,优点是不容易报错。 调用之前先把变量的初始值都设置为0,然后用tryParse函数将textBox里的数字转换为变量a、b、c。 接下来的一元二次方程计算代码,计算没有特殊的地方,就是根据一元二次方程的求值公式,先判断是否存在根,然后在进行计算。 如果根不存在,输出的两个文本框里显示根不存在。 需要注意的是在计算结束之后,计算结果x1和x2也要进行一次类型转换,以便于在窗体展示。 复制代码   if (b * b - 4 * a * c >= 0)
            {
                x1 = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2 * a);
                x2 = (-b - Math.Sqrt(b * b - 4 * a * c)) / (2 * a);
                string x11 = x1.ToString();
                string x22 = x2.ToString();
                textBox4.Text = x11;
                textBox5.Text = x22;
            }
            else
            {
                textBox4.Text = "根不存在呦~老铁";
                textBox5.Text = "根不存在呦~老铁";
            }
调用代码部分 每更新1个文本框里的内容,程序就会自动进行计算,3个输入文本框只要有变动,就会自动进行程序计算,只要在每个文本框过程中直接输入Yiyuanercifangcheng()就能完成,非常简洁。 如果不用调用代码的方式编程,就需要在每个文本框的过程中都输入计算代码,不仅费时费力,还很容易出错。  复制代码private void textBox1_TextChanged(object sender, EventArgs e)
        {
            Yiyuanercifangcheng();//直接调用,非常简洁
            textBox1.SelectAll();
        }
private void textBox2_TextChanged(object sender, EventArgs e)
        {
            Yiyuanercifangcheng();
            textBox2.SelectAll();
        }
private void textBox3_TextChanged(object sender, EventArgs e)
        {
            Yiyuanercifangcheng();
            textBox3.SelectAll();
        }
最后一段代码,是窗体生成时,自动输入三个变量计算的结果。主要为了展示效果。 复制代码private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text = "1";
            textBox2.Text = "2";
            textBox3.Text = "1";
            Yiyuanercifangcheng();
        }
 本节课程结束,谢谢大家! 
 
 |