一起答
主观

●试题三

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

【说明】

设有一个带表头结点的双向循环链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次L.Locate(x)操作时,令元素值x的结点的访问频度freq加1,并将该结点前移,链接到现它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。

【函数】

void Locate(int&x)

{<结点类型说明>

*p=first->next;

while(p!=frist&&  (1) )P=P->next;

if (p!=first)/*链表中存在x*/

{ (2) ;

<结点类型说明>

*current=p;/*从链表中摘下这个结点*/

Current->prior->next=current->next;

Current->next->prior=current->prior;

P=current->prior;/*寻找重新插入的位置*/

While(p!=first&&  (3) )p=p->prior;

Current->next= (4) ;/*插入在P之后*?

Current->prior=P;

P->next->prior=current;

P->next= (5) ;

}

else printf("Sorry.Not find!\n");/*没找到*/

}

试题出自试卷《2011年程序员考试考前密卷(七)-下午试题》
参考答案
查看试卷详情
相关试题
  1. ●试题七

    阅读以下应用说明及Visual Basic程序代码,将应填入(n)处的字句写在答题纸的对应栏内。

    【说明】

    已知窗体上有两个名为cmdGene和cmdSort的命令按钮。单击cmdGene按钮时,随机产生10个[1,100]范围内的整数并将它们放在数组intA中;单击cmdSort按钮时,用选择法排序这10个数并输出。

    【程序代码】

    Dim intA(1 To 10)As Integer

    Private Sub cmdGene_Click()

    Dim intI As Integer

    Randomize

    For intI=1 To 10

    intA(intI)= (1) 

    Next intI

    End Sub

    Private Sub cmdSort_Click()

    Dim intI,intJ,intMin,intTemp As Integer

    For intI=1 To 9

    intMin=intA(intI)

    For intJ= (2) To 10

    If intA(intJ)

    Temp=intA(intJ)

    intA(intJ)= (3) 

    intMin=intTemp

    End If

    Next intJ

     (4) 

     (5) 

    For intI=1 To 10

    Print Str(intA(intI))+" ";

    Next intI

    Next IntI

    Print

    End Sub

     

  2. ●试题八

    阅读以下说明和C++代码,将解答写入答题纸的对应栏内。

    【说明】

    源程序文件vectorClass.cpp,其中定义了用于表示向量的类vector,但类vector的定义并不完整。请按要求完成下列操作,将类vector的定义补充完整,并给出输出结果。

    1.补充类vector的构造函数,该函数有参数x和y,它们都是int型的数据,默认值都为0。请使用参数列表的形式分别将类的数据成员a和b分别初始化为参数x和y的值。

    2.完成类vector的成员函数input(int x,int y)的定义,将int型的参数x和y分别赋值给数据成员b和a。

    3.完成类vector的友元函数friend double Multiply(vector &x,vector &y)的定义,先定义double型的临时变量c,然后将参数对象x和对象y的数据成员a与b分别相乘再相加后赋值给c,最后返回c的值。

    注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。

    源程序文件vectorClass.cpp清单如下:

    #include

    class vector

    {

    int a;

    int b;

    public:

    vector( (1) ): (2) 

    {

    }

    void input(int x,int y)

    { (3) 

    }

    void output()

    {

    cout<<'('<,'<;

    }

    friend double Multiply(vector &x,vector &y);

    };

    double Multiply(vector &x,vector &y)

    {

    double c;

     (4) 

    return c;

    }

    void main()

    {

    vector x(10,20),y;

    double d;

    y.input(2,3);

    d=Multiply(x,y);

    cout<

    }

    程序输出结果是: (5) 。

  3. ●试题六

    阅读以下说明和Java代码,将解答写入答题纸的对应栏内。

    【说明】

    下面是一个Applet程序,其功能是输出已定义好的两个变量x和chr。请改正程序中的错误(有下划线的语句),使程序能输出正确的结果。

    注意:不改动程序的结构,不得增行或删行。

    import javA.awt.*;

     (1) import javA.Applet;

     (2) public class MyApplet implements Applet

    {

    int x=10;

     (3) char chr="R";

    Label output1;

    Label output2;

     (4) private void init()

    {

    output1=new Label("定义int类型变量"+"x,的初值为"+x);

    output2=new Label("定义char类型变量"+"chr,的初值为"+chr);

    add(output1);

    add(output2);

    }

    }

     

    ex34_3

     

     (5)       

    width=400 height=400 >

  4. ●试题五

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

    【程序说明】

    函数int commstr(char *str1,char *str2,int *sublen)从两已知字符串str1和str2中,找出它们的所有最长的公共子串。如果最长公共子串不止1个,函数将把它们全部找出并输出。约定空串不作为公共子串。

    函数将最长公共子串的长度送入由参数sublen所指的变量中,并返回字符串str1和str2的最长公共子串的个数。如果字符串str1和str2没有公共子串,约定最长公共子串的个数和最长公共子串的长度均为0。

    【程序】

    int strlen(char *s)

    {char *t=s;

    while(*++);

    return t-s-1;

    }

    intcommstr(char)*str1,char *str2,int *sublen

    {char*s1,*s2;

    int count=0,len1,len2,k,j,i,p;

    len1=strlen(str1);

    len2=strlen(str2);

    if(len1>len2)

    {s1=str1;s2=str2;}

    else{len2=len1;s1=str2;s2=str1;}

    for(j=len2;j>0;j--)/*从可能最长子串开始寻找*

    {for(k=0; (1) <=len2;k++)/*k为子串s2的开始位置*/

    {for(i=0;s1[ (2) ]!='\0';i++;)/* i为子串s1的开始位置*/

    {/* s1的子串与s2的子串比较*/

    for(p=0;p

    if ( (4) )/*如果两子串相同*/

    {for(p=0);p

    printf("%c",s2[k+p]);

    printf("\n");

    count++;/*计数增1*/

    }

    }

    }

    if (count>0)break;

    *sublen=(count>0)? (5) :0;

    return count;

    }

  5. ●试题四

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

    【说明】

    函数QuickSort是在一维数组A[n]上进行快速排序的递归算法。

    【函数】

    void QuickSort(int A[],int s,int t)

    {int i=s,j=t+1,temp;

    int x=A[s];

    do{

    do i++;while (1) ;

    do j--;while(A[j]>x);

    if(i

    }while(i

    A[a]=A[j];A[j]=x;

    if(s

    if(j+1

    }

  6. ●试题三

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

    【说明】

    设有一个带表头结点的双向循环链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次L.Locate(x)操作时,令元素值x的结点的访问频度freq加1,并将该结点前移,链接到现它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。

    【函数】

    void Locate(int&x)

    {<结点类型说明>

    *p=first->next;

    while(p!=frist&&  (1) )P=P->next;

    if (p!=first)/*链表中存在x*/

    { (2) ;

    <结点类型说明>

    *current=p;/*从链表中摘下这个结点*/

    Current->prior->next=current->next;

    Current->next->prior=current->prior;

    P=current->prior;/*寻找重新插入的位置*/

    While(p!=first&&  (3) )p=p->prior;

    Current->next= (4) ;/*插入在P之后*?

    Current->prior=P;

    P->next->prior=current;

    P->next= (5) ;

    }

    else printf("Sorry.Not find!\n");/*没找到*/

    }

  7. ●试题一

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

    【算法说明】

    为便于描述屏幕上每个像素的位置,在屏幕上建立平面直角坐标系。屏幕左上角的像素设为原点,水平向右方向设为X轴,垂直向下方向设为Y轴。

    设某种显示器的像素为128×128,即在每条水平线和每条垂直线上都有128个像素。这样,屏幕上的每个像素可用坐标(x,y)来描述其位置,其中x和y都是整数,0≤x≤127,0≤y≤127。

    现用一维数组MAP来存储整个一屏显示的位图信息。数组的每个元素有16位二进位,其中每位对应一个像素,"1"表示该像素"亮","0"表示该像素"暗"。数组MAP的各个元素与屏幕上的像素相对应后,其位置可排列如下:

    MAP(0),MAP (1) ,…,MAP (7) 

    MAP (8) ,MAP (9) ,…,MAP (15) 

    MAP(1016),MAP(1017),…,MAP(1023)

    下述算法可根据用户要求,将指定坐标(x,y)上的像素置为"亮"或"暗"。

    在该算法中,变量X,Y,V,S,K都是16位无符号的二进制整数。数组BIT中的每个元素BIT(K)(K=0,...,15)的值是左起第K位为1,其余位均为0的16位无符号二进制整数,即BIT(K)的值为215-k。

    【算法】

    第1步根据用户指定像素的位置坐标(x,y),算出该像素的位置所属的数组元素MAP(V)。这一步的具体实现过程如下:

    1.将x送变量X,将y送变量Y;

    2.将Y左移 (1) 位,仍存入变量Y;

    3.将X右移 (2) 位,并存入变量S;

    4.计算Y+S,存入变量V,得到像素的位置所属的数组元素MAP(V)。

    第2步算出指定像素在MAP(V)中所对应的位置K(K=0,…,15)。这一步的具体实现过程如下:将变量X与二进制数 (3) 进行逻辑乘运算,并存入变量K。

    第3步根据用户要求将数组元素MAP(V)左起第K位设置为"1"或"0"。这一步的具体实现过程如下:

    1.为把指定像素置"亮",应将MAP(V)与BIT(K)进行逻辑 (4) 运算,并存入MAP(V)。

    2.为把指定像素置"暗",应先将BIT(K)各位取反,再将MAP(V)与BIT(K)进行逻辑 (5) 运算,并存入MAP(V)。

  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) ;

    }

    }