6.18更新:學了一段時間MFC以後,把此四則運算轉換成了可視化圖形界面版本的自動生成程序,源程序已經上傳到Github上,下面是程序運行截圖;html
整形數據前端
分數java
主要是要調用MFC的一些接口和原本的程序代碼進行綁定,邏輯上和本來的網頁端差很少只是語法上有必定的差別。c++
下面是原博客內容:git
以前準備是界面用HTML等搭建,而後執行c++編譯後的exe文件,進行數據間的傳遞,達到可視化的效果。這是對界面庫一無所知的小白最初的想法。可是事情遠遠沒有這麼簡單!github
任務:將本來的四則運算(c++版本)拓展爲網頁版。bootstrap
一、GitHub:https://github.com/1120161970/Calculate瀏覽器
二、時間耗費 :框架
PSP2.1dom |
Personal Software Process Stages |
預估耗時(min) |
實際耗時(min) |
Planning |
計劃 |
30 |
|
Estimate |
估計這個任務須要多少時間 |
1200 |
|
Development |
開發 |
600 |
|
Analysis |
需求分析(包括學習新技術) |
120 |
|
Design Spec |
生成設計文檔 |
30 |
|
Design Review |
設計複審(和同事審覈設計文檔) |
10 |
|
Coding Standard |
代碼規範(爲目前的開發制定合適的規範) |
10 |
|
Design |
具體設計 |
30 |
|
Coding |
具體編碼 |
120 |
|
Code Review |
代碼複審 |
30 |
|
Test |
測試(自我測試,修改代碼,提交修改) |
120 |
|
Reporting |
報告 |
30 |
|
Test Report |
測試報告 |
10 |
|
Size Measurement |
計算工做量 |
10 |
|
Postmortem & Process Improvement Plan |
過後總結,並提出過程改進計劃 |
30 |
|
|
合計 |
|
三、解題思路:
四、設計實現過程
五、性能改進及思路
六、代碼說明(思路解釋+註釋說明)
var clearmsg = false; var ispoint = true; function show(obj){ var data = obj.value; var text = document.getElementById("text"); if(clearmsg){ text.value = ""; clearmsg=false; } if(data == "+" || data == "-" || data == "*" || data == "/"){ ispoint = true; } if(data == "0" && text.value == "0"){ text.value = parseInt(text.value) + 0; }else if(text.value == "0" && data != "+" && data != "-" && data != "*" && data != "/"){ text.value = parseInt(text.value) + parseInt(data); }else{ text.value += data; } } //計算結果 function getResult(){ var data = document.getElementById("text"); try{ ispoint = true; data.value = eval(data.value); clearmsg = true; //alert(ispoint); }catch(err){ alert("這怎麼算!"); data.value = "0"; } } //點 function point(){ var p = document.getElementById("."); var text = document.getElementById("text"); if(ispoint){ text.value += p.value; ispoint = false; } //if(text.value.indexOf(".") == true ){ //}else{ // text.value += p.value; //} } //清空 function funclear(){ var a = document.getElementById("text").value = "0"; clearmsg = false; ispoint = true; //if(a==null || a==""){ // alert("null"); //}else{ // alert(a); //} } //退格鍵 function funback(){ var text = document.getElementById("text"); if(text.value == "0" || text.value == ""){ text.value = "0"; }else{ document.getElementById("text").value=document.getElementById("text").value.slice(0,-1); } }
上面是運用js寫的運算邏輯,而後最後的界面是這樣的:
能夠完成基本的四則運算,可是對於浮點數的表示就簡單採起的四捨五入式。
2. 改進後的四則運算生成的JavaScript代碼:
function GetRandomNum(Min,Max){ var Range = Max - Min; var Rand = Math.random(); return(Min + Math.round(Rand * Range)); } // 獲取隨機數 function max_num(x,y) { var t; while (y) { t = x%y; x = y; y = t; } return x; } function fenshu(a,b,p) { if (p==1) { if (a>b) { return a+"/"+b; }else if(a<b){ return a+"/"+b; }else { return 1; } }else { var x=a/p; var y=b/p; if(y==1){ return x; }else{ return x+"/"+y; } } } function f_count(a,b,c,d) { var Arr = ["+","-","*","/"]; var n = GetRandomNum(0,3); switch(Arr[n]){ case "+":{ var sum_x=(a*d)+(b*c); var sum_y=b*d; max_x=max_num(sum_x,sum_y); max_y=max_num(sum_x,sum_y); var N=fenshu(sum_x,sum_y,max_x); return a+"/"+b+"+"+c+"/"+d+"="+N; break; } case "-":{ var sum_x=(a*d)-(b*c); while (sum_x<0) { var a = GetRandomNum(1,30); var b = GetRandomNum(1,30); var c = GetRandomNum(1,30); var d = GetRandomNum(1,30); var sum_x=(a*d)-(b*c); } var sum_y=b*d; max_x=max_num(sum_x,sum_y); max_y=max_num(sum_x,sum_y); var N=fenshu(sum_x,sum_y,max_x); return a+"/"+b+"-"+c+"/"+d+"="+N; break; } case "*":{ var sum_x=a*c; var sum_y=b*d; max_x=max_num(sum_x,sum_y); max_y=max_num(sum_x,sum_y); var N=fenshu(sum_x,sum_y,max_x); return a+"/"+b+"*"+c+"/"+d+"="+N; break; } case "/":{ var sum_x=a*d; var sum_y=b*c; max_x=max_num(sum_x,sum_y); max_y=max_num(sum_x,sum_y); var N=fenshu(sum_x,sum_y,max_x); return a+"/"+b+"÷"+c+"/"+d+"="+N; break; } } } function count(a,b){ var Arr = ["+","-","*","/"]; var n = GetRandomNum(0,3); switch(Arr[n]){ case "+":{ var sum=a+b; return a+"+"+b+"="+sum; break; } case "-":{ var sum=a-b; while(sum<0){ var a = GetRandomNum(1,30); var b = GetRandomNum(1,30); var sum=a-b; } return a+"-"+b+"="+sum; break; } case "*":{ var sum=a*b; return a+"*"+b+"="+sum; break; } case "/":{ var sum=a/b; while(a%b!==0){ var max_x=max_num(a,b); var N=fenshu(a,b,max_x); return a+"÷"+b+"="+N; } return a+"÷"+b+"="+sum; break; } } } function pl_f() { var son_a = GetRandomNum(1,30); var par_b = GetRandomNum(1,30); var son_c = GetRandomNum(1,30); var par_d = GetRandomNum(1,30); var suma=f_count(son_a,par_b,son_c,par_d); return suma; } function pl() { var a = GetRandomNum(1,30); var b = GetRandomNum(1,30); var sumb=count(a,b); return sumb; } function play_all() { // var flag = 0; var a = document.getElementById("tp").value; var inta = parseInt(a); for (i = 1; i <= inta; i++) { var a = GetRandomNum(0,1); document.getElementById("text").innerHTML+=("<br>"+"第"+i+"題:"); switch (a) { case 0: var A=pl(); var strs = A.split("="); document.getElementById("text").innerHTML+=(strs[0]+"="+"<input>"+"<button>提交</button>"+"<br>"); document.getElementById("text2").innerHTML+=("<br>"+"第"+i+"題答案:"+"<span>"+strs[1]+"</span>"+"<br>"); break; case 1: var B=pl_f(); var strs = B.split("="); document.getElementById("text").innerHTML+=(strs[0]+"="+"<input>"+"<button>提交</button>"+"<br>"); document.getElementById("text2").innerHTML+=("<br>"+"第"+i+"題答案:"+"<span>"+strs[1]+"</sapn>"+"<br>"); break; } } }
前臺界面就用bootstrap框架簡單搭建了一個,最終的界面是這樣的:
測試了最大的數目前是2000,超過這個的話瀏覽器容易崩潰,多是js不大適合直接拿來作邏輯運算吧。仍是有待提高。會在後續進一步更新
七、實際耗時
PSP2.1 |
Personal Software Process Stages |
預估耗時(min) |
實際耗時(min) |
Planning |
計劃 |
30 |
25 |
Estimate |
估計這個任務須要多少時間 |
1200 |
1400 |
Development |
開發 |
600 |
700 |
Analysis |
需求分析(包括學習新技術) |
120 |
120 |
Design Spec |
生成設計文檔 |
30 |
20 |
Design Review |
設計複審(和同事審覈設計文檔) |
10 |
15 |
Coding Standard |
代碼規範(爲目前的開發制定合適的規範) |
10 |
20 |
Design |
具體設計 |
30 |
40 |
Coding |
具體編碼 |
120 |
200 |
Code Review |
代碼複審 |
30 |
20 |
Test |
測試(自我測試,修改代碼,提交修改) |
120 |
60 |
Reporting |
報告 |
30 |
30 |
Test Report |
測試報告 |
10 |
10 |
Size Measurement |
計算工做量 |
10 |
10 |
Postmortem & Process Improvement Plan |
過後總結,並提出過程改進計劃 |
30 |
30 |
|
合計 |
1200 |
1300(目前) |