实验名称:实验七 字符串处理问题
实验目的:熟练掌握一些字符串问题的处理方法、熟练掌握一些字符类型函数和字符串操作函数。
实验内容:
在本地电脑中新建一个文件夹,用于存放C源程序,文件夹的名字要求是“学号姓名”,如 E:\ 1520115555张三。启动C-Free,完成如下各题。
- 问题描述:(最长子串)现在有一些英文字符组成的大小写敏感的字符串,你的任务是找到一个最长的字符串x,使得对于已经给出的字符串中的任意一个串y,x或者是y的字串,或者x中的字符反序之后得到的新字符串是y的子串。
输入:输入的第一行是一个整数t(1≤t≤10),t表示测试数据的组数。对于每一组测试数据,第一行是一个整数n(1≤n≤100),表示给出n个字符串。接下来的n行,每行给出一个长度在1~100之间的字符串。
输出:对于每一组测试数据,输出一行,给出题目中要求的字符串x的长度。
输入样例
2
3
ABCD
BCDEF
BRCD
2
rose
orchid
输出样例
2
2
- 问题描述:(字符串相等)输入两个长度小于80的字符串,串中包括大小写字母和空格,压缩掉空格并忽略大小写,判断这两个字符串是否相等。
输入:第一行是测试数据的组数n,每组测试数据占2行,第1行是第一个字符串s1,第2行是第二个字符串s2。每组测试数据之间有一个空行,每行数据不超过80个字符(注意字符串长度可能为0)。
输出:n行,相等则输出YES,否则输出NO。
输入样例
3
a A bb BB ccc CCC
Aa BBbb CCCccc
a dfadf fasdf
adasddfsfsaf
输出样例
YES
YES
NO
- 问题描述:(统计字符数)判断一个由a~z这26个字符组成的字符串中哪个字符出现的次数最多。
输入:第1行是测试数据的组数n(n≤10),每组测试数据占1行,是一个由a~z这26个字符组成的字符串,每行数据不超过80个字符且非空。
输出:输出n行,每行输出对应一个输入。一行输出包括出现次数最多的字符和该字符出现的次数,中间是一个空格。如果有多个字符出现的次数相同且最多,那么输出ASCII码最小的那个字符。
输入样例
2
abbccc
adfadffasdf
输出样例
c 3
f 4
- 问题描述:(密码)有一种密码的工作原理是:首先选择一个单词作为密钥,如TRAILBLAZERS,如果单词中有重复字母,则只保留第1个,其余丢弃。现在修改过的那个单词列于字母表下面,如下所示:
A B C D E F G H I J K L M O P Q R S T U V W X Y Z
TRAILBZES
然后,用字母表中没有出现的字母将密钥填充完整,得到:
A B C D E F G H I J K L M O P Q R S T U V W X Y Z
TRAILBZES C D F G H J K M N O P Q U V W X Y
对信息加密时,将原文中的所有字母,按以上对应关系——用密钥的字母取代,因此使用这个密钥就可以对原文信息进行加密。同样,也可以使用这个密钥进行解密。
输入:输入有多组,每组数据的第1行为一个整数0、1、2,1表示加密;2表示解密;0表示结束,并且不需处理。若第1行为1或2,则第2行为密钥单词,第3行为进行加解密的原文或密文。其中密钥单词长度不超过15个字符,原文长度在200个字符以内。
输出:根据加密或解密的要求和密钥,输出加密或解密的密文或原文。
输入样例
1
TRAILBLAZERS
ATTACK AT DAWN
2
TRAILBLAZERS
TPPTAD TP ITVH
0
输出样例
TPPTAD TP ITVH
ATTACK AT DAWN
实验结果与分析(运行界面截图,打开需要截的图,按ALT+PrintScreen后,将光标移到下面,单击右键后选择“粘贴”):
1.
(Ⅰ)程序代码及注释
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char str[100][101],minstr[101],substr[101],revsubstr[101]; unsigned int i,j,t,m,n,substrlen,found,minlen; scanf("%d",&t); while(t--) { scanf("%d",&n); minlen=101; for(i=0;i<n;i++) { scanf("%s",str[i]); if(strlen(str[i])<minlen) { minlen=strlen(str[i]); m=i; } } strcpy(minstr,str[m]); substrlen=minlen; while(substrlen>0) { for(i=0;i<=minlen-substrlen;i++) { strncpy(substr,minstr+i,substrlen); substr[substrlen]='\0'; strncpy(revsubstr,minstr+i,substrlen); revsubstr[substrlen]='\0'; strrev(revsubstr); found=1; for(j=0;j<n;j++) { if(strstr(str[j],substr)==NULL&&\ strstr(str[j],revsubstr)==NULL) { found=0; break; } } if(found)break; } if(found)break; substrlen--; } printf("%d\n",substrlen); } } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
2.
(Ⅰ)程序代码及注释
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char s1[81],s2[81],str[81]; unsigned int i,j,t,fg; scanf("%d",&t); gets(s1); while(t--) { gets(s1); gets(s2); gets(str); strupr(s1); strupr(s2); i=j=0; fg=1; while(s1[i]&&s2[j]) { while(s1[i]&&(s1[i]<'A'||s1[i]>'Z')) i++; while(s2[j]&&(s2[j]<'A'||s2[j]>'Z')) j++; if(s1[i]!=s2[j]) { fg=0; break; } if(s1[i]==0||s2[j]==0) break; i++; j++; } if(fg) printf("YES\n"); else printf("NO\n"); } } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
3.
(Ⅰ)程序代码及注释
#include <stdio.h> int main(int argc, char *argv[]) { char str[81]; int count[26],i,k,n; scanf("%d",&n); while(n-->0) { scanf("%s",str); for(i=0;i<26;i++) count[i]=0; i=0; while(str[i]!='\0') { count[str[i]-'a']++; i++; } k=0; for(i=1;i<26;i++) if(count[i]>count[k])k=i; printf("%c %d\n",'a'+k,count[k]); } } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
4.
(Ⅰ)程序代码及注释
#include <stdio.h> #include <string.h> #include <ctype.h> int prepare_key(char *key) { int i,k,len,f[26]; len=strlen(key); for(i=0;i<len;i++) if(!isalpha(key[i])) return(0); strupr(key); for(i=0;i<26;i++) f[i]=0; for(i=0;i<len;i++) f[key[i]-'A']++; for(k=0,i=0;i<len;i++) { if(f[key[i]-'A']>0) { key[k++]=key[i]; f[key[i]-'A']=-1; } } i=0; while(k<26) { if(f[i]==-1) { i++; continue; } key[k]=i+'A'; k++; i++; } key[26]='\0'; return(1); } void encrypt(char *data,char const *key)//加密 { int i,len; len=strlen(data); for(i=0;i<len;i++) { if(isalpha(data[i])) { if(isupper(data[i])) data[i]=key[data[i]-'A']; else data[i]=key[data[i]-'a']+'a'-'A'; } } } void decrypt(char *data,char const *key)//解密 { int i,len,p[26]; for(i=0;i<26;i++) p[key[i]-'A']=i; len=strlen(data); for(i=0;i<len;i++) { if(isalpha(data[i])) { if(isupper(data[i])) data[i]=p[data[i]-'A']+'A'; else data[i]=p[data[i]-'a']+'a'; } } } int main(int argc, char *argv[]) { char keyword[27],str[200]; int k; while(1) { scanf("%d",&k); getchar(); if(k==0)break; gets(keyword); if(!prepare_key(keyword)) { printf("ERROR!\n"); break; } gets(str); if(k==1) encrypt(str,keyword); else decrypt(str,keyword); printf("%s\n",str); } } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析