2020面向对象程序设计寒假作业3

2020面向对象程序设计寒假作业3

这个作业属于哪个课程 2020面向对象程序设计
这个作业要求在哪里 2020面向对象程序设计寒假作业3
这个作业的目标 编程题(请使用C语言或者C++完成以下题目):
1.继续完成作业二的编程题。
2.优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办
3.思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。
作业正文 编程题
其他参考文献

编程题(请使用C语言或者C++完成以下题目):

1.继续完成作业二的编程题。

2.优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办

3.思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。

Part1 需求分析与实现

1.增大转化数据的范围

  审视寒假作业2中优化后的代码,如果从拓展性角度分析,如果要增大转化数据的范围,那么只要对进行输入输出转化的两个函数(num和change_print)进行修改。

int num(char a[]){char b[10],c[10];
    if(strlen(a)==2) return swap(a);//对应零一二等单个汉字表达的数字   
    else if(strlen(a)==4){b[0]=a[2];b[1]=a[3];b[2]='\0';        
            if(swap(b)!=10) return 10+swap(b);//对应十一、十二等以十开头的两个汉字表达的数字
            else{b[0]=a[0];b[1]=a[1];b[2]='\0';
                return 10*swap(b);//对应二十、三十等以十结尾的数字
            }
    }
    else if(strlen(a)==6){b[0]=a[4];b[1]=a[5];b[2]='\0';
        c[0]=a[0];c[1]=a[1];c[2]='\0';
        return swap(b)+swap(c)*10;//对应“几十几”类型的数字
    }
}
void change_print(int sum){
    if(sum>=0&&sum<=10){printf("%s\n",list[sum]);}
    else {
        if(sum%10==0) printf("%s十\n",list[sum/10]);
        else if(sum<=19) printf("十%s\n",list[sum%10]);
        else printf("%s十%s\n",list[sum/10],list[sum%10]);
    }   
}

  对以上两个函数进行分析可以得知,如果要把数据范围扩大,只要继续增加条件分支就行。但是num函数的每个条件分支包含着对于不同长度汉字的剪切识别,如果只是一味的增加条件分支,虽然可行但是会使num函数变得冗长,所以还需要对num函数进行优化,把输入端转化和条件的功能用不同的函数去实现,提高代码的拓展性。
  这里我想到两种优化方案:可以采用先直接把汉字逐个转化成数字,再交由另一函数进行判断和运算的办法,避免了对不同长度的汉字进行逐一剪切判断;也可以把先判断汉字长度在把不同长度的汉字交由不同的函数进行运算,我这里采用第二种方法,这样想要扩展数据范围只要增加更多对应的函数就行了。

int length_switch(char a[]){
    if(strlen(a)==2) calculate_2(char a[]); 
    else if(strlen(a)==4) calculate_4(char a[]);
    else if(strlen(a)==6) calculate_6(char a[]);
    
}
int calculate_2(char a[]){
    return swap(a);
}//对应零一二等单个汉字表达的数字
int calculate_4(char a[]){
    char b[10],c[10];
    b[0]=a[2];b[1]=a[3];b[2]='\0';      
    if(swap(b)!=10) return 10+swap(b);//对应十一、十二等以十开头的两个汉字表达的数字
    else{b[0]=a[0];b[1]=a[1];b[2]='\0';
        return 10*swap(b);//对应二十、三十等以十结尾的数字
    }
}
int calculate_6(char a[]){
    char b[10],c[10];
    b[0]=a[4];b[1]=a[5];b[2]='\0';
    c[0]=a[0];c[1]=a[1];c[2]='\0';
    return swap(b)+swap(c)*10;
    
}//对应“几十几”类型的数字

  增大数据范围只要继续增加calculate_8(10、12···)函数和change_print函数中if的分支即可

2.增加更多条件识别

  

int judge(int n,char a[],char b[]){
    int sum1;
    sum1=length_switch(b);
    if(strcmp(a,"增加")==0) return n+sum1;
    else if(strcmp(a,"减少")==0) return n-sum1;
}

  只要增加judge函数中的if分支就可以达到扩充条件识别运算功能的目的,除“增加”、“减少”外,可以增加“乘"、“除以”等功能。
eg.

int judge(int n,char a[],char b[]){
    int sum1;
    sum1=length_switch(b);
    if(strcmp(a,"增加")==0) return n+sum1;
    else if(strcmp(a,"减少")==0) return n-sum1;
    else if(strcmp(a,"乘")==0) return n*sum1;
    else if(strcmp(a,"除以")==0) return n/sum1;
}

PS.这里的“除以”是整数的除法运算,商也是整数

3.功能拓展

  在对于“看看”这一查询变量数值大小的功能上运用了循环,可以使“看看”不只限于最终查询而可以在变量定义后的任何时候查看,将功能进行了拓展。

while(scanf("%s %s",d,b)!=EOF){
        if(strcmp(d,"看看")){scanf("%s",c);
            if(!strcmp(a,d)){sum=judge(sum,b,c);    
                if(sum>=99||sum<=0){printf("超出可容纳范围\n");
                    return 0;
                }
            }
            else{printf("变量不匹配\n");
                return 0;
            } 
        }
        else change_print(sum); 
    }

完整代码

#include<stdio.h>
#include<string.h>
char list[11][5]={"零","一","二","三","四","五","六","七","八","九","十"}; 
int swap(char a[]){
    int i;
    for(i=0;i<11;i++){
        if(strcmp(list[i],a)==0) return i;  
    } 
}
int length_switch(char a[]){
    if(strlen(a)==2) calculate_2(char a[]); 
    else if(strlen(a)==4) calculate_4(char a[]);
    else if(strlen(a)==6) calculate_6(char a[]);
    
}
int calculate_2(char a[]){
    return swap(a);
}
int calculate_4(char a[]){
    char b[10],c[10];
    b[0]=a[2];b[1]=a[3];b[2]='\0';      
    if(swap(b)!=10) return 10+swap(b);
    else{b[0]=a[0];b[1]=a[1];b[2]='\0';
        return 10*swap(b);
    }
}
int calculate_6(char a[]){
    char b[10],c[10];
    b[0]=a[4];b[1]=a[5];b[2]='\0';
    c[0]=a[0];c[1]=a[1];c[2]='\0';
    return swap(b)+swap(c)*10;
    
}
int judge(int n,char a[],char b[]){
    int sum1;
    sum1=length_switch(b);
    if(strcmp(a,"增加")==0) return n+sum1;
    else if(strcmp(a,"减少")==0) return n-sum1;
    else if(strcmp(a,"乘")==0) return n*sum1;
    else if(strcmp(a,"除以")==0) return n/sum1;
}
void change_print(int sum){
    if(sum>=0&&sum<=10){printf("%s\n",list[sum]);}
    else {
        if(sum%10==0) printf("%s十\n",list[sum/10]);
        else if(sum<=19) printf("十%s\n",list[sum%10]);
        else printf("%s十%s\n",list[sum/10],list[sum%10]);
    }   
}
int main(){
    int i,sum;
    char a[100],b[100],c[100],d[100];
    scanf("%s",a);
    if(!strcmp(a,"整数")) scanf("%s %s %s",a,b,c);
    else{printf("输入格式错误\n"); 
        return 0;
    }
    sum=length_switch(c);
    while(scanf("%s %s",d,b)!=EOF){
        if(strcmp(d,"看看")){scanf("%s",c);
            if(!strcmp(a,d)){sum=judge(sum,b,c);    
                if(sum>=99||sum<=0){printf("超出可容纳范围\n");
                    return 0;
                }
            }
            else{printf("变量不匹配\n");
                return 0;
            } 
        }
        else change_print(sum); 
    }
return 0;       
}

Part2 总结

  本次作业主要在于思考框架和拓展性两点,因为我用的是相对来讲结构化的编程思路来解这道题的,所以在优化代码实现改进思路时需要相对大规模的修改代码,增加了优化代码的难度;而因为一开始只顾及了条件,没有深入思考哪种实现方式能更好地把功能拓展,导致一开始的代码相对比较死板,只能解决比较固定有限的数据范围,导致拓展性不佳。这次作业拓展了思考的角度,在实现一个问题或功能时应该把眼光放得更长远些,要把代码的拓展性考虑进去,以便于日后功能或数据的拓展。

猜你喜欢

转载自www.cnblogs.com/beyondzones/p/12316703.html