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

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 面向对象程序设计寒假作业3
这个作业的目标 1.继续完成编程题2.发布博客
作业正文 如下
其他参考文献 如何优化c语言代码
**编程题(请使用C语言或者C++完成以下题目):
继续完成作业二的编程题。
优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。
思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。**

编程题要求:
读题,提取出题目的要求。
分解需求,把需求分解为几个你觉得不太相关的模块。
思考每个模块怎么写,可以从简单的模块开始写。
对于不会的问题进行查阅资料。
对于每一个模块设计测试用例。
详细记录下以上每一步,并写在博客中。
不要求完全做出来,但要求记录详细。
建议博客长度不少于1000字(不包含代码)。

解释
单元测试:对每一个函数进行测试,这代表了你需要把代码分到不同的文件,使用不同的主函数切换测试/运行。
编译脚本:运行该脚本后无需任何输入就能自动编译全部代码,并输出编译结束的代码。
测试脚本:运行该脚本后可以自动的编译并运行所有测试样例,并输出测试结果。

上次作业test2中对测试脚本的理解不够准确,在这次作业中补充如下
测试代码

#include <stdio.h>
#include <string.h> 
char change[5];
void output_1(int sum)
{
	if(sum>=0)
	{
		if(sum==0) strcpy(change,"零");
		else if(sum==1) strcpy(change,"一");
		else if(sum==2) strcpy(change,"二");
		else if(sum==3) strcpy(change,"三");
		else if(sum==4) strcpy(change,"四");
		else if(sum==5) strcpy(change,"五");
		else if(sum==6) strcpy(change,"六");
		else if(sum==7) strcpy(change,"七");
		else if(sum==8) strcpy(change,"八");
		else if(sum==9) strcpy(change,"九");
		else if(sum==10) strcpy(change,"十");
	}
    else if(sum<0)
		strcpy(change,"over-expenditure!");
}
int main()
{
    output_1(0);
	if(!strcmp(change,"零"))
	  printf("pass\n");
	else
	  printf("error\n");  
	output_1(1);
	if(!strcmp(change,"一"))
	  printf("pass\n");
	else
	  printf("error\n");   
	output_1(5);
	if(!strcmp(change,"五"))
	  printf("pass\n");
	else
	  printf("error\n");  
	output_1(-4);
	if(!strcmp(change,"over-expenditure!"))
	  printf("pass\n");
	else
	  printf("error\n");    
	 output_1(0);
	if(!strcmp(change,"一"))
	  printf("pass\n");
	else
	  printf("error\n"); 
	 output_1(1);
	if(!strcmp(change,"六"))
	  printf("pass\n");
	else
	  printf("error\n");     
	 return 0;
}

测试脚本

@echo off
gcc test.cpp -o test.exe
echo 开始测试
test.exe
echo 测试完毕
pause

运行结果


通过查找资料了解优化代码可以从以下方面入手

  • 选择合适的算法和数据结构
    将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。
  • 使用尽量小的数据类型
    能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。
  • 使用自加、自减指令
  • 减少运算的强度
    1.求余运算。a=a%8;可以改为:a=a&7; 2.平方运算a=pow(a,2.0);可以改为:a=aa; 3.用移位实现乘除法运算a=a4;b=b/4;可以改为:a=a<<2;b=b>>2;
  • 查表
    在程序中一般不进行非常复杂的运算,如浮点数的乘除及开方等,以及一些复杂的数学模型的插补运算,对这些即消耗时间又消费资源的运算,应尽量使用查表的方式,并且将数据表置于程序存储区。如果直接生成所需的表比较困难,也尽量在启了,减少了程序执行过程中重复计算的工作量。

这次代码完善中主要扩大了数字范围,实现了负数的输出。
添加了输入函数input_2,代码如下

int input_2(char num[])   
{   
	    int sum=0;
		if(strlen(num)==2)                                         //如果只有一个汉字,则可直接按照个位数转化
		   sum=input_1(num);
		else{
			char copy1[5],copy2[2];
			strcpy(copy1,num);
		   	copy1[2]='\0';                                      //获取第一个汉字
		   	if(strlen(num)==4)
		   	{
		   	    copy2[0]=num[2];copy2[1]=num[3];                //获取第二个汉字即最后一个汉字
			   	if(input_1(copy1)==10)                      //对形如"十五"的输入进行转化
		   		   sum=input_1(copy2)+10;
		   		else                                        //对形如"二十"的输入进行转化
				   sum=input_1(copy1)*10;   
		    }
		    else                                                    //对形如"二十三"的输入进行转化
		    {
		    	copy2[0]=num[4];copy2[1]=num[5];                    //获取第三个汉字即最后一个汉字
				sum=input_1(copy1)*10+input_1(copy2);;
			}
		}   
		return sum;	 
}

运行结果

添加输出函数output_3,如下

void output_3(int sum)
{
	printf("负");
	if(sum>=-10) 
	   output_1((-1)*sum);
	else
	   output_2((-1)*sum);   
}

运行结果


完整代码

#include <stdio.h>
#include <string.h>
int input_1(char a[])
{
	if(!strcmp(a,"零")) return 0;
	else if(!strcmp(a,"一")) return 1;
	else if(!strcmp(a,"二")) return 2;
	else if(!strcmp(a,"三")) return 3;
	else if(!strcmp(a,"四")) return 4;
	else if(!strcmp(a,"五")) return 5;
	else if(!strcmp(a,"六")) return 6;  
    else if(!strcmp(a,"七")) return 7; 
	else if(!strcmp(a,"八")) return 8; 
	else if(!strcmp(a,"九")) return 9; 
	else if(!strcmp(a,"十")) return 10;
}
int input_2(char num[])   
{   
	    int sum=0;
		if(strlen(num)==2)
		   sum=input_1(num);
		else{
			char copy1[5],copy2[2];
			strcpy(copy1,num);
		   	copy1[2]='\0';
		   	if(strlen(num)==4)
		   	{
		   	    copy2[0]=num[2];copy2[1]=num[3];
			   	if(input_1(copy1)==10)
		   		   sum=input_1(copy2)+10;
		   		else
				   sum=input_1(copy1)*10;   
		    }
		    else
		    {
		    	copy2[0]=num[4];copy2[1]=num[5];
				sum=input_1(copy1)*10+input_1(copy2);;
			}
		}   
		return sum;	 
}
void output_1(int sum)
{
	if(sum>=0)
	{
		if(sum==0) printf("零");
		else if(sum==1) printf("一");
		else if(sum==2) printf("二");
		else if(sum==3) printf("三");
		else if(sum==4) printf("四");
		else if(sum==5) printf("五");
		else if(sum==6) printf("六");
		else if(sum==7) printf("七");
		else if(sum==8) printf("八");
		else if(sum==9) printf("九");
		else if(sum==10) printf("十");        
	}
	else if(sum<0)
		printf("over-expenditure!"); 
}
void output_2(int sum)
{
    if(sum<=99)
	{
		int a,b;
		a=sum%10;
		b=sum/10;
		if(b!=1)
		  output_1(b);
	    printf("十");
		if(a!=0)
		  output_1(a);	  
	}
	else
	printf("You are a rich man!");
}
void output_3(int sum)
{
	printf("负");
	if(sum>=-10) 
	   output_1((-1)*sum);
	else
	   output_2((-1)*sum);   
}
int main()
{
	char zs[5],qb[100],dy[100],num[10],q[5];
	int sum;
	scanf("%s %s %s %s",zs,qb,dy,num);
	if(strcmp(zs,"整数")==0&&strcmp(qb,"钱包")==0&&strcmp(dy,"等于")==0)
	{
	    sum=input_2(num);
		while(1)
		{
			scanf("%s",qb);
			if(strcmp(qb,"钱包"))
			 break;
			scanf("%s %s",dy,num);
			if(!strcmp(dy,"增加"))
		    	sum+=input_2(num);
			else if(!strcmp(dy,"减少"))
				sum-=input_2(num);
			else
				printf("error!");
		} 
		scanf("%s",q);
		if(strcmp(qb,"看看")==0&&strcmp(q,"钱包")==0)
		{
			if(sum<=10&&sum>=0)
			 output_1(sum);
			if(sum>10&&sum<=99)
			 output_2(sum);
			if(sum<0) 
			  output_3(sum);
		} 
		else
		 printf("error!");
	} 
	else
	printf("error!");
	return 0;
} 
posted @ 2020-02-15 13:40  urrry  阅读(152)  评论(0编辑  收藏  举报