这个作业属于哪个课程 | 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;
}