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

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 面向对象程序设计寒假作业3
这个作业的目标 1.优化作业2编程题代码的架构
2.思考代码的拓展性
3.参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。
4.发布博客
作业正文 编程题
其他参考文献 windows批处理(cmd/bat)编程详解
仓库地址 仓库地址
优化代码 寒假作业01.exe、寒假作业01.cpp
单元测试 trans_input.exe、trans_input.cpp、trans_input_test.bat
trans_output.exe、trans_output.cpp、trans_output_test.bat
编译脚本 trans_test.bat、trans_test.exe
测试脚本 trans1_test.bat、trans1.exe、trans1.cpp、1.txt

编程题:

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

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

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

一、进一步优化代码

在之前作业中,我对于代码的输出进行了一定的优化,将输出结果从0~99扩大到了-99~99,这次考虑到之前的范围在实际应用中可能限制太多,于是扩大输出结果的范围;同时考虑到输入只有正数的输入,为了让程序更加灵活方便,添加了负数的处理。

(1)将输出数据的范围扩大到-999~999。

依照想法进行扩大数据范围,在绝对值100~999之中,有几个特别情况,比如整百的数(100、200、300)、没有十位的三位数(101、102、103)、十位为一的百位数读法的特殊(“110” 读作 “一百一十” 而非 “一百十”)等,针对这些特殊情况,我通过添加if选择语句来进行处理。

更改后的输出部分代码如下:

void printf_wallet(int sum)
{
    int shi,bai;
    if(sum <= 10)   trans_output(sum);  
        else
        {
        if(sum >= 100)
            {
            bai = sum /100;
            sum = sum %100;
            if(bai == 1)
            printf("一百");
            else
            {
                trans_output(bai);
                printf("百"); 
        }
        if(sum<10&&sum!=0)
        printf("零");
        if(sum>=10&&sum<20)
        printf("一");
        }
        if(sum <= 10)   trans_output(sum);
        else
        {
        shi = sum / 10;
            sum = sum % 10;
                if (shi == 1)
                {
                printf("十");
                    trans_output(sum);
                }
                if(shi > 1)
                {
                trans_output(shi);
                    printf("十");
                    if(sum!=0)
                    trans_output(sum);
                }
            }
        }
} 
 

(2)对于输入的数据增加负数的处理。

这个处理并不难,在汉字转数字处理部分,添加-1~-10的情况即可。

更改后的输入_汉字转数字部分代码如下:

int trans_input(char num[])
{
    if (strcmp(num, "零") == 0) return 0;
    if (strcmp(num, "一") == 0) return 1;
    if (strcmp(num, "二") == 0) return 2;
    if (strcmp(num, "三") == 0) return 3;
    if (strcmp(num, "四") == 0) return 4;
    if (strcmp(num, "五") == 0) return 5;
    if (strcmp(num, "六") == 0) return 6;
    if (strcmp(num, "七") == 0) return 7;
    if (strcmp(num, "八") == 0) return 8;
    if (strcmp(num, "九") == 0) return 9;
    if (strcmp(num, "十") == 0) return 10;
    if (strcmp(num, "负一") == 0) return -1;
    if (strcmp(num, "负二") == 0) return -2;
    if (strcmp(num, "负三") == 0) return -3;
    if (strcmp(num, "负四") == 0) return -4;
    if (strcmp(num, "负五") == 0) return -5;
    if (strcmp(num, "负六") == 0) return -6;
    if (strcmp(num, "负七") == 0) return -7;
    if (strcmp(num, "负八") == 0) return -8;
    if (strcmp(num, "负九") == 0) return -9;
    if (strcmp(num, "负十") == 0) return -10;
}

(3)优化后的完整代码如下:

#include<stdio.h>
#include<string.h>

int trans_input(char num[]);    //将输入的汉字转化为数字,便于计算 
int input_op(int sum);  //输入多组数据,直到查看标志字符出现停止循环
int op(int n, char b[],int sum);    //对输入数据进行处理 
void printf_wallet(int sum);  //输出最终结果 
void trans_output(int sum);     //对最终结果的数字转化为汉字并输出

char zs[20], wallet[20], opp[20], num[20];  
int sum,n;

int main()
{
    scanf("%s %s %s %s",zs,wallet,opp,num);
    sum = trans_input(num); 
    sum = input_op(sum);
    if(sum < 0)  //处理钱包数额为负数 
    {
        printf("负");
        sum=-sum;
    } 
    printf_wallet(sum);
    return 0;
}

int trans_input(char num[])
{
    if (strcmp(num, "零") == 0) return 0;
    if (strcmp(num, "一") == 0) return 1;
    if (strcmp(num, "二") == 0) return 2;
    if (strcmp(num, "三") == 0) return 3;
    if (strcmp(num, "四") == 0) return 4;
    if (strcmp(num, "五") == 0) return 5;
    if (strcmp(num, "六") == 0) return 6;
    if (strcmp(num, "七") == 0) return 7;
    if (strcmp(num, "八") == 0) return 8;
    if (strcmp(num, "九") == 0) return 9;
    if (strcmp(num, "十") == 0) return 10;
    if (strcmp(num, "负一") == 0) return -1;
    if (strcmp(num, "负二") == 0) return -2;
    if (strcmp(num, "负三") == 0) return -3;
    if (strcmp(num, "负四") == 0) return -4;
    if (strcmp(num, "负五") == 0) return -5;
    if (strcmp(num, "负六") == 0) return -6;
    if (strcmp(num, "负七") == 0) return -7;
    if (strcmp(num, "负八") == 0) return -8;
    if (strcmp(num, "负九") == 0) return -9;
    if (strcmp(num, "负十") == 0) return -10;
}

int input_op(int sum)
{
    while (1)
    {
        scanf("%s %s",wallet,opp);
        if (strcmp(wallet,"看看") == 0)
        break;
        scanf("%s", num);
        n = trans_input(num);
        sum = op(n, opp, sum);
    }   
    return sum;
}

int op(int n, char opp[], int sum)
{
    if (strcmp(opp, "增加") == 0) sum = sum + n;
    if (strcmp(opp, "减少") == 0) sum = sum - n;
    return sum;
}

void printf_wallet(int sum)
{
    int shi,bai;
    if(sum <= 10)   trans_output(sum);  
    else
    {
         if(sum >= 100)
        {
            bai = sum /100;
            sum = sum %100;
            if(bai == 1)
            printf("一百");
            else
            {
                trans_output(bai);
                printf("百"); 
            }
            if(sum<10&&sum!=0)
            printf("零");
            if(sum>=10&&sum<20)
            printf("一");
        }
        if(sum <= 10)   trans_output(sum);
        else
        {
            shi = sum / 10;
            sum = sum % 10;
            if (shi == 1)
            {
                printf("十");
                trans_output(sum);
            }
            if(shi > 1)
            {
                trans_output(shi);
                printf("十");
                if(sum!=0)
                trans_output(sum);
            }
        }
    }
 } 
 
 void trans_output(int sum)
{
    if (sum == 1) printf("一");
    if (sum == 2) printf("二");
    if (sum == 3) printf("三");
    if (sum == 4) printf("四");
    if (sum == 5) printf("五");
    if (sum == 6) printf("六");
    if (sum == 7) printf("七");
    if (sum == 8) printf("八");
    if (sum == 9) printf("九");
    if (sum == 10) printf("十");
}

部分测试数据结果如下:

(1)钱包的初始数据为负数:-3

(2)对于钱包操作的数据为负数:-10 -1

(3)输出的结果为整百:100

(4)输出结果为十位数是一的三位数:210

(5)输出结果为十位数是零的三位数:103

二、单元测试

(1)输入_汉字转化为数字单元测试

代码如下:

#include<stdio.h>
#include<string.h>

int trans_input(char num[]);

int main()
{
    char num[20];
    int n=100,i;
    for(i=0;i<21;i++)
    {
        printf("请输入大写数字:");
        scanf("%s",num);
        n=trans_input(num);
        if(n<=10&&n>=-10)
        printf("%d pass\n",n);
    }
    return 0;
 } 
 
int trans_input(char num[])
{
    if (strcmp(num, "零") == 0) return 0;
    if (strcmp(num, "一") == 0) return 1;
    if (strcmp(num, "二") == 0) return 2;
    if (strcmp(num, "三") == 0) return 3;
    if (strcmp(num, "四") == 0) return 4;
    if (strcmp(num, "五") == 0) return 5;
    if (strcmp(num, "六") == 0) return 6;
    if (strcmp(num, "七") == 0) return 7;
    if (strcmp(num, "八") == 0) return 8;
    if (strcmp(num, "九") == 0) return 9;
    if (strcmp(num, "十") == 0) return 10;
    if (strcmp(num, "负一") == 0) return -1;
    if (strcmp(num, "负二") == 0) return -2;
    if (strcmp(num, "负三") == 0) return -3;
    if (strcmp(num, "负四") == 0) return -4;
    if (strcmp(num, "负五") == 0) return -5;
    if (strcmp(num, "负六") == 0) return -6;
    if (strcmp(num, "负七") == 0) return -7;
    if (strcmp(num, "负八") == 0) return -8;
    if (strcmp(num, "负九") == 0) return -9;
    if (strcmp(num, "负十") == 0) return -10;
}

测试脚本如下:

@echo off
cd C:\C:\Users\86133\Desktop\oop.homer\寒假作业3
echo 开始测试
trans_input.exe
echo 测试结束
pause

测试结果如下图:

(2)输出_数字转化为汉字单元测试

代码如下:

#include<stdio.h>
#include<string.h>

void printf_wallet(int sum);
void trans_output(int sum); 

int main()
{
    int sum,i;
    for(i=0;i<15;i++)
    {
        printf("请输入数字:");
        scanf("%d",&sum);
        if(sum < 0)
        {
            printf("负");
            sum=-sum;
        }  
        printf_wallet(sum);
        printf("\n");
    }

    return 0;
} 
 
void printf_wallet(int sum)
{
    int shi,bai;
    if(sum <= 10)   trans_output(sum);  
    else
    {
         if(sum >= 100)
        {
            bai = sum /100;
            sum = sum %100;
            if(bai == 1)
            printf("一百");
            else
            {
                trans_output(bai);
                printf("百"); 
            }
            if(sum<10&&sum!=0)
            printf("零");
            if(sum>=10&&sum<20)
            printf("一");
        }
        if(sum <= 10)   trans_output(sum);
        else
        {
            shi = sum / 10;
            sum = sum % 10;
            if (shi == 1)
            {
                printf("十");
                trans_output(sum);
            }
            if(shi > 1)
            {
                trans_output(shi);
                printf("十");
                if(sum!=0)
                trans_output(sum);
            }
        }
    }
 } 
 
 void trans_output(int sum)
{
    if (sum == 1) printf("一");
    if (sum == 2) printf("二");
    if (sum == 3) printf("三");
    if (sum == 4) printf("四");
    if (sum == 5) printf("五");
    if (sum == 6) printf("六");
    if (sum == 7) printf("七");
    if (sum == 8) printf("八");
    if (sum == 9) printf("九");
    if (sum == 10) printf("十");
}

测试脚本如下:

@echo off
cd C:\C:\Users\86133\Desktop\oop.homer\寒假作业3
echo 开始测试
trans_output.exe
echo 测试结束
pause

测试结果如下图:

三、编译脚本

这一部分参考之前作业完成的。

脚本如下:

@echo off 
echo 请输入文件名
set /p b=
C:\Dev-Cpp\MinGW64\bin\gcc %b%.cpp -o trans.exe
if exist trans.exe echo 编译成功
if not exist trans.exe echo 编译失败
pause

编译结果如下图(编译的代码是上面的那个完整代码):

四、测试脚本

因为反复输入过于繁琐,我选择运用freopen函数,将要测试的数据保存为txt格式,每次通过改变地址来改变测试数据,或者直接改变文档的内容。

脚本如下:

@echo off
echo trans1开始测试
trans1.exe
echo trans1测试结束
pause

测试代码如下:

#include<stdio.h>
#include<string.h>

int trans_input(char num[]);    //将输入的汉字转化为数字,便于计算 
int input_op(int sum);  //输入多组数据,直到查看标志字符出现停止循环
int op(int n, char b[],int sum);    //对输入数据进行处理 
void printf_wallet(int sum);  //输出最终结果 
void trans_output(int sum);     //对最终结果的数字转化为汉字并输出

char zs[20], wallet[20], opp[20], num[20];  
int sum,n;

int main()
{
    freopen("C:\\Users\\86133\\Desktop\\oop.homer\\x.txt","r",stdin); //x代表某个文本
    scanf("%s %s %s %s",zs,wallet,opp,num);
        sum = trans_input(num); 
        sum = input_op(sum);
    if(sum < 0)  //处理钱包数额为负数 
    {
        printf("负");
        sum=-sum;
    } 
    printf_wallet(sum);
    printf("\n");
        return 0;
}

int trans_input(char num[])
{
    if (strcmp(num, "零") == 0) return 0;
    if (strcmp(num, "一") == 0) return 1;
    if (strcmp(num, "二") == 0) return 2;
    if (strcmp(num, "三") == 0) return 3;
    if (strcmp(num, "四") == 0) return 4;
    if (strcmp(num, "五") == 0) return 5;
    if (strcmp(num, "六") == 0) return 6;
    if (strcmp(num, "七") == 0) return 7;
    if (strcmp(num, "八") == 0) return 8;
    if (strcmp(num, "九") == 0) return 9;
    if (strcmp(num, "十") == 0) return 10;
    if (strcmp(num, "负一") == 0) return -1;
    if (strcmp(num, "负二") == 0) return -2;
    if (strcmp(num, "负三") == 0) return -3;
    if (strcmp(num, "负四") == 0) return -4;
    if (strcmp(num, "负五") == 0) return -5;
    if (strcmp(num, "负六") == 0) return -6;
    if (strcmp(num, "负七") == 0) return -7;
    if (strcmp(num, "负八") == 0) return -8;
    if (strcmp(num, "负九") == 0) return -9;
    if (strcmp(num, "负十") == 0) return -10;
}

int input_op(int sum)
{
    while (1)
    {
        scanf("%s %s",wallet,opp);
        if (strcmp(wallet,"看看") == 0)
        break;
        scanf("%s", num);
        n = trans_input(num);
        sum = op(n, opp, sum);
    }   
    return sum;
}

int op(int n, char opp[], int sum)
{
    if (strcmp(opp, "增加") == 0) sum = sum + n;
    if (strcmp(opp, "减少") == 0) sum = sum - n;
    return sum;
}

void printf_wallet(int sum)
{
    int shi,bai;
    if(sum <= 10)   trans_output(sum);  
    else
    {
         if(sum >= 100)
        {
            bai = sum /100;
            sum = sum %100;
            if(bai == 1)
            printf("一百");
            else
            {
                trans_output(bai);
                printf("百"); 
            }
            if(sum<10&&sum!=0)
            printf("零");
            if(sum>=10&&sum<20)
            printf("一");
        }
        if(sum <= 10)   trans_output(sum);
        else
        {
            shi = sum / 10;
            sum = sum % 10;
            if (shi == 1)
            {
                printf("十");
                trans_output(sum);
            }
            if(shi > 1)
            {
                trans_output(shi);
                printf("十");
                if(sum!=0)
                trans_output(sum);
            }
        }
    }
 } 
 
 void trans_output(int sum)
{
    if (sum == 1) printf("一");
    if (sum == 2) printf("二");
    if (sum == 3) printf("三");
    if (sum == 4) printf("四");
    if (sum == 5) printf("五");
    if (sum == 6) printf("六");
    if (sum == 7) printf("七");
    if (sum == 8) printf("八");
    if (sum == 9) printf("九");
    if (sum == 10) printf("十");
}

测试数据及其测试结果如下:

猜你喜欢

转载自www.cnblogs.com/littleseasalt/p/12307468.html