阅读以下说明和C代码,填写程序中的空缺,将解答写入答题纸的对应栏内。 【说明】 规定整型数组a中的元素取值范围为[0,N),函数usrSort(int n,int a[])对非负整型数组a的前n个元素进行计数排序。排序时,用temp_arr[i]表

admin2021-03-24  42

问题 阅读以下说明和C代码,填写程序中的空缺,将解答写入答题纸的对应栏内。
【说明】
    规定整型数组a中的元素取值范围为[0,N),函数usrSort(int n,int a[])对非负整型数组a的前n个元素进行计数排序。排序时,用temp_arr表示i在数组a中出现的次数,因此可以从0开始按顺序统计每个非负整数在a中的出现次数,然后对这些非负整数按照从小到大的顺序,结合其出现次数依次排列。
    例如,对含有10个元素{0,8,5,2,0,1,4,2,0,1}的数组a[]排序时,先计算出有3个0、2个1、2个2、1个4、1个5和1个8,然后可确定排序后a的内容为{0,0,0,1,1,2,2,4,5,8}。
    下面代码中用到的memset函数的原型如下,其功能是将p所指内存区的n个字节都设置为ch的值。
    void memset(void p,int ch,size_t n);
【C代码】
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>

    #define N 101

    void printArr(int a[],int n);
    void usrSort(int n,int a[]);

    int main()
    {
        int a [10]={0,8,5,2,0,1,4,2,0,1};
        printArr(a,sizeof(a)/sizeof(int));
      (1)  ;    //调用usrSort()对数组a进行升序排序
        printArr(a,sizeof(a)/sizeof(int));
        return 0;
    }
    void printArr(int a[],int n)
    {
       int i;
       for(i=0;i<n;i++)
            printf("%d",a);
        printf("in");
    }
    void usrSort(int n,int a[])
    {
        int i,k;
        int temp_arr;    //用temp_arr表示i在a中出现的次数
        temp_art=(int )malloc(N sizeof(int));
        if(!temp_arr)return;
        //将所申请并由temp_art指向的内存区域清零
        memset(  (2)  );
        for(i=0;i<n;i++)
            temp_err[  (3)  ]++;
        k=0;
        for(i=0;i<N; i++){
            int cnt;    //cnt表示i在数组a中的出现次数
      (4)   
          while(cnt>0){
                a[k]=i;    //将i放入数组a的适当位置
   (5)   
                cnt-;
           }
        }
        free(temp_arr);
    }

选项

答案(1)usrSort(10,a)或等效形式,a可替换为&a,&a[0]。 (2)temp_art,0,N*sizeof(int)或等效形式,其中N和sizeof(int)可替换为101、4。 (3)a[i]或*(a+i)或等效形式。 (4)cnt=temp_arr[i]或cnt=*(temp_arr+i)或等效形式。 (5)k++或++k或k=k+1或k+=1或等效形式。

解析 本题考查考生对C程序基本结构、函数定义及调用和运算逻辑的理解和应用
    根据空(1)所在语句的注释,明确是对函数usrSort进行调用。usrSort的原型声明为“void usrSort(int n,int a[]”,调用时第一个参数为一般的传值调用,实参需给出需要排序的数组元素个数,为10个,第二个参数是数组参数,需要将数组空间的首地址作为实参,用数组名或下标为0的数组元素取地址都可以,因此空(1)应填入“usrSort(10,a)”或其等效形式。
    空(2)所在语句是调用memset对申请的存储区域进行初始化。根据注释,要求将temp_arr指向的内存区域清零,根据声明memset时的形参要求,结合调用malloc的实参值N* sizeof(int),可知函数调用为memset(temp_arr 0,N* sizeof(int))。
    空(3)所在的循环语句遍历数组a[]的所有元素,将元素a作为temp_arr的下标,从而使得temp_arr[a]表示了a表示的值在数组a中出现的次数。
    在数组a中安排最后排序的元素时,for循环控制需要排列的元素i(即出现个数大于0者),根据注释“cnt表示i在数组a中的出现次数”,可知空(4)处应设置cnt的初始值,为“temp_arr”。接下来通过while循环,根据i出现的次数将i逐个放入数组中,每放入1个i,cnt自减,相应地,k需要自增,以给出下一个i要放入的数组元素,因此空(5)处应填入“k++”或其等效形式。
转载请注明原文地址:https://jikaoti.com/ti/l8W7FFFM
0

最新回复(0)