寒假作业三

匆匆过客 提交于 2020-02-16 10:41:51

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

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 寒假作业三
作业正文 寒假作业3
这个作业的目标 1.继续完成作业二的编程题,优化代码 2. 思考一个代码的延展性

编程题

  • 继续完成作业二的编程题。
  • 优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。
  • 思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。

优化代码

  • 将之前的代码做了一些优化,把错误分析单独独立为一个函数模块,并且完善了错误分析,从数据类型,数据范围,运算操作和初始化四个角度报错。用error函数,按照不同的参数输出不同的错误提示。
void error(int n)
{
    if(n==1) printf("只支持整数数据\n");
    if(n==2) printf("运算操作错误,仅支持增加或减少\n");
    if(n==3) printf("数据超出范围,仅支持0-99内数据\n");
    if(n==4) printf("未初始化\n"); 
}
  • 我新加入了负数的计算,使程序范围由0-99变为-99-99.通过读入数据时判断第一个汉字是否为“负”,因为我们平常习惯说到负数时,第一个字一定是“负”。然后开一个字符数组minus存储符号,如果有“负”则执行函数exchange1。
int main()
{ 
    char minus[5];
    //freopen("homework.txt","r",stdin);//
    char var[10],name[100],op[100],num[10];     //变量类型,变量名,运算// 
    scanf("%s %s %s %s",var,name,op,num);
    if(strcmp(var,"整数")!=0){
        error(1);
    } 
    if(strlen(num)>=4){
        char str[15];
        str[0]=num[2];str[1]=num[3];
        if(strcmp(str,"百")==0)
        error(3);
    } 
    int sum;
    if(strcmp(op,"等于")==0){                  //初始化// 
        minus[0]=num[0];minus[1]=num[1];
            if(strcmp(minus,"负")==0)
            sum=exchange1(num);
            else 
            sum=exchange(num);
    }
    else 
       error(4);
    operation(name,op,num,sum);
    return 0; 
}
  • exchange1函数内,将除去符号位的其余汉字存入unsign数组,执行exchange函数得到一个整数,exchange1函数返回为这个正数的相反数。
int exchange1(char a[]){
    char unsign[15];
    int result,i;
    for(i=2;i<strlen(a);i++){
        unsign[i-2]=a[i];
    }
    result=exchange(unsign);
    return -result;
} 
  • 到这里汉字转数字结束,计算时对负数不需要特别的判断,数字转汉字时,先判断数字是正还是负,若为负数执行inexchange1函数,先转为正数,之后在每个输出结果前加“负”即可。
void inexchange1(int sum){
    sum=-sum;
    int unit=sum%10,tens=sum/10;                
    if(sum<=10)//0-10//
    printf("负%s\n",str[sum]); 
    else if(sum>=11&&sum<=20||sum%10==0){
        if(sum%10==0)
        printf("负%s十\n",str[tens]);
        else
        printf("负十%s\n",str[unit]);  
    } 
    else{
        printf("负 %s十%s\n",str[tens],str[unit]);
    }
}

下面是完整代码

#include<stdio.h>
#include<string.h>
char str[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
int exchange(char a[]); 
void inexchange(int sum);
void operation(char name[],char op[],char num[],int sum);
void error(int n); 
int exchange1(char a[]);//负数转换// 
void inexchange1(int sum);
int main()
{ 
    char minus[5];
    //freopen("homework.txt","r",stdin);//
    char var[10],name[100],op[100],num[10];     //变量类型,变量名,运算// 
    scanf("%s %s %s %s",var,name,op,num);
    if(strcmp(var,"整数")!=0){
        error(1);
    } 
    if(strlen(num)>=4){
        char str[15];
        str[0]=num[2];str[1]=num[3];
        if(strcmp(str,"百")==0)
        error(3);
    } 
    int sum;
    if(strcmp(op,"等于")==0){                  //初始化// 
        minus[0]=num[0];minus[1]=num[1];
            if(strcmp(minus,"负")==0)
            sum=exchange1(num);
            else 
            sum=exchange(num);
    }
    else 
       error(4);
    operation(name,op,num,sum);
    return 0; 
}
void operation(char name[],char op[],char num[],int sum){     //运算// 
    int a;
    char minus[5];
    while((scanf("%s",name))!=EOF) {
        if(strcmp(name,"看看")!=0){
            scanf("%s %s",op,num);
            minus[0]=num[0];minus[1]=num[1];
            if(strcmp(minus,"负")==0)
            a=exchange1(num);
            else 
            a=exchange(num);
            if(strcmp(op,"增加")==0)
            sum+=a; 
            else if(strcmp(op,"减少")==0)
            sum-=a;
            else
            error(2);   
        }
        else {
            scanf("%s",op);//注意此时name存储的是操作,op存储的是变量名字//
            if(sum>0)
            inexchange(sum);
            else
            inexchange1(sum);
        }
    }
}
int exchange(char a[]){                     //汉字转数字// 
    int i,j,n,sum;
    char tens[10],unit[10];
    if(strlen(a)==2) {                        //1-10// 
        for(i=0;i<=10;i++){
            if((strcmp(a,str[i])==0))
            return i;
        }
    }
    if(strlen(a)==4){                        //11-20,10的倍数// 
        tens[0]=a[0];tens[1]=a[1]; 
        unit[0]=a[2];unit[1]=a[3];
        if(strcmp(tens,"十")==0){
            for(i=0;i<=10;i++){
                if(strcmp(unit,str[i])==0)
                return 10+i;
            } 
        }
        if(strcmp(unit,"十")==0){
            for(i=0;i<=10;i++){
                if(strcmp(tens,str[i])==0)
                return i*10;
            }
        }   
    }
    else {                                       //几十几//
        tens[0]=a[0];tens[1]=a[1]; 
        unit[0]=a[4];unit[1]=a[5];
        for(i=0;i<=10;i++){
            if(strcmp(tens,str[i])==0)
            sum=i*10;
        }
        for(i=0;i<=10;i++){ 
            if(strcmp(unit,str[i])==0)
            sum+=i;
        }
        return sum;
    }
}
void inexchange(int sum){     //数字转文本//
    int unit=sum%10,tens=sum/10;                
    if(sum<=10)//0-10//
    printf("%s\n",str[sum]); 
    else if(sum>=11&&sum<=20||sum%10==0){
        if(sum%10==0)
        printf("%s十\n",str[tens]);
        else
        printf("十%s\n",str[unit]);   
    } 
    else{
        printf("%s十%s\n",str[tens],str[unit]);
    }
}
int exchange1(char a[]){
    char unsign[15];
    int result,i;
    for(i=2;i<strlen(a);i++){
        unsign[i-2]=a[i];
    }
    result=exchange(unsign);
    return -result;
} 
void inexchange1(int sum){
    sum=-sum;
    int unit=sum%10,tens=sum/10;                
    if(sum<=10)//0-10//
    printf("负%s\n",str[sum]); 
    else if(sum>=11&&sum<=20||sum%10==0){
        if(sum%10==0)
        printf("负%s十\n",str[tens]);
        else
        printf("负十%s\n",str[unit]);  
    } 
    else{
        printf("负 %s十%s\n",str[tens],str[unit]);
    }
}
void error(int n)
{
    if(n==1) printf("只支持整数数据\n");
    if(n==2) printf("运算操作错误,仅支持增加或减少\n");
    if(n==3) printf("数据超出范围,仅支持0-99内数据\n");
    if(n==4) printf("未初始化\n"); 
}

一些样例



单元测试

对新增的exchange1做了测试

#include<stdio.h>
#include<string.h>
char str[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
char exe[6][10]={"负十七","负八十","负十五","负三十五","负二十五","负五十"};
int main()
{
    char tens[4],unit[4];
    int sum,i,j,result,k,b;
    for(i=0;i<6;i++)
    {
        if(strlen(exe[i])==6){
            tens[0]=exe[i][2];tens[1]=exe[i][3];
            unit[0]=exe[i][4];unit[1]=exe[i][5];
            if(strcmp(tens,"十")==0){
            for(j=0;j<=10;j++){
                if(strcmp(unit,str[j])==0)
                {
                    b=10+j;
                }
                
            } 
        }
        if(strcmp(unit,"十")==0){
            for(j=0;j<=10;j++){
                if(strcmp(tens,str[j])==0){
                    b=j*10;
                    
                    }
                }
            }   
        }
        else{
            tens[0]=exe[i][2];tens[1]=exe[i][3]; 
            unit[0]=exe[i][6];unit[1]=exe[i][7];
            for(j=0;j<=10;j++){
                if(strcmp(tens,str[j])==0)
                {
                    b=j*10;
                
                } 
            }
            for(j=0;j<=10;j++){ 
                if(strcmp(unit,str[j])==0)
                {
                    b+=j;
                
                }
                
            }   
        }
        printf("%s %d\n",exe[i],-b); 
    }   
    return 0;
} 


思考

  • 可以扩大数据范围,增加百,千等判断,在原有代码基础上类似的判断各种情况如几百,几千,几百几十,几千几百等。
  • 增加循环语句,可以增减关键词如“次”,几次就是循环几遍,遇到关键词“次”就进行循环操作
  • 增加运算操作,可以增加乘除,取模,甚至是次方,提前规定一个统一的表达方法,判断关键词,遇到什么关键词就执行什么运算操作。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!