L1-064 估值一亿的AI核心代码

AI.jpg

以上图片来自新浪微博。

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;
  • 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
  • 把原文中所有大写英文字母变成小写,除了 I
  • 把原文中所有独立的 can youcould you 对应地换成 I canI 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;
}
  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]、\[2\]和\[3\]的描述,题目中的L1-030 一帮一是一个关于班级学生性别和姓名的问题。题目要求输入一个正偶数N表示全班学生的人数,然后按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串)。题目保证本班男女比例是1:1,并且没有并列名次。输出格式未给出具体要求。 因此,题目要求我们根据输入的学生信息,进行相应的处理,但没有明确要求输出什么内容。可能的处理方式包括统计男女人数、按照一帮一的规则进行分组等。具体的处理方式需要根据题目要求进行进一步的分析和实现。 #### 引用[.reference_title] - *1* [PTA L1-030 一帮一(详解)](https://blog.csdn.net/weixin_73142957/article/details/128861748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [L1-030 一帮一 (15分) 详解笔记](https://blog.csdn.net/qq_39817609/article/details/104785567)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [L1-030 一帮一 (15分)(chen-C语言)](https://blog.csdn.net/chenmou40/article/details/109289377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值