王鑫君1759105和程雯麗1759104一塊兒結對完成的代碼編寫程序員
/*博客寫咱們寫代碼時的過程(流程)和結隊編程的收穫,觀點,以爲好仍是很差,和你一我的編有什麼區別,用了多久時間*/算法
題目:小學老師要每週給同窗出四則運算練習題。編程
兩個運算符,100之內的數字,不須要寫答案。【估計時間1】小程序
如今估計寫這個程序須要的時間。數組
須要寫答案【估計時間2】編程語言
//以後擴展開,加括號,限制數值範圍,乘除法,支持分數等函數
//估計作好這個軟件須要多長時間學習
摘要:測試
·結對編程過程觀點6條 ·改進代碼3次過程 ·總結網站
作100之內的四則運算是相比較而言比較基礎的代碼編寫,可是較爲新奇的是兩人結對的代碼編寫過程。以前就據說過兩人合做編寫代碼可以更高效,一人敲代碼,一人作代碼測試;一人缺失靈感,一人提供建議,兩兩合做聽起來真的給敲代碼這個較爲枯燥的事注入了新活力。可是,咱們在嘗試結對編程過程當中仍是有許多問題和爭議的。
結對敲代碼過程1:選編程語言的爭議
結對敲代碼觀點1:和我本身編代碼區別有點大
通常而言,本身敲代碼不會有爭議,我本身習慣哪一個或者擅長哪一個就用哪一個敲代碼,可是是兩人結對,因此咱們在一開始選擇哪一種編程語言上就有了歧義。我以爲想用C++,她想用C語言,儘管在我概念裏這兩個至關「兼容」,但相比而言我以爲C++比C簡單不少。
C語言是面向過程的編程,它最重要的特色是函數,經過main函數來調用各個子函數。
C++是面向對象的編程,類是它的主要特色,在程序執行過程當中,先由主main函數進入,定義一些類,根據須要執行類的成員函數,過程的概念被淡化了,以類驅動程序運行,類就是對象,因此咱們稱之爲面向對象程序設計。面向對象在分析和解決問題的時候,將涉及到的數據和數據的操做封裝在類中,經過類能夠建立對象,以事件或消息來驅動對象執行處理。
因此本質上仍是有區別的,最後咱們仍是決定用C語言來敲這個小程序。
結對敲代碼過程2:編程變量的命名爭議
結對敲代碼觀點2:我以爲變量命名能夠長一些,可是最好能好識別
不知道是否是由於沒有過結對敲代碼的經驗,因此許多小的問題上都有些爭議,對於她的變量命名上,我老是會不認同她,我以爲她經常在變量上的命名讓我看不懂,我以爲若是是較長的代碼量,這個變量是什麼?那個變量是什麼?我老是認不出來,記不住的,我以爲一點也不方便代碼的閱讀,是個不太好的習慣呀。
結對敲代碼過程3:與平時遇代碼bug的習慣不一樣
結對敲代碼觀點3:我好像仍是習慣一我的啃bug,專一力不太集中得起來
其次,在日常的時候咱們也會遇到別人問咱們「這段代碼哪裏有錯啊,幫忙找找呀。」之類的問題,我習慣是把代碼發給我看看,而後本身調試修改,改完了後再發回去給他,因此在結對這個代碼編寫時,就不自主地會「發給我我看看」這樣,以爲兩我的擠在一個電腦前糾錯不習慣,脖子也不太舒服,並且可能也是由於不習慣吧,因此感受沒有一我的調試的時候的那種專一感,感受注意力集中不起來。
結對敲代碼過程4:與平時遇代碼bug後的小偷懶不一樣
結對敲代碼觀點4:這個效率提升得好多啊,棒!
平時我在敲了大段代碼,滿懷期待地運行後,發現出了一些難以看出的錯誤,就會「啊!累死了,先玩會兒吧。」這樣,而後看似一直坐在桌前面對着電腦,可是隻是無用功,效率極低。可是結對編程就不同了,當連續一兩個小時一直面對着電腦時,就已經以爲累了,想歇會兒,可是做爲觀察員,駕駛員還在勤勤懇懇地敲代碼,我一個在旁邊提意見,看看是否有錯的喊累,彷佛太說不過去了,因而繼續堅持,很快錯誤就解決了,代碼也敲得很快。我以爲百度百科說的就是我這類的「懶人」,嘿嘿~
「結對編程使得程序員被迫提升了工做效率。若是單獨工做,在遇到困難的時候,並非全部人都馬上積極地去解決問題,這時或許會上網和網友聊聊天,看看無關的網站等等。有可能由於工做的打斷,大半天的時間都浪費了。看起來,程序員天天都在加班,實際有效工做時間每每還達不到6個小時。而結對編程有一種相互督促的做用,在一邊工做疲憊狀態很差時,另外一邊會起一個鼓勵和激發鬥志的做用。
並且兩我的共用一臺電腦,略帶私人性質的聊天活動都會很自覺地不去進行了。結果一天下來,新實驗結對編程的程序員都會喊累,神經緊繃8個小時的工做不累纔怪。」 ——來自百度百科「結對編程」
結對敲代碼過程5:一些新的編程技巧
結對敲代碼觀點5:三個臭皮匠頂個諸葛亮
這個是個我一開始就知道的事了,確實在編程過程當中,我本身的想法有些繞路了,她提出本身的想法,我以爲不足的地方加以改進,加入本身的想法,竟比我當初的想法更方便,固然這也在個人意料之中。我在這個結對編程的嘗試中,確實學到了一些新的編程技巧,受益良多。
結對敲代碼過程6:習慣隊友的習慣
結對敲代碼觀點6:結對編程必定會有歧義,但站在別人的習慣上分析也會發現這很正常
在一開始的代碼學習上,每一個人的理解代碼都是不同的,那麼在敲代碼時必定也會有着與本身理解相近的敲代碼習慣方式。咱們分享關於代碼細節上的知識,而且互相學習隊友的編程技巧,同時也漸漸地理解了隊友的習慣。
這是最初的代碼,可以隨機出四則運算的題目,總共10題。
代碼1:計算考查【估計時間:30分鐘】
1 #include"stdio.h" 2 #include<stdlib.h> 3 #include<time.h> 4 #include<ctype.h> 5 6 int sy[10],sr[10],jd[10],jg[10]; 7 int fs=0; 8 char fh[10]; 9 void chufa(int *s1,int *s2,int *s3) 10 { 11 int i,b=1,c,jg; 12 int cs[20]={0},sy,sr; 13 srand((unsigned)time(NULL)); 14 FA:sy=rand()%100; 15 if(sy==0) goto FA; 16 for(i=1;i<=sy;i++) 17 { 18 if(sy%i==0) { cs[b]=i; b++;} 19 else continue; 20 } 21 c=rand()%b; 22 if(c==0) c=c+1; 23 sr=cs[c]; 24 jg=sy/sr; 25 *s1=sy; 26 *s2=sr; 27 *s3=jg; 28 } 29 void jisuan() 30 { 31 int p; 32 int i,gh; 33 printf("將進行100之內數字的四則運算!\n"); 34 srand((unsigned)time(NULL)); 35 36 for(i=0;i<10;i++) 37 { 38 sy[i]=rand()%100; 39 sr[i]=rand()%100; 40 p=rand()%4; 41 42 if(p==0) 43 { 44 fh[i]='+';jg[i]=sy[i]+sr[i];} 45 else if(p==1) 46 { 47 fh[i]='-'; 48 if(sy[i]<sr[i]) 49 { gh=sy[i]; 50 sy[i]=sr[i]; 51 sr[i]=gh; 52 } 53 jg[i]=sy[i]-sr[i]; 54 } 55 else if(p==2) 56 { 57 fh[i]='*'; 58 jg[i]=sy[i]*sr[i]; 59 } 60 else if(p==3) 61 { 62 fh[i]='/'; 63 chufa(&sy[i],&sr[i],&jg[i]); 64 } 65 printf("第%2d題:%2d %c %2d=?",i+1,sy[i],fh[i],sr[i]); 66 scanf("%d",&jd[i]); 67 if(jd[i]==jg[i]) fs+=10; 68 } 69 printf("\n測試結束\n\n"); 70 } 71 int main() 72 { 73 jisuan(); 74 return 0; 75 }
運算結果:
以後,咱們但願可以進行計算考查以後,給出正確答案能讓咱們知道本身是否計算正確。
代碼2:計算考查+正確答案顯示【估計時間:15分鐘】
1 #include"stdio.h" 2 #include<stdlib.h> 3 #include<time.h> 4 #include<ctype.h> 5 6 int sy[10],sr[10],jd[10],jg[10]; 7 int fs=0; 8 char fh[10]; 9 void chufa(int *s1,int *s2,int *s3) 10 { 11 int i,b=1,c,jg; 12 int cs[20]={0},sy,sr; 13 srand((unsigned)time(NULL)); 14 FA:sy=rand()%100; 15 if(sy==0) goto FA; 16 for(i=1;i<=sy;i++) 17 { 18 if(sy%i==0) { cs[b]=i; b++;} 19 else continue; 20 } 21 c=rand()%b; 22 if(c==0) c=c+1; 23 sr=cs[c]; 24 jg=sy/sr; 25 *s1=sy; 26 *s2=sr; 27 *s3=jg; 28 } 29 void jisuan() 30 { 31 int p; 32 int i,gh; 33 printf("將進行100之內數字的四則運算!\n"); 34 srand((unsigned)time(NULL)); 35 36 for(i=0;i<10;i++) 37 { 38 sy[i]=rand()%100; 39 sr[i]=rand()%100; 40 p=rand()%4; 41 42 if(p==0) 43 { 44 fh[i]='+';jg[i]=sy[i]+sr[i];} 45 else if(p==1) 46 { 47 fh[i]='-'; 48 if(sy[i]<sr[i]) 49 { gh=sy[i]; 50 sy[i]=sr[i]; 51 sr[i]=gh; 52 } 53 jg[i]=sy[i]-sr[i]; 54 } 55 else if(p==2) 56 { 57 fh[i]='*'; 58 jg[i]=sy[i]*sr[i]; 59 } 60 else if(p==3) 61 { 62 fh[i]='/'; 63 chufa(&sy[i],&sr[i],&jg[i]); 64 } 65 printf("第%2d題:%2d %c %2d=?",i+1,sy[i],fh[i],sr[i]); 66 scanf("%d",&jd[i]); 67 if(jd[i]==jg[i]) fs+=10; 68 } 69 printf("\n測試結束\n\n"); 70 } 71 void dajuan() 72 { 73 int j; 74 printf("你的答卷爲:\n"); 75 for(j=0;j<10;j++) 76 printf("%2d %c %2d=%2d\n",sy[j],fh[j],sr[j],jd[j]); 77 printf("\n\n"); 78 } 79 int main() 80 { 81 jisuan(); 82 dajuan(); 83 return 0; 84 }
運行結果:
最後,咱們但願可以更直觀得告訴咱們對了哪些,錯了哪些,不須要本身與正確答案一一對比
代碼3:咱們提出了菜單式,有一二三四的選項供選擇【估計時間:60分鐘】
1 #include"stdio.h" 2 #include<stdlib.h> 3 #include<time.h> 4 #include<ctype.h>//字符操做函數 5 //定義全局變量 6 int sy[10],sr[10],jd[10],jg[10];//sy,sr,jd,jg分別爲第一運算數,第二運算數,輸入結果,正確結果 7 int fs=0; 8 char fh[10];//fh保存運算符號 9 10 void chufa(int *s1,int *s2,int *s3) 11 { 12 int i,b=1,c,jg;//i爲控制循環變量 13 int cs[20]={0},sy,sr;//cs爲除數數組,sy保存被除數,sr爲從cs中抽取的除數 14 srand((unsigned)time(NULL)); 15 FA:sy=rand()%100; 16 if(sy==0) goto FA; 17 for(i=1;i<=sy;i++)//產生除數數組的循環 18 { 19 if(sy%i==0) { cs[b]=i; b++;} 20 else continue; 21 }//循環結束 22 c=rand()%b;//隨機抽取除數 23 if(c==0) c=c+1; 24 sr=cs[c]; 25 jg=sy/sr; 26 *s1=sy;//指針變量 27 *s2=sr; 28 *s3=jg; 29 } 30 /* 自動生成10道運算題,數值在0-99之間 31 每出一道題後等待操做者輸入運算結果 32 判斷輸入的結果是否正確,正確加10分 33 給出最終得分 34 */ 35 /* 算法:用隨機函數rand()產生0-32767之間的整數,與100取餘數後獲得0-99之間的整數 36 運算符也由隨機數產生,rand%4獲得0-3之間的隨機數,約定0:減法,1:加法 37 2:乘法,3:除法。for循環控制題目數量,每次循環先產生題目並顯示出來,將計算結果保存在jg中再等到作題的人從鍵盤輸入計算結果保存在s中,將jg與s進行比較斷定正確性 38 作完十道題後(循環結束),顯示測試結果並進行評價 39 */ 40 void jisuan() 41 { 42 int p;//p爲隨機產生的運算符號,規定0爲加法,1爲減法,2爲乘法,3爲除法 43 int i,gh;//i爲循環控制變量,gh用於臨時交換數據 44 printf("將進行100之內數字的四則運算!\n"); 45 srand((unsigned)time(NULL));//隨機數由系統時間函數產生 46 47 //循環產生10道100以內的加減乘除法運算題目 48 for(i=0;i<10;i++) 49 { 50 sy[i]=rand()%100;//隨機產生第一個操做數(1-99) 51 sr[i]=rand()%100;//隨機產生第二個操做數(1-99) 52 p=rand()%4;//隨機產生運算符(0-3) 53 54 if(p==0)//轉換成運算符號,p爲0表示作加法 55 { 56 fh[i]='+';jg[i]=sy[i]+sr[i];}//fh爲‘+’,jg爲sy[i]+sr[i] 57 else if(p==1)//p爲1表示作減法 58 { 59 fh[i]='-'; 60 if(sy[i]<sr[i]) 61 { gh=sy[i]; 62 sy[i]=sr[i]; 63 sr[i]=gh; 64 }//若是sy<sr,則交換sy,sr,以保證結果爲正數 65 jg[i]=sy[i]-sr[i]; 66 } 67 else if(p==2)//p爲2表示作乘法 68 { 69 fh[i]='*'; 70 jg[i]=sy[i]*sr[i]; 71 }// fh爲'*',jg爲sy*sr 72 else if(p==3)//p爲3表示作除法 73 { 74 fh[i]='/'; 75 chufa(&sy[i],&sr[i],&jg[i]); 76 } 77 printf("第%2d題:%2d %c %2d=?",i+1,sy[i],fh[i],sr[i]);//顯示題目 78 scanf("%d",&jd[i]); 79 if(jd[i]==jg[i]) fs+=10; 80 }//循環結束 81 printf("\n測試結束\n\n"); 82 } 83 /*主菜單選項,分爲顯示答卷、錯題正解、系統評估、系統退出 84 算法:使用printf()函數顯示菜單項,用scanf()函數接受選項字符 85 while條件限定選項的合法性,非法字符則從新輸入並返回主函數 86 */ 87 char caidan() 88 { 89 char c='0';//定義變量 90 printf("\n*******數學四則運算*******\n\n\n"); 91 printf(" 1.顯示答卷 2.錯題正解\n\n"); 92 printf(" 3. 系統評估 4.系統退出 \n\n"); 93 printf("\n***********************************"); 94 printf("\n請輸入選項(1-4):");//提示輸入選項 95 do 96 { 97 scanf("%c",&c);//輸入選項 98 } 99 while(!(c>='1'&&c<'5'));//檢驗選項是否合法,若不然重輸 100 return c;//返回選擇項 101 } 102 /*對成績結果進行評價,便於作題了解本身的狀況,按分數的不一樣層次進行評價 103 算法:用條件函數switch對成績score進行分段並給出相應的評價,結果score的數據從主函數得到 104 */ 105 void pingjia() 106 { 107 printf("你的成績是%d分.\n",fs); 108 switch(fs) 109 { 110 case 100:printf("真棒!\n ");break; 111 case 90: printf("優秀!\n");break; 112 case 80: 113 case 70: printf("良好!請繼續努力~\n"); break; 114 case 60: printf("及格!再接再勵~!\n"); break; 115 case 50: 116 case 40: 117 case 30: 118 case 20: 119 case 10: printf("你可長點心吧~\n"); break; 120 case 0: printf("太差勁了!\n"); break; 121 122 } 123 printf("\n\n"); 124 } 125 /*顯示答卷 126 各數據從主函數中得到 127 */ 128 void dajuan() 129 { 130 int j; 131 printf("你的答卷爲:\n"); 132 for(j=0;j<10;j++) 133 printf("%2d %c %2d=%2d\n",sy[j],fh[j],sr[j],jd[j]); 134 printf("\n\n"); 135 } 136 /*對錯題給出正確的答案 137 各數據從主函數中得到 138 */ 139 void zhengjie() 140 { 141 int k; 142 printf("你答錯的題的正確答案爲:\n"); 143 for(k=0;k<10;k++) 144 { 145 if(jd[k]==jg[k]) continue; 146 else 147 { 148 printf("%2d %c %2d = %2d\n",sy[k],fh[k],sr[k],jg[k]); 149 } 150 } 151 printf("\n\n"); 152 } 153 /*主函數*/ 154 int main() 155 { 156 int key=1; 157 jisuan(); 158 while(key) 159 { 160 switch(caidan()) 161 { 162 case '1': { printf("\n\n\n");dajuan(); } break; 163 case '2': { printf("\n\n\n");zhengjie(); } break; 164 case '3': { printf("\n\n\n");pingjia(); } break; 165 case '4': key=0; 166 } 167 } 168 return 0; 169 }
運行結果:
總結:
總之,用時相加大概105分鐘左右,我以爲結對編程確實比本身編程好不少。在一開始,我確實不習慣結對編程,有許多地方的歧義和妥協,這個我在前面邊結對編程邊寫的過程觀點中有寫。可是毋庸置疑,在效率上,代碼的正確性和緊湊度上,結對編程的優勢十分醒目。這也就是爲何結對編程可以成爲一個較爲流行的編程方式的緣由。關於結對編程,仍是有一些新的受益之處。首先,它能夠促進參與項目的程序員自身的提升,一對程序員工做的時候,水平較低的一方會潛移默化地受水平略高的程序員影響,學到一些新的東西。而水平高的一方一樣由於不斷地把本身的想法說出來而整理了本身的思路。我以爲這個是我當初本身編程時所沒有的大特色,我學到了不少,在這裏感謝隊友!