日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【软工Work1】四则加减乘除混合运算(带括号、真分数)

發布時間:2023/12/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【软工Work1】四则加减乘除混合运算(带括号、真分数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家好,很高興寫一片博客給分享自己的這段奇妙的experience of coding!

本來想聽老師建議在github上down一些代碼的,但之后看網上代碼都挺復雜怕難改。而且自己更簡單的自己的思路,于是一個一個實現了。

從構思,到完成基礎功能,到想完成附加功能,到想放棄,再到再試試,然后各種debug前從上周三開始做,每天花時大約6+6+8+8+6+8+6+6>=54小時 3240min。

一共約750行代碼。

我發布在github上的項目,敬請查看:

https://github.com/a1171404817/Ruangongzuoye.git

?

文件說明、實現如下:

文件名

說明

主要思路

Main.java

  • 用于生成表達式的字符串,調用Caculate類并且寫到文件。
  • 用隨機數控制+-×÷運算符以及1~100的生成;用循環進行生成;通過String的+號拼接。

    Caculate.java

  • 實現加減法器:輸入表達式字符串,輸出結果(字符串)。
  • 乘除法器:輸入表達式字符串,輸出只帶加減符號的表達式。(用于之后交給1處理)。
  • Judge函數:通過判斷式子中的符號,交給1或2->1處理。
  • 1、加法器:通過運算符作為區分和循環,分別提取出來,放在數字字符串數組和符號字符串數組中,然后一個一個數值加。

    2、乘法器:

    提取×左右的兩個數,計算結果,并且替代,循環,轉化成加減表達式,然后交給加減法器處理。

    3、Judge函數:

    用來判斷是調用加減還是乘除法器。

    Zhengfushu.java

  • Init函數用于生成真分數表達式,并且調用2,輸出。
  • caculate用于計算真分數表達式。
  • 3、isKeyue 判斷分子分母是否可約,可約既返回可約因子。
  • 通過隨機生成分子分母,用數組裝起來,生成若分母,再成成分子,使得分子小于分母,。再通過循環進行拼接即可(main.java生成字符串)。
  • Caculate函數先字符串中數字、符號提取出來用數組裝,再判斷每個分數是否可約,可約就越。然后再通過分母同分,分子同乘其他所有分母再加起來,分子上面就調用加法器,下面不用動。最終結果再調用iskeyue函數。
  • Kuohao.java

  • init函數:輸入表達式字符串(不帶括號),輸出帶括號的字符串表達式。
  • proceed函數:用于計算帶括號的字符串表達式。
  • 左括號只生成在首、和每個符號之后。左右括號的距離可約是2、3,但要小于數-通過循環,括號長度確定,右括號就確定。先生成長度為2的括號,通過隨機數代表括號生成的每個位置、生成幾個也隨機。再處理以一個。直到長度為數-1停止,達到最大個數。并且會判斷其是否有實際意義,如(33)這樣是沒實際意義的要篩選掉。
  • 怎么替換:2+3+4 將2+3取出來 變成(2+3) 再用Stringbuilder的replace即可 第一個字串替換
  • proceed 找到最后一個“(”,其里面一定不會再有括號,計算這個()得到結果(調用caculate類,再用這個結果代替這個括號。如此循環直到表達式里面沒有括號,就會得到一個只有加減法或者結果的表達式。
  • 部分代碼展示:

    Main.java 主要用于生成算術表達式字符串

    import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintStream; import java.util.Scanner;import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;public class Main {public static void main(String [] args) throws IOException{ File f=new File(".\\src\\result.txt");if(!f.exists())f.getParentFile().mkdir();{ f.createNewFile();}PrintStream outPrintStream=new PrintStream(f);Scanner in = new Scanner(System.in);int n1=in.nextInt();int nc=0;System.out.println("2017010302");outPrintStream.println("2017010302"); // outPrintStream.println("2017010302");while(nc<n1){ int modelrdn=((int) (Math.random() * 10000))%3;if(modelrdn==0||modelrdn==2){ int nFuhao = ((int) (Math.random() * 10000))%3+3;//產生符號個數 // System.out.println(nFuhao);String fuhao[]={"+","-","×","÷"};// System.out.println(fuhao[0]+fuhao[1]+fuhao[2]+fuhao[3]);String nFirstNumS = String.valueOf(((int) (Math.random() * 10000))%101);//產生第一個數 數值隨機產生 并轉化成字符串 // System.out.println(nFirstNum);for(int j=0;j<nFuhao;j++){ int fuhaoSuiji=((int) (Math.random() * 10000)%4);nFirstNumS=nFirstNumS+fuhao[fuhaoSuiji];if(fuhaoSuiji!=3){int numSuiji=((int) (Math.random() * 10000)%101);nFirstNumS=nFirstNumS+String.valueOf(numSuiji);}//處理除號部分:查重else {//從生成上來限制必須是整數除是最正確的,因為要求是過程char[] cfn = nFirstNumS.toCharArray();int k=cfn.length-1;k--;String qianyigenum="";qianyigenum+=String.valueOf(cfn[k]);k--;while(true){ if(k<0)break; //判斷是否越界if(cfn[k]=='×'||cfn[k]=='÷'||cfn[k]=='+'||cfn[k]=='-'){ //判斷是否是數字break;}{qianyigenum+=String.valueOf(cfn[k]);k--;}}qianyigenum=new StringBuilder(qianyigenum).reverse().toString();int numSuiji=((int)((Math.random() * 10000)%100+1));while(true){if(numSuiji!=0){if((Integer.parseInt(qianyigenum)>=numSuiji&&Integer.parseInt(qianyigenum)%numSuiji==0)||Integer.parseInt(qianyigenum)==0){break;}}numSuiji=((int) ((Math.random() * 10000)%100+1));}nFirstNumS=nFirstNumS+String.valueOf(numSuiji);String panduans=new caculate().judges(nFirstNumS);if(panduans.equals("error"))break;}}String rs;caculate cl=new caculate();try{rs=cl.judges(nFirstNumS);}catch (NumberFormatException e) {// TODO: handle exceptioncontinue;}if(rs.equals("error")){continue;}else {if(modelrdn==0){nc++;System.out.println(nFirstNumS+"="+rs);outPrintStream.println(nFirstNumS+"="+rs);}else if(modelrdn==2){kuohao kh=new kuohao();String s=kh.init(nFirstNumS, 5);int ys=1000;//達到一定次數一定可以生成while(true){if(s!="error"){String rs1=kh.jieshi(s);if(rs1!="error"){ String rss1=new caculate().judges(rs1);if(rss1!="error"){System.out.print(s);System.out.println("="+rss1);outPrintStream.print(s);outPrintStream.println("="+rss1);nc++;break;}}}ys--;if(ys<=0)break;s=kh.init(nFirstNumS, 5);}}} // System.out.println( cl.caluJiajian(nFirstNumS));}else if(modelrdn==1){String isproceed=new zhenfenshu().init();while(isproceed.equals("error"))isproceed=new zhenfenshu().init();nc++;System.out.println(isproceed);outPrintStream.println(isproceed);}}System.out.println("生成完畢,文件所在目錄是"+f.getCanonicalPath());} }

    Caculate.java 用于生成乘除法器(處理乘除然后交給加減法器處理)、加減法器(處理加減得到最終結果)、和judge函數(根據算術表達式字符串判斷調用哪個)

    ?public class caculate {public String judges(String s) //返回對應表達式的字符串結果,如果出錯返回error 進行了判斷,如果為負數澤返回error{ String origins=s;if(s.indexOf("×")==-1&&s.indexOf("÷")==-1){ int resultn=Integer.parseInt(caluJiajian(s));if(resultn<0) return "error";return String.valueOf(resultn);}else {s=caculaChenChu(s);if(!s.equals("error")){int resultn;try{resultn=Integer.parseInt(caluJiajian(s));}catch (NumberFormatException e) {// TODO: handle exceptionreturn "error";}if(resultn<0) return "error";return String.valueOf(resultn);}else{return "error";}}}public String caluJiajian(String s) //注意:并不返回error 返回直接值進行判斷 //返回結果的字符串{ char[] cs = s.toCharArray();String[] arr=new String[10];for(int i=0;i<arr.length;i++) arr[i]="";int arrc=0;char[] fuhao=new char[10];int fuhaoc=0;for(int i=0;i<cs.length;i++){if(cs[i]>=48&&cs[i]<=57){arr[arrc]+=String.valueOf(cs[i]);}else{arrc++;fuhao[fuhaoc]=cs[i];fuhaoc++;}}arrc++; // for(int i=0;i<arrc;i++) //用來測試數組對字符串數字的提取是否正確 // { // System.out.println(arr[i]); // // } // // for(int i=0;i<fuhaoc;i++) // { // System.out.println(fuhao[i]); // }int sumn=Integer.parseInt(arr[0]);for(int i=0;i<fuhaoc;i++){if(fuhao[i]=='+'){sumn+=Integer.parseInt(arr[i+1]);}else{sumn-=Integer.parseInt(arr[i+1]);if(sumn<0)return String.valueOf(sumn);}}return String.valueOf(sumn);}public String caculaChenChu(String s) //返回加減表達式,如果存在非整數除法或分母為0返回error{ while(true){char[] cs = s.toCharArray();String[] twonum=new String[2];for(int i=0;i<2;i++) twonum[i]="";for(int i=0;i<cs.length;i++){if(cs[i]=='×'||cs[i]=='÷'){ char temp=cs[i];twonum[0]+=String.valueOf(cs[i+1]);int j=i+2;while(true){ if(j>=cs.length)break;if((cs[j]=='×'||cs[j]=='÷'||cs[j]=='+'||cs[j]=='-')){break;}else{twonum[0]+=String.valueOf(cs[j]);j++;}}twonum[1]+=String.valueOf(cs[i-1]);int k=i-2;while(true){if(k<0)break; //判斷是否越界if(cs[k]=='×'||cs[k]=='÷'||cs[k]=='+'||cs[k]=='-'){ //判斷是否是數字break;}{twonum[1]+=String.valueOf(cs[k]);k--;}}twonum[1]=new StringBuilder(twonum[1]).reverse().toString();//反轉字符串if(temp=='×'){String beReplce=twonum[1]+"×"+twonum[0];String sum;try{sum=String.valueOf(Integer.parseInt(twonum[1])*Integer.parseInt(twonum[0]));}catch (NumberFormatException e) {// TODO: handle exceptionreturn "error";}s=s.replace(beReplce, sum); // System.out.println("此算式合法"+"替換的字符串是:"+sum+"被替換的字符串是"+beReplce+"替換之后的結果是"+s);}else{if(twonum[0].equals("0")){ // System.out.println("此算式不合法");return "error";}String beReplce=twonum[1]+"÷"+twonum[0];int tempn=Integer.valueOf(twonum[1])%Integer.valueOf(twonum[0]);if(tempn==0){String sum=String.valueOf(Integer.valueOf(twonum[1])/Integer.valueOf(twonum[0]));s=s.replace(beReplce, sum); // // System.out.println("此算式合法"+"替換的字符串是:"+sum+"被替換的字符串是"+beReplce+"替換之后的結果是"+s);}else{ // System.out.println("此算式不合法");return "error";}}break;}}if(s.indexOf("×")==-1&&s.indexOf("÷")==-1){break;} }return s;}private char[] Integer(Double tempn) {// TODO Auto-generated method stubreturn null;}}?

    Kuohao.java 用于對字符串進行加工(生成括號);以及括號處理器(處理括號的運算,然后再調用calulate類的乘除法器或加減法器)

    public class kuohao {public String init(String s,int fn)//fn>=3{ for(int j=0;j<fn-2;j++){char[] cs = s.toCharArray();//qu 2ge int k=j+2;String subs="";int suijin=((int) (Math.random() * 10000)%(fn-1));int fuhaon=0; // System.out.println("隨機數是:"+suijin);if(suijin==0){ //從首個開始,從符號開始要分開判斷for(int i=0;i<cs.length;i++) //不考慮括號 有多少左括號 就要多添加多少個右括號{ if(k>0){if((!(cs[i]>=48&&cs[i]<=57))&&cs[i]!='('&&cs[i]!=')'){k--;}if(k<=0)break;subs+=cs[i];} }}else {for(int i=0;i<cs.length;i++) //不考慮括號 有多少左括號 就要多添加多少個右括號{ if((!(cs[i]>=48&&cs[i]<=57))&&cs[i]!='('&&cs[i]!=')')fuhaon++;if(fuhaon>=suijin){ int l=i+1;if(k>0&&i!=cs.length-1){if((!(cs[l]>=48&&cs[l]<=57))&&cs[l]!='('&&cs[l]!=')'){k--;}if(k<=0)break;subs+=cs[l];} }}}boolean isOK=true;//篩選char[] pdcs = s.toCharArray();for(int i=0;i<pdcs.length;i++){if(pdcs[i]=='('){for(int l=i+1;l<pdcs.length;l++){ if(pdcs[l]==')'){isOK=false;}if(pdcs[l]=='×'||pdcs[l]=='÷'||pdcs[l]=='+'||pdcs[l]=='-'){ break;}}}}String khsubs="("+subs+")"; // String rssubs=new caculate().judges(subs); // if(rssubs!="error"){s=s.replace(subs, khsubs); // // System.out.println(subs); // System.out.println(khsubs);System.out.println(rssubs); // System.out.println(s);}boolean isOK=true;//篩選char[] pdcs = s.toCharArray();for(int i=0;i<pdcs.length;i++){if(pdcs[i]=='('){for(int l=i+1;l<pdcs.length;l++){ if(pdcs[l]==')'){isOK=false;}if(pdcs[l]=='×'||pdcs[l]=='÷'||pdcs[l]=='+'||pdcs[l]=='-'){ break;}}}}pdcs = s.toCharArray();for(int i=0;i<pdcs.length;i++){if(i+3<pdcs.length){if(pdcs[i]=='('&&pdcs[i+1]=='('){ int mk=0;for(int l=i+2;l<pdcs.length;l++){ if(l+1<pdcs.length){if(pdcs[l]==')'&&pdcs[l+1]==')'&&mk==0){isOK=false;}if(pdcs[l]=='(')mk++;if(pdcs[l]==')')mk--;}}}}}pdcs = s.toCharArray();if(pdcs[0]=='('&&pdcs[pdcs.length-1]==')')isOK=false;if(isOK==false){return "error";}return s;}public String jieshi(String s){char[] cs = s.toCharArray();while(true){ // System.out.println("我在循環1我的字符串是"+s);boolean havakuohao=havakuohao(s);if(havakuohao==false)break;// System.out.println("我在循環2");// System.out.println("原始"+s);String subsString="";int lastzk=-1;for(int i=0;i<cs.length;i++){if(cs[i]=='('){lastzk=i;}}for(int i=lastzk+1;i<cs.length;i++){subsString+=cs[i];if(cs[i+1]==')')break;}// System.out.println("提取出的子串"+subsString);String hksubString="("+subsString+")";String rString=new caculate().judges(subsString);///注意要處理'error' // System.out.println("rString的值是"+rString+" "+rString.equals("error"));if(rString.equals("error")){return "error";}s=s.replace(hksubString, rString);cs = s.toCharArray();}return s;}public static boolean havakuohao(String s){ // System.out.println("我在循環3-1");char[] cs = s.toCharArray();for(int i=0;i<cs.length;i++){if(cs[i]=='('){ // System.out.println("我在循環3-2");return true;}} // System.out.println("我在循環3-3");return false;} }

    時間花費:

    PSP2.1

    任務內容

    計劃共完成需要的時間(min)

    實際完成需要的時間(min)

    Planning

    計劃

    840min

    3240min(54h)

    ·????????Estimate

    ·???估計這個任務需要多少時間,并規劃大致工作步驟

    120min

    480min

    Development

    開發

    630min

    2800min

    ·????????Analysis

    ·?????????需求分析 (包括學習新技術)

    60min

    240min

    ·????????Design Spec

    ·?????????生成設計文檔

    30min

    30min

    ·????????Design Review

    ·?????????設計復審?(和同事審核設計文檔)

    30min

    30min

    ·????????Coding Standard

    ·?????????代碼規范?(為目前的開發制定合適的規范)

    30min

    30min

    ·????????Design

    ·?????????具體設計

    60min

    240min

    ·????????Coding

    ·?????????具體編碼

    300min

    1400min

    ·????????Code Review

    ·?????????代碼復審

    60min

    80min

    ·????????Test

    ·?????????測試(自我測試,修改代碼,提交修改)

    60min

    750min

    Reporting

    報告

    90min

    180min

    ·?????????Test Report

    ·?????????測試報告

    30min

    60min

    ·?????????Size Measurement

    ·?????????計算工作量

    30min

    60min

    ·?????????Postmortem & Process Improvement Plan

    ·?????????事后總結,?并提出過程改進計劃

    30min

    60min

    反思:

  • 變量命名上,由于之間命名一切從簡,如nc導致代碼量高了之后閱讀困難。惡補了下命名法。
  • 耦合性太高,雖然有面向對象的思想,分成了幾個類,但每個類里面的函數所做的事情過多:如除了計算之外,還要判斷合法(判斷合法應抽象出來成為另外一個類),有的還要輸入,又當爹又當媽,導致代碼重復、冗余。
  • 明白了接口的重要性,接口的作用是統一標準,如果沒有接口,類里面的函數都是隨便命名的,導致調用函數名各有各的。
  • 算法的重要性,確實可以減少代碼量,提高效率。
  • 十萬條生成壓力測試的時候,發現會出莫名格式轉化錯誤,后來找了很久檢測發現,連續5個乘號的較大十位數,雖然概率很小,會超過int的上限21億。100多億,= =小學生能做的出來嗎。。。十萬條如果可以打印大概可以夠小學生晝夜不停做1年= =。生成大概只用了不到1分鐘。
  • 通過了十萬條壓力測試之后,感覺自己的程序的魯棒性還是不錯的。
  • 整個過程就像是在玩一場積木游戲,如果下面搭得不好或者不標準、斜斜歪歪的,那上面要花好多功夫去維持平衡,但如果再搭積最終肯定是會垮掉的。這次底層實現比較冗余、分工不是很明確。吸取教訓,下次再做一定要得更好。
  • 通過這個項目基本把自己java的知識全部撿了回來,那種思考中的撓頭和最終做出來之后那種欣喜雀躍的感覺相比,是微不足道的!這種喜悅你體會到了嗎?
  • 最后感謝你能讀這篇博客!用一首應景十四行詩形容此時的心情作為結束吧:

    When in eternal lines to time thou grow’st:

    So long as men can breath or eyes can see,

    So long lives this, and this gives life to thee.

    ?

    總結

    以上是生活随笔為你收集整理的【软工Work1】四则加减乘除混合运算(带括号、真分数)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。