这个作业属于哪个课程 | 2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业3 |
这个作业的目标 | •继续完成作业二的编程题。 •优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择、循环语句怎么办。 •思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。 |
作业正文 | 编程题 |
其他参考文献 | 可扩展性(Extensibility): 构建灵活系统的思考 |
仓库地址
编程题
3.1 继续完成作业二的编程题
作业二编程题在上次作业已经完成,略。
我的面向对象程序设计寒假作业2
3.2 优化架构,思考代码的拓展性
可扩展性,是指新的功能可以很容易地加入到系统中来。
拓展性不好,通常意味着程序很僵硬,改一点而动全身。
目前系统被扩展的几种形式:
1.直接修改代码。
2.直接修改代码,但只局限在一个类或方法中。
3.利用继承,编写子类继承以后的类,在子类里添加新的业务逻辑。
4.运行时对象装配。
5.基于模块的运行时动态扩展。
6.基于中间语言。
参考博客:可扩展性(Extensibility): 构建灵活系统的思考
从下面博客中的例子,我对扩展性有了更生动的理解。
一个小例子看编程的扩展性
由于我还不会用c++写代码,我的编程题用的是c语言,其中用了非常多else if嵌套,所以我的代码可读性差并且可拓展性差。
目前,对于添加其他功能(如循环,选择语句),我还没有思路。
3.3 思考
3.3.1 扩大数字范围
之前的代码只能实现两位数(0~99)的输入输出,现在新增point3函数以及对change函数的补充,将范围扩至三位数(0~999)。
为了解决许多汉字数字的个数和阿拉伯数字位数不相同的问题,所以我规定输入时,几位数的汉字就是几个。
例如,输入三代表3(三),输入十三代表13(十三),输入三零代表30(三十),输入三三代表33(三十三),
输入三三三代表333(三百三十三),输入五六七代表516(五百一十六)。
特例:输入十代表10,而不是一零。
下面是point3函数的代码:
int point3(char num[])
{
int point(char num[]);
int i, a, b, c, d;
char x[2], y[2], z[2];
for (i = 0; i < 2; i++) {
x[i] = num[i];
y[i] = num[i + 2];
z[i] = num[i + 4];
}
a = point(x);
b = point(y);
c = point(z);
d = a * 100 + b * 10 + c;
return d;
}
1)下面对汉字数字转化为阿拉伯数字进行测试:
一位数
两位数
三位数
汉字变数字测试代码如下:
#include
#include
char z[30]={'\0'};
int main()
{
int point(char num[]);
int point3(char num[]);
int k, i;
for(i=0;i<5;i++)
{
scanf("%s", z);
if(z[4]=='\0') k = point(z);
else k = point3(z);
printf("%d\n",k);
}
return 0;
}
int point(char num[])
{
int i, a, b, c;
char x[2], y[2];
if (strcmp("零", num) == 0) return 0;
else if (strcmp("一", num) == 0) return 1;
else if (strcmp("二", num) == 0) return 2;
else if (strcmp("三", num) == 0) return 3;
else if (strcmp("四", num) == 0) return 4;
else if (strcmp("五", num) == 0) return 5;
else if (strcmp("六", num) == 0) return 6;
else if (strcmp("七", num) == 0) return 7;
else if (strcmp("八", num) == 0) return 8;
else if (strcmp("九", num) == 0) return 9;
else if (strcmp("十", num) == 0) return 10;
else {
for (i = 0; i < 2; i++){
x[i] = num[i];
y[i] = num[i + 2];
}
if (strcmp("十", x) == 0){
a = 10;
b = point(y);
c = a + b;
}
else {
a = point(x);
b = point(y);
c = a * 10 + b;
}
return c;
}
}
int point3(char num[])
{
int point(char num[]);
int i, a, b, c, d;
char x[2], y[2], z[2];
for (i = 0; i < 2; i++) {
x[i] = num[i];
y[i] = num[i + 2];
z[i] = num[i + 4];
}
a = point(x);
b = point(y);
c = point(z);
d = a * 100 + b * 10 + c;
return d;
}
对这一部分进行测试的时候遇到了问题,就是输入三位汉字时无法得到答案,后经过上网搜索,网上说可能是指针越界,
然后我把z[30]数组定义在主函数外才解决了问题。
但对于原来总的钱包代码没有把数组定义在主函数外却没有报错,我百思不得其解。
2)下面对阿拉伯数字转化为汉字数字进行测试:
一位数
两位数
三位数
数字变汉字测试代码如下:
#include
#include
int main()
{
void change(int a);
int k, i;
for(i=0;i<5;i++)
{
scanf("%d",&k);
change(k);
}
return 0;
}
void change(int a)
{
void exchange(int b);
int x,y,c,d;
if (a < 0){
printf("负");
change(-a);
}
else{
if (a <= 10) exchange(a);
else if (a > 10 && a < 20) {
printf("十");
x = a % 10;
exchange(x);
}
else if (a >= 20 && a % 10 == 0 && a < 100) {
y = a / 10;
exchange(y);
printf("十");
}
else if(a==100) printf("一百");
else if(a>100){
c=a/100;
exchange(c);
printf("百");
d=a%100;
if(d<10){
printf("零");
exchange(d);
}
if(d>=10){
if(d<=20) printf("一");
change(d);
}
}
else {
x = a / 10;
exchange(x);
printf("十");
y = a % 10;
exchange(y);
}
}
}
void exchange(int b)
{
if (b == 0)printf("零");
if (b == 1)printf("一");
if (b == 2)printf("二");
if (b == 3)printf("三");
if (b == 4)printf("四");
if (b == 5)printf("五");
if (b == 6)printf("六");
if (b == 7)printf("七");
if (b == 8)printf("八");
if (b == 9)printf("九");
if (b == 10)printf("十");
}
3.3.2 支持负数
我个人认为负数的输入没有太大意义,因为如果是“钱包 增加 负三”完全可以用“钱包 减少 三”来实现。
也就是说,负的作用是减少变增加,增加变减少。
但我之前的代码是不能输出钱包为负债情况时的值,现在想想,并没有我之前想的那么复杂(每一步需要判断正负),
我们可以忽略中间过程(不用在意阿拉伯数字的正负),只需要在最后“看看 钱包”时,即把钱包的阿拉伯数值进行判断正负,
若为负,输出前缀“负”。
因此这里只需要对change函数做一些小小的改动。
下面是测试钱包为负债时的输出:
下图为钱包不为负债时:
编程题的钱包总代码如下:
#include
#include
int main()
{
int point(char num[]);
int point3(char num[]);
void change(int a);
int qian,k;
char a[30], b[30], c[30], d[30],x[30],y[30],z[30]={'\0'};
scanf("%s%s%s%s", a, b, c, d);
if (strcmp(a, "整数") != 0 || strcmp(b, "钱包") != 0 || strcmp(c, "等于") != 0) {
printf("格式错误");
return 0;
}
else {
if(d[4]=='\0') qian=point(d);
else qian=point3(d);
}
for(;;) {
scanf("%s%s", x, y);
if (strcmp(x, "看看") == 0 && strcmp(y, "钱包") == 0){
change(qian);
break;
}
if (strcmp(x, "钱包") == 0) {
if (strcmp(y, "增加") == 0) {
scanf("%s", z);
if(z[4]=='\0') k = point(z);
else k = point3(z);
qian += k;
}
if (strcmp(y, "减少") == 0) {
scanf("%s", z);
if(z[4]=='\0') k = point(z);
else k = point3(z);
qian -= k;
}
}
else printf("格式错误");
}
return 0;
}
int point(char num[])
{
int i, a, b, c;
char x[2], y[2];
if (strcmp("零", num) == 0) return 0;
else if (strcmp("一", num) == 0) return 1;
else if (strcmp("二", num) == 0) return 2;
else if (strcmp("三", num) == 0) return 3;
else if (strcmp("四", num) == 0) return 4;
else if (strcmp("五", num) == 0) return 5;
else if (strcmp("六", num) == 0) return 6;
else if (strcmp("七", num) == 0) return 7;
else if (strcmp("八", num) == 0) return 8;
else if (strcmp("九", num) == 0) return 9;
else if (strcmp("十", num) == 0) return 10;
else {
for (i = 0; i < 2; i++){
x[i] = num[i];
y[i] = num[i + 2];
}
if (strcmp("十", x) == 0){
a = 10;
b = point(y);
c = a + b;
}
else {
a = point(x);
b = point(y);
c = a * 10 + b;
}
return c;
}
}
int point3(char num[])
{
int point(char num[]);
int i, a, b, c, d;
char x[2], y[2], z[2];
for (i = 0; i < 2; i++) {
x[i] = num[i];
y[i] = num[i + 2];
z[i] = num[i + 4];
}
a = point(x);
b = point(y);
c = point(z);
d = a * 100 + b * 10 + c;
return d;
}
void change(int a)
{
void exchange(int b);
int x,y,c,d;
if (a < 0){
printf("负");
change(-a);
}
else{
if (a <= 10) exchange(a);
else if (a > 10 && a < 20) {
printf("十");
x = a % 10;
exchange(x);
}
else if (a >= 20 && a % 10 == 0 && a < 100) {
y = a / 10;
exchange(y);
printf("十");
}
else if(a==100) printf("一百");
else if(a>100){
c=a/100;
exchange(c);
printf("百");
d=a%100;
if(d<10){
printf("零");
exchange(d);
}
if(d>=10){
if(d<=20) printf("一");
change(d);
}
}
else {
x = a / 10;
exchange(x);
printf("十");
y = a % 10;
exchange(y);
}
}
}
void exchange(int b)
{
if (b == 0)printf("零");
if (b == 1)printf("一");
if (b == 2)printf("二");
if (b == 3)printf("三");
if (b == 4)printf("四");
if (b == 5)printf("五");
if (b == 6)printf("六");
if (b == 7)printf("七");
if (b == 8)printf("八");
if (b == 9)printf("九");
if (b == 10)printf("十");
}