欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第四章-串-习题及答案.doc

    • 资源ID:34438075       资源大小:62KB        全文页数:10页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第四章-串-习题及答案.doc

    如有侵权,请联系网站删除,仅供学习与交流第四章-串-习题及答案【精品文档】第 10 页第四章 串 习题及答案一、基础知识题4.1 简述下列每对术语的区别:空串和空白串;串常量和串变量;主串和子串;静态分配的顺序串和动态分配的顺序串;目标串和模式串;有效位移和无效位移。4.2 假设有如下的串说明:char s130="Stocktom,CA", s230="March 5 1999", s330, *p;(1)在执行如下的每个语句后p的值是什么?p=stchr(s1,'t'); p=strchr(s2,'9'); p=strchr(s2,'6');(2)在执行下列语句后,s3的值是什么?strcpy(s3,s1); strcat(s3,","); strcat(s3,s2);(3)调用函数strcmp(s1,s2)的返回值是什么?(4)调用函数strcmp(&s15,"ton")的返回值是什么?(5)调用函数stlen(strcat(s1,s2)的返回值是什么?4.3 设T0.n-1="adaabaabcaabaa",P0.m-1="aab".当用模式串匹配目标串T时,请给出所有的有效位移。算法NaiveStrMatch(T,P)返回的位移是哪一个位移。二、算法设计题:4.4 利用C的库函数strlen,strcpy和strcat写一算法void StrInsert(char *S, char *T, int i),将串T插入到串S的第i个位置上。若i大于S的长度,则插入不执行。4.5 利用C的库函数strlen 和strcpy(或strncpy)写一算法void StrDelete(char *S,int i, int m)删去串S中从位置i开始的连续m个字符。若istrlen(S),则没有字符被删除;若i+mstrlen(S),则将S中从位置i开始直至末尾的字符均删去。4.6 以HString为存储表示,写一个求子串的算法。4.7 一个文本串可用事先给定的字母映射表进行加密。例如,设字母映射表为:a b c d e f g h i j k l m n o p q r s t u v w x y z n g z q t c o b m u h e l k p d a w x f y i v r s j 则字符串"encrypt"被加密为"tkzwsdf".试写一算法将输入的文本串进行加密后输出;另写一算法,将输入的已加密的文本串进行解密后输出。4.8 写一算法void StrReplace(char *T, char *P, char *S),将T中首次出现的子串P替换为串S。注意:S和P的长度不一定相等。可以使用已有的串操作。4.9 将NaveStrMatch改写为输出目标串中所有也模式串匹配的有效位移。*4.10 利用4.9的结果写一算法void StrReplaceAll(char *T, char *P, char *S),将T中出现的所有与P相等的不重叠子串替换为S,这里S和P的长度不一定相等。4.11 若S和T是用结点大小为1的单链表存储的两个串,试设计一个算法找出S中第一个不在T中出现的字符。答案:4.1 简述下列每对术语的区别:空串和空白串;串常量和串变量;主串和子串;静态分配的顺序串和动态分配的顺序串;目标串和模式串;有效位移和无效位移。答:空串是指不包含任何字符的串,它的长度为零。空白串是指包含一个或多个空格的串,空格也是字符。串常量是指在程序中只可引用但不可改变其值的串。串变量是可以在运行中改变其值的。主串和子串是相对的,一个串中任意个连续字符组成的串就是这个串的子串,而包含子串的串就称为主串。静态分配的顺序串是指串的存储空间是确定的,即串值空间的大小是静态的,在编译时刻就被确定。动态分配的顺序串是在编译时不分配串值空间,在运行过程中用malloc和free等函数根据需要动态地分配和释放字符数组的空间(这个空间长度由分配时确定,也是顺序存储空间)。目标串和模式串:在串匹配运算过程中,将主串称为目标串,而将需要匹配的子串称为模式串,两者是相对的。有效位移和无效位移:在串定位运算中,模式串从目标的首位开始向右位移,每一次合法位移后如果模式串与目标中相应的字符相同,则这次位移就是有效位移(也就是从此位置开始的匹配成功),反之,若有不相同的字符存在,则此次位移就是无效位移(也就是从此位置开始的匹配失败)。4、2解:(1) stchr(*s,c)函数的功能是查找字符c在串s中的位置,若找到,则返回该位置,否则返回NULL。因此:执行p=stchr(s1,'t');后p的值是指向字符t的位置, 也就是p=&s15。执行p=strchr(s2,'9');后p的值是指向s2串中第一个9所在的位置,也就是p=&s29。执行p=strchr(s2,'6');之后,p的返回值是NULL。(2)strcpy函数功能是串拷贝,strcat函数的功能是串联接。所以:在执行strcpy(s3,s1); 后,s3的值是"Stocktom,CA"在执行strcat(s3,","); 后,s3的值变成"Stocktom,Ca,"在执行完strcat(s3,s2);后,s3的值就成了"Stocktom,Ca,March 5,1999"(3) 函数strcmp(串1,串2)的功能是串比较,按串的大小进行比较,返回大于0,等于0或小于0的值以表示串1比串2 大,串1等于串2 ,串1小于串2。因此在调用函数strcmp(s1,s2)后,返回值是大于0的数(字符比较是以ascii码值相比的)(4) 首先,我们要知道&s15是一个地址,当放在函数strcmp中时,它就表示指向以它为首地址的一个字符串,所以在strcmp( &s15,"ton")中,前一个字符串值是"tom,CA",用它和"ton"比较,应该是后者更大,所以返回值是小于0的数。(5)strlen是求串长的函数,我们先将s1,s2联接起来,值是"Stocktom,CAMarch 5,1999",数一数有几个字符?是不是23个(空格也是一个)? 所以返回值是23。4、3解:所有的有效位移i的值如下:2,5,9。算法NaveStrMatch(T,P)的返回值是第一个有效位移,因此是2。二、算法设计题: 4.4 解:算法如下:void StrInsert(char *S, char *T, int i)/将串T插入到串S的第i个位置上char *Temp;Temp=(char *)malloc(sizeof(charMaxsize);/ 设置一个临时串if(i<=strlen(S)strcpy(Temp,&Si);/将第i位起以后的字符拷贝到临时串中strcpy(&Si, T);/将串T拷贝到串S的第i个位置处,覆盖后面的字符strcat(S,Temp);/把临时串中的字符联接到串S后面free( Temp );/以下提供验证程序#include "string.h"#include "stdio.h"#include "malloc.h"#define Maxsize 50/假设静态顺序串的空间长度为100void StrInsert(char *S, char *T, int i);void main()char AMaxsize="I am a boy."char BMaxsize="very cool "StrInsert( A,B,7);printf("%s",A);void StrInsert(char *S, char *T, int i)/将串T插入到串S的第i个位置上char *Temp;Temp=(char *)malloc(sizeof(charMaxsize);/ 设置一个临时串if(i<=strlen(S)strcpy(Temp,&Si);/将第i位起以后的字符拷贝到临时串中strcpy(&Si, T);/将串T拷贝到串S的第i个位置处,覆盖后面的字符strcat(S,Temp);/把临时串中的字符联接到串S后面free( Temp );/程序结束4.5 解:算法如下:void StrDelete(char *S, int i ,int m)/串删除char TempMaxsize;/定义一个临时串if(i+m<strlen(S)strcpy (Temp, &Si+m);/把删除的字符以后的字符保存到临时串中strcpy( &Si,Temp);/用临时串中的字符覆盖位置i之后的字符else if(i+m>=strlen(S)&& i<strlen(S)strcpy(&Si,"0");/把位置i的元素置为'0',表示串结束/以下是验证程序#include "string.h"#include "stdio.h"#define Maxsize 40void StrDelete(char *S,int i, int m);void main()char AMaxsize="Are you a very beautiful girl?"StrDelete( A, 40, 10);printf("n%s",A);StrDelete( A, 10,15);printf("n%s",A);StrDelete( A, 7,50);printf("n%sn",A);void StrDelete(char *S, int i ,int m)char TempMaxsize;/定义一个临时串if(i+m<strlen(S)strcpy (Temp, &Si+m);/把删除的字符以后的字符保存到临时串中strcpy( &Si,Temp);/用临时串中的字符覆盖位置i之后的字符else if(i+m>=strlen(S)&& i<strlen(S)strcpy(&Si,"0");/把位置i的元素置为'0',表示串结束4.6 解:HString 是指以动态分配顺序串为存储表示,其定义为:typedef struct char *ch;int length;HString/*要进行这个算法设计,我们考虑到字符串是以指针的形式表示的,匹配时,用双重循环来实现,外循环用于进行合法位移(即令一指针沿目标串的元素向右移位)内循环进行字符匹配(即令两指针同时沿着目标串和模式串的元素进行移动并比较。直到第一次匹配成功或最终匹配失败。*/char* StringMatch( HString *T, HString *P)/串匹配char *t, *p;int m, n;for ( m=0; m<=T->length-P->length; m+)/进行合法位移 t=&(T->chm);/指针t指向目标串的当前字符 p=&(P->ch0);/指针q指向模式串的第一个字符 for (n=0 ; n<P->length && pn=tn; n+ );/进行匹配,若有不同字符则进行下一次位移if (n=P->length)return &(T->chm);/返回第一次有效位移的地址return NULL;/匹配失败/以下是验证程序#include "stdio.h"#include <string.h>typedef struct char *ch;int length;HString;char * StringMatch( HString *T, HString *P);void main()HString A="I am your friend.",17;HString B="am",2;printf("%sn",A.ch);printf("%sn",B.ch);printf("n%s",StringMatch( &A,&B);char* StringMatch( HString *T, HString *P)/串匹配char *t, *p;int m, n;for ( m=0; m<T->length-P->length; m+)/进行合法位移 t=&(T->chm);/指针t指向目标串的当前字符 p=&(P->ch0);/指针q指向模式串的第一个字符 for (n=0 ; n<P->length && pn=tn; n+ );/进行匹配,若有不同字符则进行下一次位移if (n=P->length)return &(T->chm);/返回第一次有效位移的地址return NULL;/匹配失败4.7解:加密算法可以用两个串中字符的一一对应关系来实现,当输入一个字符时,由算法在串1中查找其位置,然后用串2中相应位置的字符去替换原来的字符就可以了。解密算法则恰恰相返。/包括含算法的测试程序如下:#include <stdio.h>#include <string.h>typedef char SeqString27;/定义串类型int StrMatch(SeqString , char);void Encrypt(SeqString, SeqString , char *);void Decipher(SeqString, SeqString ,char *);#define Maxlen 100/以下两句设置加密及解密映射表/SeqString Original="abcdefghijklmnopqrstuvwxyz"SeqString Cipher ="ngzqtcobmuhelkpdawxfyivrsj"void main( )char InMaxlen;printf("nEnter a String:(len < %d)",Maxlen);scanf("%s", &In);Encrypt(Original, Cipher, In);printf("nEnter a encrypted string:(len < %d)",Maxlen);scanf("%s",&In);Decipher(Original, Cipher,In);int StrMatch( SeqString S,char c)/串匹配(子串只有一个字符)int i;for (i=0; i< strlen(S); i+)if (c=Si) return i;/匹配成功,返回位置return NULL;/映射表中没有相应字符/以下是题目要求的算法/void Encrypt( SeqString Original, SeqString Cipher, char *T)/加密int i,m;printf("n");for (i=0; i < strlen(T); i+)m=StrMatch( Original, Ti);if(m!=NULL)Ti=Cipherm;printf("%s",T);void Decipher(SeqString Original , SeqString Cipher, char* T)/解密int i , m ;printf("n");for (i=0; i < strlen(T); i+)m=StrMatch(Cipher ,Ti);if(m!=NULL)Ti=Originalm;printf("%s",T);4.8 解:由于S和P的长度不一定相等,所以在替换时可能要移动字符元素。我们可以用到前面设计的一系列算法。/算法如下:void StrReplace (char *T, char *P, char *S)/串替换int i , m;m=strlen (P);/取得子串长度i=StrMatch(T,P);/取得串匹配位置StrDelete( T,i,m);/删除匹配处子串StrInsert( T, S,i);/将S串插入到匹配位置处4.9解:书中第56页有明显提示,只要把相应的返回语句改为打印输出就可找到所有匹配位置。改写后如下:void NaveStrMatch (SeqString T, SeqString P) int i,j,k;int m=P.lenth;/模式串长度int n=T.length;/目标串长度for (i=0; i<n-m; i+)/ 确定合法位移j=0; k=i;while(j<m&&T.chk=P.chj)k+;j+;if(j=m) printf("n%d",i);/endforprintf("Search End.");4.10 解:这个算法是具有实用性的,但是做起来比较难,简单的算法应是这样的,利用4.9的算法在串T中找到一个P的匹配成功,马上进行串替换,然后从替换后的下一个位置进行匹配,直到查找完所有的有效位移或者所有合法位移考查完毕也没有匹配成功。算法如下:void StrReplaceAll(char *T, char *P, char *S)/全部替换int i, j, k ;int m=strlen(P);/ 串P长度int n=strlen(T);/串T长度int l= strlen(S);int x=n-m;for(i=0; i<=x; i+)/合法位移j=0; k=i;while(Tk=Pj)/进行匹配k+;j+;if(j=m)/匹配成功StrDelete( T,i,m);/删除匹配处子串StrInsert( T, S,i);/将S串插入到匹配位置处i+=l; /将查找位置移到替换后的下一个字符处,避免重复替换x+=l;/endif/endfor/end/以下给出验证程序#include <stdio.h>#include <string.h>#include <malloc.h>#define Maxsize 100void StrDelete(char* , int ,int);void StrInsert(char* , char* , int );void StrReplaceAll(char* , char* , char* );void main( )/验证程序char AMaxsize="A good boy is a good comrade."char B="good"char C="very cool"printf("The original string is: %s",A);printf("n%s-%s",B,C);StrReplaceAll( A,B,C);printf("nThe new String is:%s",A);void StrDelete(char *S, int i ,int m)char TempMaxsize;/定义一个临时串if(i+m<strlen(S)strcpy (Temp, &Si+m);/把删除的字符以后的字符保存到临时串中strcpy( &Si,Temp);/用临时串中的字符覆盖位置i之后的字符else if(i+m>=strlen(S)&& i<strlen(S)strcpy(&Si,"0");/把位置i的元素置为'0',表示串结束void StrInsert(char *S, char *T, int i)/将串T插入到串S的第i个位置上char *Temp;Temp=(char *)malloc(sizeof(charMaxsize);/ 设置一个临时串if(i<=strlen(S)strcpy(Temp,&Si);/将第i位起以后的字符拷贝到临时串中strcpy(&Si, T);/将串T拷贝到串S的第i个位置处,覆盖后面的字符strcat(S,Temp);/把临时串中的字符联接到串S后面free( Temp );void StrReplaceAll(char *T, char *P, char *S)/全部替换int i, j, k ;int m=strlen(P);/ 串P长度int n=strlen(T);/串T长度int l= strlen(S);int x=n-m;for(i=0; i<=x; i+)/合法位移j=0; k=i;while(Tk=Pj)/进行匹配k+;j+;if(j=m)/匹配成功StrDelete( T,i,m);/删除匹配处子串StrInsert( T, S,i);/将S串插入到匹配位置处i+=l; /将查找位置移到替换后的下一个字符处,避免重复替换x+=l;/endif/endfor/end4.11 解:查找过程是这样的,取S中的一个字符(结点),然后和T中所有的字符一一比较,直到比完仍没有相同的字符时,查找过程结束,否则再取S中下一个字符,重新进行上述过程。算法如下:char SearchNo( LinkString S, LinkString T)/查找不在T中出现的字符LinkStrNode *p,*q;p=S;q=T;while (p)/取S中结点字符 while(q&&p->data!=q->data)/进行字符比较q=q->next;if(q=NULL)return p->data;/找到并返回字符值q=T;/指针恢复串T的开始结点p=p->next;printf("there's no such character.");return NULL; 4.11 解:查找过程是这样的,取S中的一个字符(结点),然后和T中所有的字符一一比较,直到比完仍没有相同的字符时,查找过程结束,否则再取S中下一个字符,重新进行上述过程。算法如下:char SearchNo( LinkString S, LinkString T)/查找不在T中出现的字符LinkStrNode *p,*q;p=S;q=T;while (p)/取S中结点字符 while(q&&p->data!=q->data)/进行字符比较q=q->next;if(q=NULL)return p->data;/找到并返回字符值q=T;/指针恢复串T的开始结点p=p->next;printf("there's no such character.");return NULL;

    注意事项

    本文(第四章-串-习题及答案.doc)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开