第二次作业

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

这个作业属于哪个课程 2020面向对象程序设计张栋班
这个作业要求在哪里 面向对象程序设计寒假作业2
这个作业的目标 熟悉github仓库的使用,对前一次的编程题目进行优化 制作脚本
作业正文 第二次作业
其它参考文献 命名规范 编写批处理文件 批处理常用命令 freopen

一.编程题

实践题

1.先下载一个github desktop如下
第二次作业_第1张图片
在file那里有个 new responsibility即可创建
第二次作业_第2张图片
把作业文件放进本地的仓库里
第二次作业_第3张图片
然后就会出现
第二次作业_第4张图片
在github上就会找的到了
第二次作业_第5张图片

编程题

继续完成作业一的编程题。
对于命名规范,参考了文献,有驼峰命令法,匈牙利命名法,帕斯卡(pascal)命名法。但是这个我真的改不动,不知道如何下手,还要继续学习。
优化架构,一般要求每个函数长度不超过15行。
优化规范,尤其是命名规范。
制作一个编译脚本
我在原来的基础上,并没有考虑到输入会有几十,几十几这样的输入,而输出可以增加到几百,上千的我就没有去考虑了。
下面是我的三个函数
1.对于输入的个转换成十位数字位数字

int switch1(char shu[])
{
    int i;
    for(i=0;i<=10;i++)
    {
        if(strcmp(hanzi[i],shu)==0)
        return i;
    }
}

2.对于单个字符转换成汉字

int switch1(char shu[])
{
    int i;
    for(i=0;i<=10;i++)
    {
        if(strcmp(hanzi[i],shu)==0)
        return i;
    }
}

3.对于输入几十的输入,这个我还没有想到要怎么缩短,感觉都挺重要的,有个很奇怪的问题,对我与我a字符数组的转换,我发现少了一个’\0’的话strcmp函数判断的结果会有偏差,因为字符数组后面也会自动补吧,然后strcmp考虑进去了所以我卡了挺久的。

int switch3(char shu[]) 
{
    int i,t=0,j;    char a[50];
    for(i=0;i<=10;i++)
    {
        if(strncmp(hanzi[i],shu,2)==0)
        {
        t=t+i*10;   break;
        }
    }
    for(j=0;j<2;j++)
    {
    if(strlen(shu)>5)   a[j]=shu[j+4];
    else    a[j]=shu[j+2];
    }
    a[2]='\0';
    for(i=0;i<10;i++)
    {
        if(strcmp(a,hanzi[i])==0)
        t+=i;
    }
    return t;
}

完整代码如下

#include
#include
char hanzi[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
int switch1(char shu[]);
void switch2(int shu1);
int switch3(char shu[]);
int main()
{
    char a[50], b[50], c[50], d[50];
    int n,s,i,t;
    char e[50], f[50], g[50],h[50];
    scanf("%s %s %s %s", a, b, c, d);
    if (strcmp("整数", a) == 0)
    {
        if (strcmp("等于", c) == 0)
        {
            n = switch1(d);
    while(1)
    {
        scanf("%s",e);
        if(strcmp("看看",e)==0)
        break;
        scanf("%s %s",f,g);
        if(strcmp("增加", f) != 0&&strcmp("减少",f) != 0)
        {
            printf("Error!");
            break;
        }
        if (strcmp("增加", f) == 0&&strlen(g)<3)
        {
            n += switch1(g);
        }
        else if(strcmp("增加", f) == 0&&strlen(g)>3)
        {
            n += switch3(g);
        }
        if (strcmp("减少",f) == 0&&strlen(g)<3)
        {
            n -= switch1(g);
        }
        else if(strcmp("减少", f) == 0&&strlen(g)>3)
        {
            n -= switch3(g);
        }
    }
    scanf("%s",h);
    if (strcmp("看看", e) == 0)
    {
        if (n <= 10)
        {
            switch2(n);
        }
        else if (n > 10&&n<100)
        {
            if (n % 10 == 0)
            {
                s = n / 10;
                switch2(s);
                printf("十");
            }
            else
            {
                s = n / 10;
                i = n % 10;
                switch2(s);
                printf("十");
                switch2(i);
            }
        }
        else if(n>=100)
        {
            if(n%100==0)
            {
                s = n / 100;
                switch2(s);
                printf("百");
            }
            else if(n%100!=0&&n%10==0)
            {
                s=n/100;
                switch2(s);
                printf("百");
                i=n/10%10;
                switch2(i);
                printf("十");
            }
            else
            {
                s=n/100;
                switch2(s);
                printf("百");
                i=n/10%10;
                switch2(i);
                printf("十");
                t=n%100;
                switch2(t);
            }
        }
    }
    } 
    else
    printf("Error!");
    } 
    else
    printf("Error!");
    return 0;
}
int switch1(char shu[])
{
    int i;
    for(i=0;i<=10;i++)
    {
        if(strcmp(hanzi[i],shu)==0)
        return i;
    }
}
void switch2(int shu1)
{
    int i;
    for(i=0;i<=10;i++)
    {
        if(shu1==i)
        printf("%s",hanzi[i]);
    }
}
int switch3(char shu[]) 
{
    int i,t=0,j;    char a[50];
    for(i=0;i<=10;i++)
    {
        if(strncmp(hanzi[i],shu,2)==0)
        {
        t=t+i*10;   break;
        }
    }
    for(j=0;j<2;j++)
    {
    if(strlen(shu)>5)   a[j]=shu[j+4];
    else    a[j]=shu[j+2];
    }
    a[2]='\0';
    for(i=0;i<10;i++)
    {
        if(strcmp(a,hanzi[i])==0)
        t+=i;
    }
    return t;
}

单元测试

制作编译脚本

话说这个做脚本真的完全看不懂。
我搜了一下资料资料,制作脚本可以用系统自带的记事本,输入windows批处理命令来进行操作。
然后脚本代码最后一定有一个pause,不然自动结束连图都截不到
第二次作业_第6张图片
然后文件名称后缀是.bat,编码需要ANSI,不然会出现一堆中文奇怪字体。
第二次作业_第7张图片
下面是我的编译过程
第二次作业_第8张图片
经过这个就会出现
第二次作业_第9张图片

测试函数

下面是我的第一个switch1函数的测试

#include
#include
char hanzi[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
int switch1(char shu[])
{
    int i;
    for(i=0;i<=10;i++)
    {
        if(strcmp(hanzi[i],shu)==0)
        return i;
    }
}
int main()
{
    int i,b;
    char a[50]={"十"};
    b=switch1(a);
    if(b==10)
    printf("true\n");
    else
    printf("false\n");
 } 

脚本代码如下

@echo off
echo 测试开始
gcc test1.cpp -o test1.exe
test1
echo 测试结束
pause

第二次作业_第10张图片
结果是这样。
接下来第二个函数
测试代码如下

#include
#include
char hanzi[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
void switch2(int shu1)
{
    int i;
    for(i=0;i<=10;i++)
    {
        if(shu1==i)
        printf("%s\n",hanzi[i]);
    }
}
int main()
{
    int a=10;
    switch2(a);
} 

脚本代码

@echo off
echo 测试开始
gcc 未命名1.cpp -o test.exe
test
echo 测试结束
pause

第二次作业_第11张图片
第三个函数

#include
#include
char hanzi[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
int switch3(char shu[]) 
{
    int i,t=0,j;    char a[50];
    for(i=0;i<=10;i++)
    {
        if(strncmp(hanzi[i],shu,2)==0)
        {
        t=t+i*10;   break;
        }
    }
    for(j=0;j<2;j++)
    {
    if(strlen(shu)>5)   a[j]=shu[j+4];
    else    a[j]=shu[j+2];
    }
    a[2]='\0';
    for(i=0;i<10;i++)
    {
        if(strcmp(a,hanzi[i])==0)
        t+=i;
    }
    return t;
}
int main()
{
    char a[50]={"三十五"};
    printf("%d\n",switch3(a));
} 

脚本代码

@echo off
echo 测试开始
gcc test3.cpp -o test3.exe
test3
echo 测试结束
pause

结果
第二次作业_第12张图片

增加功能

这个瞄了别的大佬的博客才知道要用freopen函数来实现

形参说明:
filename:需要重定向到的文件名或文件路径。
mode:代表文件访问权限的字符串。例如,"r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。
stream:需要被重定向的文件流。
返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NULL。
参考文献在上面

下面是我的测试文件
第二次作业_第13张图片
第二次作业_第14张图片
这是增加的,freopen中的r代表的是只读写入,接下来只要写上文件名就不用管汉字的输入了,直接得出结果。

        char p[100];
    printf("输入文件名称\n") ;
    scanf("%s",p);
    freopen(p,"r",stdin) ;

你可能感兴趣的:(第二次作业)