_____________ ________ … |
华南理工大学期末考试 2008-12
《 高级语言程序设计 I 》试卷 ( A )
注意事项:1. 考前请将密封线内填写清楚;
2. 所有答案写在答题纸上;
3.试卷和答题纸同时提交;
4.考试形式:闭卷;
5. 本试卷共五大题,满分100分,考试时间120分钟。
题 号 |
一 |
二 |
三 |
四 |
五 |
总分 |
得 分 |
||||||
评卷人 |
一、单项选择题。(每小题2分, 共20分)
- 下列选项中,合法的常量表示是( )。
(A) ‘program’ (B) 183AF (C) -618e3 (D) 1.0e-5.3
- 执行下列语句后,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
- 以下有关C++的说法中,正确的陈述是( )。
(A) const只能约束普通内存变量的的写操作,不能约束指针变量的写操作。
(B) 静态变量和全局变量的作用域都是文件作用域。
(C)一维数组定义中数组的长度表达式可以使用赋初值的变量。
(D) inline函数没有普通函数调用的时空开销。
- 有如下代码段,不正确的函数调用形式( )。
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);
- 以下程序段中,循环次数是()
for(int i=10;i>0&&i%2;){ i=i-2; }
(A) 0 (B) 4 (C) 5 (D) 6
- 已知int iArray[2][2]={0,1,2,3},下列表达式的值为2的是( )。
(A) iArray[2][1] (B) iArray[1][1]
(C) *(*(iArray+1)) (D) *(*(iArray)+1)
- 假设 char *a[]={“fortran”,“basic”,“c++”, “java”};
则语句cout<<a+3; 的输出结果是( )。
(A)c++java (B)一个地址值 (C)c++ (D)java
- 设有两个字符指针char *s1和char*s2分别指向两个字符串,判断字符串s1和s2是否相等的表达式是( )。
(A) s1=s2 (B) s1==s2 (C) strcmp(s1,s2)==0 (D) strcpy(s1,s2)==0
- 下列运算符,优先级最高的是( )。
(A)-- (B) = (C)-> (D)[]
- 30*(‘F’-‘C’)/5-2*3表达式的值是( )。
(A)6 (B) 12 (C)48 (D)18
- 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.下面的程序的输出结果是:
- 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;
}
世间温柔,不过是芳春柳摇染花香,槐序蝉鸣入深巷,白茂叶落醉故乡。