软件工程-东北师大战-第四次作业(3)

程序基本信息:

语言:C#

工具:VS2013

环境:windows 7 32位

功能:四则运算

代码git地址:https://git.coding.net/xushaobin/task_4.git

 

要求1 参考《构建之法》第4章两人合作,结对编程上述功能,要求每人发布随笔1篇 (代码是共同完成的,博客是分别完成的)。 (1) 给出每个功能的重点、难点、编程收获。(2)给出结对编程的体会,以及 (3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 (10分)

 

功能1. 四则运算(不支持括号)

重点:随机生成四个数字并且随机选择三个运算符。

难点:避免除不尽,或者除数为零的情况,和表达式如何正确计算。

编程收获:学习了C#随机生成数的算法,和逆波兰、堆栈等知识

代码:

//功能一 随机生成支持出题4个数的四则运算题目(无括号)
        static void requirement1(int nn)
        {
            int right_num = 0;     //答对题目数目
            Random rd = new Random();
            int[] num = new int[4];
            char[] fourOptions = new char[] { '+', '-', '*', '/' };//四则运算符
            int i, j;
            int[] charnum = new int[3];
            for (i = 0; i < nn; i++)
            {
                num[0] = rd.Next(0, 10);
                num[1] = rd.Next(0, 10);
                num[2] = rd.Next(0, 10);
                num[3] = rd.Next(0, 10);    //随机生成四个数
                for (j = 0; j < 3; j++)
                {
                    int n = rd.Next(0, 4);
                    charnum[j] = n;
                    if (n == 3)       //如果有除法,出发后面的数字在1,2,4,5,8里面选择。
                    {
                        int[] divisor = { 1, 2, 4, 5, 8 };
                        Random rd1 = new Random();
                        num[j + 1] = divisor[rd1.Next(0, 5)];
                    }
                }
                //Console.WriteLine(num1 + fourOptions[0] + num2 + fourOptions[1] + num3 + fourOptions[2] + num4);
                string expression = num[0] + "" + fourOptions[charnum[0]] + num[1] + fourOptions[charnum[1]] + num[2] + fourOptions[charnum[2]] + num[3];
                Console.WriteLine(expression);
                Console.Write("?");
                String str = Console.ReadLine();
                //  Console.WriteLine(expression + " = " + Calucate(expression));
                if (Math.Abs(Calucate(expression) - GetValue(str)) < 1e-7)
                {
                    Console.WriteLine("答对了,你真是个天才!");
                    right_num++;
                }
                else
                {
                    Console.WriteLine("再想想吧,答案似乎是" + Calucate(expression) + "喔!");
                }
            }
            Console.WriteLine("你一共答对" + right_num + "道题,共20道题。");
        }

运行截图:

 

功能2. 四则运算(支持括号)

重点:表达式中序变后序。

难点:如何随机使括号成对出现在表达式,这里人为规定的了10种情况的,证明改程序支持有括号的四则运算。另外如何避免带括号的除数为零的情况,比如:2/(1+1-2)。

编程收获:进一步理解逆波兰去括号,最后变为后序的工作原理。

代码:

//功能二 随机生成支持出题4个数的四则运算题目(有括号)
        static void requirement2(int nn)
        {
            int right_num = 0;        //答对题目个数
            Random rd = new Random();
            int[] num = new int[4];
            char[] fourOptions = new char[] { '+', '-', '*', '/' };//四则运算符
            int i, j;
            int[] charnum = new int[3];
            for (i = 0; i < nn; i++)
            {

                num[0] = rd.Next(0, 10);
                num[1] = rd.Next(0, 10);
                num[2] = rd.Next(0, 10);
                num[3] = rd.Next(0, 10);
                for (j = 0; j < 3; j++)
                {
                    int n = rd.Next(0, 4);
                    charnum[j] = n;
                    if (n == 3)   //如果出现除法,后面的数从1,2,4,5,8里面选择
                    {
                        int[] divisor = { 1, 2, 4, 5, 8 };
                        Random rd1 = new Random();
                        num[j + 1] = divisor[rd1.Next(0, 5)];
                    }
                }
                string[] expression = new String[10];
                expression[0] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + num[2] + fourOptions[charnum[2]] + num[3];
                expression[1] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
                expression[2] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
                expression[3] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + fourOptions[charnum[2]] + num[3] + ")";
                expression[4] = num[0] + "" + fourOptions[charnum[0]] + num[1] + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + ")";
                expression[5] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + ")";
                expression[6] = "((" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
                expression[7] = "(" + num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + "))" + fourOptions[charnum[2]] + num[3];
                expression[8] = num[0] + "" + fourOptions[charnum[0]] + "((" + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3] + ")";
                expression[9] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + "))";
                int mm = rd.Next(0, 10);
                double ans = Calucate(expression[mm]);
                if (go == 0)
                {
                    Console.WriteLine(expression[mm]);
                    Console.Write("?");
                    String str = Console.ReadLine();
                    //  Console.WriteLine(expression + " = " + Calucate(expression));
                    if (Math.Abs(Calucate(expression[mm]) - GetValue(str)) < 1e-7)
                    {
                        Console.WriteLine("答对了,你真是个天才!");
                        right_num++;
                    }
                    else
                    {
                        Console.WriteLine("再想想吧,答案似乎是" + Calucate(expression[mm]) + "喔!");
                    }
                }
                else
                {
                    i--;
                    go = 0;
                }
            }
            Console.WriteLine("你一共答对" + right_num + "道题,共20道题。");
        }

运行截图:

 

 

功能3. 限定题目数量,"精美"打印输出,避免重复

重点:按规定格式进行打印输出test.txt文件

难点:避免重复,限定题目数量。

编程收获:复习了文件读写操作和获取主函数传入的参数并处理。

代码:

  //功能三 限定题目数量,"精美"打印输出,避免重复
        static void requirement3(int nn)
        {
            string path = "test.txt";
            File.Delete(path);
            if (!File.Exists(path))
            {

                FileInfo myfile = new FileInfo(path);
                FileStream fs = myfile.Create();
                fs.Close();
            }
            StreamWriter sw = File.AppendText(path);
            Random rd = new Random();
            int[] num = new int[4];
            char[] fourOptions = new char[] { '+', '-', '*', '/' };//四则运算符
            int i, j;
            int[] charnum = new int[3];
            double[] outcome = new double[nn];
            for (i = 0; i < nn; i++)
            {
                num[0] = rd.Next(0, 10);
                num[1] = rd.Next(0, 10);
                num[2] = rd.Next(0, 10);
                num[3] = rd.Next(0, 10);
                for (j = 0; j < 3; j++)
                {
                    int n = rd.Next(0, 4);
                    charnum[j] = n;
                    if (n == 3)
                    {
                        int[] divisor = { 1, 2, 4, 5, 8 };
                        Random rd1 = new Random();
                        num[j + 1] = divisor[rd1.Next(0, 5)];
                    }
                }
                string[] expression = new String[10];
                expression[0] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + num[2] + fourOptions[charnum[2]] + num[3];
                expression[1] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
                expression[2] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
                expression[3] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + fourOptions[charnum[2]] + num[3] + ")";
                expression[4] = num[0] + "" + fourOptions[charnum[0]] + num[1] + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + ")";
                expression[5] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + ")";
                expression[6] = "((" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
                expression[7] = "(" + num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + "))" + fourOptions[charnum[2]] + num[3];
                expression[8] = num[0] + "" + fourOptions[charnum[0]] + "((" + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3] + ")";
                expression[9] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + "))";
                int mm = rd.Next(0, 10);
                outcome[i] = Calucate(expression[mm]);
                if (go == 0)
                {
                    int or = 0;
                    for (int k = 0; k < i; k++)           //如果结果重复,重新生成该题目。
                    {
                        if (outcome[k] == outcome[i])
                        {
                            or = 1;
                            i = i - 1;
                            break;
                        }
                    }
                    if (or == 0)
                    {
                        Console.WriteLine("{0,-20}{1,-7}", expression[mm], Calucate(expression[mm]));
                        sw.WriteLine("{0,-20}{1,-7}", expression[mm], Calucate(expression[mm]));
                        sw.Flush();
                    }
                }
                else
                {
                    i--;
                    go = 0;
                }
            }
            sw.Close();

        }

运行截图:

 

逆波兰表达式解数学运算参考博客:

http://blog.csdn.net/liuyuxusuixiang/article/details/25289715

结对编程的体会

结对编程用两个人的力量编写一个程序,常常产生1+1>2的情况,开发效率较高。另外锻炼了自己与人交流,与人合作的能力,同时增进的我与我的队友蔺依铭同学的革命友谊。

 

在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。

1、讨论逆波兰的实现原理。

2、讨论如何避免除不尽和除数为零的情况。

3、讨论如何获取主函数参数并获取其中用户想要生成的题目个数。

4、讨论如何避免题目重复的情况

5、讨论功能四是否能短时间完成。

 

要求2 给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。 (5分)

照片:

 

工作地点:计算机二楼实验室

计算机:个人笔记本电脑

 

要求3 使用coding.net做版本控制。checkin 前要求清理 临时文件、可执行程序,通常执行 build-clean可以达到效果。(5分)

代码git地址:https://git.coding.net/xushaobin/task_4.git

 

转载于:https://www.cnblogs.com/xushaobin/p/7650101.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值