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

这个作业属于哪个课程 2020面向对象程序设计张栋班
这个作业的要求在哪里 面向对象程序设计寒假作业3
这个作业的目标 1、对于代码拓展性的理解;2、优雅地命名函数;3、单元测试
作业正文 2020面向对象程序设计寒假作业3
其他参考文献 C++中,字符串比较函数strcmp()的用法指针与string类

一、题目要求

依旧是通过题目我读到的要求:

1、 拓展性是什么?

根据直播得来,我学习到的代码拓展性就是好不好加功能,加功能的时候不用修改太多更或者是重新写。

2、 我想要加的功能?

加入能读取汉字的两位数(例如二十,十一,二十一)!
能够在钱包加加减减的过程中变化成负数(脱离现实嘛),报错!
还有就是支持负数(好吧,就是要脱离现实)

3、 我自己的代码拓展性好不好呢?

在自己写这道题的时候好好的体会感受一下,再来回答!

二、写题过程

1、 我想加入输入两位数

这是我通过看直播才想到的,真是为自己的智商担忧。
我得到的思路就是读取和翻译出来两个要解决的问题。
根据助教直播的时候用的是一位位比较读取,比如二十一,先读二,再读十,再读一。
我也想尝试一下这种。
但是,很不幸的是,我用的是string类,这样我得到汉字(例如二十一),根本就没办法用指针一位一位来读取,于是我痛下决心,嗯,改了string类。
经过努力
我把情况分为了汉字一位数(例如“五”),二位数(二十,十一),三位数(五十三)。
分为三个函数来转换one two three
分别如下:

one:

int one()
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n=0,m=0,sum1=0;
	cn=number;	
	for (i = 0;; i++)
		{
			if (strcmp(cn,chinese[i]) == 0)
			{
				break;
			}
		}
	return sum1+i;	
}

two:

int two()
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n=0,m=0,sum1=0;
	cn=number;	
	for(t=0,j=0;j<strlen(number);t++,j+=2)
	{
	for(m=0;m<2;n++,m++)
	{
		a[m]=number[n];//更新到下一个汉字
	}
	cn=a;
	sum1=sum1+i;
	for (i = 0;; i++)
	{
		if (strcmp(cn,chinese[i]) == 0)
		{
			break;
		}
	}
	if(i!=10&&t==0)
	return i*10;//二十,三十之类的这里出去
	}
	return sum1+i;//十一,十三这样的这里出去
}

three:

int three()
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n[2]={0,4},m=0,sum1=0;
	for(t=0;t<2;t++)
	{
	for(m=0;m<2;n[t]++,m++)//跳过二十三中的十的作用。
	{
		a[m]=number[n[t]];
	}
	cn=a;
	sum1=sum1+i*t*10;	
	for (i = 0;; i++)
	{
		if (strcmp(cn,chinese[i]) == 0)
		{
			break;
		}
	}
	}
	return sum1+i;
}

整体测试代码以及结果:

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
string  add = "增加", depress = "减少";
const char *chinese[11] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
int sum=0,flag = 1;
int one(char number[])
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n=0,m=0;
	cn=number;	
	for (i = 0;; i++)
		{
			if (strcmp(cn,chinese[i]) == 0)
			{
				break;
			}
		}
	return sum+i;	
}
int two(char number[])
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n=0,m=0;
	cn=number;	
	for(t=0,j=0;j<strlen(number);t++,j+=2)
	{
	for(m=0;m<2;n++,m++)
	{
		a[m]=number[n];
	}
	cn=a;
	sum=sum+i;
	for (i = 0;; i++)
	{
		if (strcmp(cn,chinese[i]) == 0)
		{
			break;
		}
	}
	if(i!=10)
	return i*10;
	}
	sum=sum+i;
	return sum;
}
int three(char number[])
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n[2]={0,4},m=0;
	for(t=0,j=0;j<strlen(number);t++,j+=2)
	{
	for(m=0;m<2;n[t]++,m++)
	{
		a[m]=number[n[t]];
	}
	cn=a;
	sum=sum+i*t*10;	
	for (i = 0;; i++)
	{
		if (strcmp(cn,chinese[i]) == 0)
		{
			break;
		}
	}
	}
	return sum+i;
}
int  transform(char number[])
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n=0,m=0;
	if(strlen(number)==2)
	return	one(number);
	else if(strlen(number)==4)
	return two(number);
	else
	return three(number);

}
int main()
{
	char number[100]={0};
	for(int i=1;i<=4;i++)
	{
	cin>>number;
	cout<<transform(number);
	}
	return 0;
}

整个代码测试结果:

2、 报错

这是最有想法的了!从第一次作业就想解决的问题,!
我的第一思路,添加一个判断的函数在每次的加(或者减)的时候判断,若出错,马上报错,返回0,停止process函数,并且不再读取,整个函数结束!
但是我在写的过程中发现了另一个思路,啊啊啊啊,我最爱的flag!
因为我在每行每行读取的时候,判断到看看钱包的时候用flag来结束输入,所以我再次借用这个flag,当sum<0的时候,flag=0,结束输入。
步骤:

1、 前提准备:先把flag改为全局变量,方便在其他函数里用。
2、 函数本身:写judge函数
3、 函数应用位置:经过思考,我觉得这个函数只要在减的过程中用就好。
4、 测试一下

Judge函数:

void judge(int sum)
{
	if(sum<0)
	{
	flag=0;
	cout<<"钱包的钱不够了!倒欠:"<<-sum<<"元";
	} 

}

测试函数以及测试结果:

#include<iostream>
#include<string>
using namespace std;
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" }, add = "增加", depress = "减少";
int sum,flag = 1;
void judge(int sum)
{
	if(sum<0)
	{
	flag=0;
	cout<<"钱包的钱不够了!倒欠:"<<-sum<<"元";
	} 

}
int main()
{
	int sum[3]={0,-3,2};
	for(int i=0;i<=2;i++)
	{
		judge(sum[i]);
	}
	return 0;
}

添加功能后的整个函数测试:

3、 支持负数

因为支持负数,所以就删除报错的功能先。
我的思路,负数,就设置一个“负”的常量比较,有这个数就添加一个负号,在把这个数更新为正数(例如 负三 更新为三)尝试用一个判断函数judge2来写写看。

judge2

void judge2()
{
	symbol=1;
	char*cn,a[100]={0};
	for(int i=0;i<2;i++)
	{
		a[i]=number[i];
	}
	cn=a;
	if(strcmp(cn,minuss) == 0)
	{
		symbol=-1;
		for(int i=0,t=2;i<=strlen(number);i++,t++)
		{
			number[i]=number[t];
		}
	}
}

测试代码及结果

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
string  add = "增加", depress = "减少";
const char *chinese[11] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"},minuss[3]={"负"};
int sum,symbol=1;
int flag = 1;
char number[100]={0};
void judge2()
{
	char*cn,a[100]={0};
	for(int i=0;i<2;i++)
	{
		a[i]=number[i];
	}
	cn=a;
	if(strcmp(cn,minuss) == 0)
	{
		symbol=-1;
		for(int i=0,t=2;i<=strlen(number);i++,t++)
		{
			number[i]=number[t];
		}
	}
}
int one()
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n=0,m=0;
	cn=number;	
	for (i = 0;; i++)
		{
			if (strcmp(cn,chinese[i]) == 0)
			{
				break;
			}
		}
	return sum+i;	
}
int two()
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n=0,m=0;
	cn=number;	
	for(t=0,j=0;j<strlen(number);t++,j+=2)
	{
	for(m=0;m<2;n++,m++)
	{
		a[m]=number[n];
	}
	cn=a;
	sum=sum+i;
	for (i = 0;; i++)
	{
		if (strcmp(cn,chinese[i]) == 0)
		{
			break;
		}
	}
	if(i!=10&&t==0)
	return i*10;
	}
	return sum+i;
}
int three()
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n[2]={0,4},m=0;
	for(t=0;t<2;t++)
	{
	for(m=0;m<2;n[t]++,m++)
	{
		a[m]=number[n[t]];
	}
	cn=a;
	sum=sum+i*t*10;	
	for (i = 0;; i++)
	{
		if (strcmp(cn,chinese[i]) == 0)
		{
			break;
		}
	}
	}
	return sum+i;
}
int  transform()
{
	symbol=1;
	judge2(); 
	if(strlen(number)==2)
	return	symbol*one();
	else if(strlen(number)==4)
	return symbol*two();
	else
	return symbol*three();

}
int main()
{
	for(int i=1;i<=4;i++)
	{
	sum=0;
	cin>>number;
	cout<<transform();
	}
	return 0;
}

结果:

三、完整代码

先评价一下,我觉得自己的代码添加功能还是比较容易的。所以拓展性还可以啦!

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
string  add = "增加", depress = "减少";
const char *chinese[11] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"},minuss[3]={"负"};
int sum,symbol=1;
int flag = 1;
char number[100]={0};
int one()
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n=0,m=0,sum1=0;
	cn=number;	
	for (i = 0;; i++)
		{
			if (strcmp(cn,chinese[i]) == 0)
			{
				break;
			}
		}
	return sum1+i;	
}
int two()
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n=0,m=0,sum1=0;
	cn=number;	
	for(t=0,j=0;j<strlen(number);t++,j+=2)
	{
	for(m=0;m<2;n++,m++)
	{
		a[m]=number[n];
	}
	cn=a;
	sum1=sum1+i;
	for (i = 0;; i++)
	{
		if (strcmp(cn,chinese[i]) == 0)
		{
			break;
		}
	}
	if(i!=10&&t==0)
	return i*10;
	}
	return sum1+i;
}
int three()
{
	char *cn,a[100]={0};
	int i=0,t=0,j=0,n[2]={0,4},m=0,sum1=0;
	for(t=0;t<2;t++)
	{
	for(m=0;m<2;n[t]++,m++)
	{
		a[m]=number[n[t]];
	}
	cn=a;
	sum1=sum1+i*t*10;	
	for (i = 0;; i++)
	{
		if (strcmp(cn,chinese[i]) == 0)
		{
			break;
		}
	}
	}
	return sum1+i;
}
/*void judge(int sum)
{
	if(sum<0)
	{
	flag=0;
	cout<<"钱包的钱不够了!倒欠:"<<-sum<<"元";
	} 

}*/
void judge2()
{
	symbol=1;
	char*cn,a[100]={0};
	for(int i=0;i<2;i++)
	{
		a[i]=number[i];
	}
	cn=a;
	if(strcmp(cn,minuss) == 0)
	{
		symbol=-1;
		for(int i=0,t=2;i<=strlen(number);i++,t++)
		{
			number[i]=number[t];
		}
	}
}
int  transform()
{
	judge2(); 
	if(strlen(number)==2)
	return	symbol*one();
	else if(strlen(number)==4)
	return symbol*two();
	else
	return symbol*three();

}
void process(string first)
{
    cin>>number;
    getchar();
	if (first == add)
	{
		sum = sum + transform();
	}
	else
	{
		sum = sum - transform();
		//judge(sum);
	}
}
void putout()
{
	int a[10], n, i, t,l;
	string outcome;
	if (sum < 0) 
	{
		cout << "负";
		sum=-sum;
	}
		n = sum;
		if (sum <= 10) cout << chinese[sum];
		else {
			for (i = 1; n != 0; i++)
			{
				a[i] = n % 10;
				n = n / 10;
			}
			if (a[i - 1] != 1) outcome = chinese[a[i - 1]];
			if (a[i - 2] == 0) outcome = outcome + "十";
			else {
				for (t = i - 2; t > 0; t--)
				{
					l = a[t];
					outcome = outcome + "十" + chinese[a[t]];
				}
			}
			cout << outcome;
		}
}
int main()
{
	string begin,later, first;
	for (int i = 1; i <= 3; i++)
	getline(cin, begin, ' ');
	cin>>number;
	getchar();
	sum = transform();
	do {
		getline(cin, later, ' ');
		if (later == "钱包")
		{
			getline(cin, first, ' ');process(first);
		}
		else
		{
			putout();flag = 0;
		}
	} while (flag);
	return 0;
}
原文地址:https://www.cnblogs.com/zouzou-1/p/12310583.html