【软工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 | | 用隨機數控制+-×÷運算符以及1~100的生成;用循環進行生成;通過String的+號拼接。 |
| Caculate.java | | 1、加法器:通過運算符作為區分和循環,分別提取出來,放在數字字符串數組和符號字符串數組中,然后一個一個數值加。 2、乘法器: 提取×左右的兩個數,計算結果,并且替代,循環,轉化成加減表達式,然后交給加減法器處理。 3、Judge函數: 用來判斷是調用加減還是乘除法器。 |
| Zhengfushu.java | | |
| Kuohao.java | | |
部分代碼展示:
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 |
反思:
最后感謝你能讀這篇博客!用一首應景十四行詩形容此時的心情作為結束吧:
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】四则加减乘除混合运算(带括号、真分数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java工程师学习指南(2019最新版)
- 下一篇: abupy文件结构功能