软件工程结对编程第二次作业

1. 题目要求

我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
能够自动生成四则运算练习题
可以定制题目数量
用户可以选择运算符
用户设置最大数(如十以内、百以内等)
用户选择是否有括号、是否有小数
用户选择输出方式(如输出到文件、打印机等)
最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)

2.成员定位

驾驶员(我)
能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中(15分)
能够对导航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结(5分)
领航员(敏·斯丢皮德
能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试(10分)
能够根据上次作业的代码检查表对驾驶员的本次工作进行评价(5分)
能够对本次工作完成500字以上的总结(5分)

3.代码

因为最好要有图形界面,所以选用c#实现
窗体设计:

下面是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.IO;

namespace chuti
{
    public partial class Form1 : Form
    {        
        public bool panduan(int shu)
        {
            if (shu == 0)
            {
                MessageBox.Show("请至少选用一种运算符号");
                return true;
            }
            else return false;
        }
        public int fuhao(ArrayList arr)
        {
            int shu = arr.Count;
            if (checkBox1.CheckState != CheckState.Checked)
            {
                shu--;
                arr.Remove("+");
            }
            if (checkBox2.CheckState != CheckState.Checked)
            {
                shu--;
                arr.Remove("-");
            }
            if (checkBox3.CheckState != CheckState.Checked)
            {
                shu--;
                arr.Remove("*");
            }
            if (checkBox4.CheckState != CheckState.Checked)
            {
                shu--;
                arr.Remove("/");
                if (panduan(shu)) { shu = 1; arr.Add("/"); checkBox4.CheckState = CheckState.Checked; }
            }
            return shu;
        }
        public string xiaoshu(Random ran, int numMax, ArrayList arr,int rollFu,int rollFu2)
        {
            string a;
            int shu1 = ran.Next(1, numMax * 10);
            int shu2 = ran.Next(1, numMax * 10);
            int shu3 = ran.Next(1, numMax * 10);
            float temp1 = (float)(shu1 * 0.1);
            float temp2 = (float)(shu2 * 0.1);
            float temp3 = (float)(shu3 * 0.1);
            if (checkBox5.CheckState == CheckState.Checked)
            {
                a = temp1.ToString() + arr[rollFu] + "(" + temp2.ToString() + arr[rollFu2] + temp3.ToString() + ")";
            }
            else a = temp1.ToString() + arr[rollFu] + temp2.ToString();
            return a;
        }

       public void chanSheng(int timuMax,int numMax)
        {
            ArrayList arr = new ArrayList() { "+", "-", "*", "/" };
            string a;
            Random ran = new Random();
            int b = fuhao(arr);       
            for (int i = 0; i < timuMax; i++)
            {
                
                int rollFu = ran.Next(0, b);
                int rollFu2 = ran.Next(0, b);
                if(checkBox6.CheckState==CheckState.Checked)
                {
                    a=xiaoshu(ran,numMax,arr,rollFu,rollFu2);                   
                }
                else
                {
                    int shu1 = ran.Next(1, numMax);
                    int shu2 = ran.Next(1, numMax);
                    int shu3 = ran.Next(1, numMax);
                    if (checkBox5.CheckState == CheckState.Checked)
                    {
                        a = shu1.ToString() + arr[rollFu] +"("+ shu2.ToString() + arr[rollFu2] + shu3.ToString()+")";
                    }
                    else a = shu1.ToString() + arr[rollFu] + shu2.ToString();
                }
                var aout = new System.Data.DataTable().Compute(a, "");
                double c = Convert.ToDouble(aout);
                aout=Math.Round(c, 2);
                textBox1.Text += a + "="+aout.ToString()+"\r\n";
            }
        }
        public Form1()
        {
            InitializeComponent();            
        }
        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
            textBox1.Font = new Font("宋体", 20);
            int timuMax = Convert.ToInt32(textBox2.Text);
            int numMax = Convert.ToInt32(textBox3.Text);
            chanSheng(timuMax,numMax);           
        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                string path = this.folderBrowserDialog1.SelectedPath + @"\题目.txt";

                using (StreamWriter writer = new StreamWriter(path))
                {
                    writer.Write(this.textBox1.Text);
                }
                MessageBox.Show("写入成功");
            }
        }
    }
}


代码已上传至GitHub:地址

4.执行效果

随机生成最大数为20的10道有括号只包含加减法的运算:

随机生成100道最大值为10的含有小数的乘除法运算:

当未选中符号时弹出警告:

写入到文件效果:

5.总结

  此次作业使我受益颇多,捡回了很久不用的c#。主要学习了调用随机数与读写调用文件等操作,在此次作业中遇到了很多困难,如函数间的互相调用,如何将字符串转换为数学算式求得结果和如何获得随机小数都困扰了我很久,一方面我上网查阅一些资料一方面有队友一直在给我提出解决的思路与想法使得本来没有什么思路的我能逐渐理清程序的思路。
  这个代码虽然完成了题目中的基本要求但还有很多不足,比如没有办法生成小数与整数混合的运算,而且因为是随机生成的数字所以乘除法会出现特别难算的情况,目前虽然想到了几种解决方法但由于太过麻烦还没有实施。一开始我写这个程序看题目没有要求给答案所以这个程序生成后是没有答案的但是后来想想感觉用户如果使用这个生成器做生成后的题目也是需要答案来核对的所以就给出了答案,现在感觉如果能给出一个按钮通过点击来显示隐藏答案就更好了。
  在审查的过程中,导航员给了我很大帮助,由于我一个人编程习惯了而且不加注释导致我的代码可读性低很多地方只有我能看懂给导航员的测试带来了很大麻烦但是他还是很认真的完成了测试,因为他编程水平不高所以一直在我遇到困难时帮我想解决思路并且从网上给我找相关资料解决了我很多问题。通过不断的修正测试,我的程序基本能实现功能,但是在细节上不够好,他能不怕麻烦,一次次的去进行测试,发现程序的不足之处并加以指正,我觉得这是难能可贵的。
  通过这次作业,我意识到自己对编程掌握的还不是很深,对发现问题的处理还不是很全面,对编程还没有形成系统的计划。随着学习的继续和对编程的进一步熟悉,我也希望能够在今后的学习中更加迅速的提升自己的编程能力,“业精于勤而荒于嬉”,在以后的编程中我要不断学习业务知识,通过多看、多问、多学、多练来不断的提高自己的编程能力。学无止境,时代的发展瞬息万变,各种学科知识日新月异。我将坚持不懈地努力学习编程,并勇于实践。

posted @ 2018-04-13 21:58  NCERF  阅读(285)  评论(0)    收藏  举报