_____________ ________ … |
?华南理工大学期末考试?? 2008-12
《 高级语言程序设计 I 》试卷 ( A )?
注意事项:1. 考前请将密封线内填写清楚;
????????? 2. 所有答案写在答题纸上;
?????? ? 3.试卷和答题纸同时提交;
????????? 4.考试形式:闭卷;
????????? 5. 本试卷共五大题,满分100分,考试时间120分钟。
题 号 | 一 | 二 | 三 | 四 | 五 | 总分 |
得 分 | ||||||
评卷人 |
一、单项选择题。(每小题2分, 共20分)
(A) ‘program’??? (B) 183AF????? (C) -618e3???? (D) 1.0e-5.3
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
(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
(A) iArray[2][1]??? ?????????? (B) iArray[1][1]
(C) *(*(iArray+1)) ???? ??????? (D) *(*(iArray)+1)
则语句cout<<a+3;? 的输出结果是(??? )。
(A)c++java???? (B)一个地址值?????? (C)c++???? (D)java
(A) s1=s2?? (B) s1==s2???? (C) strcmp(s1,s2)==0??? (D) strcpy(s1,s2)==0
(A)--????????? (B) =????????????? (C)->????????? (D)[]
(A)6?????????? (B) 12???????????? (C)48????????? (D)18
(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.下面的程序的输出结果是:
#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;
}
世间温柔,不过是芳春柳摇染花香,槐序蝉鸣入深巷,白茂叶落醉故乡。