这个作业属于哪个课程 | 2020面向对象程序设计张栋班 |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业1 |
这个作业的目标 | 按照要求完成简单文言文编程的相关功能 |
其他参考文献 | 无 |
ps:因为能力有限加上本人有点懒,所以该程序仅支持数据范围在0~99内的处理和很差的错误提示以及代码不够简练,如有大佬发现我的代码有不足之处,请指正,希望日后能改进程序。 |
1、思考题目所需要的功能
- (1)数字转换成为汉字需要考虑以下特殊情况:
- 0~9的数字
- 10~19的数字
- 整十的数字
在这里我设置了一个字符数组记录0~10的数字
char hz[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
然后分情况处理对应的特殊情况
然后我写了一个函数来完成:
if(num>=10)
{
if(num%10==0)
{
if(num==10)
{
printf("%s
",hz[10]);
}
else
{
printf("%s%s
",hz[num/10],hz[10]);
}
}
else
{
if(num<20)
{
printf("%s%s
",hz[10],hz[num%10]);
}
else
{
printf("%s%s%s
",hz[num/10],hz[10],hz[num%10]);
}
}
}
else
{
printf("%s
",hz[num]);
}
- (2)汉字转换为数字:
这里我了解到gbk编码一个汉字为两个字节,于是我想到用strlen函数先量取字符串长度,因为范围在0~99,因此可以得出字符串长度仅可为2、4、6;- 当长度为6时,提取字符串头两个和最后两个位,利用循环在hz数组中对比相应的汉字数字
- 当长度为4和2时,仅需提取头两位进行循环对比
函数代码如下:
int hz_to_num(char* str)
{
char a[10],b[10];
int len,i,j;
len=strlen(str);
if(len==4)
{
a[0]=str[0];
a[1]=str[1];
b[0]=str[2];
b[1]=str[3];
if(strcmp(b,hz[10])==0)
{
for(i=0;i<11;i++)
{
if(strcmp(a,hz[i])==0)
{
return i*10;
}
}
}
else
{
for(i=0;i<10;i++)
{
if(strcmp(b,hz[i])==0)
{
return i+10;
}
}
}
}
else if(len==6)
{
a[0]=str[0];
a[1]=str[1];
b[0]=str[4];
b[1]=str[5];
b[2]=0;//这里十分不解,自己也是试了几遍才试出来,需要加上一个' ',感觉是内存分配出了问题,但是不知道为什么
for(i=0;i<10;i++)
{
if(strcmp(a,hz[i])==0)
{
for(j=0;j<11;j++)
{
if(strcmp(b,hz[j])==0)
{
return i*10+j;
}
}
}
}
}
else if(len==2)
{
a[0]=str[0];
a[1]=str[1];
for(i=0;i<11;i++)
{
if(strcmp(a,hz[i])==0)
{
return i;
}
}
}
}
- (3)计算功能
这里引入关键字字符数组:
char keywords[5][20]={"整数","等于","增加","减少","看看"};
该功能需要结合前两个函数进行计算代码如下:
int calculate(int num,char* command,char* number)
{
int n;
if(strcmp(command,keywords[2])==0)
{
n=hz_to_num(number);
//printf("%d
",n);
num+=n;
return num;
}
else if(strcmp(command,keywords[3])==0)
{
n=hz_to_num(number);
num-=n;
return num;
}
}
2、直接给出代码
#include<stdio.h>
#include<string.h>
int hz_to_num(char* str);
char hz[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
char keywords[5][20]={"整数","等于","增加","减少","看看"};
int calculate(int num,char* command,char* number)
{
int n;
if(strcmp(command,keywords[2])==0)
{
n=hz_to_num(number);
num+=n;
return num;
}
else if(strcmp(command,keywords[3])==0)
{
n=hz_to_num(number);
num-=n;
return num;
}
}
int hz_to_num(char* str)
{
char a[10],b[10];
int len,i,j;
len=strlen(str);
if(len==4)
{
a[0]=str[0];
a[1]=str[1];
b[0]=str[2];
b[1]=str[3];
if(strcmp(b,hz[10])==0)
{
for(i=0;i<11;i++)
{
if(strcmp(a,hz[i])==0)
{
return i*10;
}
}
}
else
{
for(i=0;i<10;i++)
{
if(strcmp(b,hz[i])==0)
{
return i+10;
}
}
}
}
else if(len==6)
{
a[0]=str[0];
a[1]=str[1];
b[0]=str[4];
b[1]=str[5];
b[2]=0;
for(i=0;i<10;i++)
{
if(strcmp(a,hz[i])==0)
{
for(j=0;j<11;j++)
{
if(strcmp(b,hz[j])==0)
{
return i*10+j;
}
}
}
}
}
else if(len==2)
{
a[0]=str[0];
a[1]=str[1];
for(i=0;i<11;i++)
{
if(strcmp(a,hz[i])==0)
{
return i;
}
}
}
}
int num_to_hz(int num)
{
if(num>=10)
{
if(num%10==0)
{
if(num==10)
{
printf("%s
",hz[10]);
}
else
{
printf("%s%s
",hz[num/10],hz[10]);
}
}
else
{
if(num<20)
{
printf("%s%s
",hz[10],hz[num%10]);
}
else
{
printf("%s%s%s
",hz[num/10],hz[10],hz[num%10]);
}
}
}
else
{
printf("%s
",hz[num]);
}
}
int main()
{
char name[20],command[100][20];
int i=0,target;
scanf("%s",command[i++]);
if(strcmp(command[i-1],keywords[0])==0)
{
scanf("%s",name);
scanf("%s",command[i++]);
if(strcmp(command[i-1],keywords[1])==0)
{
scanf("%s",command[i++]);
target=hz_to_num(command[i-1]);
}
else
{
printf("输入错误!
");
return 0;
}
}
else
{
printf("错误,请先定义变量!
");
}
while(1)
{
scanf("%s",command[i++]);
if(strcmp(command[i-1],keywords[4])==0)
{
scanf("%s",command[i++]);
if(strcmp(command[i-1],name)==0)
{
num_to_hz(target);
return 0;
}
else
{
printf("输入名称错误!
");
}
}
else if(strcmp(command[i-1],name)==0)
{
scanf("%s",command[i++]);
scanf("%s",command[i++]);
target=calculate(target,command[i-2],command[i-1]);
}
else
{
printf("输入名称错误!
");
}
}
}
3、下面是我的几个测试样例