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

生成字符串,计算式子结果的代码都得到了重用,但是代码还是冗长。

猜你喜欢

转载自www.cnblogs.com/wangyupan/p/10046131.html