zoukankan      html  css  js  c++  java
  • 四则运算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.git

    一、解题思路

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

    二、需要注意的地方

    请查看博客【点击

    三、难点

    • 表达式求值
      构造两个栈,一个放操作数,另一个放操作符,通过入栈、出栈进行运算,将“=”作为表达式结束的符号。
            //求表达式值
            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();
            }
    

    四、结对编程

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

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

    • 说服队友不要直接编码,先列举这个项目存在的技术难点、功能,做技术原型,然后 再开始编码。大约90min。让队友自己独立编码,按照她自己的想法,我在旁边看着。
    • 功能四是否做还是不做呢。一开始纠结了,做了相关的技术原型,如公倍数、公约数等。然后放弃了,时间不允许。
    • 代码规范。和伙伴分别阅读老师作业推荐的博文,然后将各自总结的规范给对方看,相互提意见,最后综合到一起。
    • 测试用例。是先写部分用例呢,还是写完代码后再开始写测试用例?最终是先写了功能测试的测试用例,在完成基础功能后,开始进行核心功能的单元测试。
    • 谁来编码?我代码能力相对好点,然而还是决定让队友多花时间写写代码,我在旁边看着她写,给她提意见。有利于自己提高处理代码细节的能力,也能让我的表达能力得到训练。
  • 相关阅读:
    面向对象编程(二)封装--构造方法,this关键字,static关键字,方法重载
    面向对象编程(四)继承,概念及super关键字,final关键字,Object类常见方法
    Python学习4--字符串
    python学习3--元祖
    数据挖掘概念与技术14--Star-Cubing
    Python学习2--列表
    数据挖掘概念与技术13--BUC
    数据挖掘概念与技术12--数据立方体的计算和多路数组聚集详解
    Python学习1--数据类型与循环要点
    数据挖掘概念与技术11--数据仓库的实现
  • 原文地址:https://www.cnblogs.com/ranh941/p/7649935.html
Copyright © 2011-2022 走看看