寒假作业1.3

这次的编程作业我把需求分为输入,汉字转为数字,计算,数字转为汉字并输出4个部分
而其中最重要也是最难的部分是汉字转为数字阶段,我先在开始开辟两个字符数组用来存放汉字的零至十和会输入的指令
同时将零至十和数组地址做好一一对应以方便后续查找

char key[6][20]={"整数","钱包","等于","增加","减少","看看"};
char num[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};

以及做好一个报错函数来让我不用每次都要打那段话(斜眼笑)

void error(){
    printf("输入错误\n");
}//输入报错情况

然后就是汉字转数字阶段,我用了这么一大段代码来处理转换,同时若发现输入的中文数字不符合规范,将返回(-1)来供程序进行报错与重新输入

int change(char a[20])
{
    int i,n,sum;
    char x[10],y[10];
    n=strlen(a);
    if(n==2)//0-10的输入 
    {
        for(i=0;i<=11;i++)
        {
            if((strcmp(a,num[i])==0))
            return i;
            if(i==11)
            return -1;
        }
    }
    if(n==4)//11-20以及10的倍数
    {
        for(i=0;i<2;i++){
            x[i]=a[i];
        } 
        for(i=2;i<4;i++){
            y[i-2]=a[i];
        }
        if(strcmp(x,"十")==0){
            for(i=0;i<=11;i++){
                if(strcmp(y,num[i])==0)
                return 10+i;
                if(i==11)
                return -1;
            } 
        }
        else if(strcmp(y,"十")==0){
            for(i=1;i<=11;i++){
                if(strcmp(x,num[i])==0)
                return i*10;
                if (i==11)
                return -1;
            }
        }
        else return -1;   
    }
    else if(n==6)//几十几
    {
         for(i=2;i<4;i++){
            x[i-2]=a[i];
        } 
        if(strcmp(x,num[10])!=0)
        return -1;
        for(i=0;i<2;i++){
            x[i]=a[i];
        } 
        for(i=4;i<6;i++){
            y[i-4]=a[i];
        }
        for(i=0;i<=11;i++){
            if(strcmp(x,num[i])==0){
                sum=i*10;
                break;
            }
            if (i==11)
                return -1;
        }
        for(i=0;i<=11;i++){ 
            if(strcmp(y,num[i])==0){
                sum=sum+i;
                break;
            }
            if (i==11)
                return -1;
        }
        return sum;
    }
    else return -1;
}//文字转换数字

而在输入阶段,我也采用了分支进行识别处理,以确保输入正确性,但同时这样还是无法避免用户千奇百怪的输入方式。。。(是否要配一个说明书。。。)(想到一个程序员设计酒吧的笑话)

while(1){
        if(flag==1){
                scanf("%s %s %s %s",a,b,c,d);
            if(strcmp(a,key[0])==0&&strcmp(b,key[1])==0&&strcmp(c,key[2])==0)//初始化
            {
                flag=0;
                n=change(d);
                if(n==-1){
                    error();
                    flag=0;
                    continue;
                }
            }
            else error();
        }
        else{
            scanf("%s %s",a,b);
            if(strcmp(a,key[1])==0&&strcmp(b,key[3])==0)//增加
            {
                scanf(" %s",c);
                m=change(c);
                if(m>=0)
                n=n+m;
                else {
                    error();
                    continue;
                }
            }
            else if(strcmp(a,key[1])==0&&strcmp(b,key[4])==0)//减少
            {
                scanf(" %s",c);
                m=change(c);
                if(m>=0)
                n=n-m;
                else
                {
                    error();
                    continue;
                }
                
            }
            else if(strcmp(a,key[5])==0&&strcmp(b,key[1])==0)//输出
            {
                print(n);
                break;
            }
            else {
                error();
                scanf(" %s",c);
            }
            
        }
    }
}

通过flag变量我能确定程序该执行的是初始化阶段还是后续的计算阶段,同时在后续计算阶段,我选择先读取输入的两个词语,已确定输入的是计算还是输出指令,同时在计算阶段,若发现输入的不合规范这可以吸收掉输入的中文数字部分,但似乎还是有考虑不全的地方。。。
然后是输出部分,采用下列输出进行处理,处理了小于0和超过100的报错,通过x、y两个变量分别寄存十位和个位的数字,并通过不同的判断标准来输出符合中文语法的结果。

void print(int n)//输出
{
    if(n<0)
    printf("你欠债了");
    else if(n>99)
    printf("数字过大这渣渣计算器办不到。。。");
    else{
        int x,y;
        x=n/10;
        y=n%10;
        if(x==0)//0-9阶段
        {
            printf("%s",num[y]);
        }
        else if(x!=0&&y==0)//几十
        {
            if(x==1)
            printf("十");
            else
            printf("%s十",num[x]);
        }
        else if(x==1&&y!=0)//十几
        {
            printf("十%s",num[y]);
        }
        else//几十几
        {
            printf("%s十%s",num[x],num[y]);
        }
    
    } 
 
}

以下是整体程序

#include<stdio.h>
#include<string.h>
char key[6][20]={"整数","钱包","等于","增加","减少","看看"};
char num[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
int change(char a[20]);//转换
void error();
void print(int n);
int main(){
    int flag=1,i=0,n=0,m;
    char a[20]={" "},b[20]={" "},c[20]={" "},d[20]={" "};
    while(1){
        if(flag==1){
                scanf("%s %s %s %s",a,b,c,d);
            if(strcmp(a,key[0])==0&&strcmp(b,key[1])==0&&strcmp(c,key[2])==0)//初始化
            {
                flag=0;
                n=change(d);
                if(n==-1){
                    error();
                    flag=0;
                    continue;
                }
            }
            else error();
        }
        else{
            scanf("%s %s",a,b);
            if(strcmp(a,key[1])==0&&strcmp(b,key[3])==0)//增加
            {
                scanf(" %s",c);
                m=change(c);
                if(m>=0)
                n=n+m;
                else {
                    error();
                    continue;
                }
            }
            else if(strcmp(a,key[1])==0&&strcmp(b,key[4])==0)//减少
            {
                scanf(" %s",c);
                m=change(c);
                if(m>=0)
                n=n-m;
                else
                {
                    error();
                    continue;
                }
                
            }
            else if(strcmp(a,key[5])==0&&strcmp(b,key[1])==0)//输出
            {
                print(n);
                break;
            }
            else {
                error();
                scanf(" %s",c);
            }
            
        }
    }
}
void error(){
    printf("输入错误\n");
}//输入报错情况
int change(char a[20])
{
    int i,n,sum;
    char x[10],y[10];
    n=strlen(a);
    if(n==2)//0-10的输入 
    {
        for(i=0;i<=11;i++)
        {
            if((strcmp(a,num[i])==0))
            return i;
            if(i==11)
            return -1;
        }
    }
    if(n==4)//11-20以及10的倍数
    {
        for(i=0;i<2;i++){
            x[i]=a[i];
        } 
        for(i=2;i<4;i++){
            y[i-2]=a[i];
        }
        if(strcmp(x,"十")==0){
            for(i=0;i<=11;i++){
                if(strcmp(y,num[i])==0)
                return 10+i;
                if(i==11)
                return -1;
            } 
        }
        else if(strcmp(y,"十")==0){
            for(i=1;i<=11;i++){
                if(strcmp(x,num[i])==0)
                return i*10;
                if (i==11)
                return -1;
            }
        }
        else return -1;   
    }
    else if(n==6)//几十几
    {
         for(i=2;i<4;i++){
            x[i-2]=a[i];
        } 
        if(strcmp(x,num[10])!=0)
        return -1;
        for(i=0;i<2;i++){
            x[i]=a[i];
        } 
        for(i=4;i<6;i++){
            y[i-4]=a[i];
        }
        for(i=0;i<=11;i++){
            if(strcmp(x,num[i])==0){
                sum=i*10;
                break;
            }
            if (i==11)
                return -1;
        }
        for(i=0;i<=11;i++){ 
            if(strcmp(y,num[i])==0){
                sum=sum+i;
                break;
            }
            if (i==11)
                return -1;
        }
        return sum;
    }
    else return -1;
}//文字转换数字
void print(int n)//输出
{
    if(n<0)
    printf("你欠债了");
    else if(n>99)
    printf("数字过大这渣渣计算器办不到。。。");
    else{
        int x,y;
        x=n/10;
        y=n%10;
        if(x==0)//0-9阶段
        {
            printf("%s",num[y]);
        }
        else if(x!=0&&y==0)//几十
        {
            if(x==1)
            printf("十");
            else
            printf("%s十",num[x]);
        }
        else if(x==1&&y!=0)//十几
        {
            printf("十%s",num[y]);
        }
        else//几十几
        {
            printf("%s十%s",num[x],num[y]);
        }
    
    } 
 
}

然后是运行结果展示:
1、题目给的示例
2、结果为“十几”的输出
3、输入有“几十”输出为“几十几”
4、难度大一些的玩意
5、溢出报错
6、输入命令报错
7、输入中文数字不合规范报错

THE END

猜你喜欢

转载自www.cnblogs.com/LRlicious/p/12235831.html