这个作业属于哪个课程 | 班级的链接 |
---|---|
这个作业要求在哪里 | 作业的要求 |
这个作业的目标 | 继续完成作业二的编程题。 优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。 思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。 |
作业正文 | 作业3 |
其他参考文献 | strncpy函数的用法 |
目前支持的功能有:1、可以给变量赋初值 2、可以改变变量名 3、可以支持大于10的汉字输入 4、支持破产!
仍不具备的功能有:1、不能输入负数(如果要输入负数的话直接输入减少xx不就可以了吗)2、不能纠正错误的输入 3、不能边输入边看钱包(变量) 4、数字范围仍在0~100
后续会升级这些功能
本次主要是升级了数字范围(10以上),但仍然存在一个大问题至今仍未解决,导致处理数字的过程要到主函数中进行使主函数看起来有些杂乱,下面上代码的同时分享一下我的问题,如果有大犇知道怎么回事请救救蒟蒻。
头文件使用了万能头
#include<bits/stdc++.h>
using namespace std;
全局变量,本次用一个二维数组来储存标准的汉字数字,使得后续处理的函数更加简短。
int sum;//总额
char var[100],num[10],oper[10],tmp[10];//变量,初始化 运算 没用的替代品temp
char arabe[11][5]={"零","一","二","三","四","五","六","七","八","九","十"};//汉字数字
单个汉字转数字函数,用到了上面的标准汉字数组。
int trans(char str[])
{
for(int i=0;i<=10;i++)if(!strcmp(arabe[i],str))return i;
}
单个(10以内)数字转汉字函数,同样用到了上面的标准汉字数组,使得函数十分简短。
void output(int x)
{
cout<<arabe[x];
}
#以下为主函数内容:
定义两个长度为2的字符串,当输入的汉字数字大小大于10的时候来储存十位和个位的汉字
```
char x[2],y[2];//储存十位和个位的汉字数字
```
第一行用cin输入,因为遇到空格会停下,所以额外用了一个tmp来储存不进行操作的字符串,“整数”“等于”等。
```
cin>>tmp>>var>>tmp>>num;
```
###此环节为给sum赋初值
众所周知,单个汉字长度为2,这边通过三个if来判断长度分别为2 4 6 的情况,如“二” “十二” “二十二”
若为单个汉字,即长度为2,直接调用上面trans函数来给sum赋初值
长度为4时,有两种情况,类似“十五”这种十几的和类似“二十”“三十”这种整十的,具体分离方法为使用strncpy这个函数(头文件为#include<string.h>)来截取部分片段赋值给x、y,此时x、y为单个汉字,将其用trans转换同时处理 *10 等情况便可得初值
长度为6时便是“几十几”的情况,处理方法同上。
[strncmp的语法](https://baike.baidu.com/item/strncpy/8491017)
```
if(strlen(num)==2)sum=trans(num);
if(strlen(num)==4)
{
strncpy(x,num,2);
strncpy(y,num+2,2);
if(!strcmp(x,"十"))sum=10+trans(y);
else sum=trans(x)*10;
}
if(strlen(num)==6)
{
strncpy(x,num,2);
strncpy(y,num+4,2);
sum=trans(x)*10+trans(y);
}
```
输入完第一行后,开始对加减进行操作。定义一个变量a来储存每一轮的数字,这边处理数字模块和上面的赋初值环节同理(完 全 一 致)。此次优化我将变量、对应操作、要操作的数字分开输入,可以简化副函数。
```
for(;;)
{
int a;//每一轮的数字
cin>>var;
if(strcmp("看看",var)==0)break;//当读入“看看”时退出
cin>>oper>>num;//通过cin读入变量名,遇到空格停止
if(strlen(num)==2)a=trans(num);
if(strlen(num)==4)
{
strncpy(x,num,2);
strncpy(y,num+2,2);
if(!strcmp(x,"十"))a=10+trans(y);
else a=trans(x)*10;
}
if(strlen(num)==6)
{
strncpy(x,num,2);
strncpy(y,num+4,2);
a=trans(x)*10+trans(y);
}
if(strcmp("增加",oper)==0)sum+=a;
if(strcmp("减少",oper)==0)sum-=a;
}
```
输出环节,将大于11的数字拆分成十位和个位变成单个数字,再通过output函数进行单个位输出汉字
```
if(sum<0)cout<<"破产了!";
if(sum>=0&&sum<=10)output(sum);
if(sum>10)
{
int ten_position=sum/10;
if(ten_position==1)cout<<"十";
else{
output(ten_position);
cout<<"十";
}
if(sum%10)output(sum%10);
}
```
比赛时不要忘记return 0
```
return 0;
```
###测试样例1:
整数 钱包 等于 五十五
钱包 增加 四十
钱包 减少 六十六
看看 钱包

###测试样例2:
整数 我 等于 六十六
我 减少 七十七
看看 我

###测试样例3:
整数 bankcard 等于 七十七
bankcard 减少 八十
bankcard 增加 二十五
看看 bankcard

##问题:
我的主要问题在于那个将大于十的汉字数字转化为阿拉伯数字的过程。我的处理过程搬到了主函数内而且写了两遍,一遍是赋初值一遍在之后的循环里,因为我无法写一个函数来处理这个过程
通过拆分、输出的测试,可以看到:
正确的应该是

而当我转移到外面的函数时(在里面写了cout来测试拆分的汉字)
```
int trans(char str[])
{
for(int i=0;i<=10;i++)if(!strcmp(arabe[i],str))return i;
}
int deal_number(char str[])
{
char x[2],y[2];//储存十位和个位的汉字数字
if(strlen(str)==2)return trans(str);
if(strlen(str)==4)
{
strncpy(x,str,2);
strncpy(y,str+2,2);
cout<<x<<endl<<y<<endl;
if(!strcmp(x,"十"))return 10+trans(y);
else return trans(x)*10;
}
if(strlen(str)==6)
{
strncpy(x,str,2);
strncpy(y,str+4,2);
cout<<x<<endl<<y<<endl;
return trans(x)*10+trans(y);
}
}
```
得到的却是错误的

无奈,只能将其放到主函数里了(笨 b 操 作)
###知道为什么的大犇请务必告诉我TOT!!
##完整代码
```
#include<bits/stdc++.h>
using namespace std;
int sum;//总额
char var[100],num[10],oper[10],tmp[10];//变量,初始化 运算 没用的替代品temp
char arabe[11][5]={"零","一","二","三","四","五","六","七","八","九","十"};//汉字数字
int trans(char str[])
{
for(int i=0;i<=10;i++)if(!strcmp(arabe[i],str))return i;
}
void output(int x)
{
cout<<arabe[x];
}
int main()
{
char x[2],y[2];//储存十位和个位的汉字数字
cin>>tmp>>var>>tmp>>num;
if(strlen(num)==2)sum=trans(num);
if(strlen(num)==4)
{
strncpy(x,num,2);
strncpy(y,num+2,2);
if(!strcmp(x,"十"))sum=10+trans(y);
else sum=trans(x)*10;
}
if(strlen(num)==6)
{
strncpy(x,num,2);
strncpy(y,num+4,2);
sum=trans(x)*10+trans(y);
}
for(;;)
{
int a;//每一轮的数字
cin>>var;
if(strcmp("看看",var)==0)break;//当读入“看看”时退出
cin>>oper>>num;//通过cin读入变量名,遇到空格停止
if(strlen(num)==2)a=trans(num);
if(strlen(num)==4)
{
strncpy(x,num,2);
strncpy(y,num+2,2);
if(!strcmp(x,"十"))a=10+trans(y);
else a=trans(x)*10;
}
if(strlen(num)==6)
{
strncpy(x,num,2);
strncpy(y,num+4,2);
a=trans(x)*10+trans(y);
}
if(strcmp("增加",oper)==0)sum+=a;
if(strcmp("减少",oper)==0)sum-=a;
}
if(sum<0)cout<<"破产了!";
if(sum>=0&&sum<=10)output(sum);
if(sum>10)
{
int ten_position=sum/10;
if(ten_position==1)cout<<"十";
else{
output(ten_position);
cout<<"十";
}
if(sum%10)output(sum%10);
}
return 0;
}
```