以上图片来自新浪微博。
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
- 无论用户说什么,首先把对方说的话在一行中原样打印出来;
- 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
- 把原文中所有大写英文字母变成小写,除了
I
; - 把原文中所有独立的
can you
、could you
对应地换成I can
、I could
—— 这里“独立”是指被空格或标点符号分隔开的单词; - 把原文中所有独立的
I
和me
换成you
; - 把原文中所有的问号
?
换成惊叹号!
; - 在一行中输出替换后的句子作为 AI 的回答。
输入格式:
输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。
输出格式:
按题面要求输出,每个 AI 的回答前要加上 AI:
和一个空格。
输入样例:
6
Hello ?
Good to chat with you
can you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know
输出样例:
Hello ?
AI: hello!
Good to chat with you
AI: good to chat with you
can you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know
C语言:
将题目中要求的修改先用函数逐步实现,最后在主函数内调用。
Judge:
定义函数Judge,参数是char类型,判断元素是否为大、小写字母或数字,是返回0不是返回1
因为此函数需要有返回值,所以定义为int类型而不是void类型
RemoveSpaces:
定义函数RemoveSpaces,参数是字符类型的数组和int类型整数,此函数用来删除多余的空格,有2种情况:
一、多余的空格在开头即a[0]为空格
内层使用if进行判断,如果a[0]为空格则用后一个元素进行覆盖即a[j]=a[j+1]即使a[0+1]成为a[0] ,再在外层嵌套for循环,如果新覆盖的a[0]仍然为空格则进行下一次循环覆盖。
二、多余的空格不在开头,在中间或者末尾即a[i]为空格
定义标记flag然后调用上面定义的Judge函数判断空格的后一个元素即a[i+1]号元素是否是大、小写字母或者数字;如果是返回的值为0,即flag=0,反之如果不是则flag=1,flag=1时说明此空格后面还有空格,或者是此空格在末尾,均是需要删除的多余空格 ;然后使用if语句判断flag的值,如果flag==1则说明需要删除,依旧使用后一个元素覆盖的方法进行处理
Tolower:
定义函数Tolower用来将大写转换成小写,tolower()函数是ctype.h标准函数库中的函数,作用是将大写字母转化为小写。
Change:
定义函数Change进行标点符号替换 。
Replace:
定义函数Replace替换并打印最终结果。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int Judge(char element)
{
if((element>='A'&&element<='Z')||(element>='a'&&element<='z')||(element>='0'&&element<='9'))
{
return 0;
}else{
return 1;
}
}
void RemoveSpaces(char a[],int len)
{
int i=0;
for(i=0;i<len;i++)
{
if(a[0]==' ')//如果空格在开头
{
int j=0;
for(j=0;j<len;j++)
{
a[j]=a[j+1];
}
}
if(a[i]==' ')//如果空格不在开头
{
int flag=0;
flag=Judge(a[i+1]);
if(flag==1)
{
int k=0;
for(k=i;k<len;k++)
{
a[k]=a[k+1];
}
i--;
}
}
}
}
void Tolower(char a[],int len)
{
int i=0;
for(i=0;i<len;i++)
{
if(a[i]!='I')
{
a[i]=tolower(a[i]);
}
}
}
/*替换并打印最终结果*/
void Replace(char a[])
{
printf("AI: ");
int i=0;
for(i=0;i<strlen(a);i++)
{//把符合题目要求的can you换成i can
if ((a[i]=='c'&&a[i+1]=='a'&&a[i+2]=='n'
&&a[i+3]==' '
&&a[i+4]=='y'&&a[i+5]=='o'&&a[i+6]=='u')
&&(i==0||a[i-1]==' ')
&&(a[i+7]==' '||a[i+7]=='\0'||Judge(a[i+7])))
{
printf("I can");
i+=6;
}
else if((a[i]=='c'&&a[i+1]=='o'&&a[i+2]=='u'&&a[i+3]=='l'&&a[i+4]=='d'
&&a[i+5] ==' '
&&a[i+6]=='y'&&a[i+7]=='o'&&a[i+8]=='u')
&&(i==0||a[i-1]==' ')&&(a[i+9]==' '|| a[i+9]=='\0'||Judge(a[i+9])))
{
printf("I could");
i+=8;
}
else if(a[i]=='I'
&&(i==0||a[i-1]==' ')&&(a[i+1]==' '||a[i+1]=='\0'||Judge(a[i+1])))
{
printf("you");
}
else if((a[i]=='m'&&a[i+1]=='e')
&&(i==0||a[i-1]==' ')&&(a[i+2]==' '||a[i+2]=='\0'||Judge(a[i+2])))
{
printf("you");
i+=1;
}
else
{
printf("%c",a[i]);
}
}
}
//标点符号替换
void Change(char a[], int len)
{
int i=0;
for(i=0;i<len;i++)
{
if(a[i]=='?')
{
a[i]='!';
}
}
}
//主函数
int main()
{
int n=0;
scanf("%d",&n);
getchar();
char a[1001]={0};
int i=0,len;
for(i=0;i<n;i++)
{
gets(a);
printf("%s\n",a);
len=strlen(a);
RemoveSpaces(a,len);
Tolower(a,len);
Change(a,len);
Replace(a);
printf("\n");
}
return 0;
}