(11)己知a所指的数组中有N个元素。函数fun的功能是,将下标k(k>0)开始的后续元素全部向前移动一个位置。请填空。void fun(int a[N],int k){ int i;for(i=k;i<N;i++) a[ 【11】 ]=a[i];}

题目

(11)己知a所指的数组中有N个元素。函数fun的功能是,将下标k(k>0)开始的后续元素全部向前移动一个位置。请填空。

void fun(int a[N],int k)

{ int i;

for(i=k;i<N;i++) a[ 【11】 ]=a[i];

}


相似考题
更多“(11)己知a所指的数组中有N个元素。函数fun的功能是,将下标k(k&gt;0)开始的后续元素全部向前移动一 ”相关问题
  • 第1题:

    请补充函数fun(),该函数的功能是:从键盘输入一个下标n,把数组aa中比元素aa[n]小的元素放在它的左边,比它大的元素放在它的右边,排列成的新数组仍然保存在原数组中。

    例如,数组aa={33,67,42,58,25,76,85,16,41, 56},输入3。

    结果输出“33,42,25,16,41,56,58,67,76,85”。

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

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

    试题程序:

    include<stdio.h>

    define N 10

    void fun(int aa[],int n)

    {

    int i,j=0,k=0,t;

    int bb[N];

    t=aa[n];

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

    {

    if(aa[i]>t)

    bb[j++]=aa[i];

    if(aa[i]<t)

    aa[k++]=aa[i];

    }

    【 】;

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

    aa[k]=bb[i];

    }

    main()

    {

    int i,n;

    int aa[N]={33,67,42,58,25,76,85,16,41,56};

    clrscr();

    printf("\n*** original list ***\n");

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

    printf("%4d"/aa[i]);

    printf("\n suffix n\n");

    scanf("%d",&n);

    fun(aa,n);

    printf("\n*** new list ***\n");

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

    printf("%4d", aa[i]);

    }


    正确答案:aa[k++]=t ij
    aa[k++]=t ij 解析:第一空:首先将aa[n]赋值给t,通过for循环,将比t大的数暂存在数组bb中,将比t小的数保存在数组aa中,此时应该将t存入数组aa中,正好放在那些小于t的元素后面。第二空:最后将数组bb中的元素存入数组aa中,放在t的后面。变量j记录了大于t的元素的个数,所以变量i的取值范围是从0到j-1。

  • 第2题:

    以下程序段是函数返回a所指数组中最大的值所在的下标值,横线处的语句为( )。 fun(int*a, int n) { int i,j=0,k; k=j; for(i=j;i<n;i++) if[a[i]>a[k])______; return(k); }

    A.k=i

    B.k=j

    C.i=j

    D.i=n


    正确答案:A
    解析:函数fun中首先定义整型变量k用来存放返回最大值的下标,并将其首先指向第一个元素,即k=j。然后在for循环中依次将当前元素a[i]与标识为最大值的元素进行比较,如果当前元素大于这个标识元素,那么将最大值标识为当前元素,即k=i。

  • 第3题:

    下面函数的功能是:找出一维数组元素中最大的值和它所在的下标,最大值的和它所在的下标通过形参传回。数组元素中的值已在主函数中赋予。主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。请填空。

    #include<stdlib.h>

    #include<stdio.h>

    void fun(int a[],int n, int *max, int *d)

    { int i;

    *max=a[0];

    *d=0;

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

    if(*max<【16】)

    {*max=a[i];*d=i;}

    }

    main()

    { int i, x[20], max, index, n=10;

    randomize();

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

    {

    x[i]=rand()%50; printf("%4d",x[i]);

    }

    printf("\n");

    fun(x,n,&max,&index);

    printf("Max=%5d,Index=%4d\n",max,index);

    }


    正确答案:
    i<n;a[i]

  • 第4题:

    以下fun函数的功能是:找出具有N个元素的一维数组中的最小值,并作为函数值返回,请填空。(设N己定义)

    int fun(int x[N])

    {int i,k=0

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

    if(x[i]<x[k])k=_____;

    return x[k];

    }


    正确答案:i
    i 解析:循环语句依次查找数组的元素,下标从0到N-1,当x[i]的值小于k时,记录i值即此元素的下标,然后再将其余元素与新的k元素比较,最终求得最小值。所以填i。

  • 第5题:

    下面函数返回数组中最大元素的下标,数组中元素个数为t,将程序补充完整。

    int findmax(int s[],int t) {

    int k,p;

    for(p=0,k=p;p<t;p++) {

    if 【 】

    k=p;

    }

    return k;

    }


    正确答案:(s[p]>s[k])
    (s[p]>s[k]) 解析:分析程序其他部分,k存放最大元素的下标。

  • 第6题:

    请编写函数fun(),它的功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从0到p(含p,p<n-1)的数组元素平移到数组的最后。例如:一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为: 5,6,7,8,9,10,1,2,3,4。部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

    include<stdiO.h>

    define N 80

    void fun(int *w,int p,int n)

    {

    }

    main()

    {in[ a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

    int i,p,n=15;

    printf("The odginal data:\n");

    for(i=0;i<n;i++)printf("%3d",a[i]);

    printf("\nEnter p:");

    scanf("%d",&p);

    fun(a,p,n);

    printf ("\n The data after moving:\n");

    for(i=0;i<n;i++)printf("%3d”,a[i]);

    }


    正确答案:void fun(int*wint pint n) {int iJ; int a[N]; for(i=0;i=p;i++)a[i]=w[i] for(i=p+1j=0;in;i++j++)w[j]=w[i]; for(i=0;i=p;i++)w[n-p-1+i]=a[i]; }
    void fun(int*w,int p,int n) {int i,J; int a[N]; for(i=0;i=p;i++)a[i]=w[i] for(i=p+1,j=0;in;i++,j++)w[j]=w[i]; for(i=0;i=p;i++)w[n-p-1+i]=a[i]; } 解析:将数组后面的元素向前平移,肯定会将前面的元素覆盖。因此,可以定义一个数组用来暂时存放前面的元素。可以先将w[0]~w[p]依次赋给a[0]~a[p];然后将w[p]~w[n—1)
    移到数组的前面:再将a[0]~a[p)依次赋给w[n-p-1+i]~w[n—1]。

  • 第7题:

    已知有一维数组T[0..m*n-1],其中m>n。从数组T的第一个元素(T[0])开始,每隔n个元素取出一个元素依次存入数组B[1..m]中,即B[1]=T[0],D[2]=T[n],依此类推,那么放入B[k](1≤k≤n)的元素是______。

    A.T[(k-1)*n]

    B.T(k*n)

    C.T[(k-1)*m]

    D.T[k*m]


    正确答案:A
    解析:根据题意,每隔n个元素取出一个元素依次存入数组B(1..m]中。所以,不难推导出B[1]=T[0],B[2]=T[n],B[3]=T[2n],…,B[k]=T[(k-1)n]故本题应该选择A。

  • 第8题:

    下面函数的功能是找出一维数组元素中最大的值和它所在的下标,最大值的和它所在的下标通过形参传回。#include <stdlib.h>#include <stdio.h>void fun(int a[ ],int n,int *max,int *d){ int i; *max=a[0]; *d=0; for(i=0;;i++) if(*max<) { *max=a[i];*d=i; }}


    正确答案:i<n,a[i]
    在本题中,fun函数的功能是找出一维数组元素中最大的值和它所在的下标,最大的值和它所在的下标通过形参传回。要通过形参传回值,那么需要采用的传值方式是传址传值法,即传递地址,指针或数组能实现传址传值。
    在程序中,fun函数带了四个形参变量,其中数组a是需要被处理的一维数组,n是数组中元素的个数,指针变量max和d分别用于返回最大值和下标。
    在程序体中,定义一个循环变量i,并给指针变量max和d进行赋初值操作,然后执行for循环,从程序中很明显地能看出,第12空所处的位置正是for循环的结束条件,结合题目的要求,我们不难推断出这个循环的作用是找出数组中最大的元素及其下标,那么循环结束的条件是遍历完数组中的元素,即循环变量i小于数组中元素的个数,用表达式表示为i<n。
    第13空是一个条件判断语句的条件部分,条件如果成立,则将当前数组的元素值赋给*max,并用*d记录当前值的数组下标。结合题目的要求,我们不难推断出该条件判断语句的作用是判定当前最大值max与所取数组元素的大小。因此,本空处需要填写的内容是a[i]。

  • 第9题:

    请编写函数fun,函数的功能是:移动一维数组中的内容:若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。

    例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10:p的值为3。移动后,一维数组中的内容应为:5, 6, 7, 8, 9, 10, 1, 2, 3,4。

    注意:部分源程序在文件PROGl.C中。

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。


    正确答案:
    解析:该程序功能是移动一维数组中的内容。解题思路首先将字符串拷贝到一个临时的数组,然后将字符串进行前移操作,最后将由于前移覆盖掉的字符,由临时数组中拷贝到指定字符串。

  • 第10题:

    有以下程序 include void fun(int *a,int n)/*fun函数的功能是将a所指数组元素从大到

    有以下程序

    #include <stdio.h>

    void fun(int *a,int n)/*fun函数的功能是将a所指数组元素从大到小排序*/

    { int t,i,j;

    for(i=0;i<n-1;j++)

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

    if(a[i]<a[j]) { t=a[i];a[i]=a[j];a[j]=t;}

    }

    main( )

    { int c[10]={1,2,3,4,5,6,7,8,9,0},i;

    fun(c+4,6);

    for(i=0;i<10;i++) printf("%d,",c[i]);

    printf("\n");

    }

    程序的运行结果是

    A.1,2,3,4,5,6,7,8,9,0,

    B.0,9,8,7,6,5,1,2,3,4,

    C.0,9,8,7,6,5,4,3,2,1,

    D.1,2,3,4,9,8,7,6,5,0,


    正确答案:D
    解析:在本题中,主函数在调用fun( )函数进行排序时,传递的参数是c+4和6,fun( )函数实现的功能是将数组c的第5个元素开始的6个元素依次进行从大到小的顺序排列。排序之后,数组c的内容变为{1,2,3,4,9,8,7,6,5,0}。

  • 第11题:

    试题三(共15分)

    阅读以下说明和C函数,回答问题 l和问题 2,将解答填入答题纸的对应栏内。

    【说明】

    对于具有n个元素的整型数组a,需要进行的处理是删除a中所有的值为 0的数组元素,并将a中所有的非 O元素按照原顺序连续地存储在数组空间的前端。下面分别用函数CompactArr_v1 和CompactArr v2来实现上述处理要求,函数的返回值为非零元素的个数。 函数CompactArr_vl(int a[],int n)的处理思路是:先申请一个与数组a的大小相同的动态数组空间,然后顺序扫描数组a的每一个元素,将遇到的非O元素依次复制到动态数组空间中,最后再将动态数组中的元素传回数组a中。

    函数CompactArr_v2(int a[],int n)的处理思路是:利用下标i(初值为 0)顺序扫描数组a的每一个元素,下标k(初值为0)表示数组 a中连续存储的非0元素的下标。扫描时,每遇到一个数组元素,i就增 1,而遇到非 0元素并将其前移后k才增 1。

    【问题1】 (12分)

    请根据说明中函数CompactArr_v1的处理思路填补空缺(1)~(3),根据CompactArr_v2的处理

    思路填补空缺(4)。

    【问题2】(3分)

    请说明函数CompactArr vl存在的缺点。


    正确答案:
    试题三参考答案(共 15分)
    【问题 1】 (12分)
    (1) sizeof(int) (3分)
    若考生解答为一个正整数,则给 2分
    (2)temp[k++] 或*(temp+k++)或等价表示 (3分)
    (3) ik 或等价表示 (3分)
    (4)a[k++] 或*(a+k++)或等价表示 (3分)
    【问题 2】(3分)
    可能由于动态内存申请操作失败而导致函数功能无法实现,时间和空间效率低。
    注:考生仅回答出运行速度慢则给 2分,其他含义相同的描述可给满分或酌情给分。

  • 第12题:

    问答题
    请根据以下各小题的要求设计C应用程序(包括界面和代码)。  给定程序中函数fun()的功能是:按顺序给s所指数组中的元素赋予从2开始的偶数,然后再按顺序对每五个元素求一个平均值,并将这些值依次存放在w所指的数组中。若s所指数组中元素的个数不是5的倍数,多余部分忽略不计。  例如,s所指数组有14个元素,则只对前10个元素进行处理,不对最后的4个元素求平均值。  请改正程序中的错误,使它能得到正确结果。  注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。  试题程序如下:#include #define SIZE 20int fun(double *s, double *w){ int k,i; double sum; for(k=2,i=0;i

    正确答案:

    (1)错误:sun=0.0
    正确:sum=0.0
    (2)错误:if(i+1%5==0)
    正确:if((i+1)%5==0)
    解析:

      错误1:由题目程序的其他部分可以知道,此处变量名sun书写错误,应为sum。
      错误2:由C语言的运算符优先级的定义顺序可以知道:由于%的优先级比+高,所以必须加上括号,因此改为:if((i+1)%5==0)。

  • 第13题:

    请编写函数fun(),该函数的功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从p到n-1(p≤n-1)的数组元素平移到数组的前面。

    例如,一维数组中的原始内容为1,2,3,4,5,6,7, 8,9,10,11,12,13,14,15,p的值为6。移动后,一维数组中的内容应为7,8,9,10, 11,12,13,14,15,1, 2, 3, 4, 5, 6。

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

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    试题程序:

    include<stdio.h>

    define N 80

    void fun(int *w,int p,int n)

    {

    }

    main()

    {

    int a[N]={1,2,3,4,5,6,7,8,9,10,11, 12,13,14,15};

    int i,p,n=15;

    printf("The original data:\n");

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

    printf("%3d",a[i]);

    printf("\n\nEnter p:");

    scanf("%d",&p);

    fun(a,p,n);

    printf("\nThe data after moving:\n");

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

    printf("%3d",a[i]);

    printf("\n\n");

    }


    正确答案:void fun(int *w int p int n) { int i.jt; for(i=p;i=n-1;i++) /*循环右移n-p次*/ {t=w[n-11; for(j=n-2;j>=0;j--) /*实现循环右移*/ w[j+1]=w[j]; w[0]=t; }
    void fun(int *w, int p, int n) { int i.j,t; for(i=p;i=n-1;i++) /*循环右移n-p次*/ {t=w[n-11; for(j=n-2;j>=0;j--) /*实现循环右移*/ w[j+1]=w[j]; w[0]=t; } 解析:本题采用“循环右移”的算法。和我们在前面分析的稍有不同的是,—个是整型数组,—个是字符型数组。

  • 第14题:

    请编写函数fun(),该函数的功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从p~n-1(p<n-1)的数组元素平移到数组的前面。

    例如,一维数组中的原始内容为1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, P的值为6。移动后,一维数组的内容应为7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 2, 3, 4, 5, 6。

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

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    [试题源程序]

    inciude <stdio.h>

    define N 80

    void fun(int *w, int p, int n)

    {

    }

    main()

    {

    int a[N]=(i, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);

    int i, P, n=15;

    printf("The original data:\n");

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

    printf("%3d", a[i]);

    printf("\n\nEnter p: ");

    scanf("%d", &p);

    fun(a, P, n);

    printf("\nThe data after moving:\n");

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

    printf("%3d", a[i]);

    printf("\n\n");

    }


    正确答案:void fun(int *w int p int n) { int i J t; for(i=p; i=n-i; i++) { t=w[n-1]; for(j=n-2; j>=0; j--) w[j+1]=w[j]; w[0]=t; } }
    void fun(int *w, int p, int n) { int i, J, t; for(i=p; i=n-i; i++) { t=w[n-1]; for(j=n-2; j>=0; j--) w[j+1]=w[j]; w[0]=t; } }

  • 第15题:

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

    }

    }

    }


    正确答案:(1)k或k!=0 (2)(j-k+n)%n或(t-k+n)%n (3)j (4)a[t]或等价表达式 (5)i++或等价表达式
    (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++或其他等价表达式。

  • 第16题:

    下列给定程序中,函数fun()的功能是:按顺序给s所指数组中的元素赋予从2开始的偶数,然后再按顺序对每5个元素求一个平均值,并将这些值依次存放在w所指的数组中。若s所指数组中元素的个数不是5的倍数,多余部分忽略不计。例如,s所指数组有14个元素,则只对前10个元素进行处理,不对最后的4个元素求平均值。

    请改正函数fun()中的错误,使它能得出正确的结果。

    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

    试题程序:

    include <stdio.h>

    define SIZE 20

    fun (double *s, double *w)

    { int k, i; double sum;

    for(k=2, i=0; i<SIZE; i++)

    {s [i]=k; k+=2;}

    sum=0.0;

    for(k=0, i=0; i<SIZE;i++)

    {sum+=s[i];

    /*************found**************/

    if(i+1%5==0)

    {w[k]=sum/5; Sum=0; k++;}

    }

    return k;

    }

    main()

    { double a[SIZE],b[SIZE/5];

    int i, k;

    k=fun(a/b);

    printf ("The original data:\n");

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

    {

    if(i%5==0)printf("\n");

    printf("%4.0f"/a[i]);

    }

    printf{"\n\nThe result:\n");

    for(i=0; i<k; i++) printf("%6.2f",b[i]);

    printf("\n\n");

    }


    正确答案:错误:if(i+1%5==0) 正确:if((i+1)%5==0)
    错误:if(i+1%5==0) 正确:if((i+1)%5==0) 解析:本题除了考查循环语句以外,其实就是一道简单的数学题,循环条件if(i+1%5==0)是一个标准的语法错误,这跟题目考查的知识点毫无关系,也就是说,做这样的题,只要读懂了题干意思,问题便可迎刃而解。

  • 第17题:

    假设有一维数组T[O...m*n-1],其中m>n。从数组T的第一个元素(T[0])开始,每隔n个元素取出一个元素依次存入数组B[1...m)中,即B[1]=T[0],B[2]=T[n],依此类推,那么放入B[k](1≤k≤n)的元素是(120)。

    A.T[(K-1)*m]

    B.T[K*n)

    C.T[(K-1)*n]

    D.T[K*m]


    正确答案:C
    解析:代入k=1,得到B[k]=T[0];代入k=2,得到B[k]=T[n]。可见只有T[(K-1)*m)满足要求。

  • 第18题:

    已知数组a中有n个元素,下列语句将数组a中从下标x1开始的k个元素移动到从下标x2开始的k个元素中,其中O<=xl<x2<n,x2+k<n,请将下列语句补充完整。

    For(int i=x1+k-1;i>=x1;i--)

    a[______]=a[i];


    正确答案:X2+k-1
    X2+k-1 解析:此题考查的是数组的操作。a[i]表示从下标x1开始的第i个元素,若为第一次循环,则i为xt+k-1,按照题目将数组a中从下标x1开始的k个元素移动到从下标x2开始的k个元素中的要求,所以将a[i]赋值给下标为X2+k-1的元素。

  • 第19题:

    请编写函数fun(),该函数的功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从0到p(p≤n-1)的数组元素平移到数组的最后。

    例如,一维数组中的原始内容为1,2,3,4,5,6,7, 8,9,10,11,12,13,14,15,p的值为3。移动后,一维数组中的内容应为5,6,7,8,9,10,11,12,13,14,15, 1, 2, 3, 4。

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

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    试题程序:

    include <stdio.h>

    define N 80

    void fun(int *w, int p, int n)

    {

    }

    main ()

    {

    int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

    int i, p, n=15;

    printf("The original data:\n");

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

    printf("%3d",a[i]);

    printf("\n\nEnter p: ");

    scanf("%d",&p);

    fun(a,p,n);

    printf("\nThe data after moving:\n");

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

    printf("%3d",a[i]);

    printf("\n\n");

    }


    正确答案:void fun(int *wint pint n) { int i j t; for(i=0; i=p; i++) /*循环左移p+1次*/ {t=w[0]; for(j=1/jn;j++) /*实现循环左移*/ w[j-1]=w[j]; w[j-1]=t; } }
    void fun(int *w,int p,int n) { int i, j, t; for(i=0; i=p; i++) /*循环左移p+1次*/ {t=w[0]; for(j=1/jn;j++) /*实现循环左移*/ w[j-1]=w[j]; w[j-1]=t; } } 解析:本题采用“循环左移”的算法(关于“循环左移”,我们在后面的试题中有详细的解释)。和我们在前面分析的稍有不同的是,一个是整型数组,一个是字符型数组。

  • 第20题:

    请编写一个函数fun(),它的功能是:找出一维数组元素中最大的值和它所在的下标,最大值和它所在的下标通过形参传回。数组元素中的值已在主函数中赋予。

    主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。

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

    请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

    试题程序:

    include<stdlib.h>

    include<stdio.h>

    void fun(int a[],int n, int *max,int *d)

    {

    }

    main()

    {

    int i, x[20], max, index, n=10;

    randomize();

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

    {

    x[i]=rand()%50;

    printf("%4d",x[i]);

    /*输出一个随机数组*/

    }

    printf("\n");

    fun(x,n,&max,&index);

    printf("Max=%5d,Index=%4d\n",max,index);

    }


    正确答案:void fun(int a[]int nint *maxint *d) { int i; *max=a[0]; *d=0; for(i=0;in;i++) /*将最大的元素放入指针max所指的单元最大元素的下标放入指针d所指的单元*/ if(*maxa[i]) {*max=a[i];*d=i;} }
    void fun(int a[],int n,int *max,int *d) { int i; *max=a[0]; *d=0; for(i=0;in;i++) /*将最大的元素放入指针max所指的单元,最大元素的下标放入指针d所指的单元*/ if(*maxa[i]) {*max=a[i];*d=i;} } 解析:该程序直接使用形参max和d,由于它们都是指针变量,所以要引用它所指向的变量时要对它进行指针运算,也即*号运算。

  • 第21题:

    已知有一维数组T[0...m*n-1],其中m>n。从数组T的第一个元素(T[0])开始,每隔n个元素取出一个元素依次存入数组B[1...m]中,即B[1]=T[0],B[2)= T[n],依次类推,那么放入B[k](1≤k≤m)的元素是______。

    A.T[(k-1)*n]

    B.T[k*n]

    C.T[(k-1)*m]

    D.T[k*m]


    正确答案:A
    解析:由题可知,B[1]=T[(1-1)*n],B[2]=T[(2-1)*n],B[3]=T[(3-1)*n],...,根据归纳法可得B[k]=T[(k-1)*n)。

  • 第22题:

    阅读下列函数说明和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++或其他等价表达式。

  • 第23题:

    试题14

    以下程序调用fun函数把x中的值插入到a数组下标为k的数组元素中。主函数中,n存放a数组中数据的个数。请填空。

    #include <stdio.h>

    void fun(int s[], int *n, int k, int x)

    { int i;

    for(i=*n-1; i>=k; i- - ) s[ ___ ]=s[i];

    s[k]=x;

    *n=*n+______;

    }

    main()

    { int a[20]={1,2,3,4,5,6,7,8,9,10,11}, i, x=0, k=6, n=11;

    fun(a, &n, k, x);

    for(i=0; i<n; i++) printf(“%4d”,a[i]); printf(“\n”);

    }


    正确答案:
    试题14分析
    因为是把x中的值插入到a数组下标为k的数组元素中,所以首先要将k及其后的元素往后移一位,方法是s[i+1]=s[i],插入之后,因为多了一个元素,要将n中值增1。
    试题14答案
     【14】i+1
    【15】1