友友们,下面代码怎么错了。。

从键盘输入两个小于100的整数A和B,计算A与B两数的基本算数运算。需要注意的是:A和B的每一位数位上的数字由对应的英文单词给出。系统要求:(1)系统由菜单做导航,给出输入数据功能、退出程序功能、数据输入功能并能够循环输入执行运算等。(2)在数据运算输入功能菜单下分别给出A与B的相加运算、A与B的相乘运算、A与B的相减运算、A与B的相除运算、A与B的相除取于运算等功能。(3)当A输入为zero,同时B输入为zero时自动返回菜单上一级。输入样例:

one + two =

three four + five six =

zero seven + eight nine =

zero + zero =

输出样例:

one + two = threethree

four + five six = nine zero

zero seven + eight nine = nine six

 

#include <stdio.h>

#include <string.h>

char a[50][50]; //定义每个测试用例可以有50个字符

char example[10][6] = {"zero","one","two","three","four","five","six","seven","eight","nine"};

int val[50];

 

void StringBracket(char *str)//删除空格

{

    int i,j,len;

 

    len=strlen(str);

    j=0;

    for(i=0; i<len; i++)

    {

        if(str[i]!=' ')

        {

            str[j]=str[i];

            j=j+1;

        }

    }

    str[j]='\0';

}

 

char calculate(char *str,int m) //计算每个表达式的值

{

    int i,j,len,result;

    int a1=0,a2=-1,b1=0,b2=-1;//每个表达式最多有4个整数

    char str1[20],str2[20];//分解为两个字符串

    char stra1[10],stra2[10]={0},strb1[10],strb2[10]={0};//每个字符串最多分解为两个子串

 

    len=strlen(str);

    for(i=0; i<len; i++)

    {

        str1[i]=str[i];

        if(str[i]=='+')

        {

            str1[i]='\0';

            for(j=i+1; j<len; j++)

                str2[j-i-1]=str[j];

            str2[len-i-2]='\0';

            break;

        }

    }

 

    len=strlen(str1);

    for(i=0; i<len; i++)

        {

                stra1[i]=str1[i];

                if(str1[i]==' ')

                {   

                    stra1[i]='\0';

                    for(j=i+1; j<len; j++)

                        stra2[j-i-1]=str1[j];

                    stra2[len-i-1]='\0';

                    break;

                }

        }

    len=strlen(str2);

    for(i=0; i<len; i++)

    {

        strb1[i]=str2[i];

        if(i!=0 && str2[i]==' ') //i>1表示不考虑前面的空格

        {

            strb1[i]='\0';

            for(j=i+1; j<len; j++)

                strb2[j-i-1]=str2[j];

            strb2[len-i-1]='\0';

            break;

        }

    }

    StringBracket(stra1);

    StringBracket(stra2);

    StringBracket(strb1);

    StringBracket(strb2);

    for(i=0; i<10; i++)

    {

        if(strcmp(stra1,example[i])==0) a1=i;

        if(strcmp(stra2,example[i])==0) a2=i;

        if(strcmp(strb1,example[i])==0) b1=i;

        if(strcmp(strb2,example[i])==0) b2=i;

    }

    if(a2>=0) a1=a1*10+a2; //a2初始化为-1,>=0表示为两位数

    if(b2>=0) b1=b1*10+b2;

 

    if(m==1)

    result=a1+b1;

    else if(m==2)

    result=a1*b1;

    else if(m==3)

    result=(int)a1/b1;

    else if(m==4)

    result=a1%b1;

 

    return result;

}

 

 

int main()

{

    int answer;

    int i,n=0,m;

 

    printf("input style:\n");

    scanf("%d",&m);

    printf("Please input numbers:\n");

    while(1)

    {

    gets(a[n]);

    val[n]=calculate(a[n],m);

    if(val[n]==0) 

        break;

    n++;

    if(n>=50) 

        break;

    }

    printf("output:\n");

    for(i=0;i<n;i++)

    {

        if(val[i]!=0)

            printf("%s ",a[i]);

        answer = val[i];

        if(0==answer/10) printf("%s\n",example[answer]);

        else if(0==answer/100) printf("%s %s\n",example[answer/10],example[answer%10]);

        else printf("%s %s %s\n",example[answer/100],example[answer/10%10],example[answer%10]);

    }

return 0;

}

参考GPT和自己的思路:

首先,这段代码中存在一些语法错误和逻辑错误,需要进行修改和补充。其中比较明显的问题有:

  1. 在输入数据时,使用了gets()函数,这个函数无法清除输入缓冲区中的回车符,导致接下来的输入会出现问题。建议用scanf()函数读取字符串。

  2. 在计算表达式时,用char类型的变量接受结果,这个结果通常是ascii码,不便于后续处理。建议使用int类型接收。

  3. 在输出结果时,对于两位数及以上的数字,没有考虑到中间需要添加“and”等连接词。

  4. 在输入数据时,没有对输入的小于100的数字进行校验,可能会导致后续出现错误。

针对上述问题,我对整个程序进行了修改和完善,具体改动如下: