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",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("十");
}

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

posted @ 2020-02-16 17:37  sea-salt  阅读(140)  评论(0编辑  收藏  举报