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

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

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 面向对象程序设计寒假作业3
这个作业的目标 1. 继续完成编程题 2. 发布博客
作业正文 2020年面向对象程序设计寒假作业3

1. 优化代码

(1)对sum函数进行了优化,去掉了繁琐的步骤,将大于等于20的部分进行修改,缩短代码

void sum(int mon)
{
    int ge, shi;
    if (mon <= 10) Chinese(mon);
    else
    {
        shi = mon / 10;
        ge = mon % 10;
        if(mon>=20)
        {
            Chinese(shi);
            printf("十");
            if(ge!=0) Chinese(ge);
        }
        else if(mon < 20)
        {
            printf("十");
            Chinese(ge);
        }
    }
}

(2)对exchange函数修改,添加语句,避免在测试时出错

dg[2]='\0';
ds[2]='\0';

2. 添加功能

(1)添加负数功能

我将数字范围拓展到了-99~99,添加了负数的功能

void sum(int mon)
{
    int ge, shi;
    if (abs(mon) <= 10)
    {
        if(mon<0) printf("负");
        Chinese(mon); 
     } 
    else
    {
        shi = abs(mon) / 10;
        ge = abs(mon) % 10;
        if(abs(mon)>=20)
        {
            if(mon<0) printf("负");
            Chinese(shi);
            printf("十");
            if(ge!=0) Chinese(ge);
        }
        else if(abs(mon) < 20)
        {
            if(mon<0) printf("负");
            printf("十");
            Chinese(ge);
        }
    }
}

我发现其中有一部分是共有的,所以将它提取出来

if(mon<0) printf("负");
void sum(int mon)
{
    int ge, shi;
    if(mon<0) printf("负");
    if (abs(mon) <= 10) Chinese(mon); 
     
    else
    {
        shi = abs(mon) / 10;
        ge = abs(mon) % 10;
        if(abs(mon)>=20)
        {
            Chinese(shi);
            printf("十");
            if(ge!=0) Chinese(ge);
        }
        else if(abs(mon) < 20)
        {
            printf("十");
            Chinese(ge);
        }
    }
}

(2)扩大数字范围至百位,即-999~999

void sum(int mon)
{
    int ge, shi,bai;
    if(mon<0) printf("负");
    if (abs(mon) <= 10) Chinese(mon); 
    else if(abs(mon) >= 100) 
    {
        bai=abs(mon)/100;
        ge=abs(mon)%10;
        shi=(abs(mon)-bai*100-ge)/10;
        Chinese(bai);
        printf("百");
        if(ge!=0) 
        {
            Chinese(shi);
            if(shi!=0) printf("十");
            Chinese(ge);
        }
    }
    else
    {
        shi = abs(mon) / 10;
        ge = abs(mon) % 10;
        if(abs(mon)>=20)
        {
            Chinese(shi);
            printf("十");
            if(ge!=0) Chinese(ge);
        }
        else if(abs(mon) < 20)
        {
            printf("十");
            Chinese(ge);
        }
    }
}

一开始正数没有问题,在负数部分出现问题,通过之前设置的 辅助输出排查出,在三位数中对十位的处理忘记加绝对值,即

shi=(abs(mon)-bai*100-ge)/10;

2020年面向对象程序设计寒假作业3_第1张图片
2020年面向对象程序设计寒假作业3_第2张图片

3. 完整代码如下

#include
#include
#include
int number(char d[])
{
    if (strcmp(d, "零") == 0) return 0;
    else if (strcmp(d, "一") == 0) return 1;
    else if (strcmp(d, "二") == 0) return 2;
    else if (strcmp(d, "三") == 0) return 3;
    else if (strcmp(d, "四") == 0) return 4;
    else if (strcmp(d, "五") == 0) return 5;
    else if (strcmp(d, "六") == 0) return 6;
    else if (strcmp(d, "七") == 0) return 7;
    else if (strcmp(d, "八") == 0) return 8;
    else if (strcmp(d, "九") == 0) return 9;
    else if (strcmp(d, "十") == 0) return 10;
}
int exchange(char d[])
{
    char ds[1000],dg[1000];
    if(strlen(d)==2) return number(d);//处理0-10
    else if(strlen(d)==4) 
    {
        dg[0]=d[2];dg[1]=d[3];dg[2]='\0';//dg里存的是两位数里的个位 
        if(number(dg)!=10) return 10+number(dg);//处理11-19 
        else//处理10的倍数20,30,40,50,60,70,80,90 
        {
            ds[0]=d[0];ds[1]=d[1];ds[2]='\0';//ds里存的是两位数中的十位
            return 10*number(ds);
        }
    }
    else if(strlen(d)==6)
    {
        ds[0]=d[0];ds[1]=d[1];ds[2]='\0';//ds里存的是两位数中的十位
        dg[0]=d[4];dg[1]=d[5];dg[2]='\0';//dg里存的是两位数里的个位 
        return 10*number(ds)+number(dg);
    }
}
void Chinese(int mo)
{
    switch (mo)
    {
    case 0:printf("零"); break;
    case 1:printf("一"); break;
    case 2:printf("二"); break;
    case 3:printf("三"); break;
    case 4:printf("四"); break;
    case 5:printf("五"); break;
    case 6:printf("六"); break;
    case 7:printf("七"); break;
    case 8:printf("八"); break;
    case 9:printf("九"); break;
    case 10:printf("十"); break;
    }
}
void sum(int mon)
{
    int ge, shi,bai;
    if(mon<0) printf("负");
    if (abs(mon) <= 10) Chinese(mon); 
    else if(abs(mon) >= 100) 
    {
        bai=abs(mon)/100;
        ge=abs(mon)%10;
        shi=(abs(mon)-bai*100-ge)/10;
        Chinese(bai);
        printf("百");
        if(ge!=0) 
        {
            Chinese(shi);
            if(shi!=0) printf("十");
            Chinese(ge);
        }
    }
    else
    {
        shi = abs(mon) / 10;
        ge = abs(mon) % 10;
        if(abs(mon)>=20)
        {
            Chinese(shi);
            printf("十");
            if(ge!=0) Chinese(ge);
        }
        else if(abs(mon) < 20)
        {
            printf("十");
            Chinese(ge);
        }
    }
}
int main()
{
    char a[1000], b[1000], c[1000], d[1000],be[1000],ce[1000],f[1000];
    scanf("%s %s %s %s", a, b, c, d);
    int m, money;
    if (strcmp(a, "整数")!=0) m = 1;
    for (int i = 1;m==0; i++)
    {
        if (i == 1) money = exchange(d);
        else
        {
            scanf("%s",be);
            if ( (strcmp(be, "看看")==0)) break;
            if((strcmp(be, b) != 0) && (strcmp(be, "看看") != 0)) continue; 
            scanf("%s %s", ce, f);
            if (strcmp(ce, "增加") == 0) 
            {
                money += exchange(f);
                //printf("%d\n",money);sum(money);printf("\n");
            }
            if (strcmp(ce, "减少") == 0) 
            {
                money -= exchange(f);
                //printf("%d\n",money);sum(money);printf("\n");
            }   
        }
    }
    //printf("%d\n",money);
    sum(money);
    return 0;
}

一些样例

2020年面向对象程序设计寒假作业3_第3张图片
2020年面向对象程序设计寒假作业3_第4张图片
2020年面向对象程序设计寒假作业3_第5张图片
2020年面向对象程序设计寒假作业3_第6张图片
2020年面向对象程序设计寒假作业3_第7张图片
2020年面向对象程序设计寒假作业3_第8张图片

4. 单元测试(这里对有改动的部分进行测试)

重新写了测试脚本

2020年面向对象程序设计寒假作业3_第9张图片

(1)sum函数

#include
#include 
#include
void Chinese(int mo)
{
    switch (mo)
    {
    case 0:printf("零"); break;
    case 1:printf("一"); break;
    case 2:printf("二"); break;
    case 3:printf("三"); break;
    case 4:printf("四"); break;
    case 5:printf("五"); break;
    case 6:printf("六"); break;
    case 7:printf("七"); break;
    case 8:printf("八"); break;
    case 9:printf("九"); break;
    case 10:printf("十"); break;
    }
}
void sum(int mon)
{
    int ge, shi,bai;
    if(mon<0) printf("负");
    if (abs(mon) <= 10) Chinese(mon); 
    else if(abs(mon) >= 100) 
    {
        bai=abs(mon)/100;
        ge=abs(mon)%10;
        shi=(abs(mon)-bai*100-ge)/10;
        Chinese(bai);
        printf("百");
        if(ge!=0) 
        {
            Chinese(shi);
            if(shi!=0) printf("十");
            Chinese(ge);
        }
    }
    else
    {
        shi = abs(mon) / 10;
        ge = abs(mon) % 10;
        if(abs(mon)>=20)
        {
            Chinese(shi);
            printf("十");
            if(ge!=0) Chinese(ge);
        }
        else if(abs(mon) < 20)
        {
            printf("十");
            Chinese(ge);
        }
    }
}
int main()
{
    int money;
    scanf("%d",&money);
    sum(money);
    return 0; 
}

2020年面向对象程序设计寒假作业3_第10张图片

(2)exchange函数

#include
#include 
#include
int number(char d[])
{
    if (strcmp(d, "零") == 0) return 0;
    else if (strcmp(d, "一") == 0) return 1;
    else if (strcmp(d, "二") == 0) return 2;
    else if (strcmp(d, "三") == 0) return 3;
    else if (strcmp(d, "四") == 0) return 4;
    else if (strcmp(d, "五") == 0) return 5;
    else if (strcmp(d, "六") == 0) return 6;
    else if (strcmp(d, "七") == 0) return 7;
    else if (strcmp(d, "八") == 0) return 8;
    else if (strcmp(d, "九") == 0) return 9;
    else if (strcmp(d, "十") == 0) return 10;
}
int exchange(char d[])
{
    char ds[1000],dg[1000];
    if(strlen(d)==2) return number(d);//处理0-10
    else if(strlen(d)==4) 
    {
        dg[0]=d[2];dg[1]=d[3];dg[2]='\0';//dg里存的是两位数里的个位 
        if(number(dg)!=10) return 10+number(dg);//处理11-19 
        else//处理10的倍数20,30,40,50,60,70,80,90 
        {
            ds[0]=d[0];ds[1]=d[1];ds[2]='\0';//ds里存的是两位数中的十位
            return 10*number(ds);
        }
    }
    else if(strlen(d)==6)
    {
        ds[0]=d[0];ds[1]=d[1];ds[2]='\0';//ds里存的是两位数中的十位
        dg[0]=d[4];dg[1]=d[5];dg[2]='\0';//dg里存的是两位数里的个位 
        return 10*number(ds)+number(dg);
    }
}
int main()
{
    char d[1000];
    scanf("%s",d);
    printf("%d",exchange(d));
    return 0; 
}

2020年面向对象程序设计寒假作业3_第11张图片

5. 编译脚本

2020年面向对象程序设计寒假作业3_第12张图片

你可能感兴趣的:(2020年面向对象程序设计寒假作业3)