赞
踩
用C语言实现,具体思路是:先将输入的字符串装入数组,然后将不规则的字符串规范化(即将输入的不规则的字符串转换成日常英语的书写的规范一致),然后通过遍历,将一般的字符直接输出(例如数字,空格和非转换的字符),将特别的字符转换成想要的字符进行输出。
- #include<stdio.h>
- #include<string.h>
- #define N 1300
- int main(){
- int i,j,k,n,x;
- char a[N],b[N];
- char arr1[]="can you",arr2[]="could you";
- scanf("%d",&n);
- getchar();
- for(i=0;i<n;i++){
- gets(a);
- puts(a);
- printf("AI: ");
- j=0;k=0;
- //将输入的字符串规范化
- while(a[j]!='\0'){
- //将非空格字符串读入
- if(a[j]!=' '){
- //将非I的大写字符转换成相应小写字符
- if(a[j]>='A'&&a[j]<='Z'&&a[j]!='I'){
- b[k]=a[j]+32;
- k++;
- }else if(a[j]=='?'){ //将?号转换成!号
- b[k]='!';
- k++;
- }else{ //小写字符直接添加
- b[k]=a[j];
- k++;
- }
- j++;
- }else{ //消除多余的空格字符
- if(j==0){
- while(a[++j]==' '); //消除开头的空格字符
- }else{
- while(a[++j]==' ');
- if((a[j]>='a'&&a[j]<='z')||(a[j]>='A'&&a[j]<='Z')||(a[j]>='0'&&a[j]<='9')){
- b[k]=' '; //将字符之间的多个空格字符变成一个字符
- k++;
- }else continue; //消除标点符号前和结尾多余的空格字符
- }
- }
- }
- b[k]='\0';
- x=0;
- //将得到的规范化字符串进行遍历输出
- while(b[x]!='\0'){
- if(b[x]!='c'&&b[x]!='I'&&b[x]!='m'){
- printf("%c",b[x]); //将一般字符直接输出
- x++;
- }else{ //对特殊字符进行判断
- if(b[x]=='I'){
- if(x!=0){ //特殊字符不在开头
- if((b[x-1]>='0'&&b[x-1]<='9')||(b[x-1]>='A'&&b[x-1]<='Z')||(b[x-1]>='a'&&b[x-1]<='z')||(b[x+1]>='0'&&b[x+1]<='9')||(b[x+1]>='A'&&b[x+1]<='Z')||(b[x+1]>='a'&&b[x+1]<='z')){ //判断是否是独立的特殊字符I
- printf("%c",b[x]);
- x++; //不是特殊字符直接输出
- }else{
- printf("you"); //是特殊字符转换输出
- x++;
- }
- }else{ //特殊字符在开头
- if((b[x+1]>='0'&&b[x+1]<='9')||(b[x+1]>='A'&&b[x+1]<='Z')||(b[x+1]>='a'&&b[x+1]<='z')){ //判断是否是独立的特殊字符I
- printf("%c",b[x]);
- x++; //不是特殊字符直接输出
- }else{
- printf("you");
- x++; //是特殊字符转换输出
- }
- }
- }else if(b[x]=='m'){
- if(b[x+1]=='e'){
- if(x!=0){ //特殊字符不在开头
- if((b[x-1]>='0'&&b[x-1]<='9')||(b[x-1]>='A'&&b[x-1]<='Z')||(b[x-1]>='a'&&b[x-1]<='z')||(b[x+2]>='0'&&b[x+2]<='9')||(b[x+2]>='A'&&b[x+2]<='Z')||(b[x+2]>='a'&&b[x+2]<='z')){ //判断是否是独立的特殊字符me
- printf("%c",b[x]); //直接输出
- x++;
- }else{
- printf("you"); //转换输出
- x=x+2;
- }
- }else{ //特殊字符在开头
- if((b[x+2]>='0'&&b[x+2]<='9')||(b[x+2]>='A'&&b[x+2]<='Z')||(b[x+2]>='a'&&b[x+2]<='z')){ //判断是否是独立的特殊字符me
- printf("%c",b[x]); //直接输出
- x++;
- }else{
- printf("you"); //转换输出
- x=x+2;
- }
- }
- }else{ //不是特殊字符,直接输出
- printf("%c",b[x]);
- x++;
- }
- }else if(b[x]=='c'){
- if(strstr(b+x,arr1)-(b+x)==0){
- if(x!=0){ //特殊字符不在开头
- if((b[x-1]>='0'&&b[x-1]<='9')||(b[x-1]>='A'&&b[x-1]<='Z')||(b[x-1]>='a'&&b[x-1]<='z')||(b[x+7]>='0'&&b[x+7]<='9')||(b[x+7]>='A'&&b[x+7]<='Z')||(b[x+7]>='a'&&b[x+7]<='z')){ //判断是否是独立的特殊字符can you
- printf("%c",b[x]); //直接输出
- x++;
- }else{
- printf("I can"); //转换输出
- x=x+7;
- }
- }else{ //特殊字符在开头
- if((b[x+7]>='0'&&b[x+7]<='9')||(b[x+7]>='A'&&b[x+7]<='Z')||(b[x+7]>='a'&&b[x+7]<='z')){ //判断是否是独立的特殊字符can you
- printf("%c",b[x]); //直接输出
- x++;
- }else{
- printf("I can"); //转换输出
- x=x+7;
- }
- }
- }else if(strstr(b+x,arr2)-(b+x)==0){
- if(x!=0){ //特殊字符不在开头
- if((b[x-1]>='0'&&b[x-1]<='9')||(b[x-1]>='A'&&b[x-1]<='Z')||(b[x-1]>='a'&&b[x-1]<='z')||(b[x+9]>='0'&&b[x+9]<='9')||(b[x+9]>='A'&&b[x+9]<='Z')||(b[x+9]>='a'&&b[x+9]<='z')){ //判断是否是独立的特殊字符could you
- printf("%c",b[x]); //直接输出
- x++;
- }else{
- printf("I could"); //转换输出
- x=x+9;
- }
- }else{ //特殊字符在开头
- if((b[x+9]>='0'&&b[x+9]<='9')||(b[x+9]>='A'&&b[x+9]<='Z')||(b[x+9]>='a'&&b[x+9]<='z')){ //判断是否是独立的特殊字符could you
- printf("%c",b[x]); //直接输出
- x++;
- }else{
- printf("I could"); //转换输出
- x=x+9;
- }
- }
- }else{
- printf("%c",b[x]); //不是特殊字符,直接输出
- x++;
- }
- }
- }
- }
- printf("\n");
- }
- return 0;
- }
总而言之,处理过程及其繁琐,究其原因是C语言对字符串类型的数据的处理内置函数非常的少,因此不建议用C语言处理这道题,用C++处理会方便很多,下面的链接是用C++语言进行处理的,处理过程非常的简便,有兴趣可以参考一下。(30条消息) pta L1-064 估值一亿的AI核心代码_Dream.Luffy的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。