20181127-1 附加作業 軟體工程原則的應用例項分析
阿新 • • 發佈:2018-11-30
此作業的要求參見:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2446
分析自己的程式碼作業之前,先貼出自己程式碼連線:
詞頻統計的程式碼:https://git.coding.net/wangyupan/first-program.git
四則運算的程式碼:https://git.coding.net/wangyupan/second-program.git
1.軟體工程的原則有很多,我的程式碼了體現了一些。比如說要滿足使用者的需求,只有在滿足使用者的需求之後,才能新增你認為更好的功能。我在完成詞頻統計的時候忽略了這一點,沒有完成使用者的需求,在楊老師的提醒下,及時修正了這一點。在結對程式設計的時候,先定好編寫程式碼時的程式碼規範,然後再進行編寫。吉林市兩日遊,提出兩套方案,應對意外事件的發生。
2.感覺自己寫程式碼挺失敗的,基本是沒有子功能的劃分,程式碼也沒能重用。
詞頻統計中,統計單詞這段程式碼:
while(~scanf("%s",str)) { int len=strlen(str); int j=0; for(int i=0; i<len; i++) { if(str[i]>='A'&&str[i]<='Z') { str[i]+=32; }if(str[i]>='a'&&str[i]<='z') { str1[j++]=str[i]; } else { str1[j]='\0'; if(str1[0]=='\0') continue; else total++; bool flag=true; for(int i=0; i<num; i++) { if(strcmp(Word[i].W,str1)==0) { Word[i].cnt++; flag=false; break; } } if(flag) { strcpy(Word[num].W,str1); Word[num].cnt=1; num++; } j=0; } } str1[j]='\0'; if(str1[0]=='\0') { continue; } //else //{ // total++; //} bool flag=true; for(int i=0; i<num; i++) { if(strcmp(Word[i].W,str1)==0) { Word[i].cnt++; flag=false; break; } } if(flag) { strcpy(Word[num].W,str1); Word[num].cnt=1; num++; } }
控制檯輸入和重定向輸入都可以用這段程式碼,但是一開始沒真正理解重定向,就沒實現重定向功能。後來實現的時候,沒能將程式碼重用。
編寫四則運算的時候,重用的程式碼變多了。
char GetStr() { int tmp; //char str[20]; int i; bool F=true; for( i=0; i<7; i++) { if(i%2==0) { if(F) { str1[i]=rand()%10+'0'; } else { while(1) { tmp=rand()%10; if(tmp) { str1[i]=tmp+'0'; break; } } } } else { str1[i]=Flag(); if(str1[i]=='/') F=false; else F=true; } } str1[i]='\0'; //return str; }
float Arithmetic(char *str) { Stack1 opt; Stack2 opd; Init2(&opd); Init1(&opt); int tmp=0,i=0,j; //char str[50]; //scanf("%s",str); while(str[i]!='\0'||!Empty1(&opt)) { if(str[i]>='0'&&str[i]<='9') { tmp=tmp*10+str[i]-'0'; i++; if(str[i]<'0'||str[i]>'9') { Push2(&opd,tmp); tmp=0; } } else { if(Empty1(&opt)||(GetTop1(&opt)=='('&&str[i]!=')')||Prt(str[i])>Prt(GetTop1(&opt))) { Push1(&opt,str[i]); i++; continue; } if(GetTop1(&opt)=='('&&str[i]==')') { Pop1(&opt); i++; continue; } if((str[i]=='\0'&&!Empty1(&opt))||(str[i]==')'&&GetTop1(&opt)!='(')||Prt(str[i])<=Prt(GetTop1(&opt))) { switch(Pop1(&opt)) { case '+': Push2(&opd,Pop2(&opd)+Pop2(&opd)); break; case '-': j=Pop2(&opd); Push2(&opd,Pop2(&opd)-j); break; case '*': Push2(&opd,Pop2(&opd)*Pop2(&opd)); break; case '/': j=Pop2(&opd); Push2(&opd,Pop2(&opd)/j); } continue; } } } return Pop2(&opd); }
生成字串,計算式子結果的程式碼都得到了重用,但是程式碼還是冗長。