辛巴狮子王:初级程序员2008上半年下午试题
第2章 程序员下午试题[分析]与解答
试题一
阅读以下说明和流程图,填补流程图中的空缺(1)~(9),将解答填入对应栏内。
【说明】
假设数组A中的各元素A(1),A(2),…,A(M)已经按从小到大排序(M≥1);数组B中的各元素B(1),B(2),…,B(N)也已经按从小到大排序(N≥1)。执行下面的流程图后,可以将数组A与数组B中所有的元素全都存入数组C中,且按从小到大排序 (注意:序列中相同的数全部保留并不计排列顺序)。例如,设数组A中有元素:2,5, 6,7,9;数组B中有元素2,3,4,7:则数组C中将有元素:2,2,3,4,5,6,7, 7, 9。
【流程图】
参考答案
(1)1 (2)A(i) (3)B(j)
(4)i (5)j (6)B(j)
(7)A(i) (8)j (9)i
[分析] 这是最常见的一种合并排序方法。为对较大的序列进行排序,先将其分割成容量相当的几个部分,分别进行排序,最后再合并在一起。当然,这些排序要么都是升序,要么都是降序。本题全部是按升序排序的。
例如,为了将整副扑克牌按升序进行排序,先将其分割成两个部分(数量大致相当),对每个部分完成升序排序后,就形成了两叠已排序的牌。如何将其合并呢?办法如下。
每次都比较各叠最上面的两张牌,取出比较小的,放入新堆,再继续比较。直到其中一堆空了,就将另一堆剩余的牌逐张放入新堆。新堆就是合并后的已完成排序的序列。
在数据排序时,遇到相同的数比较时,任取一个就可以了。
对本题来说,i、j、k是数组A、B、C的下标,初始时,都应该是1。因此,空(1)处应填写1。
将A(i)与B(j)进行比较后,如果A(i)≤B(j),那么应该将A(i)→C(k)。这是升序的要求。因此,空(2)处应填A(i)。如果A(i)>B(j),则应将B(j)→C (k)。因此,空(3)处应填B(j)。
在A(i)→C(k)后,i应增加1,为下次取A(i)再比较做准备(k也需要增加1,为下次存入C(k)做准备)。这时,需要比较数组A是否已经取完,即判断i>M是否成立。如果i>M,则表示数组A中的元素已经全部取出,需要将数组B中剩余的元素逐个移入C(k)。因此,空(4)处应填i,空(6)处应填B(j)。数组B处的元素何时移完呢?这就需要判断i>N是否成立。因此,空(8)处应填j。
同样,空(3)处将B(j)存入C(k),直到,j>N时数组B中的元素取完。此时,需要将数组A中剩余的元素逐个移入C(k),直到i>M时全部完成。因此,空(5)处应填j,空(7)处应填A(i),空(9)处应填i。
试题二
阅读以下说明和C程序,将应填入 (n) 处的字句写在对应栏内。
【说明】
下面的程序按照以下规则输出给定名词的复数形式。
a.若名词以“y”结尾,则删除y并添加“ies”;
b.若名词以“s”、“ch”或“sh”结尾,则添加“es”;
c.其他所有情况,直接添加“s”。
【C程序】
#include <stdio.h>
#include <string.h>
char*plural(char *word)
{
int n;
char *pstr;
n=strlen(word); /*求给定单词的长度*/
pstr=(char*)malloc(n+3);/*申请给定单词的复数形式存储空间*/
if (!pstr||n<2)
return NULL;
strcpy(pstr,word); /*复制给定单词*/
if ( (1) )
{
pstr[n-1]='i';pstr[n] ='e';pstr[n+1]='s'; (2) ;
}
else
if(pstr[n-1]=='s'| |pstr[n-1]=='h'&&( (3) ))
{
pstr[n]='e';pstr[n+1]='s';pstr[n+2]='\0';
}
else
{ pstr[n]='s';pstr[n+1]='\0';)
(4) ;
}
main()
{ int i; char *ps;
char wc[9][10]=
{"chair","dairy","boss","circus","fly","dog","church","clue","dish");
for(i = 0;i<9; i++) {
ps= (5) ;
printf("%s: %s\n",wc[i],ps); /*输出单词及其复数形式*/
free(ps); /*释放空间*/
}
system("pause");
}
参考答案
(1)pstr[n-1]='y',或*(pstr+n-1)=='y',或其等价表示
(2)pstr[n+2]='\0',或*(pstr+n+2)='\0',或其等价表示
(3)pstr[n-2]='c'||pstr[n-2]='s',或其等价表示
(4)return pstr
(5)plural(wc[i]),或其等价表示
[分析]
本题考查C程序设计基本能力和字符串处理基本操作。
C程序中字符串存储在字符数组中,串的结尾需要设置结束标志符号'\0'。若已知串 pstr的长度为n(不包括结束标志),则串中的字符依次存储在pstr[0],pstr[1],...,pstr[n-1]中。因此,名词的最后一个字符pstr[n-1]若等于字符“y”,则按照规则a求其复数形式。下面的if语句处理的是以“y”结尾的名词,因此,空(1)处应填入“pstr[n-1]='y'”或其等价形式。由于串pstr的长度发生了变化,所以需要设置新的结束标志,空(2)处应填入“pstr[n+2]='\0'”或其等价形式。
if( (1) )
{
pstr[n-1]= 'I'; pstr[n]= 'e'; pstr[n+1] = 's'; (2) ;
}
显然,下面的if语句处理规则b所示的情况,即串的末尾为“s”、“ch”或“sh”的情形,空(3)处应填入“pstr[n-2]='c'||pstr[n-2]='s”或其等价形式。
if(pstr[n-1]=='s'||pstr[n-1]=='h' && ( (3) ))
{
pstr[n] = 'e'; pstr[n+1] ='s'; pstr[n+2]='\0';
}
根据函数“char *plural(char *word)”的定义,最后应将求得的给定名词的复数形式返回给主调函数mae,对于串,应返回串空间的首地址,即返回指针pstr,因此空(4)处应填入“return pstr”。
根据以下代码,空(5)处应调用函数plural(char*word)对指定名词求复数,数组 WC初始化时已设置了名词序列,因此,空(5)处应填入“plural(wc[i])”。
for(i = 0; i < 9; i++) {
ps= (5) ;
printf("%s: %s\n",wc[i],ps); /*输出单词及其复数形式*/
free(ps); /*释放空间*/
}
试题三
阅读以下说明和C程序,将应填入 (n) 处的字句写在对应栏内。
【说明】
下面的程序用DoleRob算法生成N阶(N为奇数)魔方阵(各行、列、对角线数字之和相等)。该算法的过程为:从1开始,按如下方法依次插入各自然数,直到N2为止。
a.在第一行的正中插入1。
b.新位置应当处于最近插入位置的右上方,若该位置已超出方阵的上边界,则新位置取应选列的最下一个位置;若超出右边界,则新位置取应选行的最左一个位置。
c.若最近插入的元素是N的整数倍,则选同列的下一行位置为新位置。
例如,3阶魔方阵如下所示:
8 1 6
3 5 7
4 9 2
【C程序】
#include<stdio.h>
#include<stdlib.h>
#define SIZE 50
main( )
{ int row, col, n,value;
int a[SIZE+1][SIZE+1]; /*不使用下标为0的元素*/
printf("请输入要输出魔方阵的阶数n(奇数,<%d):n=",SIZE);
scanf("%d",&n);
if (!(n % 2)||n < 1 || (1) ) {
printf("输入数据有误!\n"); exit(0);
}
row=1; col = (n+1)/2; value=1;
while(value< = (2) ) {
a[row][col] = value;
/*计算下一位置*/
if(value%n !=0){
row--; (3) ;
if(row<1) row=n;
if(col>n) (4) ;
}
else row++;
value = (5) ;
}
printf("\n%d阶魔方阵如下所示:\n\n",n);
for(row = 1;row <= n; row++){
for(col = 1; col <=n; col++)
printf("%5d",a[row][col]);
printf("\n");
}
}
参考答案
(1)n>SIZE,或其等价表示
(2)n*n
(3)col++,或++col,或col=col+1,或其等价表示
(4)col-=n,或col=1,或其等价表示
(5)value+l,或其等价表示
[分析]
本题考查根据算法编写程序的基本能力。
N阶魔方阵定义为各行、列、对角线的数字之和相等。DoleRob给出了奇数阶魔方阵的算法,算法中方阵的行号和列号从1至N取值。程序中空(1)处判断n的合法性, n需为奇数,矩阵规模应不超过SIZE2。
根据题中的算法描述,由于要按次序将数值1~n2放入方阵中(在程序中以value表示每次要存入的数值),因此从1开始填入。将数值填入方阵的语句为“a[row][col]= value;”,该语句在循环中,因此循环条件为“value<=n*n”,因此,空(2)处填入“n*n”。
程序中,本次填入的数值为value的值,下一次要填入的数值为value加1,因此,空(5)处应填入“value+l”。
数值1的位置在第一行的正中间,即行号为1、列号为(n+1)/2,下一个位置即2的位置在1的右上方,即1所在位置的行号减1、列号加1。当新位置超出方阵的上边界,则新位置取应选列的最下一个位置:若超出右边界,则新位置取应选行的最左一个位置,因此对于3阶魔方阵,1填入第1行第2列,2填入第3行第3列,3填入第2行第1列,其余位置按照算法步骤b类推。因此,空(3)处填入“col++”或其等价形式,空(4)处填入“col=1或“col-=n”。需要考虑的特殊情况是本次填入的value值为N的倍数时,下一个插入位置为本次插入位置的正下方,即对于3阶矩阵,4填入3的正下方,7填入6的正下方等。
试题四
阅读以下说明和C函数,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
计算机在处理算术表达式时,首先将其转换为后缀表达式。例如,表达式“46+5*(120-37)”的后缀表达式形式为“46 512037-*+”。
计算后缀表达式时,从左至右扫描后缀表达式:若遇到运算对象,则压入栈中;遇,到运算符,则从栈中弹出相关运算对象进行计算,并将运算结果压入栈中。重复以上过程,直到后缀表达式扫描结束。例如,后缀表达式“46 5120 37-*+”的计算过程如下。
a.依次将46、5、120、37压入栈中;
b.遇到“-”,取出37、120,计算120-37=83,将其压入栈中:
c.遇到“*”,取出83、5,计算5×83=415,将其压入栈中;
d.遇到“+”,取出415、46,计算46+415=461,将其压入栈中;
e.表达式结束,则计算过程完成。
函数computing(char expr[],int *result)的功能是基于栈计算后缀形式的表达式(以串形式存入字符数组expr)的值,并通过参数result返回该值。函数的返回值为-1/0,分别表示表达式有/无错误。假设表达式中仅包含数字、空格和算术运算符号,其中所有项均以空格分隔,且运算符仅包含加(“+”)、减(“-”)、乘(“*”)、除(“\”)。
函数computing中所用栈的基本操作的函数原型说明如下。
· void InitStack(STACK *s):初始化栈。
· void Push(STACK,s,int e):将一个整数压栈,栈中元素数目增1。
· void Pop(STACK *s):栈顶元素出栈,栈中元素数目减1。
· int Top(STACK s):返回非空栈的栈顶元素值,栈中元素数目不变。
· int IsEmpty(STACKs):若s是空栈,则返回1;否则返回0。
【C函数】
int computing (char expr[],int *result)
{
STACK s; int tnum,a,b; char *ptr;
InitStack(&s);
ptr=expr;pstr /*字符指针指向后缀表达式串的第一个字符*/
while(*ptr!='\0') {
if(*ptr==' ') { /*当前字符是空格*/
(1) ; /*字符指针指向下一字符*/
continue;
}
else
if(isdigit (*ptr)) {
/*当前字符是数字,则将该数字开始的数字串转换为数值*/
tnum= (2) ;
while (*ptr>='0' && *ptr <='9') {
tnum=tnum * 10 + (3) ;
ptr++;
}
Push( (4) );
}
else /*当前字符是运算符或其他符号*/
if (*ptr=='+'||*ptr=='-'||*ptr=='*'||*ptr=='/'){
if(!IsEmpty(s)) {
a=Top(s);Pop(&s); /*取运算符的第二个运算数*/
if(!IsEmpty(s)) {
b=Top(s);Pop(&s);/*取运算符的第一个运算数*/
}
else return -1;
}
else return -1;
switch (*ptr) {
case '+': Push(&s,b+a); break;
case '-':Push(&s,b-a); break;
case '*':Push(&s,b*a); break;
case '/':Push(&s,b/a); break;
}
}
else
return -1;
ptr++; /*字符指针指向下一字符*/
}/*while*/
if(IsEmpty(s)) return -1;
else{
(5) =Top(s); Pop(&s); /*取运算结果*/
if(!IsEmpty(s)) return -1;
return 0;
}
}
参考答案
(1)ptr++,或++ptr,或ptr=ptr+1,或其等价表示
(2)0,或tnum=0
(3)*ptr-'0',或*ptr-48,或其等价表示
(4)&s,tnum
(5)*result
[分析]
本题考查栈结构在后缀表达式求值过程中的应用。
利用栈计算后缀表达式时,从左至右扫描后缀表达式:若遇到运算对象,则压入栈中;遇到运算符,则从栈中弹出对应数目的运算对象进行计算,并将运算结果压入栈中。重复以上过程,直到后缀表达式扫描结束,最后栈顶就是表达式的计算结果。
根据题目的说明,由于后缀表达式以字符串方式存储且以空格分隔符号(数值、算符),因此遇到空格字符时,指向表达式中字符的指针ptr应增加1指向后续字符,因此,空(1)处应填入“ptr++”或其等价形式。
下面以字符串“
数值375=((0×10+3)×10+7)×10+5
(1)取得数字字符“
mum=0*10+51-48=3;
(2)取得数字字符“
tnum=3*10+55-48=37;
(3)取得数字字符“
tnum=37*10+53-48=375;
以下代码用于将一个数字字符串转换为对应的整数存入tnum,显然,tnum的初始值应为0。
tnum= (2) ;
while (*ptr>='0' && *ptr <='9') {
tnum=tnum*10+ (3) ;
ptr++;
}
因此,空(2)处应填入“
空(4)处用于将转换所得的数值tnum压入栈顶,根据题目中Push的原型“void Push(STACK *s,int e)”,调用时第一个实际参数是STACK类型变量的地址,第二个实际参数是一个整数,因此,空(4)处填入“&s,tnum”。
由于函数computing(ckar expr[],int *result)通过参数result返回该表达式的值,因此需要将存在栈顶的运算结果赋值给result指向的整型变量,即空(5)处填入“*result”。
该题目还考查了参数传递知识,因此考生应通过上机实践加强基本概念的理解和程序设计能力的培养。
试题五
阅读下列说明、图和C抖代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
已知对某载客车辆(Car)进行类建模,如图5-1所示,其中类Engine表示发动机引擎,类Wheel表示车轮,类Body表示车身,类Driver表示司机,类Passenger表示乘客。
【C++代码】
const int (1) =7; //定义最多载客数
const int MAX WHEELS=5; //定义最多轮胎数
class Body{ //此处代码省略 }; //车身类
class Passenger{ //此处代码省略 }; //乘客类
class Wheel{ //此处代码省略 }; //车轮类
class Driver{ //司机类
public:
string name;//表示第几路公交车司机
Driver(string driverName):name( (2) ){}///构造函数
};
class Engine{//引擎类
public:
string engineNo;//引擎编号
Engine(string engineNo){ (3) ->engineNo=engineNo;}//构造函数
};
class Car{//汽车类
protected:
Engine * engine; Driver * driver; Body body;
Wheel * wheels [MAX_WHEELS];Passenger * passengers [MAX_PASSENGERS];
public:
Car(Driver *driver){ //构造函数
this->driver=driver;
engine=new Engine("TX6536型号引擎");
for (int index=0; index<MAX WHEELS;index++){
wheels[index]=new Wheel();
}
for(int index=0;index<MAX_PASSENGERS;index++){
passengers[index]=NULL;
}
}
virtual ~Car(){//析构函数
for( int index=0;index<MAX_WHEELS;index++)
delete wheels[index];
delete (4) ;
}
int getPassengerNumber(){//获取车上乘客数量
//此处代码省略
}
void getOnPassenger(Passenger * aPassenger){//乘客上车
//此处代码省略
}
void run(){ //开车
if(driver==NULL){cout<<"司机尚未上车!"; return; }
//此处代码省略
}
};
void main(){
Driver driver("第五路公交车司机");
Car car( (5) );
Passenger passengers[MAX_PASSENGERS];
for(int index=0;index<MAX PASSENGERS;index ++) //乘客上车处理
car.getOnPassenger(&passengers [index]);
car.run();
}
参考答案
(1)MAX_PASSENGERS
(2)driverName
(3)this
(4)engine
(5)&driver
[分析]
根据类图描述,分析可得:一辆汽车可以载0~7名乘客,一辆汽车可以被一个或者多个司机驾驶,并且一辆汽车有4~5个轮胎,一个引擎和一个车框架。程序代码中空(1)处表示一辆汽车最多载客数目, 从后面的程序代码[分析]可得,应该填写 MAX PASSENGERS。空(2)处主要设置车的假设司机,由于参数的名称与成员变量的名称相同,因此需要加上this以示区别。空(3)处主要用于判断司机是否上车,因此,代码应该对汽车所维持的司机对象的引用是否为空进行判断。空(4)处用于产生一个汽车对象,所以,需要给汽车对象传递合适的参数,构造方法中需要传递一个司机对象,因此应该将driver对象传递到汽车对象中。空(5)处表示乘客上车,getOnPassenger要求传递的是乘客对象,因此空缺处应为构造乘客对象的代码。
试题六
阅读以下应用说明及Visual Basic程序代码,将应填入 (n) 处的字句写在对应栏内。
【应用说明】
某应用程序可选择打开用户指定的文本文件,将其内容显示在指定的文本框内供用户编辑,并将编辑后的结果保存在用户指定的文件中。运行时的窗口如图6-1所示,其中有6个标签、一个驱动器列表框、一个目录列表框、一个文件列表框、一个文件类型组合框、一个文件编辑文本框、一个文件名文本框以及两个命令按钮。
该程序的开发要求如下。
(1)通过驱动器列表框(Drivel)、目录列表框(Dirl)和文件列表框(Filel),选择文件。
(2)文件类型组合框(Cmb_type)设置为下拉式列表框,其中有三个供选项,分别为“所有文件(*.*)”、“文本文件(*.txt)”和“可执行文件(*.exe)”。在文件列表框中列出的文件类型会自动与文件类型组合框中选择的文件类型相匹配。
(3)在文件列表框中单击一个文件名时,该文件名会显示在文件名文本框 (Txt filename)中。
(4)在文件列表框中双击一个文件名时,若是文本文件,则在文件编辑文本框 (Txt file)中显示该文件的内容并可进行编辑;若不是文本文件,则弹出一个对话框,提示“请选择文本文件!”。
(5)对于编辑后的文本文件,可在文件名文本框中输入新的文件名,并单击命令按钮(Cmd save)进行保存。
【Visual Basic程序代码】
Private Sub Form_Load()
Cmb_type.Addltem "所有文件(*.*)"
Cmb_type.Addltem "文本文件(*.txt)"
Cmb_type.Addltem "可执行文件(*.exe)"
Cmb_type.ListIndex=0
Filel.Pattern="*.*": Txt_filename.Text=" "
Txt_file.Text= " "
End Sub
Private Sub Dirl Change()
Filel.Path= (1)
End Sub
Private Sub Drivel Change()
Dirl.Path=Drivel.Drive
End Sub
Private Sub Cmb_type_click()
Select Case Cmb_type. (2)
Case 0
Filel.Pattern="*.*"
Case 1
Filel.Pattern="*.txt"
Case 2
Filel.Pattern="*.exe"
End Select
End Sub
Private Sub Cmd_save_Click()
usrFile=GetFileName() '函数GetFileName获得要保存的文件名
Open usrFile For Output As #1 '定义usrFile为1号输出文件
Print #1,Txt file.Text '输出到1号文件
Close #1
End Sub
Private Sub Filel_DblClick()
If right(Filel.FileName,3)<> (3) Then
MsgBox "请选择文本文件!"
Exit Sub
End If
usrFile=GetFileName() '函数GetFileName获得要打开的文件名
Open usrFile For Input As #1 '定义usrFile为1号输入文件
Txt_file.Text=" "
DO While (4) EOF(1)
Line Input #l,fContext '从1号文件读入一行
Txt_file.Text;Txt file.Text + (5) +vbCrLf
Close #1
End Sub
'其他代码略
参考答案
(1)Dir1.Path
(2)ListIndex
(3)"txt"
(4)Not
(5)fContext
[分析]
驱动器列表框(DriveListBox)、目录列表框(DirListBox)和文件列表框(FileListBox)是Visual Basic提供的内部控件,驱动器列表框可自动填写驱动器的名字和卷标,目录列表框可显示指定驱动器的目录树,而文件列表框则是一个特殊的ListBox控件,它显示指定目录下的所有文件,并可选择按文件的名字、扩展名或属性排列内容。
这些控件常常在一个窗体中工作,当用户在DriveListBox中选择一个驱动器时, DirListBox控件就更新显示该驱动器上的目录树,当用户在DirListBox中选择一条路径时,FileListBox控件中的内容为该目录下的文件列表,这些活动自动地触发Change事件。但是,这些活动不能自动完成,需要为Change事件编写代码,通过代码将驱动器列表框的Drive属性(指明当前驱动器)赋值给目录列表框的Path属性,将目录列表框的Path属性(指明当前路径)赋值给文件列表框的Path属性,即Dirl.Path=Drivel. Drive,Filel.Path=Dirl.Path,因此,空(1)处应填入“Dirl.Path”。
下拉式列表框(Combo Box)是组合列表框和文本框的特性而成的控件。它的Text属性值是用户所选择的项目的文本或直接从编辑区输入的文本。它的ListIndex属性值为选中条目的编号。显然,对于文件类型组合框Cmb_type的单击事件,空(2)处应填入“ListIndex”。
空(3)所在的if语句通过后缀判断文件的类型,显然对于文本文件,空(3)处应填入“txt”。由于文件的大小是变化的,因此对文件进行读取操作时,条件是文件未到达结尾,一般程序语言都会提供对文件操作的命令或函数,因此,空(3)处应填入“Not”。若要将文本文件的内容显示在文本框Txt_file中,则需把从1号文件读入的各行文本连接起来,语句“LineInput#1,fContext”用于从1号文件读入一行文本并存入变量fContext。因此,空(5)处应填入“fContext”。
试题七
阅读下列说明、图和Java代码,将应填入 (n) 处的字句写在对应栏内。
【说明】
已知对某载客车辆(Car)进行类建模,如图7-1所示,其中类Engine表示发动机引擎,类Wheel表示车轮,类Body表示车身,类Driver表示司机,类Passenger表示乘客。
【Java代码】
class Body{ //此处代码省略 ); //车身类
class Passenger{ //此处代码省略 )/ //乘客类
class Wheel{ //此处代码省略 ); //车轮类
class Driver{ //司机类
public String name; //表示第几路公交车司机
public Driver(String driverName){name = driverName/) //构造函数
};
class Engine{//引擎类
public String engineNo;//引擎编号
public Engine(String engineNo){this.engineNo=engineNo;)//构造函数
};
public class Car{//汽车类
static final int (1) =7; //定义最多载客数
static final int MAX WHEELS =5; //定义最多轮胎数
protected Engine engine;
protected Driver driver;
protected Body body=new Body();
protected Wheel[] wheels;
protected Passenger[]passengers;
public Car(Driver driver){ //构造函数
(2) .driver=driver;
engine=new Engine("TX6536型号引擎");
wheels=new Wheel[MAX WHEELS];
passengers=new Passenger[MAX_PASSENGERS];
for(int index=0;index<MAX_WHEELS;index++){
wheels[index]=new Wheel();
}
for(int index=0;index<MAX_PASSENGERS;index++){
passengers[index]=null;
}
}
int getPassengerNumber(){//获取车上乘客数量
//此处代码省略
}
void getOnPassenger(Passenger aPassenger){//乘客上车
//此处代码省略
}
void run(){ //开车
if( (3) ){System.out.println("司机尚未上车!");return;}
//此处代码省略
}
public static void main(String args[]){
Driver driver=new Driver("第五路公交车司机");
Car car=new Car( (4) );
for (int index = 0 ; index < MAX_PASSENGERS; index ++)
car.getOnPassenger( (5) Passenger());
car.run();
}
}
参考答案
(1)MAX_PASSENGERS
(2)this
(3)driver==null
(4)driver
(5)new
[分析]
根据类图描述[分析]可得:一辆汽车可以载0~7名乘客,一辆汽车可以被一个或者多个司机驾驶,并且一辆汽车有4~5个轮胎,一个引擎和一个车框架。程序代码中空(1)处表示一辆汽车最多载客数目,从后面的程序代码[分析]可得,应该填写 MAX PASSENGERS。空(2)处主要设置车的假设司机,由于参数的名称与成员变量的名称相同,因此需要加上this以示区别。空(3)处主要用于判断司机是否上车,因此,代码应该对汽车所维持的司机对象的引用是否为空进行判断。空(4)处用于产生一个汽车对象,所以需要给汽车对象传递合适的参数,构造方法中需要传递一个司机对象,因此应该将driver对象传递到汽车对象中。空(5)处表示乘客上车,getOnPassenger要求传递的是乘客对象,因此空缺处应为构造乘客对象的代码。