面向对象程序设计第三次作业

这个作业属于哪个课程 2020春福大面向对象程序设计
这个作业要求在哪里 寒假作业3
这个作业的目标 继续完成作业二的编程题。优化架构,思考代码的拓展性
作业正文 第三次作业

编程题

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

仓库地址https://github.com/fzu-CCchaos/oop-homework-CCchaos

关于两位数输入的功能的添加:

因为一开始写的代码只支持个位数的输入,所以这次为了扩展数字范围,我尝试一下支持两位数的输入。(好像大佬们很早就实现了)

思考过程:

要实现二位数的输入,首先要知道怎么把二位数中的每个字分离出来。于是先根据想象做了一个简单的实验:

#include<stdio.h>
int main()
{char a[10],b[10];
 scanf("%s",a);
 printf("%c",a[2]);
 printf("%c",a[3]);
 return 0;
}

发现如果只写一行printf("%c",a[2]);那么就什么都不会输出,如果写了连续两个字符元素,就会输出对应的汉字。例如上面的程序,输入“五十五”就会输出“十”。

所以,可以产生一个比较粗略的思路:可以新建几个字符型数组,用来分别存输入汉字的单个字符。同时要考虑的特殊情况有例如“十六”这样的输入,如果是例如“七十”这样的输入,在第三个汉字的判断时通过if else的方法就可以找出来。注意:在新建的字符数组赋值后,要再添加一个’\0’,不然会出现错误。

实现方法:在原先的change函数中,添加了不满足0到10的任意数的情况,并将该情况的返回值设定为change2的返回值。change2是用来将输入的两位数的汉字转化成数字的。change2的写法如下:

int change2(char shu[])
{
    char x[10],y[10],z[10];
    int m=0; 
    x[0]=shu[0];x[1]=shu[1];x[2]='\0';
    if(strcmp(x,"十")==0)
        {y[0]=shu[2];y[1]=shu[3];y[2]='\0';
         if(strcmp(y,"一")==0) m=11;
         if(strcmp(y,"二")==0) m=12;
         if(strcmp(y,"三")==0) m=13;
         if(strcmp(y,"四")==0) m=14;
         if(strcmp(y,"五")==0) m=15;
         if(strcmp(y,"六")==0) m=16;
         if(strcmp(y,"七")==0) m=17;
         if(strcmp(y,"八")==0) m=18;
         if(strcmp(y,"九")==0) m=19;
        }
    else
        {
         if(strcmp(x,"二")==0) m+=20;
         if(strcmp(x,"三")==0) m+=30;
         if(strcmp(x,"四")==0) m+=40;
         if(strcmp(x,"五")==0) m+=50;
         if(strcmp(x,"六")==0) m+=60;
         if(strcmp(x,"七")==0) m+=70;
         if(strcmp(x,"八")==0) m+=80;
         if(strcmp(x,"九")==0) m+=90;
         z[0]=shu[4];z[1]=shu[5];z[2]='\0';
         if(strcmp(z,"一")==0) m+=1;
         else if(strcmp(z,"二")==0) m+=2;
         else if(strcmp(z,"三")==0) m+=3;
         else if(strcmp(z,"四")==0) m+=4;
         else if(strcmp(z,"五")==0) m+=5;
         else if(strcmp(z,"六")==0) m+=6;
         else if(strcmp(z,"七")==0) m+=7;
         else if(strcmp(z,"八")==0) m+=8;
         else if(strcmp(z,"九")==0) m+=9;
         else m+=0;
        }
    return m;
}

change2和change函数共同进行对输入的汉字的转换功能。所以测试是一起进行的。测试代码如下:

#include<stdio.h>
#include<string.h>
int change2(char shu[])
{
    char x[10],y[10],z[10];
    int m=0; 
    x[0]=shu[0];x[1]=shu[1];x[2]='\0';
    if(strcmp(x,"十")==0)
        {y[0]=shu[2];y[1]=shu[3];y[2]='\0';
         if(strcmp(y,"一")==0) m=11;
         if(strcmp(y,"二")==0) m=12;
         if(strcmp(y,"三")==0) m=13;
         if(strcmp(y,"四")==0) m=14;
         if(strcmp(y,"五")==0) m=15;
         if(strcmp(y,"六")==0) m=16;
         if(strcmp(y,"七")==0) m=17;
         if(strcmp(y,"八")==0) m=18;
         if(strcmp(y,"九")==0) m=19;
        }
    else
        {
         if(strcmp(x,"二")==0) m+=20;
         if(strcmp(x,"三")==0) m+=30;
         if(strcmp(x,"四")==0) m+=40;
         if(strcmp(x,"五")==0) m+=50;
         if(strcmp(x,"六")==0) m+=60;
         if(strcmp(x,"七")==0) m+=70;
         if(strcmp(x,"八")==0) m+=80;
         if(strcmp(x,"九")==0) m+=90;
         z[0]=shu[4];z[1]=shu[5];z[2]='\0';
         if(strcmp(z,"一")==0) m+=1;
         else if(strcmp(z,"二")==0) m+=2;
         else if(strcmp(z,"三")==0) m+=3;
         else if(strcmp(z,"四")==0) m+=4;
         else if(strcmp(z,"五")==0) m+=5;
         else if(strcmp(z,"六")==0) m+=6;
         else if(strcmp(z,"七")==0) m+=7;
         else if(strcmp(z,"八")==0) m+=8;
         else if(strcmp(z,"九")==0) m+=9;
         else m+=0;
        }
    return m;
}
int change(char shu[])
{
    if(strcmp(shu,"一")==0) return 1;
    else if(strcmp(shu,"二")==0) return 2;
    else if(strcmp(shu,"三")==0) return 3;
    else if(strcmp(shu,"四")==0) return 4;
    else if(strcmp(shu,"五")==0) return 5;
    else if(strcmp(shu,"六")==0) return 6;
    else if(strcmp(shu,"七")==0) return 7;
    else if(strcmp(shu,"八")==0) return 8;
    else if(strcmp(shu,"九")==0) return 9;
    else if(strcmp(shu,"零")==0) return 0;
    else if(strcmp(shu,"十")==0) return 10;
    else return change2(shu);
}
int main()
{
    char a[5][20]={"二十","五十六","十七","二十三","九十九"};
    int b,i;
    printf("这是两位数转换的测试:\n");
    for(i=0;i<5;i++)
        {printf("输入 %s   ",a[i]);
         b=change(a[i]);
         if(b>=0&&b<100)
            printf("%d   pass\n",b);
         else
            printf("error");
        }
}

运行结果如图所示

关于除法和乘法功能的添加

思路就是分别写两个函数,用来进行乘法和除法的运算,在主函数里的修改只要增加判断时的两个特例,所以实现方法并不复杂。函数如下:

int cheng(int num,int x)
{int ch;
 ch=num*x;
 return ch;
}
int chu(int num,int x)
{int chu;
 chu=num/x;
 return chu;
}

关于负数输出功能的添加

由于在输入中输入负数的可能性较小,在经过运算后得到一个负数结果的可能性还是比较大的,所以在输出函数中可以多做一个判断,如果最后结果num<0,就在输出结果前添加一个负号,再将num变为正数,其余的输出就和正数的输出一样了。实现方法是在print函数的最前面加上下列语句:

if(num<0)
    {printf("负");
     num=-num; 
    }

直播中提到这道题可以通过确定从字符数组的哪里开始读取,从而可以一次性地读入一整行的字符然后进行操作。这样对字符串的控制会更加快捷。

可以改进的地方

  • 支持更高位数字的输入输出,例如千或万的数值
  • 支持多次查看钱包余额,而不是输入一次“看看”就停止

收获

  • 一个函数不要包含太多功能,不然改起函数来同样很麻烦

猜你喜欢

转载自www.cnblogs.com/CCchaos/p/12307252.html