1. 程式人生 > >20181127-1 附加作業 軟體工程原則的應用例項分析

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);
}

生成字串,計算式子結果的程式碼都得到了重用,但是程式碼還是冗長。