第1题:
函数String(n,字符串)的功能是( )。
A.把数值型数据转换为字符串
B.返回由n个字符组成的字符串
C.从字符串中取出n个字符
D.从字符串中第n个字符的位置开始取子字符串
第2题:
阅读以下技术说明和流程图,根据要求回答问题1至问题3。
[说明]
图4-8的流程图所描述的算法功能是将给定的原字符串中的所有前部空白和尾部空白都删除,但保留非空字符。例如,原字符串“ FileName ”,处理变成“File Name”。图4-9、图4-10和图4-11分别详细描述了图4-8流程图中的处理框A、B、C。
假设原字符串中的各个字符依次存放在字符数组ch的各元素ch(1)、ch(2)、…、ch(n)中,字符常量 KB表示空白字符。
图4-8所示的流程图的处理过程是:先从头开始找出该字符串中的第一个非空白字符ch(i),再从串尾开始向前找出位于最末位的非空白字符ch(j),然后将ch(i)、……、ch(j)依次送入ch(1)、ch(2)、……中。如果字符串中没有字符或全是空白字符,则输出相应的说明。
在图4-8流程图中,strlen()是取字符串长度函数。
请将图4-9、图4-10和图4-11流程图中(1)~(4)空缺处的内容填写完整。
第3题:
阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入对应栏内。
【说明】
下面流程图的功能是:在已知字符串A中查找特定字符串B,如果存在,则输出B串首字符在A串中的位置,否则输出-1。设串A由n个字符A(0),A(1),…,A(n-1)组成,串B由m个字符B(0),B(1),…,B(m-1)组成,其中n≥m>0。在串A中查找串 B的基本算法如下:从串A的首字符A(0)开始,取子串A(0)A(1)…A(m-1)与串B比较;若不同,则再取子串A(1)A(2)…A(m)与串B比较,依次类推。
例如,字符串“CABBRFFD”中存在字符子串“BRF”(输出3),不存在字符子串“RFD”(输出-1)。
在流程图中,i用于访问串A中的字符(i=0,1,…,n-1),j用于访问串B中的字符(j=0,1,…,m-1)。在比较A(i)A(i/1)…A(i+m-1)与B(0)B(1)…B(m-1)时,需要对 A(i)与B(0)、A(i+1)与B(1)、…、A(i+j)与B(j)等逐对字符进行比较。若发现不同,则需要取下一个子串进行比较,依此类推。
【流程图】
第4题:
读以下说明和流程图,回答问题将解答填入对应栏。
[说明]
下面的流程图,用来完成求字符串t在s中最右边出现的位置。其思路是:做一个循环,以s的每一位作为字符串的开头和t比较,如果两字符串的首字母是相同的,则继续比下去,如果一直到t的最后一个字符也相同,则说明在s中找到了一个字符串t;如果还没比较到t的最后一个字符,就已经出现字符串不等的情况,则放弃此次比较,开始新一轮的比较。当在s中找到一个字符串t时,不应停止寻找(因为要求的是求t在s中最右边出现位置),应先记录这个位置pos,然后开始新一轮的寻找,若还存在相同的字符串,则更新位置的记录,直到循环结束,输出最近一次保存的位置。如果s为空或不包含t,则返回-1。
注:返回值用pos表示。
[问题]
将流程图的(1)~(5)处补充完整。
第5题:
阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入对应栏内。
[说明]
下面的流程图旨在统计指定关键词在某一篇文章中出现的次数。
设这篇文章由字符A(0),…,A(n-1)依次组成,指定关键词由字符B(0),…,B(m-1)依次组成,其中,n>m≥1。注意,关键词的各次出现不允许有交叉重叠。例如,在“aaaa”中只出现两次“aa”。
该流程图采用的算法是:在字符串A中,从左到右寻找与字符串B相匹配的并且没有交叉重叠的所有子串。流程图中,i为字符串A中当前正在进行比较的动态予串首字符的下标,j为字符串B的下标,k为指定关键词出现的次数。
[流程图]
第6题:
阅读下列说明和流程图,将应填入(n)处。
[流程图说明]
流程图1-1描述了一个算法,该算法将给定的原字符串中的所有前导空白和尾部空白都删除,但保留非空字符之间的空白。例如,原字符串“ File Name ”,处理后变成“File Name”。流程图1-2、流程图1-3、流程图1-4分别详细描述了流程图1-1中的框A,B,C。
假设原字符串中的各个字符依次存放在字符数组ch的各元素ch(1),ch(2),…,ch(n)中,字符常量KB表示空白字符。
流程图1-1的处理过程是:先从头开始找出该字符串中的第一个非空白字符ch(i),再从串尾开始向前找出位于最末位的非空白字符ch(j),然后将ch(i),…,ch(j)依次送入 ch(1),ch(2),…中。如果原字符串中没有字符或全是空白字符,则输出相应的说明。在流程图中,strlen是取字符串长度函数。
[问题]在流程图1-1中,判断框P中的条件可表示为:
i>(5)
第7题:
?????? 阅读以下说明和流程图,填补流程图中的空缺(1)~(5),将解答填入答题纸的
对应栏内。
【说明】
本流程图旨在统计一本电子书中各个关键词出现的次数。假设已经对该书从头到尾
依次分离出各个关键词{A(i)li=l,…,n}(n>1)}.其中包含了很多重复项,经下面的流程
处理后,从中挑选出所有不同的关键词共m个{K(j)[j=l,…,m},而每个关键词K(j)出现的次数为NK(j).j=l,…,m。
??????
第8题:
试题一(共15 分 )
阅读以下说明和流程图,将应填入 (n) 处的字句写在答题纸的对应栏内。
【 说明 】
下面的流程图旨在统计指定关键词在某一篇文章中出现的次数。
设这篇文章由字符A(0),…,A(n-1)依次组成,指定关键词由字符B(0),…,B(m-1)依次组成,其中n>m≥1。注意,关键词的各次出现不允许有交叉重叠。例如,在“aaaa”中只出现两次“aa”。
该流程图采用的算法是:在字符串A中,从左到右寻找与字符串B相匹配的并且没有交叉重叠的所有子串。流程图中,i 为字符串 A 中当前正在进行比较的动态子串首字符的下标,j为字符串B 的下标,k为指定关键词出现的次数。
第9题:
第10题:
第11题:
第12题:
函数String(n,"str")的功能是()。
第13题:
/*写一个函数,用来返回一个字符串中重复出现的最长字串的长度及其开始地址const char*p=NULL;int len=maxsubstr("qweohiuweyowohifpw",&p);输出:len=3,substr=ohi*/#include<stdio.h>#include<string.h>int maxsubstr(const char *str,const char **p){ int len=0,templen=0;//len为字符串中重复出现的最长字串的长度,templen为判断过程中字符串中重复出现的字串的长度 int size=strlen(str); const char*i=str,*j=0; //i=str即i=str[0],i指向字符串的第一个字符 for(i=str;i<str+size;i++){ //i依次指向字符串内的各个字符 const char *temp_i=i; //temp_i指向当前i所指字符 for(j=i+1;j<str+size;++j){ //j指向当前i所指字符的下一个字符,temp_i、j依次在总字符串中取两个字符串,temp_i在前,即在temp_i后寻找 与从temp_i开始的字符串重复长度最长的字符串 if(*temp_i==*j&&templen==0){ //此处前两个if可以合并,如果所指字符相同,temp_i往后指一个字符,j在第二个循环中会自动往后指(++j) ++templen; ++temp_i; } else if(*temp_i==*j&&templen!=0){ ++templen; ++temp_i; } else{ //当前所指字符不相等,temp_i需要指回i所指位置,j指回此次循环开始位置(由于for循环有++j,实际下次循环开始时往后指了一个) if(templen>len){ //判断重复出现的最长字串的长度是否改变 len=templen; templen=0; *p=i; }else{ templen=0; //就算重复出现的最长字串的长度不改变,当前长度也得清零。。。 } } } } return len;}int main(){ char str[10000]; const char*p=0; int len=0; int i=0; printf("输入带重复字符的字符串"); scanf("%s",str); len=maxsubstr(str,&p); printf("len=%d,substr=",len); for(i=0;i<len;i++){ printf("%c",*p++); } printf("\n");}
第14题:
函数f_str(char *str,char del)的功能是;将非申字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。例如,若str的值为“66981636666257”,del的值为“6”,调用此函数后,将输出3个子字符串,分别为“981”、“3”和“257”。请将函数f_str中(6)~(8)空缺处的内容填写完整。
[函数]
void f_str(char *str,char del)
{ int i,j,len;
len = strlen(str);
i = 0;
while (i<len) {
while ( (6) )
i++; /* 忽略连续的标志字符 */
/* 寻找从srt[i]开始直到标志字符出现的一个子字符串 */
j = i+1;
while (str[j] !=del && str[j] !='\0')
j++;
(7)="\0"; /* 给找到的字符序列置字符串结束标志 */
printf (" %s\t", & str [i]);
(8);
}
}
第15题:
阅读下列函数说明和C函数,将应填入______处的语句写在答题纸的对应栏内。
[函数2.1说明]
函数palindrome(char s[])的功能是:判断字符串s是否为回文字符串,若是,则返回0,否则返回-1。若一个字符串顺读和倒读都一样,称该字符串是回文字符串,例如,“LEVEL”是回文字符串,而“LEVAL”不是。
[函数2.1]
int palindrome(char s[])
{
char *pi, *pj;
pi=s;pj=s+strlen(s)-1;
while(pi<pj&& (1) ) {
pi++;pj--;
}
if( (2) ) return-1;
else return 0;
}
[函数2.2说明]
函数f(char *str,char del)的功能是:将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。
例如,若str的值为“33123333435”,del的值为“3”,调用此函数后,将输出3个子字符串,分别为“12”,“4”和“5”。
[函数2.2]
void f(char *str,char del)
{
int i,j,len;
len=strlen(str);
i=0;
While(i<len){
While( (3) )i++; /* 忽略连续的标志字符 */
/* 寻找从str[i]开始直到标志字符出现的一个子字符串 */
j=i+1;
while(str[j]!=del &&str[j]!'\0')j++;
(4) ='\0'; /* 给找到的字符序列置字符串结束标志 */
printf("%s\t",&str[i]);
(5);
}
}
第16题:
阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。
【函数1说明】
函数palindrome(char s[])的功能是:判断字符串s是否为回文字符串。若是,则返回0,否则返回-1。若一个字符串顺读和倒读都一样时,则可称该字符串是回文字符串。例如,“LEVEL”是回文字符串,而“LEVAL”不是。
【函数1】
int palindrome(char s[]{
char *pi, *pj;
pi=s; pj=s+strlen(s)-1;
while(pi<pj&&(1)){
pi++; pj--;
}
if((2))return-1;
else return 0;
}
【函数2说明】
函数f(char *str, char del)的功能是:将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。
例如,若str的值为“33123333435”,del的值为“3”,调用此函数后,将输出三个子字符串,分别为“12”、“4”和“5”。
【函数2】
void f(char *str, char del){
int i,j, len;
len=strlen(str);
i=0;
while(i<len){
While((3)) i++; /*忽略连续的标志字符*/
/*寻找从str[i]开始直到标志字符出现的一个子字符串*/
j=i+1;
while(str[j]!=del && str[j]!='\0')j++;
(4)='\0'; /*给找到的字符序列置字符串结束标志*/
printf("%s\t",&str[i]);
(5);
}
}
第17题:
下列给定程序中函数fun的功能是:统计substr所指的字符串在str所指的字符串中出现的次数。 例如,若字符串为aaas lkaaas,子字符串为as;则应输出2。 请改正程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件MODll.C中,不得增行或删行,也不得更改的程序的结构!
第18题:
阅读下列说明和C函数,填补C函数中的空缺,将解答填入答案纸的对应栏目内。 【说明】 字符串是程序中常见的一种处理对象,在字符串中进行子串的定位、插入和删除是常见的运算。 设存储字符串时不设置结束标志,而是另行说明串的长度,因此串类型定义如下: typedef struct ﹛ Char *str; //字符串存储空间的起始地址 int length; //字符串长 int capacity; //存储空间的容量 ﹜SString;
【函数1说明】 函数indexStr(S,T,pos)的功能是:在S 所表示的字符串中,从下标pos开始查找T所表示字符串首次出现的位置。方法是:第一趟从S中下标为pos、T中下标伟0的字符开始,从左往右逐个对于来比较S和T的字符,直到遇到不同的字符或者到达T的末尾。若到达T的末尾,则本趟匹配的起始下标pos为T出现的位置,结束查找;若遇到了不同的字符,则本趟匹配失效。下一趟从S中下标pos+1处的字符开始,重复以上过程。若在S中找到T,则返回其首次出现的位置,否则返回-1。 例如,若S中的字符为伟”students ents”,T中的字符串伟”ent",pos=0,则T在S中首次出现的位置为4。 【C函数1】 int index Str(SString S ,SString T,int pos) ﹛ int i,j: i (S.length<1||T.length<1||pos+T.length-1) return-1; for(i=pos,j=0;i<S.length &&j<T.length;)﹛ if (S.str[i]==T.str[j])﹛ i++;j++; ﹜ else﹛ i=( 1 );j=0 ﹜ ﹜ if ( 2 )return i -T.length; return-1; ﹜ 【函数2说明】 函数 eraseStr(S,T}的功能是删除字符串S中所有与T相同的子串,其处理过程为: 首先从字符串 S 的第一个字符(下标为0)开始查找子串T,若找到〈得到子串在S中的起始位置),则将串 S 中子串T之后的所有字符向前移动,将子串T覆盖,从而将其删除,然后重新开始查找下一个子串T,若找到就用后面的宇符序列进行覆盖,重复上述过程,直到将S中所有的子串T删除。 例如,若字符串 S为 “12ab345abab678”、T为“ab”。第一次找到“ab”时(位置为2),将“345abab678”前移,S 中的串改为“12345abab678” ,第二次找到“ab”时(位置为 5);将“ab678”前移,S中的串改为“12345ab678”,第三次找到“ab”时(位置为5);将“678”前移 ,S中的串改为“12345678 ”。 【C函数2】 Void eraseStr(SString*S,SStringT) ﹛ int i; int pos; if (S->length<1||T.length<1||S->length<T.length) return; Pos=0; for(;;)﹛ //调用indexStr在S所表示串的pos开始查找T的位置 Pos=indexStr( 3 ); if(pos=-1) //S所表示串中不存在子串T return; for(i=pos+T.length;i<S->length;i++) //通过覆盖来删除自串T S->str[( 4 )]=S->str[i]; S->length=( 5 ); //更新S所表示串的长度 ﹜ ﹜
第19题:
阅读以下说明和C函数,填补代码中的空缺(1)~(5),将解答填入答题纸的对
应栏内。
【说明】
函数removeDuplicates(char *str)的功能是移除给定字符串中的重复字符,使每种字
符仅保留一个,其方法是:对原字符串逐个字符进行扫描,遇到重复出现的字符时,设
置标志,并将其后的非重复字符前移。例如,若str指向的字符串为“aaabbbbscbsss”,
则函数运行后该字符串为“abse”。
【c代码】
void removeDuplicates (char *str)
int i,len = strlen (str); /*求字符串长度*/
If( (l) )return;/*空串或长度为1的字符串无需处理*l
for(i=0;i<len;i++) {
Int flag =O; /*字符是否重复标志*/
int m:
for(m =( 2 ); m<len; m++){
if(str[i]==str[m] ) {
__(3)_;break;
}
}
if (flag){
Int n,idx = m;
/*字符串第idx字符之后、与str [i]不同的字符向前移*/
For( n=idx+l; n<len. n++)
if ( str[n]!= str[i]) {
str[idx]= str[n]; (4);
}
Str[(5)]=\0; /* 设置字符串结束标志*/
}
}
}
第20题:
第21题:
第22题:
第23题: