从键盘输入两个小于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和自己的思路:
首先,这段代码中存在一些语法错误和逻辑错误,需要进行修改和补充。其中比较明显的问题有:
在输入数据时,使用了gets()函数,这个函数无法清除输入缓冲区中的回车符,导致接下来的输入会出现问题。建议用scanf()函数读取字符串。
在计算表达式时,用char类型的变量接受结果,这个结果通常是ascii码,不便于后续处理。建议使用int类型接收。
在输出结果时,对于两位数及以上的数字,没有考虑到中间需要添加“and”等连接词。
在输入数据时,没有对输入的小于100的数字进行校验,可能会导致后续出现错误。
针对上述问题,我对整个程序进行了修改和完善,具体改动如下: