C++试卷

发布于:2023-12-18 ⋅ 阅读:(85) ⋅ 点赞:(0)

_____________ ________

诚信应考,考试作弊将带来严重后果!

 华南理工大学期末考试   2008-12

高级语言程序设计 I 》试卷 ( A ) 

注意事项:1. 考前请将密封线内填写清楚;

          2. 所有答案写在答题纸上;

         3.试卷和答题纸同时提交;

          4.考试形式:闭卷;

          5. 本试卷共五大题,满分100分,考试时间120分钟

题 号

总分

得 分

评卷人

一、单项选择题。(每小题2分, 共20分)

  1. 下列选项中,合法的常量表示是(    )。

(A) ‘program’    (B) 183AF      (C) -618e3     (D) 1.0e-5.3

  1. 执行下列语句后,i,j,k的值为(   )。

int i=1,j=1,k=1; (i++,--j) && ++k;

(A) 2,0,1      (B) 2,0,2      (C) 1,1,1      (D) 1,0,2

  1. 以下有关C++的说法中,正确的陈述是(    )。

(A) const只能约束普通内存变量的的写操作,不能约束指针变量的写操作。

(B) 静态变量和全局变量的作用域都是文件作用域。

    (C)一维数组定义中数组的长度表达式可以使用赋初值的变量。

    (D) inline函数没有普通函数调用的时空开销。

  1. 有如下代码段,不正确的函数调用形式(    )。

typedef int (*pType)(int,int);

int max(int a,int b){ return a>b?a,b; }

pType pf = max;

(A) pf(1,2);       (B) (*pf)(1,2);     (C) max(1,2);       (D) (&pf)(1,2);

  1. 以下程序段中,循环次数是()

for(int i=10;i>0&&i%2;){ i=i-2; }

(A) 0           (B) 4              (C) 5           (D) 6

  1. 已知int iArray[2][2]={0,1,2,3},下列表达式的值为2的是(    )。

(A) iArray[2][1]               (B) iArray[1][1]

(C) *(*(iArray+1))              (D) *(*(iArray)+1)

  1. 假设 char *a[]={“fortran”,“basic”,“c++”, “java”};

则语句cout<<a+3;  的输出结果是(    )。

(A)c++java     (B)一个地址值       (C)c++     (D)java

  1. 设有两个字符指针char *s1和char*s2分别指向两个字符串,判断字符串s1和s2是否相等的表达式是(    )。

(A) s1=s2   (B) s1==s2     (C) strcmp(s1,s2)==0    (D) strcpy(s1,s2)==0

  1. 下列运算符,优先级最高的是(    )。

(A)--          (B) =              (C)->          (D)[]

  1. 30*(‘F’-‘C’)/5-2*3表达式的值是(    )。

(A)6           (B) 12             (C)48          (D)18

  1. sizeof(char)+6*(6>5)/(2>3?2:3)表达式的值是(    )。

(A) 3          (B) 4              (C) 1              (D)2

二、简答题。(共20分)

1.写出两个表达变量x和y的值都不等于零的逻辑表达式。 x!=0&&y!=0 x&&y

2.有以下语句,循环体执行次数是多少?结束后x的值是什么?       10,-1

    int x=10;  while(x--) cout<<x<<endl;

3.有说明语句:

    int a; double x; int *p=new int[100];

分析以下表达式值的类型。

    a+x     a=a+x      p+1     double  int  int*

4.设有函数:

    void fun1(int a){ a++; };

void fun2(int & a){ a++; };

    有以下调用:

    int b=5;

     fun1(b);      //b的值是什么?

fun2(b);      //b的值又是什么?

两次调用函数后变量b的值有变化吗?为什么?  传值参数,引用参数

5.设有函数:

int function(int a)

{ static int k=0;  return a+k++; }

并有调用:

    int t=1;

     t=function(t)+function(t)+function(t);

有人说t的结果值等于3,对吗?为什么?              6,k是静态变量

6.设有语句:

    int *ap=new int[10];

请写出两个动态数组最后一个元素的表示形式。

Ap[9]

*(ap+9)

7.请解释以下说明语句中标识符www的含义。

    double * www(double);

www是函数名,有一个double值参,返回值类型为double*

8.设有语句:

    char *s="South China University of Technology";

请写输出子串“University of Technology”的语句。  cout<<s+12<<endl;

9.有说明语句:

    int ary[100]; int max;

赋值语句调用函数MaxAry求数组的最大元素值:

    max=MaxAry(ary,10);

请写出MaxAry的函数原型。      int MaxAry(const int *,int);

或   int MaxAry(const int [],int);

10.有语句:

struct link{ int code; link *next; }; link *head;

//……

push(head,256);

已知head为单链表的头结点,函数调用语句push在表头插入一个数据,请写出对应的函数原型。      void push(link *&, int);

三、阅读程序写输出结果(共20分)

1.//循环

#include <iostream.h>

void main()

{ int i=0,s=0;

  while (i++<=10)

  { if(i%2) continue;

    s=s+i;

    cout<<s<<'\t';

  }

}

2   6   12  20  30

2.//数组指针

#include<iostream.h>

void main()

{ int num[5];

  int *p=num, i;

  for(i=1;i<=5;i++) num[i-1]=i;

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

    cout<<num[i]+(*p++)<<'\t';

  cout<<endl;

}

2      4      6      8      10

3. //递归

#include<iostream.h>

void print(char ch)

{ int i=0;

if(ch=='D')

return;

else

{ print(ch+1);

       while(i++<=ch-'A')

 cout<<ch;

       cout<<endl;

     }

}

void main()

{ print('A');

}

CCC

BB

A

4. //函数指针参数

#include <iostream.h>

void fun(int *x, int *y)

{ cout<<"*x="<<*x<<'\t';

cout<<"*y="<<*y<<'\t';

*x = 3 ;

*y = 4 ;

}

void main()

{ int x = 1, y = 2 ;

fun(&y, &x);

cout<<"x="<<x<<'\t';

cout<<"y="<<y<<'\t'<<endl;

}

*x=2 *y=1 x=4 y=3

四、程序填空题(每空2分,共20分)

1. 假设90分以上为A等,80分到89分为B等,70分到79分为C等,60分到69分为D等,60分以下为E等。下面是输入一个分数,输出相应的五级制成绩的程序。

#include<iostream.h>

void main()

{double score;

 cout<<"score="; cin>>score;

 if( score > 100 || score < 0 )  cout <<"Input Error!";

   else  switch(        (1)       )           // (1)  (int) score/10

         {case 9:

          case 10: cout<<"A\n"; break;

          case 8:  cout<<"B\n"; break;

          case 7:  cout<<"C\n"; break;

          case 6:  cout<<"D\n"; break;

          default:      (2)      ;      // (2)  cout<<"E\n"

         }

}

2. 下面是显示如下图案的程序。

1111111111

 2222222

  33333

   444

    5

#include<iostream.h>

void main()

{ int i ,  j, k ;

  for( i = 1; i <= 5; i++ )

   {  for( k = 1;      (3)      ; k++ )       

           cout<<ends ;

      for( j =1 ;      (4)       ; j++ )     

      cout <<       (5)       ;           

      cout<<endl;  

}

}

#include<iostream>

using namespace std;

int main()

{

    int i, j, k;

    for (i = 1; i <= 5; i++)

    {

        for (k = 1; k < i; k++)

            cout << " ";

        for (j = 2*i-1; j >= 1; j--)

            cout << i;

        cout << endl;

    }

    return 0;

}

3.下面的程序的输出结果是:

  1. 3   2  1  10  9  8  7  6  5   

#include <iostream.h>

void  fun(       (6)       , int n , int m )    //int * s  或  int  s[]

{ int i , j , t ;

  i = n ; j = m ;

  while ( i<j )

 { t=s[i]; s[i]=s[j]; s[j]=t; i++; j--; }

 }

void  main()

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

  fun( a , 0 , 3 );       

  fun(       7       );                         // a,4,9 

  for ( int i = 0; i<10; i++ )

     cout << a[i] << ends;

  cout << endl;

}

4.下面的程序运行时屏幕显示Please  input  i(1~10) :  键盘输入3后,屏幕显示程序运行结果如图1所示:                 

图1 程序运行结果

#include <iostream.h>

int i ;                        

void  prints(       (8)       , int i )         // char * s

{  cout<<       (9)       << endl;             // (s + i – 1)

   cout<<       (10)       << endl;            // *( s + i )

};

void  main()

{  int  i ;

   cout << "Please  input i ( 1~10 ): ";

   cin >> i; 

   prints ( "ABCDEFGHIJ", i );

}

五、编程题(20分)

1、设计程序,输入一个正整数i(<256),求另一个正整数j,使i和j在用8位二进制表示时互为逆序。例如,输入i=3(00000011),应求得j=192(11000000)。

#include<iostream.h>

void main()

{ int i,j=0,k;

  cout<<"i=";

  cin>>i;

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

  { j=j*2+i%2;

    i/=2;

  }

  cout<<"j="<<j<<endl;

}

2、以下程序由随机数生成一个整数序列,放在数组a中,然后按奇数在前,偶数在后的顺序重新排放。程序运行效果如图2所示。请编写函数RandAry和函数PutAry。

#include<iostream.h>

#include<stdlib.h>

#include<time.h>

void RandAry(int *a, int n, int m);

void PutAry(int *a, int n);

void main()

{ int *a, i, n;

  cout<<"n=";  cin>>n;

  a=new int[n];

  RandAry(a, n, 100);         //用小于100的随机数对数组赋值

  for(i=0; i<n; i++)  cout<<a[i]<<"   ";               //输出原始序列

  cout << endl;

  PutAry(a,n);                     //整理数组,奇数放在前,偶数在后

  for(i=0; i<n; i++)  cout<<a[i]<<"   ";               //输出整理后序列

  cout << endl;

}

图2  整理数据

void RandAry(int *a, int n, int m)

{ srand( time( 0 ) );              //调用种子函数

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

  a[i] = rand() % m;                //用随机函数初始化数组

}

void PutAry(int *a, int n)

{ int i,t,k=0;

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

        if(a[i]%2)

        { t=a[i];

          a[i]=a[k];

          a[k++]=t;

        }

}

3、设有说明语句:

        struct list{ int data;  list * next; };

        list *head;

head是有序单向链表的头指针。请编写函数:

        void Count(list * head);

计算并输出链表中数据相同值的结点及个数。例如,数据序列为:

2 3 3 3 4 5 5 6 6 6 6 7 8 9 9

则输出为:

data          number

3               3

5               2

6               4

9               2

void Count(list * head)

{ list *p,*q;

  int n=1,t=0;//t表示是否发现了相同的值,n为相临结点具有相同值的结点的个数。

  q=head; p=head->next;

  cout<<"data\t"<<"number\n";

  while(p)

{ if(q->data==p->data)

          {n++; t=1;}

      else t=0;

  if(!t&&n>1)

  {cout<<q->data<<'\t'<<n<<endl;

   n=1;

  }

 q=p; p=p->next;

}

 if(n>1)//考虑最后一组相邻节点的情况

   cout<<q->data<<'\t'<<n<<endl;

}

世间温柔,不过是芳春柳摇染花香,槐序蝉鸣入深巷,白茂叶落醉故乡。

本文含有隐藏内容,请 开通VIP 后查看