• 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

    编程题:

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

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

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

    一、进一步优化代码

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

    (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);
    	}
    	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:Users86133Desktopoop.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("
    ");
    	}
    
    	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:Users86133Desktopoop.homer寒假作业3
    echo 开始测试
    trans_output.exe
    echo 测试结束
    pause
    

    测试结果如下图:

    三、编译脚本

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

    脚本如下:

    @echo off 
    echo 请输入文件名
    set /p b=
    C:Dev-CppMinGW64ingcc %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("
    ");
            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("十");
    }
    

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

  • 相关阅读:
    python生成随机整数
    pycharm怎么修改python路径
    Linux 在 TOP 命令中切换内存的显示单位
    MySQL之limit使用
    Fiddler设置抓取FireFox火狐的包
    火狐FireFox看视频不能全屏显示的问题
    【.Net】exe加密/加壳工具.Net Reactor
    【WPF】使用控件MediaElement播放视频
    【WPF】在MenuItem中下划线“_”显示不正常
    【.Net】Thread.Start()与ThreadPool.QueueUserWorkItem()的区别
  • 原文地址:https://www.cnblogs.com/littleseasalt/p/12307468.html
Copyright © 2020-2023  润新知