str为一个字符序列,序列由字符0和1组成。请补充函数 fun(),该函数的功能是:查找该字符序列中0字符

题目

str为一个字符序列,序列由字符0和1组成。请补充函数 fun(),该函数的功能是:查找该字符序列中0字符连续出现的最长长度(即0字符的个数),如果有几个0字符串长度相同,只记录最后一个0字符串的相关信息。通过m和k返回最长0字符串的长度和最后0字符的下标。例如,如果输入“01001000”,结果为:0字符串最长长度为3,起始和结尾下标依次为5、7。

注意:部分源程序给出如下.

请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。

试题程序:

include<stdio.h>

include<conio.h>

define N 80

void fun (【 】)

{

int i, j=0;

int bb[N];

char *p=str;

*m=0;

*k=0;

for(i=0;i<N;i++)

bb[i]=0;

i=0;

while(*(p+i))

{

if(*(p+i)='0')

{

【 】

i++;

}

else

{

j++;

i++;

}

if (【 】)

{

*m=bb[j];

*k=i-1;

}

}

}

main()

{

char str[N];

int m,n,k;

clrscr();

printf("***input the original string

***\n");

gets(str);

printf("***The Original string ***\n");

puts(str);

fun(str,&m,&k);

printf("\nThe length of '0' is :

%d\n",m);

printf("*** The suffix of character

***\n");

printf(" %d,%d",k-m+1,k);

}

参考答案和解析
正确答案:char *strint*mint*k bb[j]++ *m=bb[j]
char *str,int*m,int*k bb[j]++ *m=bb[j] 解析:第一空:通过主函数main()对函数fun()的调用,可以知道函数的形参都是指针型,其中,第一个参数为字符型指针,后两个参数都是整型指针。第二空:数组bb[j]用来统计连续0的长度。第三空:*m中存放连续0的最长长度,当bb[j]中的数大于*m的值时,则将bb[j]赋给*m,始终保持*m中存放连续0的最长长度。
如果没有搜索结果或未解决您的问题,请直接 联系老师 获取答案。
相似问题和答案

第1题:

字符串str由数字字符‘0’和‘1’组成(长度不超过8个字符),可看作二进制数,请补充函数fun(),该函数的功能是:把str字符串转换成十进制数,结果由函数返回。例如,输入“1001”,结果输出:9。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。

试题程序:

include<stdio.h>

include<stdlib.h>

include<string.h>

int fun(char *str)

{

int n;

char *p=str;

【 】;

p++;

while (*p)

{

n=【 】;

p++;

}

return【 】;

}

main()

{

char str[9];

int i;

int n;

printf ("Enter a string made up of '0' and

'1' digital character:");

gets (str);

if (strlen(str)>8)

{

printf ("Error:string too longer!

please input again !\n\n");

exit(0);

}

for(i=0;str[i];i++)

if(str[i]<'0'||str[i]>'1')

{

printf("Error:%c not is '0'and

'1' digital character !\n\n",

str[i]);

exit(0);

}

printf("The original string:");

puts(str);

n=fun(str);

printf("\n%s is convered to decimal

number:%d\n\n",str,n);

}


正确答案:n=*p-'0' n*2+*p'0' n
n=*p-'0' n*2+*p'0' n 解析:第一空:'0'和'1'是字符串中的数字字符,为了进行数字运算,必须要将数字字符转换为数字,用数字字符减去字符'0'的ASCII码,就得到对应的数字。第二空:将二进制数转换为十进制数的算法是:以1001为例,对应的十进制数为1*23+0*22+0*2+1=2*(2*(2*1+0)+0)+1=9。明白了这一算法,此空就非常容易了。第三空:最后计算的结果存放在变量n中,所以函数的返回值为n。

第2题:

请补充函数fun(),该函数的功能是:把字符下标能铍2或3整除的字符从字符串str中删除,把剩余的字符重新保存在字符串str中。字符串str从键盘输入,其长度作为参数传入函数fun()。

例如,输入“abcdefghijk”,输出“bfh”。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。

试题程序:

include <stdio.h>

define N 80

void fun(char s[], int n)

{

int i, k;

【 】;

for(i=0; i<n; i++)

{

s[k++]=s[i];

if(【 】)

k--;

}

【 】;

}

main()

{

int i=0,strlen=0;

char str[N];

clrscr();

printf("\nInput a string:\n");

gets(str);

while(str[i]!='\0')

{

strlen++;

i++;

}

fun(str,strlen);

printf('\n*** display string ***\n");

puts(str);

}


正确答案:k=0 (i%2==0)||(i%3==0 s[k]='\0'
k=0 (i%2==0)||(i%3==0 s[k]='\0' 解析:第一空;变量k声明时没有初始化,所以在使用前要对它初始化。因为k用作字符数组的下标,所以初始化为 0。第二空:如果当前字符的下标能被2或3整除,则不保存这个字符。第三空:将所有字符下标能被2或3整除的字符从字符串中删除后,在字符串的最后还要加上结束标记符'\0'。

第3题:

str是全部由小写字母字符和空格字符组成的字符串,由 num传入字符串的长度。请补充函数fun(),该函数的功能是:统计字符串str中的单词个数,结果由变量num传回。每个单词之间都由空格隔开,并且字符串str开始不存在空格。

例如:str=“how do you do”,结果为:num=4。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。

试题程序:

include <stdio.h>

define N 80

void fun(char *s,int *num)

{

int i,n=0;

for(i=0;【 】;i++)

{

if(s[i]>='a',&&s[i]<='z',&&(s[i+1)==’’||s[i+1]=='\0'))

【 】;

}

【 】;

}

main()

{

char str[N];

int num=0;

printf("Enter a string:\n");

gets(str);

while(str[num])

num++;

fun(str,&num);

printf("The number of word is:

%d\n\n",num);


正确答案:i*num n++ *num=n
i*num n++ *num=n 解析:第一空:*num传入字符串的长度,所以for循环中变量i的变化范围是从0到*num-1。第二空:如果当前判断的字符是小写字母,并且它的下一个字符是空格或者是字符串结束标记符,则表示当前字符是一个单词的最后一个字母,统计单词数的变量n要加上1。第三空:题目要求结果由变量num传回,所以要将n的值赋给指针num所指的单元。

第4题:

以下函数fun的功能是返回str所指字符串中以形参c中字符开头的后续字符串的首地址,例如,str所指字符串为Hello!,c中的字符为e,则函数返回字符串ello!的首地址。若str所指字符串为空或不包含c中的字符,则函数返回NULL,请填空。char *fun(char *str,char c){ int n=0; char *p=str; if(p!=NULL) while(p[n]!=c&&p[n]!=’\0’) n++; if(p[n]==’\0’) return NULL; return();}


正确答案:p+n
在本题中,函数fun的功能是返回str所指字符串中以形参c中字符开头的后续字符串的首地址。
在本题的程序中,fun函数带有两个形参,其中一个是指针str,它指向字符串的首地址,另一个是字符变量c。程序首先定义了一个整型变量n,从程序中可知,它是字符串str中参数c相对于首地址的偏移量,然后定义了一个指针变量p,指向字符串str的首地址,然后执行条件语句,如果字符串不为空,则执行循环语句,循环结束的条件是要么字符串结束,要么找到形参c中对应的字符。根据循环结束的条件我们可以判断,其非死循环,循环结束后,从程序中可以看出,判断循环结束的原因是否因为字符串结束而结束的,如果是,说明没找到形参c中对应的字符,返回NULL。
如果不是,则说明是因为找到了形参c中对应的字符而结束循环的。根据题目要求,需要返回以形参c中字符开头的后续字符串的首地址,而这时以形参c中字符开头的后续字符串的首地址为p+n。

第5题:

阅读下列函数说明和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);

}

}


正确答案:(1)*pi==*pj (2)pipj或 *pi != * pj及其等价形式 (3)str[i]==del (4)str[j] (5)i=j+1
(1)*pi==*pj (2)pipj或 *pi != * pj,及其等价形式 (3)str[i]==del (4)str[j] (5)i=j+1 解析:[函数2.1]
若一个字符串顺读和倒读都一样,称该字符串是回文字符串。如果使用数组s[n]来存储一个字符串,则根据这个定义,要判断一个串是否是回文字符串,需要循环比较:
(1)该字符串的第一个元素s[0]和最后一个元素s[n-1]比较,如果s[0]不等于 s[n-1],则s不是回文字符串。
(2)如果s[0]等于s[n-1],则第二个元素s[1]和倒数第二个元素s[n-2]比较,如果s[1]不等于s[n-2],则s不是回文字符串。
(3)依次类推,直到最中间的2个元素也比较完毕(如果s有偶数个元素),或者只剩下中间的1个元素(如果s有奇数个元素)。
当上述循环结束时,如果最中间的元素没有进行比较,就说明s不是回文字符串,如果进行了比较,则s是回文字符串。
在函数2.1中,pi和pj是2个指向字符的指针,程序首先将s的首地址赋给pi(即 pi=&a[0]),将元素s[strlen(s)-1)的地址赋给pj(即pj=&s[strlen(s)-1]),当pipj并且pi和pj所指向的字符相等时进行循环:pi自增,pj自减。
退出循环后,如果pipj,则s是回文字符串(如果s有偶数个元素,则为pi>pj,如果 s有奇数个元素,则为pi=pj);如果pipj,则s不是回文字符串。
[函数2.2]
由函数2.2说明可知,此函数对给定的字符串进行从左至右的扫描,找出不包含标志字符的子字符串。
在函数2.2中,i的初值为0,len表示字符串的长度。当ilen时进行循环:如果当前字符是标志字符,则不做处理,继续扫描以处理标志字符连成一串的情况。当退出该循环时,当前字符str[i]不是标志字符,这时开始寻找从str[i]开始,直到标志字符出现的一个子字符串(i保持不变,用j标记寻找的过程),给找到的字符序列置字符串结束标志,以便于后面语句的输出。
输出语句结束后,就要继续寻找后面的不包含标志字符的子字符串,这时需要把指针 i移动j的后面,继续扫描。

第6题:

str为一个字符序列。请补充函数fun(),该函数的功能是:查找str中值为x的元素,返回该字符序列中值为x的元素个数,并把这些值为x的元素下标依次保存在数组bb中。例如,在“abcdefahij”中查找‘a’,结果为:2个‘a’,下标依次为 0、6。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。

试题程序:

include<stdio.h>

include<conio.h>

define N 20

int bb[N];

int fun(char *str,char ch)

{

int i=0, n=0;

char t=ch;

char *p=str;

while(*p)

{

if (【 】)

【 】;

p++;

i++;

}

return【 】;

}

main()

{

char str[N];

char ch;

int i, j,n;

clrscr();

printf("***Input the original string

***\n");

gets(str);

printf("***The Original ***\n");

puts(str);

printf("***Input character ***\n");

scanf("%c",&ch);

n=fun(str,ch);

printf("\nThe numbr of character is:

%d\n", n);

printf{"***The suffix of character

***\n");

for(i=0;i<n;i++)

printf("%d ",bb[i]);

}


正确答案:*p==t bb[n++]=I n
*p==t bb[n++]=I n 解析:第一空:通过指针p的移动来依次访问字符串的各个字符,如果指针p所指的字符等于待查找的字符,即表示找到了满足条件的字符。第二空:将找到的字符在字符数组中的下标值保存在数组bb中。第三空:变量n记录在字符串中找到待查找字符的个数。由main函数的调用可知函数fun()的返回值为n。

第7题:

请补充函数fun(),该函数的功能是:把字符下标为非素数的字符从字符串sb中删除,把字符下标为素数的字符重新保存在字符串e口中。字符串sb从键盘输入,其长度作为参数传入函数fun()。

例如,输入“abcdefghijkl”,输出“cdfhl”。

注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。

试题程序:

include <stdio.h>

define N 80

void fun(char s[],int n)

{

int i, j, k, flag;

【 】;

for(i=0; i<n; i++)

{

if (i>1)

s [k++] =s [i];

flag=I;

for(【 】; j<i&&flag; j++)

if (i%j==0)

{

flag=0;

【 】

}

}

s [k]='\0';

}

main()

{

int i=0, strlen=0;

char str[N];

clrscr ();

printf("\n Input a string:\n");

gets (str);

while (str [i] !='\0')

{

strlen++;

i++;

}

fun (str, strlen);

printf("\n*** display string ***\n");

puts (str);

}


正确答案:k=0 j=2 k--
k=0 j=2 k-- 解析:第一空:变量k声明时没有初始化,所以要在使用前初始化为0。第二空:如果一个数能被除了1和其自身之外的数整除,即余数为0,则这个数不是素数。所以除数j从2开始取数。第三空:如果当前字符的下标为非素数,则应将此字符删除,所以变量k减1,使下一个字符覆盖它,达到删除的目的。

第8题:

阅读下列函数说明和C函数,将应填入(n)处的字句写在对应栏内。

【函数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);

}

}


正确答案:(1)*pi==*pj (2)pipj或者等价表达式 (3)str[i]==del (4)str[j] (5)i=j+1
(1)*pi==*pj (2)pipj或者等价表达式 (3)str[i]==del (4)str[j] (5)i=j+1 解析:(1)指针pi从左往右移动,指针pj从右往左移动,每移动一次,判断二者指向的元素是否相等,所以此处应填入判断语句*pi= =*pj。(2)pi如果能移动到pj右面,说明字符串是回文字符串,否则返回-1,所以此处应填入pipj或者其他等价表达式。(3)此处表达式判断当前字符是否等于标志字符del,即填入str[i]==del。(4)此处表达式为符合要求的字符串置结束标志,此时j已指向最后,所以应填入str[j]即可。(5)此处语句是修改i指针进行下一次循环,所以应填入i=j+1。

第9题:

以下函数 fun 的功能是返回 str 所指字符串中以形参 c 中字符开头的后续字符串的首地址 , 例如 : st r所指字符串为 : Hello! , c 中的字符为 e ,则函数返回字符串 : ello! 的首地址。若 str 所指字符串为空串或不包含 c 中的字符,则函数返回 NULL 。请填空。

char *fun(char *str,char c)

{ int n=0; char *p=str;

if(p!=NULL)

while(p[n]!=c&&p[n]!='\0') n++;

if(p[n]=='\0') return NULL;

return( 【 1 2 】 );

}


正确答案:
(12) 【 12 】 p+n
解析 : n++ 到一定数值 , 就找到所指的字符 , 返回 c 的地址。