itgle.com

阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。【说明】函数void rcr(int a[],int n,int k)的功能是:将数组a中的元素s[0]~9[n-1]循环向右平移k个位置。为了达到总移动次数不超过n的要求,每个元素都必须只经过一次移动到达目标位置。在函数rcr中用如下算法实现:首先备份a[0]的值,然后计算应移动到a[0]的元素的下标 p,并将a[P]的值移至a[0];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至 a[p];依次类推,直到将a[0]的备份值移到

题目

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

【说明】

函数void rcr(int a[],int n,int k)的功能是:将数组a中的元素s[0]~9[n-1]循环向右平移k个位置。

为了达到总移动次数不超过n的要求,每个元素都必须只经过一次移动到达目标位置。在函数rcr中用如下算法实现:首先备份a[0]的值,然后计算应移动到a[0]的元素的下标 p,并将a[P]的值移至a[0];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至 a[p];依次类推,直到将a[0]的备份值移到正确位置。

若此时移动到位的元素个数已经为n,则结束;否则,再备份a[1]的值,然后计算应移动到a[1]的元素的下标p,并将a[p]的值移至9[1];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至a[p];依次类推,直到将a[1]的备份值移到正确位置。

若此时移动到位的元素个数已经为n,则结束;否则,从a[2]开始,重复上述过程,直至将所有的元素都移动到目标位置时为止。

例如,数组a中的6个元素如图1(a)所示,循环向右平移两个位置后元素的排列情况如图1(b)所示。

void rcr( int a[] ,int n,int k)

{ int i,j,t,temp,count;

count =0; /*记录移动元素的次数*/

k=k%n;

if((1)){ /*若k是n的倍数,则元素无须移动;否则,每个元素都要移动*/

i=0

while(count<n) {

j=i;t=i;

temp =a[1]; /*备份a[i]的值*/

/*移动相关元素,直到计算出a[i]应移动到的目标位置*/

while((j=(2))! =i){

a[t]=a[j];

t=(3);

count++;

}

(4)= temp;count ++;

(5);

}

}

}


相似考题
更多“ 阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。【说明】函数void rcr(int a[],int n,int k)的功能是:将数组a中的元素s[0]~9[n-1]循环向右平移k个位置。为了达到总”相关问题
  • 第1题:

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

    [说明1]

    函数void fun(char*w,char x,int*n)用来在w数组中插入x,w数组中的数已按由小到大顺序存放,n指存储单元中存放数组中数据的个数,插入后数组中的数仍有序。

    [C函数1]

    void fun(char*W,char x,int*n)

    { int i,P;

    p=0;

    w[*n]=x;

    while(x>w[p]) (1) ;

    for(i=*n,i>p;i--)w[i]=(2);

    w[p]=x;

    ++*n;

    }

    [说明2]

    函数void revstr(char*s)将字符串s逆置。例如:字符串“abcde”,经过逆置后变为“edcba”。

    [C函数2]

    void revstr(char*s)

    { char*p,c;

    if(s==NULL)return;

    p=(3); /*p指向字符串s的最后一个有效字符*/

    while(s<p){ /*交换并移动指针*/

    C=*s;

    (4)=*p;

    (5)=c;

    }

    }


    正确答案:(1) p++ (2) w[i-1] (3) s+strlen(s)-1 (4) *s++或*(s++) (5) *p-或*(p--)
    (1) p++ (2) w[i-1] (3) s+strlen(s)-1 (4) *s++或*(s++) (5) *p-或*(p--) 解析:函数1的fun()中的while循环是为了找到x的插入位置,因此(1)填“p++”,for循环是移动数组中的元素,因此(2)填“w[i-1]”。
    对于函数2,设字符串的长度为n,则该函数的思想为将*(s+j)与*(s+n-1+i)对换,i=0....n/2。采用指针来实现,s为起始地址,p定位为最后一个字符的位置,所以空(3)应填“s+strlen(s)-1”;采用*s与*p交换后为s++与P--。即空(4)填“*s++”或“*(s++)”,空(5)填“*p-”或“*(p--)”。

  • 第2题:

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

    【说明】

    函数void rcr(int a[],int n,int k)的功能是:将数组a中的元素a[0]~a[n-1]循环向右平移k个位置。

    为了达到总移动次数不超过n的要求,每个元素都必须只经过一次移动到达目标位置。在函数rcr中用如下算法实现:首先备份a[0]的值,然后计算应移动到a[0]的元素的下标p,并将a[p]的值移至a[0];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至a[p];依次类推,直到将a[0]的备份值移到正确位置。

    若此时移动到位的元素个数已经为n,则结束;否则,再备份a[1]的值,然后计算应移动到a[1]的元素的下标p,并将a[p]的值移至a[1];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至a[p];依次类推,直到将a[1]的备份值移到正确位置。

    若此时移动到位的元素个数已经为n,则结束;否则,从a[2]开始,重复上述过程,直至将所有的元素都移动到目标位置时为止。

    例如,数组a中的6个元素如图1(a)所示,循环向右平移两个位置后元素的排列情况如图1(b)所示。

    【函数】

    void rcr(int a[],int n,int k)

    {int i,j,t,temp,count;

    count=0;/*记录移动元素的次数*/

    k=k%n;

    if( (1) ){/*若k是n的倍数,则元素无须移动;否则,每个元素都要移动*/

    i=0;

    while(count<n){

    j=i;t=i;

    temp=a[i];/*备份a[i]的值*/

    /*移动相关元素,直到计算出a[i]应移动到的目标位置*/

    while((j= (2) )!=i){

    a[t]=a[j];

    t= (3) ;

    count++;

    }

    (4) =temp;count++;

    (5) ;

    }

    }

    }


    正确答案:
    【答案】(1)k或k!=0(2)(j-k+n)%n或(t-k+n)%n(3)j(4)a[t]或等价表达式(5)i++或等价表达式【解析】(1)判断k执行k=k%n后是否为0,即是否是n的倍数,应填入k或k!=0。(2)j表示要移动到a[t]的元素的位置,于是j和t的关系为j=(t-k+n)%n;当执行完j=i,t=i后,j=t,于是此处可填入(j-k+n)%n或(t-k+n)%n。(3)将a[j]移动到a[t]后,需要将t指向j,即此处填入j。(4)将暂存在temp中的值移动到a[t]中。即此处填入a[t]或等价表达式。(5)此处while循环的递增条件,显然应该是i++或其他等价表达式。

  • 第3题:

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

    [说明]

    函数int psort(int a[],int n)实现将含n个整数的数组a[]的不同元素按从小到大顺序存于数组a[]中。实现方法是从未确定的元素列中找到最小元素并将a[]的第i最小元素交换至a[i]位置。如该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。

    [C函数]

    int psort(int a[],int n)

    {int i,J,k,P;

    for(i=0,k=0;i<(1);i++){

    for(j=i+1, (2) ;j<n; j++)

    if(a[p]>a[j])

    p=j;

    if(p!=i){

    t=a[p];

    a[p]=a[i];

    a[i]=t;

    }

    if( (3) ) k++;

    else if( (4) <a[i])

    (5)=a[i];

    }

    return k;

    }

    int a[]={5,7,5,6,4,3,4,6,7};

    main()

    {int k,n;

    for(k=0;k<(Sizeof a)/Sizeof(int);k++)

    printf("%5d",a[k]);

    printf ("\n\n");

    n=psort(a,(sizeof(a))/sizeof(int));

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

    printf("%5d",a[k]);

    printf("\n\n");

    }


    正确答案:(1) n-1 (2) P=i (3) k==0 (4) a[k-1] (5) a[k++]
    (1) n-1 (2) P=i (3) k==0 (4) a[k-1] (5) a[k++] 解析:本程序排序方法是从未确定的元素列中找到最小元素并将a[]的第i最小元素交换至a[i]位置。如该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。这是采用选择法对数组元素进行排序,因此空(1)填“n-1”,空(2)填“p=i”。若该最小元素比已确定的最后一个最小元素大,则将它接在已确定的元素序列的后面;否则,忽视该元素。因此,空(3)填“k==0”;而当a[k-1]a[i]时”,则a[k++]=a[i];否则忽略元素a[i]。所以空(4)填“a[k-1]”空(5)填“a[k++]”。

  • 第4题:

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

    【说明】

    输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

    【函数】

    main ( )

    {

    int number[10];

    input (number);

    max min (number);

    output (number);

    }

    input (number)

    int number[10];

    {int i;

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

    scanf ( "%d,",&number[i] );

    scanf ( "%d",&number[9] );

    }

    max_min ( array )

    int array[10];

    {int *max,*min,k,1;

    int *p,*arr_end;

    arr end=(1);

    max=min=array;

    for ( p=(2);p<arr_end;p++ )

    if((3)) max=p;

    else if ( *p<*min ) min=p;

    (4);

    l=*min;

    (5);array[0]=1;1=*p;

    *p=array[9];array[9]=k;k=*p;

    return;

    }

    output ( array )

    int array[10];

    { int *p;

    for ( p=array;p<array+9;p++ )

    printf ( "%d,",*p );

    printf ( "%d\n",array[9] );

    }


    正确答案:(1)array+10 (2) array+1 (3) *p>*max (4) k=*max (5) *p=array[0]
    (1)array+10 (2) array+1 (3) *p>*max (4) k=*max (5) *p=array[0]

  • 第5题:

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

    [说明1]

    函数int function(int a)的功能是判断指定的正整数是否为素数,若是,返回1,否则返回0。

    [C函数1]

    int function(int a)

    { int yes,i;

    i=2;yes=1;

    while(i<=a/2 && (1) ){

    if( (2) ) yes=0;

    i++;

    }

    return yes;

    }

    [说明2]

    函数int deleteARR(int*arr,intn)的功能是指定的有序数组压缩成各元素互不相同的有序数组,即相同数只保留一个,多余的被删除。函数返回值是互不相同的元素个数。

    [C函数2]

    int deleteARR(int*arr,int n)

    { int k,j;

    k=0;j=1;

    while(j<n){

    if( (3) )

    (4)=arr[j];

    j++;

    }

    return (5);

    }


    正确答案:(1) yes或yes==1或yes !=0 (2) a/i[*]i==a或a%i==0或!(a%i) (3) arr[k]!=arr[j] (4) arr[++k] (5) k+1或++k
    (1) yes或yes==1或yes !=0 (2) a/i[*]i==a或a%i==0或!(a%i) (3) arr[k]!=arr[j] (4) arr[++k] (5) k+1或++k 解析:对于函数1,增加了一个判断的标志yes,开始进入素数判别循环时置yes=1,则(1)应填“yes”或“yes==1”或“yes !=0”;一旦数n能被某个不等于零的真因子整除,退出循环,则(2)应填“a/i[*]i==a”或“a%i==0”或“!(a%i)”。
    对于函数2,用k记录数组arr[]中不同元素的个数,同时设置工作指针j,将arr[j]与已得到的互不相同元素的最后一个元素进行比较,若不相等,则将其作为已比较的互不相同元素的最后一个元素,所以(3)填“arr[k]!=art[j]”,(4)填“arr[++k]”。最后返回互不相同的元素个数k+1,即(5)填“k+1”或“++k”。