四則運算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。讓隊友本身獨立編碼,按照她本身的想法,我在旁邊看着。
  • 功能四是否作仍是不作呢。一開始糾結了,作了相關的技術原型,如公倍數、公約數等。而後放棄了,時間不容許。
  • 代碼規範。和夥伴分別閱讀老師做業推薦的博文,而後將各自總結的規範給對方看,相互提意見,最後綜合到一塊兒。
  • 測試用例。是先寫部分用例呢,仍是寫完代碼後再開始寫測試用例?最終是先寫了功能測試的測試用例,在完成基礎功能後,開始進行核心功能的單元測試。
  • 誰來編碼?我代碼能力相對好點,然而仍是決定讓隊友多花時間寫寫代碼,我在旁邊看着她寫,給她提意見。有利於本身提升處理代碼細節的能力,也能讓個人表達能力獲得訓練。
相關文章
相關標籤/搜索