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

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

仓库地址

编程题

3.1 继续完成作业二的编程题

作业二编程题在上次作业已经完成,略。

我的面向对象程序设计寒假作业2

3.2 优化架构,思考代码的拓展性

可扩展性,是指新的功能可以很容易地加入到系统中来。

拓展性不好,通常意味着程序很僵硬,改一点而动全身。

目前系统被扩展的几种形式:

1.直接修改代码。

2.直接修改代码,但只局限在一个类或方法中。

3.利用继承,编写子类继承以后的类,在子类里添加新的业务逻辑。

4.运行时对象装配。

5.基于模块的运行时动态扩展。

6.基于中间语言。

参考博客:可扩展性(Extensibility): 构建灵活系统的思考

从下面博客中的例子,我对扩展性有了更生动的理解。

一个小例子看编程的扩展性

由于我还不会用c++写代码,我的编程题用的是c语言,其中用了非常多else if嵌套,所以我的代码可读性差并且可拓展性差。

目前,对于添加其他功能(如循环,选择语句),我还没有思路。

3.3 思考

3.3.1 扩大数字范围

之前的代码只能实现两位数(099)的输入输出,现在新增point3函数以及对change函数的补充,将范围扩至三位数(0999)。

为了解决许多汉字数字的个数和阿拉伯数字位数不相同的问题,所以我规定输入时,几位数的汉字就是几个。

例如,输入三代表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<stdio.h>
#include<string.h>
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<stdio.h> 
#include<string.h>
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<stdio.h>
#include<string.h>
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("十");
} 
posted @ 2020-02-14 23:27  Zenlena  阅读(45)  评论(0编辑  收藏