增加新功能
1.扩大数字范围
之前输入的数值范围限制为0-10之间,现在改进为0-99之间。需要考虑到:
- 一个汉字占两个字符。
- 中文对于11到99数字的表达习惯不同,需要两个汉字表达的可以是“十三”(11-19)或者“二十”(整十数),需要三个汉字表达的如“五十二”等。
所以需要先对输入的数据进行范围判定,而后再根据不同情况进行具体的数据处理,具体代码如下:
int convert1(char num[])
{
int len=strlen(num);
char x[10],y[10];
int a,b;
if(len==2)
{
if (strcmp(num, "一") == 0)
return 1;
else if (strcmp(num, "二") == 0)
return 2;
else if (strcmp(num, "三") == 0)
return 3;
else if (strcmp(num, "四") == 0)
return 4;
else if (strcmp(num, "五") == 0)
return 5;
else if (strcmp(num, "六") == 0)
return 6;
else if (strcmp(num, "七") == 0)
return 7;
else if (strcmp(num, "八") == 0)
return 8;
else if (strcmp(num, "九") == 0)
return 9;
else if (strcmp(num, "零") == 0)
return 0;
else if (strcmp(num, "十") == 0)
return 10;
}
else if(len==4)
{
x[0]=num[0];x[1]=num[1];
y[0]=num[2];y[1]=num[3];
a=convert1(x);b=convert1(y);
if(a==10)
return a+b;
else
return a*10;
}
else if(len==6)
{
x[0]=num[0];x[1]=num[1];
y[0]=num[4];y[1]=num[5];
a=convert1(x);b=convert1(y);
return 10*a+b;
}
}
对convert1函数测试代码如下:
#include <stdio.h>
#include <string.h>
int convert1(char num[])
{
int len=strlen(num);
char x[10],y[10],z[10];
int a,b;
if(len==2)
{
if (strcmp(num, "一") == 0)
return 1;
else if (strcmp(num, "二") == 0)
return 2;
else if (strcmp(num, "三") == 0)
return 3;
else if (strcmp(num, "四") == 0)
return 4;
else if (strcmp(num, "五") == 0)
return 5;
else if (strcmp(num, "六") == 0)
return 6;
else if (strcmp(num, "七") == 0)
return 7;
else if (strcmp(num, "八") == 0)
return 8;
else if (strcmp(num, "九") == 0)
return 9;
else if (strcmp(num, "零") == 0)
return 0;
else if (strcmp(num, "十") == 0)
return 10;
}
else if(len==4)
{
x[0]=num[0];x[1]=num[1];
y[0]=num[2];y[1]=num[3];
a=convert1(x);b=convert1(y);
if(a==10)
return a+b;
else
return a*10;
}
else if(len==6)
{
x[0]=num[0];x[1]=num[1];
y[0]=num[4];y[1]=num[5];
a=convert1(x);b=convert1(y);
return 10*a+b;
}
}
int main()
{
int n;
n=convert1("三十");
//printf("%d\n",n);
if(n==30)
printf("pass\n");
else
printf("error\n");
n=convert1("十三");
if(n==13)
printf("pass\n");
else
printf("error\n");
n=convert1("二十二");
if(n==22)
printf("pass\n");
else
printf("error\n");
}
运行结果如下:

2.增加输出负数功能
考虑到运行结果可能是负数,所以在output函数中再添一种情况,即计算结果是负数,增加代码如下:
if(n<0)
{
printf("负");
n=-n;
output(n);
}
output函数完整代码如下:
void output(int n)
{
if(n<0)
{
printf("负");
n=-n;
output(n);
}
else if (n<=10)
{
printf("%s",convert2(n));
}
else if(n%10==0&&n<100)
{
printf("%s十",convert2(n/10));
}
else if (n<20)
{
n%=10;
printf("十%s",convert2(n));
}
else if (n<100)
{
printf("%s十%s", convert2(n/10),convert2(n%10));
}
}
增加运算法则,“乘以”,“除以”,增加代码如下:
else if(strcmp(b,"乘以")==0)
{
result*=convert1(c);
}
else if(strcmp(b,"除以")==0)
{
result/=convert1(c);
}
完整代码如下:
#include<stdio.h>
#include<string.h>
int convert1(char num[])
{
int len=strlen(num);
char x[10],y[10],z[10];
int a,b;
if(len==2)
{
if (strcmp(num, "一") == 0)
return 1;
else if (strcmp(num, "二") == 0)
return 2;
else if (strcmp(num, "三") == 0)
return 3;
else if (strcmp(num, "四") == 0)
return 4;
else if (strcmp(num, "五") == 0)
return 5;
else if (strcmp(num, "六") == 0)
return 6;
else if (strcmp(num, "七") == 0)
return 7;
else if (strcmp(num, "八") == 0)
return 8;
else if (strcmp(num, "九") == 0)
return 9;
else if (strcmp(num, "零") == 0)
return 0;
else if (strcmp(num, "十") == 0)
return 10;
}
else if(len==4)
{
x[0]=num[0];x[1]=num[1];
y[0]=num[2];y[1]=num[3];
a=convert1(x);b=convert1(y);
if(a==10)
return a+b;
else
return a*10;
}
else if(len==6)
{
x[0]=num[0];x[1]=num[1];
y[0]=num[4];y[1]=num[5];
a=convert1(x);b=convert1(y);
return 10*a+b;
}
}
char* convert2(int n)
{
if (n == 0) return "零";
else if (n == 1) return "一";
else if (n == 2) return "二";
else if (n == 3) return "三";
else if (n == 4) return "四";
else if (n == 5) return "五";
else if (n == 6) return "六";
else if (n == 7) return "七";
else if (n == 8) return "八";
else if (n == 9) return "九";
else if (n == 10) return "十";
}
void output(int n)
{
if(n<0)
{
printf("负");
n=-n;
output(n);
}
else if (n<=10)
{
printf("%s",convert2(n));
}
else if(n%10==0&&n<100)
{
printf("%s十",convert2(n/10));
}
else if (n<20)
{
n%=10;
printf("十%s",convert2(n));
}
else if (n<100)
{
printf("%s十%s", convert2(n/10),convert2(n%10));
}
}
int main()
{
int result;
char a[10],name[10],b[10],c[10];
/*printf("输入文件名\n");
char s[10];
scanf("%s",s);
freopen(s,"r",stdin);*/
scanf("%s %s %s %s",a,name,b,c);
if(strcmp(a,"整数")!=0||strcmp(b,"等于")!=0)
{printf("输入错误\n");
return 0;
}
result=convert1(c);
while(1)
{
scanf ("%s ",name);
if(strcmp(name,"看看")!=0)
{
scanf("%s %s",b,c);
if(strcmp(b,"增加")==0)
{
result+=convert1(c);
}
else if(strcmp(b,"减少")==0)
{
result-=convert1(c);
}
else if(strcmp(b,"乘以")==0)
{
result*=convert1(c);
}
else if(strcmp(b,"除以")==0)
{
result/=convert1(c);
}
}
else break;
}
output(result);
return 0;
}
对完整代码进行部分数据测试:


关于测试脚本,编译脚本
反思
还可以将数据范围扩展到更大,以及输入负数等