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

这个作业属于哪个课程 [2020面向对象程序设计张栋班][1]
这个作业要求在哪里 [面向对象程序设计寒假作业3][2]
这个作业的目标 1.继续完成编程题
2.优化架构,思考代码的拓展性
3.思考:选择、循环语句、函数、或者扩大数字范围,支持负数的功能的加入
作业正文 [2020面向对象程序设计寒假作业3][3]
其他参考文献 [谈代码架构的可扩展性][4]
[某同学的博客][5]
GitHub地址 https://github.com/bamboo233/learning
[1]:https://edu.cnblogs.com/campus/fzu/2020OOP "2020面向对象程序设计张栋班"
[2]:https://edu.cnblogs.com/campus/fzu/2020OOP/homework/10288 "面向对象程序设计寒假作业3"
[3]:https:////www.cnblogs.com/bamboo233/p/12312847.html "2020面向对象程序设计寒假作业3"
[4]:https://www.cnblogs.com/big1987/p/10900435.html "谈代码架构的可扩展性"
[5]:https://www.cnblogs.com/zouzou-1/p/12310583.html "某同学的博客"

编程题

读题

1.对代码拓展性的理解
代码架构可扩展性的一个重要表现:每次新加的代码或者补丁能够在合适的位置合适的地方找打它的位置(不影响原来的代码,不改动原来的代码)。
现在我的理解就是最好将功能独立,把每个需要的块都写在不同的函数里,不要全部都一股脑的全写在main函数中,main函数要尽可能的简单,将功能全都放在不同的函数中,方便修改和调用,与其他模块相互独立。

2.需求

  • 增加可以读取两位数、三位数的函数。

做题过程

1.如何增加可以读取两位数、三位数的函数。
这是在写前两次作业时就想要增加的功能,但是一直没有思路,不知如何实现才好,然后助教直播讲题,是使用指针一位一位读取比较的,不是整体一起读入的。但是我原先没有用指针,所以后来还是修改为指针类型。
由于在先前的作业中,其他板块都差不多已经写好了,所以这里只记录如何增加读取两位数、三位数的函数。
最开始处理input函数分类也是有依据读取的字符串的长度来决定是调用哪个change函数。
这是原先没有用指针时读取一位数的函数(原先也只写了读取一位数的)

int change1(char a[]){
	int n;
	if(strcmp(a,"零")==0) n=0;
	else if (strcmp(a,"一")==0) n=1;
	else if (strcmp(a,"二")==0) n=2;
	else if (strcmp(a,"三")==0) n=3;
	else if (strcmp(a,"四")==0) n=4;
	else if (strcmp(a,"五")==0) n=5;
	else if (strcmp(a,"六")==0) n=6;
	else if (strcmp(a,"七")==0) n=7;
	else if (strcmp(a,"八")==0) n=8;
	else if (strcmp(a,"九")==0) n=9;
	else n=10;
	return n;
}

转化时一一对应的都写出来了,比较冗长。

下面是修改后读取一位数的函数

const char *ch[11]={"零","一","二","三","四","五","六","七","八","九","十"}; 
int change1(char shu[] ){
	char *chin;
	chin=shu;
	int i=0;
	while(1){
		if(!strcmp(chin,ch[i])) break;
        i++;
	}
	return i;
} 

以下是测试函数

#include<stdio.h>
#include<string.h>
const char *ch[11]={"零","一","二","三","四","五","六","七","八","九","十"};
int change1(char shu[] ){
	char *chin;
	chin=shu;
	int i=0;
	while(1){
		if(!strcmp(chin,ch[i])) break;
        i++;
	}
	return i;
} 

int main(){
	char shu[10];
	while(scanf("%s",shu)!=EOF)
	printf("%d\n",change1(shu));
    return 0;
} 

以下是这个函数的测试结果

在写读取两位数的函数时,还有就是需要更新位置那里,比较困难.说实话,助教直播代码更新位置那块看不懂。
思路是这样的:两位数有两种情况,一是除十之外的整十数,二是十几的数11-19;所以最后在return的时候要做判断
因为之前有一个是这样的

int main(){
    char a[10]="十四";
    printf("%c%c",a[0],a[1]);
    return 0;

输出

然后后面再看了其他同学的作业
开始在更新的时候没有再重新开过数组记录,而是

for(i=0,j=0;i<len;j++,i+=2){
		for(k=0;k<2;k++,l++){
			shu[k]=shu[l];
		}

出了一些问题,后面想了一下,好像错误是这样子:如果循环继续的话,就会导致后面的shu[k]的值变成前面更新后的shu[k]的值。
所以就再开了一个数组shu2[]来存,这样就不会冲突了。
这是读取两位数的函数

int change2(char shu[]){//10-20,整十数
    char *chin,shu2[10]={0}; 
	chin=shu;
    int i,j,l=0,k=0,n=0,len=strlen(shu);
    int g=0;
    for(i=0,j=0;j<len;i++,j+=2){
        for(k=0;k<2;l++,k++) {
           shu2[k]=shu[l];
        }
        chin=shu2;
        n+=g;
        for (g=0;;g++){
            if (!strcmp(chin,ch[g])){
                break;
            }
        }
        if(g!=10&&i==0)
        return g*10;
    }
    return n+g;
}

测试函数

#include<stdio.h>
#include<string.h>
const char *ch[11]={"零","一","二","三","四","五","六","七","八","九","十"};
int change2(char shu[]){
    char *chin,shu2[10]={0}; 
	chin=shu;
    int i,j,l=0,k=0,n=0,len=strlen(shu);
    int g=0;
    for(i=0,j=0;j<len;i++,j+=2){
        for(k=0;k<2;l++,k++) {
           shu2[k]=shu[l];
        }
        chin=shu2;
        n+=g;
        for (g=0;;g++){
            if (!strcmp(chin,ch[g])){
                break;
            }
        }
        if(g!=10&&i==0)
        return g*10;
    }
    return n+g;
}
int main(){
	char shu[10];
	while(scanf("%s",shu)!=EOF)
	printf("%d\n",change2(shu));
	return 0;
} 

测试结果

读取三位数的函数,由于三位数都是几十几这样固定的格式,所以在转换时跳过中间的“十”,直接转化一三位的数,在由“一”*10+“三”,就得到了该数
emmm,这是最开始的有问题的,输出不了。。

int change3(char shu[]){
    char *chin,shu2[10]={0}; 
	chin=shu;
    int i,j,l=0,k=0,n=0,len=strlen(shu);
    for(i=0;i<2;i++){
    	shu2[i]=shu[i];
    	//printf("%c",shu);
    	chin=shu2;
    	for(j=0;;j++){
    	    if(!strcmp(chin,ch[j])){
    		    break;
		    }
		}
		n=j;	  
	}
	printf("%d",n);	  
	for(i=4,j=0;i<6;i++,j++){
		shu2[j]=shu[i];
		chin=shu2;
		for(k=0;;k++){
			if(!strcmp(chin,ch[k])){
				break;
			}
		}
		n=n*10+k;
	}
}

这是后面的

int change3(char shu[]){
    char *chin;
    char shu2[10];
    int i,j,s[2]={0,4},n=0,g=0;
    for(i=0;i<2;i++) {
        for(j=0;j<2;s[i]++,j++){
            shu2[j]=shu[s[i]];
        }
        chin=shu2;
        if(i==1){
        	n=g*10;
		}
        for(g=0;;g++){
            if (!strcmp(chin,ch[g])){
                break;
            }
        }
    }
    return n+g;
}

将转化放在一个循环里
测试函数

#include<stdio.h>
#include<string.h>
const char *ch[11]={"零","一","二","三","四","五","六","七","八","九","十"};
int change3(char shu[]){
    char *chin;
    char shu2[10];
    int i,j,s[2]={0,4},n=0,g=0;
    for(i=0;i<2;i++) {
        for(j=0;j<2;s[i]++,j++){
            shu2[j]=shu[s[i]];
        }
        chin=shu2;
        if(i==1){
        	n=g*10;
		}
        for(g=0;;g++){
            if (!strcmp(chin,ch[g])){
                break;
            }
        }
    }
    return n+g;
}
int main(){
	char shu[10];
	while(scanf("%s",shu)!=EOF)
	printf("%d\n",change3(shu));
	return 0;
} 

测试结果

完整代码

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<cstring>
using namespace std;
const char *ch[11]={"零","一","二","三","四","五","六","七","八","九","十"}; 
int change1(char shu[] ){
	char *chin;
	chin=shu;
	int i=0;
	while(1){
		if(!strcmp(chin,ch[i])) break;
		i++;
	}
	return i;
} 
int change2(char shu[]){//10-20,整十数 
    char *chin,shu2[10]={0}; 
	chin=shu;
    int i,j,l=0,k=0,n=0,len=strlen(shu);
    int g=0;
    for(i=0,j=0;j<len;i++,j+=2){
        for(k=0;k<2;l++,k++) {
           shu2[k]=shu[l];
        }
        chin=shu2;
        n+=g;
        for (g=0;;g++){
            if (!strcmp(chin,ch[g])){
                break;
            }
        }
        if(g!=10&&i==0)
        return g*10;
    }
    return n+g;
}
int change3(char shu[]){
    char *chin;
    char shu2[10];
    int i,j,s[2]={0,4},n=0,g=0;
    for(i=0;i<2;i++) {
        for(j=0;j<2;s[i]++,j++){
            shu2[j]=shu[s[i]];
        }
        chin=shu2;
        if(i==1){
        	n=g*10;
		}
        for(g=0;;g++){
            if (!strcmp(chin,ch[g])){
                break;
            }
        }
    }
    return n+g;
}
int input(char shu[]){
	int len=strlen(shu),n;
	if(len==2){
	    n=change1(shu);	
	}
	else  if(len==4){
		n=change2(shu);
	}
	else{
		n=change3(shu);
	}
	return n;
} 
void switch1(int n){
	cout << ch[n];
}
void switch2(int n){
	n%=10;
	cout <<"十";
	cout << ch[n]; 
}
void switch3(int n){
	int ge,shi;
	shi=n/10;
	ge=n%10;
	if(!ge){
	    cout << ch[shi];
	    cout << "十"; 
	}
	else{
		cout << ch[shi];
		cout <<"十";
		cout << ch[ge];
	}
}
void output(int n){
	if(n<=10){
		switch1(n);
	} 
	else if(n>=11&&n<=19){
		switch2(n);
	} 
	else{
		switch3(n); 
	}
}
int main(){
	int n;
	char lei[10],rong[10],fu[10],shu[10],r2[10];
	cin >> lei >> rong >> fu >> shu;
	n=input(shu);
	if(strcmp(lei,"整数")==0) {
		if(strcmp(rong,"钱包")==0){
			while(1){
				cin >> r2;
				if(strcmp(r2,"钱包")==0) {
					cin >> fu >> shu;
					if(strcmp(fu,"增加")==0) n+=input(shu);
					else n-=input(shu);
				} 
				if(strcmp(r2,"看看")==0) break;
			}
		}
	}
    output(n);
    return 0;
}



posted @ 2020-02-16 20:17  根号233  阅读(182)  评论(0编辑  收藏  举报