第一次个人编程作业(汉字编程)

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/SE
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzzcxy/SE/homework/10283
这个作业的目标 汉字编程
作业正文 https://github.com/Qiiiii-u/ChineseProgramme
其他参考文献

1、时间记录

  • 代码行数:402行
  • 需求分析时间:大约1小时
  • 编码时间:每天5h+,合计20h+

2、遇到的问题

(1)如何多次输入一组数据。

输入时,采用了while(scanf("%s",&a)!=EOF){},根据a的输入来分别跳转至加减法运算、看看、如果、或是再次定义汉字变量,四种情况。

(2)汉字转数字。

根据n的长度来分为不同的情况,一个汉字占2位。

  • strlen(n)==2,即零-十。
  • strlen(n)==4,以十开头的11-19,以十结尾的10-90整十数,以百为结尾的100-900整百数。
  • strlen(n)==6,21-99的普通数。
  • strlen(n)==8,101-109等中间带0的数,110-190等末尾为0的数。
  • strlen(n)==10,111-999等普通数。
    这里只考虑了1000以下包括负数的汉字转数字的情况。
int change1(char n[]) //n汉字
{   
    char m1[10]="\0",m2[10]="\0",m3[10]="\0";
    int num=0;
    int i=0,j=0;
    if(strlen(n)==2) //0-10
    {
        for(i=0;i<11;i++)
            if(strcmp(n,s4[i])==0)
                num=num+i;
    }
    else if(strlen(n)==4)
    {   
        strncpy(m1,n,2); //第一位
        strncpy(m2,n+2,2);  //第二位
        if(strcmp(m1,s4[10])==0) //第一位为十
        {
            num=10+num;
            for(i=0;i<10;i++)
                if(strcmp(m2,s4[i])==0)
                    num=i+num;
        }
        else if(strcmp(m2,s4[10])==0) //第二位是十,即十倍数
        {
            for(i=0;i<10;i++)
                if(strcmp(m1,s4[i])==0)
                    num=num+i*10;
        }
        else if(strcmp(m2,s7[0])==0) //第二位是百
        {
            for(i=0;i<10;i++)
                if(strcmp(m1,s4[i])==0)
                    num=num+i*100;
        }
        if(strcmp(m1,s4[1])==0) //第一位为一   一百 一千 一万
        {
            if(strcmp(m2,s7[0])==0)
                num=100;
            else if(strcmp(m2,s7[1])==0)
                num=1000;
            else if(strcmp(m2,s7[2])==0)
                num=10000;
            else
                printf("输入数值过大,暂不给予转换");
        }
    }
    else if(strlen(n)==6) //21-99
    {
        strncpy(m1,n,2);
        strncpy(m3,n+4,2);
        for(i=0;i<10;i++)
        {
            if(strcmp(m1,s4[i])==0)
                num=num+i*10;
            if(strcmp(m3,s4[i])==0)
                num=num+i;
        }
    }
    else if(strlen(n)==8)  //100以上
    {
        strncpy(m1,n,2);
        strncpy(m2,n+4,2);
        strncpy(m3,n+6,2);
        for(i=0;i<10;i++)
            if(strcmp(m1,s4[i])==0)//百位
            {
                num=num+i*100;
                if(strcmp(m2,s4[0])==0) //十位为零
                {
                    for(j=0;j<10;j++)
                        if(strcmp(m3,s4[j])==0)
                            num=num+j;
                }
                else
                {
                    for(j=0;j<10;j++)
                        if(strcmp(m2,s4[j])==0)
                            num=num+j*10;
                }
            }
    }
    else if(strlen(n)==10)
    {
        strncpy(m1,n,2);
        strncpy(m2,n+4,2);
        strncpy(m3,n+8,2);
        for(i=0;i<10;i++)
        {
            if(strcmp(m1,s4[i])==0)
            {
                num=num+i*100;
                for(j=0;j<10;j++)
                {
                    if(strcmp(m2,s4[j])==0)
                        num=num+j*10;
                    if(strcmp(m3,s4[j])==0)
                            num=num+j;
                }
            }
        }
    }
    return num;
}
int change2(char n[]) //判断负数
{
    char m[10]="\0";
    char k[10]="\0";
    int num=0;
    strncpy(m,n,2);
    if(strcmp(m,s8)==0)
    {
        strncpy(k,n+2,strlen(n));
        num=num-change1(k);
    }
    else
        num=change1(n);
    return num;
}

(3)数字转汉字

sum进行整数分割,存入一个数组中,再根据每位数的不同情况化为汉字形式。此处依旧只考虑1000以下包括负数的情况。

int change3(int sum)
{
    int d[10],i=0,flag1=0,flag2=0;
    if(sum==0)
        printf("零");
    else if(sum==100)
        printf("一百");
    else if(sum>100) //1000>sum>100
    {   
        if((sum/10%10)==0)
            flag1=1;
        if((sum%100)==0)
            flag2=1;
        while(sum!=0)
        {
            d[i]=sum%100;
            sum=sum/100;
            i++;
        }
        printf("%s百",s4[d[1]]);
        if(flag1==1)
            if(flag2==1);
            else
                printf("零");
        change(d[0]);
    }
    else
        change(sum);
    return 0;
}

int change(int sum)  //99以下
{
    int d[10],i=0,count=0,j=0;
    while(sum!=0)
    {
        d[i]=sum%10;
        sum=sum/10;
        i++;count++;
    }
    for(i=count-1;i>=0;i--)
    {
        if(j==1)
        {
            printf("十");
            j++;
        }
        if(j==0)
        {   
            if(d[i]==0);
			else if(d[i]==1)
				if(i==0)
					printf("%s",s4[d[i]]);
				else
					;
            else 
                printf("%s",s4[d[i]]);
            j++;
        }
        else if(j==2)
        {
            if(d[i]==0);
            else
                printf("%s",s4[d[i]]);
            j++;
        }
    }
    return 0;
}

int change4(int sum) //判断负数
{
    if(sum<0)
    {
        printf("负");
        sum=abs(sum);
        change3(sum);
    }
    else
        change3(sum);
    return 0;
}

(4)加减法的运算。

此处并没有讨论乘除法的情况,后续也许会补上。

int cal(char op[],int num,int sum)
{
    if(strcmp(op,s6[0])!=0)
        sum-=num;
    else
        sum+=num;
    return sum;
}

(5)看看+字符串/看看+汉字变量

此处考虑了“字符串”"字符串"字符串三种情况。本质是判断字符串的第一位是否是英文或是中文引号。

void judge1(char a[])//看看 “字符串”
{
    char m[20]={"\0"};
    char n[20]={"\0"};
    if(strcmp(strncpy(n,a,1),s9[0])==0)
        strncpy(m,a+1,strlen(a)-2);
    else if(strcmp(strncpy(n,a,2),s9[1])==0)
        strncpy(m,a+2,strlen(a)-4);
    else
        strcpy(m,a);
    printf("%s\n",m);
}

(6)未考虑的情况。

  • 乘除运算,或是不同表达的各种运算。
  • 文字中,大等于小等于不等于的情况。
  • 如果语句中,否则之后不是单纯的计算,或是看看的情况,那么可能无结果。

3、完整代码

#include<stdio.h>
#include<string.h>
#include<math.h>
char s1[2][5]={"整数","小数"}; //暂无考虑
char s2[5];//主体
char s3[3][5]={"大于","小于","等于"};
char s4[11][3]={"零","一","二","三","四","五","六","七","八","九","十"};
char s5[2][5]={"看看","如果"};
char s6[2][5]={"增加","减少"};
char s7[3][3]={"百","千","万"};
char s8[3]="负";
char s9[3][3]={"\"","“","”"};

char a1[10],a2[10],a3[10],a4[10],a5[20];
char op[10],n[10];
char c1[20],c2[20],c3[20],c4[20],c5[20],c6[20],c7[20],c8[20],c9[20];
int sum=0,num,num2=0;
char type[10],name[20],same[10];

int change1(char n[]);
int change2(char n[]);
int change3(int sum);
int change4(int sum);
int change(int sum);
int cal(char op[],int num,int sum);
void judge1(char a[]);
void judge2(char b[],char c1[],char c2[],int sum,int num,char c[]);

int main()
{
    int a[20]={0};
    char b[10][10]={"\0"};
    int i=0,flag1=0,j=0,flag2=0;
    printf("请输入要求:\n");
    while(scanf("%s",a1)!=EOF)
    {
        if(strcmp(a1,s1[0])==0)//判断是否为整数
        {
        	scanf("%s",name);
        	for(j=0;j<=i;j++)
        		if(strcmp(name,b[j])==0)
        		{
        			flag1=1;
        			break;
        		}
        	if(flag1==1)
        	{
        		scanf("%s %s",same,n);
        		strcpy(b[j],name);
        		a[j]=change2(n);
        		flag1=0; 
        	}
        	else
        	{
        		scanf("%s %s",same,n);
        		strcpy(b[i],name);
        		a[i]=change2(n);
        		i++;
			}
        		
        }
        else if(strcmp(a1,s5[0])==0) //看看
        {
        	flag2=0; 
            scanf("%s",a5);
            for(j=0;j<=i;j++)
            {
                if(strcmp(a5,b[j])==0)
                {
                    change4(a[j]);
                    printf("\n");
                    flag2=1;
                    break;
                }
            }
            if(flag2==0)
                judge1(a5);
        }   
        else if(strcmp(a1,s5[1])==0) //如果
        {
            scanf("%s %s %s %s %s %s %s %s %s",c1,c2,c3,c4,c5,c6,c7,c8,c9);
            if(strcmp(c5,s5[0])==0 && strcmp(c8,s5[0])==0)
            {
                num=change2(c3);
                for(j=0;j<i;j++)
                    if(strcmp(c1,b[j])==0)
                    {
                        judge2(c2,c6,c9,a[j],num,b[j]);
                        break;
                    }
            }
            else
            {
                for(j=0;j<=i;j++)
                    if(strcmp(c1,b[j])==0)
                    {   
                        num=change2(c3);
                        num2=change2(c7);
                        if(strcmp(c2,s3[0])==0)
                        {
                            if(a[j]>num)
                            {
                                for(int k=0;k<=i;k++)
                                    if(strcmp(c5,b[k])==0)
                                        a[k]=cal(c6,num2,a[k]);
                            }
                            else
                                break;
                        }
                        else if(strcmp(c2,s3[1])==0)
                        {
                            if(a[j]<num)
                            {
                                for(int k=0;k<=i;k++)
                                    if(strcmp(c5,b[k])==0)
                                        a[k]=cal(c6,num2,a[k]);
                            }
                            else
                                break;
                        }
                        else
                        {
                            if(a[j]==num)
                            {
                                for(int k=0;k<=i;k++)
                                    if(strcmp(c5,b[k])==0)
                                        a[k]=cal(c6,num2,a[k]);
                            }
                            else
                                break;
                        }
                    }
            }
        }
        else  //加减
        {   
            scanf("%s %s",a3,a4);
            for(j=0;j<=i;j++)
                if(strcmp(a1,b[j])==0)
                {
                    num=change2(a4);
                    a[j]=cal(a3,num,a[j]);
                    break;
                }
        }
    }
    return 0;
}


//汉字转数字
int change1(char n[]) //n汉字
{   
    char m1[10]="\0",m2[10]="\0",m3[10]="\0";
    int num=0;
    int i=0,j=0;
    if(strlen(n)==2) //0-10
    {
        for(i=0;i<11;i++)
            if(strcmp(n,s4[i])==0)
                num=num+i;
    }
    else if(strlen(n)==4)
    {   
        strncpy(m1,n,2); //第一位
        strncpy(m2,n+2,2);  //第二位
        if(strcmp(m1,s4[10])==0) //第一位为十
        {
            num=10+num;
            for(i=0;i<10;i++)
                if(strcmp(m2,s4[i])==0)
                    num=i+num;
        }
        else if(strcmp(m2,s4[10])==0) //第二位是十,即十倍数
        {
            for(i=0;i<10;i++)
                if(strcmp(m1,s4[i])==0)
                    num=num+i*10;
        }
        else if(strcmp(m2,s7[0])==0) //第二位是百
        {
            for(i=0;i<10;i++)
                if(strcmp(m1,s4[i])==0)
                    num=num+i*100;
        }
        if(strcmp(m1,s4[1])==0) //第一位为一   一百 一千 一万
        {
            if(strcmp(m2,s7[0])==0)
                num=100;
            else if(strcmp(m2,s7[1])==0)
                num=1000;
            else if(strcmp(m2,s7[2])==0)
                num=10000;
            else
                printf("输入数值过大,暂不给予转换");
        }
    }
    else if(strlen(n)==6) //21-99
    {
        strncpy(m1,n,2);
        strncpy(m3,n+4,2);
        for(i=0;i<10;i++)
        {
            if(strcmp(m1,s4[i])==0)
                num=num+i*10;
            if(strcmp(m3,s4[i])==0)
                num=num+i;
        }
    }
    else if(strlen(n)==8)  //100以上
    {
        strncpy(m1,n,2);
        strncpy(m2,n+4,2);
        strncpy(m3,n+6,2);
        for(i=0;i<10;i++)
            if(strcmp(m1,s4[i])==0)//百位
            {
                num=num+i*100;
                if(strcmp(m2,s4[0])==0) //十位为零
                {
                    for(j=0;j<10;j++)
                        if(strcmp(m3,s4[j])==0)
                            num=num+j;
                }
                else
                {
                    for(j=0;j<10;j++)
                        if(strcmp(m2,s4[j])==0)
                            num=num+j*10;
                }
            }
    }
    else if(strlen(n)==10)
    {
        strncpy(m1,n,2);
        strncpy(m2,n+4,2);
        strncpy(m3,n+8,2);
        for(i=0;i<10;i++)
        {
            if(strcmp(m1,s4[i])==0)
            {
                num=num+i*100;
                for(j=0;j<10;j++)
                {
                    if(strcmp(m2,s4[j])==0)
                        num=num+j*10;
                    if(strcmp(m3,s4[j])==0)
                            num=num+j;
                }
            }
        }
    }
    return num;
}
int change2(char n[]) //判断负数
{
    char m[10]="\0";
    char k[10]="\0";
    int num=0;
    strncpy(m,n,2);
    if(strcmp(m,s8)==0)
    {
        strncpy(k,n+2,strlen(n));
        num=num-change1(k);
    }
    else
        num=change1(n);
    return num;
}

//数字转汉字
int change3(int sum)
{
    int d[10],i=0,flag1=0,flag2=0;
    if(sum==0)
        printf("零");
    else if(sum==100)
        printf("一百");
    else if(sum>100) //1000>sum>100
    {   
        if((sum/10%10)==0)
            flag1=1;
        if((sum%100)==0)
            flag2=1;
        while(sum!=0)
        {
            d[i]=sum%100;
            sum=sum/100;
            i++;
        }
        printf("%s百",s4[d[1]]);
        if(flag1==1)
            if(flag2==1);
            else
                printf("零");
        change(d[0]);
    }
    else
        change(sum);
    return 0;
}

int change(int sum)  //99以下
{
    int d[10],i=0,count=0,j=0;
    while(sum!=0)
    {
        d[i]=sum%10;
        sum=sum/10;
        i++;count++;
    }
    for(i=count-1;i>=0;i--)
    {
        if(j==1)
        {
            printf("十");
            j++;
        }
        if(j==0)
        {   
            if(d[i]==0);
			else if(d[i]==1)
				if(i==0)
					printf("%s",s4[d[i]]);
				else
					;
            else 
                printf("%s",s4[d[i]]);
            j++;
        }
        else if(j==2)
        {
            if(d[i]==0);
            else
                printf("%s",s4[d[i]]);
            j++;
        }
    }
    return 0;
}

int change4(int sum) //判断负数
{
    if(sum<0)
    {
        printf("负");
        sum=abs(sum);
        change3(sum);
    }
    else
        change3(sum);
    return 0;
}

//计算
int cal(char op[],int num,int sum)
{
    if(strcmp(op,s6[0])!=0)
        sum-=num;
    else
        sum+=num;
    return sum;
}

//看看
void judge1(char a[])//看看 “字符串”
{
    char m[20]={"\0"};
    char n[20]={"\0"};
    if(strcmp(strncpy(n,a,1),s9[0])==0)
        strncpy(m,a+1,strlen(a)-2);
    else if(strcmp(strncpy(n,a,2),s9[1])==0)
        strncpy(m,a+2,strlen(a)-4);
    else
        strcpy(m,a);
    printf("%s\n",m);
}

//如果
void judge2(char b[],char c1[],char c2[],int sum,int num,char c[])  
{
    if(strcmp(b,s3[0])==0) //大于
    {
        if(sum>num)
            judge1(c1);
        else
            judge1(c2);
    }       
    else if(strcmp(b,s3[1])==0)  //小于
    {
        if(sum<num)
            judge1(c1);
        else
            judge1(c2);
    }
    else if(strcmp(b,s3[2])==0)  //等于
    {
        if(sum=num)
            judge1(c1);
        else
            judge1(c2);
    }
}

4、测试样例

样例1
输入:

整数 气温 等于 十
气温 减少 三
气温 增加 二
看看 气温
如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”

输出:

样例2
输入:

整数 小杨年龄 等于 八
整数 小杨零花钱 等于 二
小杨年龄 增加 一
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
看看 小杨零花钱

输出:

样例3
输入:

整数 钱包 等于 零
钱包 增加 四
钱包 减少 四
看看 “钱包”
看看 钱包 

输出:

posted @ 2020-02-08 22:58  Qiiiii  阅读(477)  评论(0编辑  收藏