四则运算V1.1

做业:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/997
代码:https://coding.net/u/Dawnfox/p/f4/git/tree/master/code
git地址:https://git.coding.net/Dawnfox/f4.githtml

1、解题思路

看题后不要着急编码,将题目中涉及的功能列出来,肯定可能存在的技术难点。功能一/二实际上就是对操做数、操做符进行操做,这里涉及到的就是核心功能“表达式求值”,输入、输出格式处理都不用着急着去解决。表达式的重复性检验目前没有想到咋用代码实现,待定中。其余想法晚上找文档再补充。git

2、须要注意的地方

请查看博客【点击编程

3、难点

  • 表达式求值
    构造两个栈,一个放操做数,另外一个放操做符,经过入栈、出栈进行运算,将“=”做为表达式结束的符号。
//求表达式值
        static public String OpsExp(string[] arr)
        {
            arr = arr.Where(s => !string.IsNullOrEmpty(s)).ToArray();
            Stack<string> ovs = new Stack<string>();//操做数
            Stack<string> ops = new Stack<string>();//操做符
            String res = "";
            foreach (string str in arr)
            {
                if (str.Equals("="))
                {
                    while (ops.Count != 0)
                    {
                        if (ovs.Count >= 2)
                        {
                            string firOps = ovs.Pop();
                            string secOps = ovs.Pop();
                            string onceOps = ops.Pop();
                            String[] resOps = OpsAl(secOps, firOps, onceOps);
                            if (IsValid(resOps[0]))
                            {
                                ovs.Push(resOps[1].ToString());

                            }
                            else
                            {
                                return res;

                            }

                        }
                    }

                    if (ops.Count == 0)
                    {

                        res = ovs.Pop();
                        break;
                    }

                }

                if (Regex.IsMatch(str, ovsArr))
                {
                    ovs.Push(str);
                }
                else if (opsArr.Contains(str))
                {
                    //第一个运算符
                    if (ops.Count == 0)
                    {
                        ops.Push(str);
                    }
                    else
                    {

                        //遇到左括号
                        if (str.Equals("("))
                        {
                            ops.Push(str);
                        }

                        //15/12/24 3:30 by hr
                        // 还须要考虑括号隔两个操做符的状况!
                        //遇到右括号且当前栈顶元素为左括号 
                        //if (str.Equals(")") && ops.Peek().Equals('('))
                        if (str.Equals(")"))
                        {
                            //还须要考虑括号隔两个操做符的状况!
                            while (!ops.Peek().Equals("("))
                            {
                                if (ovs.Count >= 2)
                                {
                                    string firOps = ovs.Pop();
                                    string secOps = ovs.Pop();
                                    string onceOps = ops.Pop();
                                    String[] resOps = OpsAl(secOps, firOps, onceOps);
                                    if (IsValid(resOps[0]))
                                    {
                                        ovs.Push(resOps[1].ToString());
                                    }
                                    else
                                    {
                                        return res;
                                    }
                                }

                            }
                            if (ops.Peek().Equals("("))
                            {
                                ops.Pop();
                            }

                        }


                        if ((str.Equals("+") || str.Equals("-") || str.Equals("*") || str.Equals("/")))
                        {

                            //当前操做符优先级低于操做符栈顶元素优先级 
                            if (!ops.Peek().Equals("(") && Priority(ops.Peek()) >= Priority(str))
                            {
                                if (ovs.Count >= 2)
                                {
                                    string firOps = ovs.Pop();
                                    string secOps = ovs.Pop();
                                    string onceOps = ops.Pop();
                                    String[] resOps = OpsAl(secOps, firOps, onceOps);
                                    if (IsValid(resOps[0]))
                                    {
                                        ovs.Push(resOps[1].ToString());
                                        ops.Push(str);
                                    }
                                    else
                                    {
                                        return res;
                                    }

                                }
                            }

                            //当前运算符优先级大于运算符栈顶元素优先级
                            if (!ops.Peek().Equals("(") && Priority(ops.Peek()) < Priority(str))
                            {
                                ops.Push(str);
                            }

                            if (ops.Peek().Equals("("))
                            {
                                ops.Push(str);
                            }


                        }
                    }

                }
                else
                {
                    Console.WriteLine("存在不合法数据或符号");
                    break;
                }

            }

            return res;
        }
  • 随机数重复?不重复?
    C#的随机函数是伪随机,直接使用随机函数是从必定范围内获取随机数,屡次获取随机数,是可能存在取到相同的随机数。所以须要选择时间做为种子,同时检测每次生成的随机数是否已经存在,若存在,则保留,不然继续产生随机数。
//随机整数 
        //number 随机数个数,isDuplicated 随机数是否重复(true 重复,false 不重复)
        static public int[] GetRadomDigits(int number,int minValue, int maxValue, bool isDuplicated) {
             Random ra = new Random((int)DateTime.Now.Ticks);

            int[] resNums = new int[number];
            int tmpNum = 0, i=0;
            for (i = 0; i < number; i++) {
                tmpNum = ra.Next(minValue, maxValue);

                //检测随机数是否重复
                while (resNums.Contains(tmpNum)&&!isDuplicated)
                {
                    tmpNum = ra.Next(minValue, maxValue);
                }
                resNums[i] = tmpNum;
            }

            return resNums;
        }
  • 写文件
    检验文件路径的合法性,将内容格式化输出,内容追加(若存在指定文件,则追加到文件尾,不然新建指定的文件)。
//写文件 全部
        //todo 路径合法性检验
        static public void WriteFile(string path, Dictionary<String, String> contents)
        {
            FileStream fs = new FileStream(path, FileMode.Append);//若存在指定文件则追加到文件尾 不然新建文件
            StreamWriter sw = new StreamWriter(fs);
            String content = "";
            foreach (KeyValuePair<String, String> ele in contents)
            {
                content = string.Format("{0,-30}{1,-10}", ele.Key, ele.Value);     //格式化输入内容
                sw.WriteLine(content);
            }

            sw.Flush();//清空缓冲区
            //关闭流
            sw.Close();
            fs.Close();
        }

4、结对编程

工做地点:东北师范大学传媒软件所。
计算机: Windows 版本 10.0.15063 64位+外接dell显示屏
队友:袁玥

结对编程能有啥感觉呢?我以为我本身不咋滴,然而其余人都以为我还不错。接触福大以及其余学校的同窗,我清楚认识本身的能力还远远不足以被他人看得上。和个人队友结对编程,我能看到她的不足,编程能力、与人沟通,这样的问题一样存在于我本身身上。如何把本身的想法,对于这个小项目如何去作,怎么去作,阐述清楚,对我而言,仍是很难啊。关于合做过程当中存在较长争论的的事件以下:dom

  • 说服队友不要直接编码,先列举这个项目存在的技术难点、功能,作技术原型,而后 再开始编码。大约90min。让队友本身独立编码,按照她本身的想法,我在旁边看着。
  • 功能四是否作仍是不作呢。一开始纠结了,作了相关的技术原型,如公倍数、公约数等。而后放弃了,时间不容许。
  • 代码规范。和伙伴分别阅读老师做业推荐的博文,而后将各自总结的规范给对方看,相互提意见,最后综合到一块儿。
  • 测试用例。是先写部分用例呢,仍是写完代码后再开始写测试用例?最终是先写了功能测试的测试用例,在完成基础功能后,开始进行核心功能的单元测试。
  • 谁来编码?我代码能力相对好点,然而仍是决定让队友多花时间写写代码,我在旁边看着她写,给她提意见。有利于本身提升处理代码细节的能力,也能让个人表达能力获得训练。
相关文章
相关标签/搜索