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

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

1、时间记录

  • 代码行数:383行
  • 需求分析时间:大约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,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=i+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 || d[i]==1);
            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
#include
#include
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[10],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=1,flag1=0,j=0,flag2=0;

    printf("请输入要求:\n");
    scanf("%s %s %s %s",&type,&b[0],&same,&n);//整数 气温 等于 十
    a[0]=change2(n);
    while(scanf("%s",&a1)!=EOF)
    {
        if(strcmp(a1,s1[0])==0)//判断是否为整数
        {
            scanf("%s %s %s",&b[i],&same,&n);
            a[i]=change2(n);
            i++;
        }
        else if(strcmp(a1,s5[0])==0) //看看
        {
            scanf("%s",&a5);
            for(j=0;jnum)
                            {
                                for(int k=0;k100) //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 || d[i]==1);
            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

4、测试样例

样例1
输入:

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

输出:
第一次个人编程作业(汉字编程)_第1张图片

样例2
输入:

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

输出:
第一次个人编程作业(汉字编程)_第2张图片

样例3
输入:

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

输出:
第一次个人编程作业(汉字编程)_第3张图片

你可能感兴趣的:(第一次个人编程作业(汉字编程))