实验七 字符串处理问题

文章介绍了四个C语言编程实验,涉及字符串处理(包括最长公共子串、字符串相等判断、字符频率统计和字符串加密解密),通过实际编程任务展示了如何使用相关函数和技术解决这些问题。
摘要由CSDN通过智能技术生成

实验名称:实验七 字符串处理问题

实验目的:熟练掌握一些字符串问题的处理方法、熟练掌握一些字符类型函数和字符串操作函数。

实验内容:

在本地电脑中新建一个文件夹,用于存放C源程序,文件夹的名字要求是“学号姓名”,如 E:\ 1520115555张三。启动C-Free,完成如下各题。

  1. 问题描述:(最长子串)现在有一些英文字符组成的大小写敏感的字符串,你的任务是找到一个最长的字符串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

  1. 问题描述:(字符串相等)输入两个长度小于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

  1. 问题描述:(统计字符数)判断一个由a~z这26个字符组成的字符串中哪个字符出现的次数最多。

输入:第1行是测试数据的组数n(n≤10),每组测试数据占1行,是一个由a~z这26个字符组成的字符串,每行数据不超过80个字符且非空。

输出:输出n行,每行输出对应一个输入。一行输出包括出现次数最多的字符和该字符出现的次数,中间是一个空格。如果有多个字符出现的次数相同且最多,那么输出ASCII码最小的那个字符。

输入样例

2

abbccc

adfadffasdf

输出样例

c   3

f   4

  1. 问题描述:(密码)有一种密码的工作原理是:首先选择一个单词作为密钥,如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);

}

}

(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值