itgle.com

阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。[说明]设一个环上有编号为0~n-1的n粒颜色不尽相同的珠子(每粒珠子颜色用字母表示,n粒珠子的颜色由输入的字符串表示)。从环上的某两粒珠子间剪开,则环上珠子形成一个序列然后按以下规则从序列中取走珠子:首先从序列左端取走所有连续的同色珠子;然后从序列右端在剩下的珠子中取走所有连续的同色珠子,两者之和为该剪开处可取走珠子的粒数。在不同位置剪开,能取走的珠子也不尽相同。本程序所求的是在环上哪个位置剪开,按上述规则可取走的珠子粒数最多。程序中用数

题目

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

[说明]

设一个环上有编号为0~n-1的n粒颜色不尽相同的珠子(每粒珠子颜色用字母表示,n粒珠子的颜色由输入的字符串表示)。从环上的某两粒珠子间剪开,则环上珠子形成一个序列然后按以下规则从序列中取走珠子:首先从序列左端取走所有连续的同色珠子;然后从序列右端在剩下的珠子中取走所有连续的同色珠子,两者之和为该剪开处可取走珠子的粒数。在不同位置剪开,能取走的珠子也不尽相同。

本程序所求的是在环上哪个位置剪开,按上述规则可取走的珠子粒数最多。程序中用数组存储字符串。例如:10粒珠子颜色对应字符串为“aaabbbadcc”,在0号珠子前剪开,序列为aaabbbadcc,从左端取走3粒a色珠子,从右端取走2粒c色珠子,共取走5粒珠子。若在3号珠子前剪开,即bbbadccaaa,共取走6粒珠子。

[C函数]

int count(char*s,int start,int end)

{inti,c=0,color=s[start],step=(start>end)?-1:1;

for(i=start;s[i]==color;i+=step){

if(step>0 && i>end || (1) ) break;

(2) ;

}

return c;

}

void main()

{ char t,s[120];

int i,j,C,len,maxc,cut=0;

printf("请输入环上代表不同颜色珠子字符串:");

scanf("%s",s );

len=strlen(s);

for(i=maxc=0;i<len;i++){ /*尝试不同的剪开方式*/

c=count(s,0,len-1);

if(c<len) C+=count( (3));

if(c>maxc){cut=i;maxc=c; )

/*数组s的元素循环向左移动一个位置*/

t=s[0];

for(j=1;i<len;i++) (4);

(5);

}

printf("在第%d号珠子前面剪开,可以取走%d个珠子.\n",cut,maxc);

}


相似考题
参考答案和解析
正确答案:(1) step0&&iend (2) ++c (3) slen-1c (4) s[j-1]=s[j] (5) s[len-1]=t
(1) step0&&iend (2) ++c (3) s,len-1,c (4) s[j-1]=s[j] (5) s[len-1]=t 解析:依据取珠子个数最多的规则,count函数每次从左或从右取出相同颜色的珠子,因此从右到左的条件为step0&&iend,即(1)应填“step0&&iend”。当是同色珠子时,计数值加1,所以(2)填“++c”。从右到左计算时,函数count调用的实参次序为s,len-1,C。即(3)应填“s,len-1,c”。在尝试不同的剪开方式时,数组s的元素要循环向左移动一个位置,则(4)填“s[j-1]=s[j]”,(5)填“s[len-1]=t”。
更多“阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。 [说明] 设一个环上有编号为0~ ”相关问题
  • 第1题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。

    【函数2.1说明】

    递归函数sum(int a[], int n)的返回值是数组a[]的前n个元素之和。

    【函数2.1】

    int sum (int a[],int n)

    {

    if(n>0) return (1);

    else (2);

    }

    【函数2.2说明】

    有3个整数,设计函数compare(int a,int b,int c)求其中最大的数。

    【函数2.2】

    int compare (int a, int b, int c )

    { int temp, max;

    (3) a:b;

    (4) temp:c;

    }

    【函数2.3说明】

    递归函数dec(int a[],int n)判断数组a[]的前n个元素是否是不递增的。不递增返回 1,否则返回0。

    【函数2.3】

    int dec( int a[], int n )

    {

    if(n<=1) return 1;

    if(a[0]<a[1]) return 0;

    return (5);

    }


    正确答案:(1)a[n-1]+sum(an-1)或者a[0]+sum(a+1n-1); (2)return 0; (3)temp=(a>b)? (4)max=(temp>c)? (5)dec(a+1n-1);
    (1)a[n-1]+sum(a,n-1)或者a[0]+sum(a+1,n-1); (2)return 0; (3)temp=(a>b)? (4)max=(temp>c)? (5)dec(a+1,n-1); 解析:本题考查C语言函数和一些基本运算。
    下面我们分别来分析这几个函数。在函数2.1中,题目要求用此递归函数求数组前 n个元素之和。递归函数的特点是在函数体中不停地调用函数本身,只是将其函数的参数范围改变。题目中要求我们求数组前n个元素之和,我们可以这样理解,即前n个元素之和等于第n个元素加上前n-1个元素之和,现在的问题转化成如何求前n-1个元素之和。同样的道理,可以将求前n-1个元素之和转化成求前n-2个元素之和,直到这个数小于0。从函数2.1的代码中可以知道,在计算以前,首先判断n与0的关系,如果n小于0,说明数组中无元素,因此,返回0值;如果n大于等于0,说明数组中有元素,应该返回的结果是第n个元素加上前n-1个元素之和,而前n-1个元素之和是调用函数本身来计算的。因此,第(1)空和第(2)空的答案分别是a[n-1)+sum(a,n-1),return()。
    在函数2.2中,题目要求我们在三个数中取最大数,在数学中,我们从三个数中取最大数时,一般是首先拿其中两个数比较,取较大的数再与第三个数比较,再取其较大的数,这个数就是三个数中的最大数。从函数2.2的代码中知道,三个数a、b、c,两个整型变量temp与max。根据求三个数中最大数的数学过程和函数中已给出的代码可知,第(3)空处语句应该为temp=(a>b)?a:b,求得a、b中较大数并存放在变量temp中。第(4)空处语句为max=(temp>c)?temp:c。
    在函数2.3中,题目要求判断数组a[]的前n个元素是否是不递增的。不递增返回1,否则返回0。要判断前n个元素是否是不递增的,需要判断前n-1个元素是否是不递增的,以及第n个元素与第n-1个元素的关系。此处与函数2.1一样,用的都是递归函数,只是出口不同,在函数2.1中,只要数组中没有元素了,递归结束,这里只要第n个元素大于第n-1个元素,则返回0,递归结束。又由if(a[0]a[1])语句可知,在每次调用函数时,都将其数组中的第一个元素与第二个元素比较来作为递归的出口,如果结果为假,就说明数组的前面两项的关系是不递增的,在下次调用中不用再考虑第一项。因此第(5)空应该是dec(a+1,n-1)。

  • 第2题:

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

    [说明]

    已知r[1...n]是n个记录的递增有序表,用折半查找法查找关键字为k的记录。若查找失败,则输出“failure",函数返回值为0;否则输出“success”,函数返回值为该记录的序号值。

    [C函数]

    int binary search(struct recordtype r[],int n,keytype k)

    { intmid,low=1,hig=n;

    while(low<=hig){

    mid=(1);

    if(k<r[mid].key) (2);

    else if(k==r[mid].key){

    printf("succesS\n");

    (3);

    }

    else (4);

    }

    printf("failure\n");

    (5);

    }


    正确答案:(1) (low+hig)/2 (2) hig=mid-1 (3) returnmid (4) low=mid+1 (5) return 0
    (1) (low+hig)/2 (2) hig=mid-1 (3) returnmid (4) low=mid+1 (5) return 0 解析:折半查找法也就是二分法:初始查找区间的下界为1,上界为len,查找区间的中界为k=(下界+上界)/2。所以(1)应填“(low+hig)/2”。中界对应的元素与要查找的关键字比较。当kr[mid].key时,(2)填“hig=mid-1”;当k==r[mid].key时,(3)填“return mid”;当k>r[mid].key时,(4)填“low=mid+1”。如果low>hig时循环终止时,仍未找到需查找的关键字,那么根据题意返回0,即空(5)填“return 0”。

  • 第3题:

    ()阅读下列说明和C语言程序,将应填入 (n)处的语句写在答题纸的对应栏内。[说明]下面程序是一个带参数的主函数,其功能是显示在命令行中输入的文本文件内容。[C语言函数]#include"stdio.h"main(argc,argv) int argc; char *argv[]; { (1) ; if((fp=fopen(argv[1],”r’’))== (2) ) { printf(”file not open!\n”);exit(0);} while( (3) ) putchar( (4) ); (5); }


    正确答案:()
    (1)FILE *fp; (2)NULL  (3)!feof(fp)  (4)fgetc(fp)   (5)fclose(fp)
    从程序功能来看,程序中需要用到文件型指针变量中,而主函数体没有定义,所以(1)应该填写的是“FILE *fp;”。接下来的语句是标准的打开只读文本文件的语句,显示的是文件没打开,说明文件名不存在,也就是为“NULL”。接着的while循环语句中有两处空白。前一个空白是控制循环的条件,从程序功能来看,要将文本文件中的所有字符显示出来,这儿当然只能填写“不是文件尾则继续循环”,具体说,需要填写的是“!feof(fp)”。(4)出现在循环体中的语句中,该循环体的功能是从fp指向的文本文件中读取单个字符并显示在屏幕上,此处使用的是putchar函数,该函数的功能是将形参对应的字符显示在屏幕上,所以该处的空白就是要显示的字符,这个字符必须是从文本文件中读取的单个字符,完成这项工作的可以利用fgetc()函数,所以(4)填写的是“fgetc(fp)”。最后一句应当是关闭文件,所以(5)应填fclose(fp)。

  • 第4题:

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

    [函数2.1说明]

    下面程序的功能是计算x和y的最小公倍数。

    [函数2.1]

    main()

    { int m,n,d,r;

    seanf("%d %d",&m,&n);

    if(m<n) {r=m;m=n;n=r;}

    (1);

    while (d%n! =0) (2);

    printf("%d\n",d);

    }

    [函数2.2说明]

    下述程序接收键盘输入,直到句点“.”时结束。输入的字符被原样输出,但连续的空格输入将转换成一个空格。

    [函数2.2]

    include <stdio.h>

    main()

    { char c,preChar='\0';

    c = getchar();

    while(c! = '.'){

    if((3)) putchar(c);

    else if(preChar! =' ') putchar(c);

    (4);

    c=(5);

    }

    }


    正确答案:(1)d=m (2) d+=m或d=d+m (3) c!=‘’ (4) preChar=c (5) getchar()
    (1)d=m (2) d+=m或d=d+m (3) c!=‘’ (4) preChar=c (5) getchar() 解析:(1)下文使用了变量d,因此需在此初始化,由下面循环的条件“d%n!=0”知初值不能是n,因此必为m;
    (2)此处while循环生成最小公倍数d,其终止条件是n整除d,因此循环过程中需要保证m整除d并且d尽可能地小,于是d应以m为增量递增;
    (3)当输入的字符非空格时,原样输出;
    (4)程序中变量preChar用于记录上一次读入的字符,循环过程中应不断更新其值;
    (5)接收下一个输入。

  • 第5题:

    试题三(共 15 分)

    阅读以下说明和 C 程序,将应填入 (n) 处的字句写在答题纸的对应栏内。


    正确答案:

  • 第6题:

    阅读下列说明和?C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
    【说明】
    阅读下列说明和?Java代码,将应填入?(n)?处的字句写在答题纸的对应栏内。
    【说明】
    某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类比萨)、饮料和玩具,其餐品种
    类可能不同,但其制作过程相同。前台服务员?(Waiter)?调度厨师制作套餐。现采用生成器?(Builder)?模式实现制作过程,得到如图?6-1?所示的类图。






    答案:
    解析: