《面向对象程序设计》课程作业六

作业描述:1. 本次作业要求将四则运算的核心部分采取栈的知识进行解决。即表达式生成的合法性检验、表达式结果计算。 2. 学习C++界面编程,可以学QT、MFC或者VS,选择其一即可,用博客记录学习到的知识以及心得体会。

不知道为什么当时做作业四的时候要解释算法……就不重复贴了。请点:算法及实现

代码里也有很详尽的注释,流程图也很清楚,不赘述了。


重点讲一下C++界面编程吧。

我先花了点时间去看了一下MFC,MFC全称Microsoft Foundation Classes,也就是微软基础类库。它是VC++的核心,VC++全称是Visual C++,是由微软提供的C++开发工具。MFC很彻底的用C++封装了Windows SDK(Software Development Kit,软件开发工具包)中的结构和功能,提供了一个应用程序框架,此应用程序框架为软件开发者提供了方便的操作手段,完成一些例行工作,提高开发效率。

下面是MFC的画风:

void CAdditionDlg::OnBnClickedAddButton()   
{   
    // TODO: Add your control notification handler code here   
    // 将各控件中的数据保存到相应的变量   
    UpdateData(TRUE);   
  
    // 将被加数和加数的加和赋值给m_editSum   
    m_editSum = m_editSummand + m_editAddend;   
  
    // 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值   
    UpdateData(FALSE);   
}  

效果图如下:

MFC是很典型的C++语法。在稍微了解了MFC中,我认为C#完全可以替代MFC的功能。而且C#也是面向对象的语言,写C#时也能,并且很多语法比纯C++的MFC简易许多。之前看过C#的网络公开课,然而很多东西当时还没有理解,现在借着这个作业的机会重拾了那堂公开课。

我实现了一个非常简易的“自动出题器”,功能是这样的:有三个按钮——出题、判定和清空。

按下出题后,产生一个很简单的算式,然后用户可以在旁边的空白文本框中输入答案。然后按下判定,会在下面的文本列表中显示本次答题的情况,如果回答错误还会显示正确答案,并统计做题的情况。

清空后会清空所有数据。

下面贴上代码:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int a, b;
        string op;
        int result;

        static int numright = 0, numwrong = 0;
        
        Random rnd = new Random();

        private void btnNew_Click(object sender, EventArgs e)
        {
            labelright.Text = numright.ToString();
            labelwrong.Text = numwrong.ToString();

            a = rnd.Next(9) + 1;
            b = rnd.Next(9) + 1;
            int c = rnd.Next(4);
            switch (c)
            {
                case 0: op = "+";result = a + b;break;
                case 1: op = "-";result = a - b;break;
                case 2: op = "*";result = a * b;break;
                case 3: 
                    while(a%b!=0)
                    {
                        /*这里防止了除不尽的情况*/
                        a = rnd.Next(9) + 1;
                        b = rnd.Next(9) + 1;
                    }
                    op = "/";result = a / b;break;
            }
            label1.Text = a.ToString();
            label2.Text = op;
            label3.Text = b.ToString();
            textBox1.Text = "";
        }

        private void btnJudge_Click(object sender, EventArgs e)
        {
            string ans = textBox1.Text;
            if (ans == "") return;

            double d = double.Parse(ans);
            string display = "" + a + op + b + "=" + ans + " ";
            if (d == result)
                { display += "√"; numright++; }
            else
                { display += "╳ 正确答案是: " + result.ToString() ; numwrong++; }

            listBox1.Items.Add(display);
            labelright.Text = numright.ToString();
            labelwrong.Text = numwrong.ToString();
        }  

        private void btnClear_Click(object sender, EventArgs e)
        {
            label1.Text = "";
            label2.Text = "";
            label3.Text = "";
            textBox1.Text = "";
            listBox1.Items.Clear();
            numright = 0;
            numwrong = 0;
            labelright.Text = numright.ToString();
            labelwrong.Text = numwrong.ToString();
        }
    }
}

C#的界面编程,很基础的部分都是很好学的。C#代码的书写也是行云流水(很多都是系统自动生成,不需要写很多代码),也有图形化操作界面帮助设置各种属性等等。

看到上面的简易出题器,之后的工作只需要把我们之前写的生成复杂表达式的逻辑整合到新的C#程序中即可。

那最后安利一波我以前看过,现在重拾的唐大仕老师的C#课程。MOOC是好东西呀,要多看MOOC。

posted @ 2017-05-29 20:46  畅畅1  阅读(405)  评论(2编辑  收藏  举报