20181127-1 附加作业 软件工程原则的应用实例分析
此作业的要求参见: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); }
生成字符串,计算式子结果的代码都得到了重用,但是代码还是冗长。