面向对象程序设计寒假作业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;
}