题型有:1. 必答题 2. 选答题
必答题(共4道大题,每道大题15分)
1. 阅读以下说明和流程图,填写流程图和问题中的空缺,将解答填入答题纸对应栏内。【说明】 如果一个自然数N恰好等于它所有不同的真因子(即N的约数以及1,但不包括N)之和S,则称该数为“完美数”。例如6=1+2+3,28=1+2+4+7+14,所以,6和28都是完美数。显然,6是第1个(即最小的)完美数。 下面流程图的功能是求500以内所有的完美数。【流程图】 循环开始框中注明:循环变量=初始值,终值[,步长],步长为1时可以缺省。【问题】 如果某自然数小于其所有真因子之和(例如24<1+2+3+4+6+8+12),则称该自然数为亏数;如果某自然数大于其所有真因子之和(例如8>1+2+4),则称该自然数为赢数;如果某自然数等于从1开始的若干个连续自然数之和(例如10=1+2+3+4)则称该自然数为三角形数。据此定义,自然数496是(5)________________。供选择答案: A.亏数
B.赢数
C.完美数,非二角形数
D.完美数和三角形数
正确答案:(1)2(2)N%K或N mod K或N/K*K-N或等效的其他形式(3)S+K或K+S等效形式(4)S(5)D或完美数和三角形数
解析:本题考查程序算法流程图的设计。 流程图中,外循环是对自然数N=6,7,…,500生行的,即判断每个N是台为完美数。显然,内循环用于判断每个K是否为N的因子。N的因子只可能在2,3,…,N/2中,因此,(1)处应填2。为判断K是否为N的因子,即N能否被K整除,或N除以K的余数是否为0,可以采用多种方法:例如判断N%K,或N mod K,或N/K*K-N是否为0。因此(2)处可填N%K,或N mod K,或N/K*K-N。 变量S用于累加N的所有因子。开始时S=1,以后每次发现因子K后,就应执行S+K→S。因此(3)处应填S+K或K+S。 随后应比较N与S是否相等用于判断N是否为完美数。因此(4)处应填S。 在问题中,由于496=24×31=1+2+4+8+16+31+62+124+248,即496等于其所有真因子之和,因此496是完美数。同时,496=31×32/2=1+2+3+…+31,因此496是三角形数。
2. 阅读以下说明和C代码,填写程序中的空(1)~(5),将解答写入答题纸的对应栏内。【说明】 直接插入排序是一种简单的排序方法,具体做法是:在插入第i个关键码时k1,k2,…,ki-1已经排好序,这时将关键码ki依次与关键码ki-1,ki-2等进行比较,找到ki应该插入的位置时停下来,将插入位置及其后的关键码依次向后移动,然后插入ki。 例如,对{17,392,68,36}按升序作直接插入排序时,过程如下: 第1次:将392(i=1)插入有序子序列{17},得到{17,392}; 第2次:将68(i=2)插入有序子序列{17,392},得到{17,68,392}; 第3次:将36(i=3)插入有序子序列{17,68,392},得到{17,36,68,392},完成排序。 下面函数insertSort用直接插入排序对整数序列进行升序排列,在main函数中调用insertSort并输出排序结果。【C代码】 void insertSort(int data[],int n) /*用直接插入排序法将 data[0]~data[n—1]中的n个整数进行升序排列*/ { int i,j; int tmp; for(i=1; i<n; i++){ if(data[i]<data[i—1])(//将data[i]插入有序子序列data[0]~data[i-1] tmp=data[i]; //备份待插入的元素 data[i]= (1); for(j=i-2; j>=0&& data[j]>tmp;j--) //查找插入化置并将元素后移(2) ; (3) =tmp; //插入正确位置 }/★if★/ }/*for*/ }/*insertSort*/ int main( ) int *bp,*ep; int n,arr[]={17,392,68,36,291,776,843,255}; n=sizeof(arr)/Sizeof(int); insertSort(arr,n); bp= (4) ; ep =arr+n; for( ;bp<ep;bp++) //按升序输出数组元素 printf(“%d\t”, (5) ); return 0; }
正确答案:(1)data[i-1]或等效形式(2)data[j+1]=data[j]或等效形式(3)data[j+1]或等效形式(4)arr或&arr[0]或等效形式(5)*bp或bp[0]或等效形式
解析:本题考查C程序流程控制和直接插入排序算法的实现及指针的应用。 直接插入方法的基本思路是不断将元素插入有序序列的适当位置,保持序列的有序性。在确定插入位置时,从有序序列的末端开始,用待插入元素与序列中的元素进行比较,同时移动大于插入元素者,以空出位置放入待插入元素。 本代码中直接插入排序算法用函数insertSort(int data[],int n)实现,待插入元素为data[i],递增有序的序列为data[0]~data[i-1]。显然,如果data[i]>=data[i-1](即待插入元素比有序序列的最大元素还要大或相等,则不需要移动任何元素,data[0]~data[i]已成为新的有序序列)。反之,如果data[i]<data[i一1],则至少需要将data[i—1]移到data[i]所在位置,因此用tmp先将待插入元素data[i]备份起来,待找到其插入位置后再插入。空(1)所在语句是实现该过程中第一次的元素移动,即移动data[i-1],所以该空应填入“data[i一1]”或其等效表示形式。空(2)所在语句则是通过在data[0]~data[i-2]中查找待插入元素的位置,用j表示该有序序列中的元素位置,当待插入元素(用tmp表示)小于data[j]时,需要移动元素,即将data[j]移入data[j+1](初始时j等于i-2),因此空(2)处应填入“data[j+1]=data[j]”或其等效形式,该空所在的循环语句结束时,tmp>=data[j],即data[j+1]为所确定出的插入位置,空(3)处将待插入元素放入该位置即可。 在main函数中,通过指针方式访问数组arr的元素。指针变量bp初始时指向数组的第一个元素,之后通过递增(bp++)来指向后续元素,因此空(4)应填入“arr”或“&arr[0]”或其他等效形式。指针所指向的对象用“*”运算符号加指针变量表示,因此空(5)处应填入“*bp”或其等效形式。
阅读以下C代码,回答问题1至问题3,将解答填入答题纸的对应栏内。
3. 【C代码1】 float adjustSalary(int service year,int age,float salary){ if(service_year<=5){ if(age>30) salary*=1.2; } else salary*=2.0; return salary; }【问题1】对于【C代码1】,写出下面的函数调用后x1、x2和x3的值。 x1=adjustSalary(1,25,9000.0); x2=adjUStSalary(8,32,7000.0); x3=adjustSalary(5,41,5000.0);
正确答案:
解析:本题考查C程序流程控制及其应用。【问题1】 本问题考查描述两分支流程控制的if语句的应用。代码1中的if语句中嵌套了不含else分支的if语句,其含义如下面的流程图所示,表示服务年限不足5年而年龄大于30岁的职员,其工资增长20%;服务年限大于5年者,其工资翻倍。 函数首部为float adjustSalary(int service_year,int age,float salary),第一个参数service year表示服务年限,第二个参数age表示年龄,第二个参数salary表示当前工资。 对于函数调用“x1=adjustSalary(1,25,9000.0)”,第一个实参的值为1,即服务年限为1,“service year<=5”成立,第二个实参的值为25,“age>30”不成立,因此salary不变,x1得到的值为9000.0。 对于函数调用“x2=adjustSalary(8,32,7000.0)”,第一个实参的值为8,即服务年限为8,“service year<=5”不成立,因此salary增加1倍,x2得到的值为14000.0。 对于函数调用“x3=adjustSalary(5,41,5000.0)”,第一个实参的值为5,即服务年限为5,“service year<=5”成立,第二个实参的值为41,“age>30”成立,因此salary增加20%,x3得到的值为6000.0。
4. 【C代码2】 VOid foo(int coin){ switch (coin) { case 1:printf(“Cent\n”); case 5:printf(“Nickel\n”); break; case 10:printf(“Dime\n”); case 25:printf(“Quarter\n”); } }【问题2】(1)写出函数调用为foo(1)的输出结果;(2)写出函数调用为foo(5)的输出结果;(3)写出函数调用为foo(10)的输出结果;(4)写出函数调用为foo(25)的输出结果。
正确答案:(1)CentNickel(2)Nickel(3)DimeQuarter(4)Quarter
解析:【问题2】本问题考查描述多分支流程控制的switch语句应用。 通过传入不同值考查对switch语句的理解和应用,特别要注意其中break的作用。题目中的switch语句在逻辑上可以理解为下面流程图的含义,实际上通过将各情况的代码位置记在一个称为跳转表的数组中,根据coin的值实现直接跳转,可以得到更高效的执行效率。(1)对于函数调用foo(1),其输出结果为: Cent Nickel(2)对于函数调用foo(5),其输出结果为: Nickel(3)对于函数调用foo(10),其输出结果为: Dime Quarter(4)对于函数调用foo(25)的输出结果。 Quarter
5. 【C代码3】 int getSum(int n) { int t,i=0,sum=0; while(i<n){ scanf(“%d”,&t); if(t<0) continue; sum+=t; i++; } return sum; }【问题3】(1)简要说明【C代码3】中的函数getSum( )的功能;(2)程序员小王将函数getSum改写后得到下面的函数getSum_v2(即用for语句来描述循环)。请问,getSum_v2的功能是否与【C代码3】的gctSum完全相同,若不同,请说明原因。 int getSum v2(int n) { int t,i=0,sum=0; for(i=0;i<n; i++) { scanf(“%d”,&t); if(t<0) continue; Sum+=t; } return sum; }
正确答案:(1)将输入的n个非负整数求和或含义相同的表述(2)不同for循环中i的值每次都增1,在while循环中i的值不是每次都增1。注:含义相同的表述都可。
解析:【问题3】本问题考查描述循环流程控制的语句应用。 while和for都是常用的循环语句,需要注意其中continue的作用。 函数getSum的处理逻辑如下面的流程图所示,其中continue的作用是结束本次循环,重新开始下一次循环,因此i的值在输入的整数不小于0时才增加1,其作用是计算输入的非负整数个数,在i的值为n时结束循环,sum的结果是n个非负整数的和。 而函数getSum_V2的处理逻辑如下面的流程图所示,其中,在输入的整数不小于0时sum的值增加,i的值每次循环都会自增,所以i计算的是所输入的所有整数的个数,最后sum的结果是n个整数中所有非负整数的和。
6. 阅读以下说明和C代码,填写代码中的空(1)~(6),将解答写入答题纸的对应栏内。【说明】 下面的C代码在输入的100个英文单词中找出最小单词和最大单词。约定每个单词是仅由英文字母构成的字符串,且都不超过20个字符。单词的大小按照字典序定义。例弧,单词“entry”大于“enter”“art”小于“article”“an”等于“An”,【C代码】 #include<stdio.h> #define NUMBER 100 int isValid(const char *s1);//若字符串s1仅包含英文字母则返回1,否则返回0 char toLower(char ch); //将大写字母转换为小写字母 int usr_strcmp(char*s1,char*s2);//比较字符串s1和s2,相等时返回0, //s1大则返回正整数,s1小则返回负整数 void usr strcpy(char*s1,const char*s2); //字符串s2拷贝给s1 int main( ) { char word[32]; char maxWord[32]=““,minWord[32]=““;int numWord=0;while(numWord<NUMBER){ scanf(“%s”, (1) ); //输入一个单词存入word if(isValid(word)) { if(0==numWord){usr_strcpy(minWord,word); usr strcpy(maxWord,word);} numWord++; if( (2) >0) //调用usr_strcmp比较单词 usr_strcpy(maxWord,word); //m maxWord记下最大单词 else if( (3) <0) //调用usr_strcmp比较单词 usr strcpy(minWord,word); //用minWord记下最小单词 }}printf(“maxWord=%s minWord=%s\n”,maxWord,minWord);return 0;}int isValid(const char*s){ for(;*s ; s++) if(!(*s>=‘a’&&*s<=‘z’)&&!(*s>=‘A’&&*s<=‘Z’)) return 0; return 1;}char toLower(char ch){ //若ch为大写字母则返回其小写形式,否则直接返回原字符 if(ch>=‘A’&&ch<=‘Z’) ch= (4) +’a’; return ch,}int usr strcmp(char*s1,char*s2){ //按字典序比较两个英文单词,若s1表示的单词大,则返回正整数,//若s1表示的单词小,则返回负整数;否则返回0for(; (5) ; ){ if (toLower(*s1)==toLower(*s2)) {s1++, s2++;} else break; } return(toLower(*s1)一toLower(*s2)); } Void usr_strcpy(char *s1, const char *s2) { //将s2表示的字符串复制给s1 for(; (6) ; ) ★s1++= ★s2++; *s1= ‘\0’; }
正确答案:(1)word或等效形式(2)usr_strcmp(word,maxWord)(3)usr_strcmp(word,minWord)(4)ch一’A’或ch一65或等效形式(5)*s1&&*s2或*s1!=‘\0’&&*s2!=‘\0’或等效形式注:*s1可替换为s1[0]、*s2可替换为s2[0],’\0’可替换为0(6)*s2或s2[0]或等效形式
解析:本题考查C程序流程控制、函数定义及调用和字符串运算。 在main函数中输入字符串,并调用字符串比较函数来判断两个字符串的大小关系,输入的第一个字符串既是最大的单词maxWord,也是最小的单词minWord。 代码中通过调用用户自定义函数的ust stromp(char*s1,char*s2)进行字符串的比较,使用自定义函数usr_strcpy(char*s1,const char*s2)实现字符串的复制。根据函数声明,当字符串s1和s2相等时函数usr strcmp返回0,s1大则返回正整数,s1小则返回负整数。 空(1)处应填入“word”或其等效形式“&word”。 空(2)处比较word和maxWord的大小,当word大于maxWord时更新maxWord的内容,即调用usr strcmp的结果应大于0,所以调用表达式为“usr_strcmp(word,maxWord)”,两个参数次序不正确时,其结果与程序要求的处理逻辑不相符。同理,空(3)处比较word和minWord的大小,当word小于minWord时更新minWord的内容,因此该空应填入“usr strcmp(word,minWord)”。 空(4)所在函数将大写字母转换为小写字母。在ASCII字符表中,大写字母“A”的编码是十进制数65,字母“B”的编码为66,依次类推,字母“Z”的编码为90;而小写字母“a”的编码是十进制数97,字母“b”的编码为98,其他小写字母依次类推。根据字母的编码规律可知,将大写字母的编码减去“A”的编码即可得到该字母的序号(从0开始),再加上小写字母”a”的编码,即可得到对应的小写字母编码,因此空(4)应填入“ch-‘A’”或其等效形式。 空(5)所在的函数实现两个字符串的比较,过程是两个字符串的第一个字符进行比较,若相同则继续比较它们的第二个字符,若不同则可以结束,然后根据这两个不同字符的大小来确定对应字符串的大小。如果其中的一个字符串先结束,则先结束的字符串小于另一个字符串,所以空(5)处应填入“*s1&&*s2”或其等效形式,确保所比较的两个字符串都可提供进行比较的字符。 空(6)所在的函数进行字符串复制处理,通过逐个字符的复制来完成,显然for语句的循环条件是被复制的字符串未结束,因此空(6)应填入“*s2”或其等效形式。
选答题(共3道大题,每道大题15分)从下列3道试题中任选1道解答,如果解答的试题数超过1道,则仅题号小的1道题解答有效。
7. 阅读下列说明和C++代码,填写程序中的空(1)~(6),将解答写入答题纸的对应栏内。【说明】 以下C++代码实现一个简单绘图工具,绘制不同形状以及不同颜色的图形。部分类及其关系如图6—1所示。【C++代码】 #include #include using namespace std; class DrawCircle{ //绘制圆形,抽象类 public: (1) //定义参数为int radius,int x,int y virtual ~DrawCircle( ) {} }; class RedCircle:public DrawCircle{ //绘制红色圆形 public: void drawCircle(int radius,int x,int y){ toutdrawCircle=drawCircle; } virtual ~Shape( ) {} public: virtual VOid draw( )=0;};class Circle:public Shape{ //圆形 private: int x,y,radius; public: Circle(int x,int y,int radius,DrawCircle *drawCircle) (3) { thiS一>x=x; this一>y=y; thiS一>radius=radius; } public: void draw( ) { drawCircle一> (4) ; }};int main( ){ Shape *redCircle=new Circle(100,100,10, (5) );//绘制红色圆形 Shape *greencircle=new Circle(100,100,10, (6) );//绘制绿色圆形 redCircle一>draw( ); greenCircle一>draw( ); return 0; }
正确答案:(1)virtual void drawCircle(int radius,int x,int y)=0(2)DrawCircle *drawCircle(3):Shape(drawCircle)(4)drawCircle(radius,x,y)(5)new RedCircle( )(6)new GreenCircle( )
解析: 本题考查C++语言程序设计的能力,涉及接口、类、对象、函数的定义和使用。要求考生根据给出的案例和代码说明,认真阅读理清程序思路,然后完成题目。题目所给代码清晰,易于理清思路。 先考查题目说明,实现一个简单绘图工具,绘制不同形状以及不同颜色的图形示意(采用打印相应信息的方式实现)。根据题目说明进行设计,给出图6—1的类图,定义相关的接口、类及其之间的关系。其中Shape定义抽象类形状的接口(抽象方法)draw( ),维护一个指向DrawCircle对象的引用drawCircle;Circle作为Shape的实现类,扩展了抽象类Shape,并具体实现draw( )方法。DrawCircle定义实现绘制Circle的接口drawCircle( ),RedCircle和GreenCircle实现DrawCircle接口并定义绘制不同颜色Circle的具体drawCircle( )方法的实现。 绘制圆形(DrawCircle)定义为接口,在C++中的抽象类,函数定义为纯虚函数,通过用virtual关键字修饰方法声明,并在声明中使用”=0”来指定,只有函数的声明,没有具体函数实现,直接用分号(;)结束,即: publiC: virtual void drawCircle(int radius,int x,int y)=0; 抽象类无法直接创建对象,需要由具体实现类RedCircle和GreenCircle实现DrawCircle中的声明的纯虚函数后,才能创建对象。在C++中,采用:加父类名,即: class RedCircle:publiC DrawCircle{…} class GreenCircle:public DrawCircle{…} 其中定义了drawCircle( )方法的具体实现,具体绘制红色圆形和绿色圆形: publiC: void drawCircle(int radius,int x,int y){…} 此方法的名称、返回类型、参数和访问控制与所实现接口中的相同。 Shape定义为抽象类,其中定义一个向DrawCircle类型对象的引用drawCircle: protected: DrawCircle *drawCircle; 在Shape类中定义一个带参数的构造器,构造器参数DrawCircle*drawCircle与对象的属性同名,用this关键字加以区分。其中this关键字用来引用当前对象或类实例,可以用—>取属性或行为,即: this一>drawCircle=drawCircle; 其中,this—>drawCircle表示当前对象的drawCircle属性,赋值符号右侧drawCircle表示参数。 抽象方法public:virtual void draw( )=0;定义绘制图形的方法标识,具体绘制哪个图形由Shape的子类Circle实现。即Circle继承Shape,并在构造器中指定绘制圆形的参数——圆心、半径和DrawCircle实现,实现具体draw( )方法,即: class Circle:public Shape{ publiC: Circle(int x, int y, int radius,DrawCircle *drawCircle) :Shape(drawCircle){…} public: void draw( ) {…} } 其中,因为Shape中只定义了一个带参数的构造器,所以Circle的构造器中需显式调用父类Shape的构造器,并且只能出现子类参数表之后,即:Shape(drawCircle);Circle中实现父类的抽象方法draw( ),具体调用drawCircle引用对象的drawCircle( ):方法: public:void draw( ) { drawCircle一>drawCircle(radius,x,y); } C++中采用指针引用机制实现引用对象的绑定和方法调用。 绘制图形工具的主程序中,可以根据需求定制所需绘制的图形。本题中在的main( )函数中,定义绘制红色圆形和绘制绿色圆形,创建具体绘制相应颜色圆形的对象并传递引用,并自动向上转型赋给Shape类型的引用,然后调用draw( )方法,动态绑定相应Circle对象的draw( )版本进行具体绘制。即: int main( ) { Shape★redCircle=new Circle(100,100,10,new RedCircle( ));//绘制红色圆形 Shape*greenCircle =new Circle(100,100,10,new GreenCircle( ));//绘制绿色圆形 redCircle一>draw( ); greenCircle一>draw( ); return ( ); 综上所述,空(1)需要是实现接口中方法声明与实现类相同,即填入“virtual voiddrawCircle(int radius,int x,int y)=O”;空(2)要表示维护一个指向DrawCircle的指针drawCircle,即填入“DrawCircle*drawCircle”;空(3)处需要调用父类的构造器,即填入“:Shape(drawCircle)”;空(4)为drawCircle调用其drawCircle方法绘制对应圆形,即填入“drawCircle(radius,x,y)”;空(5)处为创建绘制红色圆形对象,即填入“newRedCircle( )”;空(6)处为绘制绿色圆形,即填入“new GreenCircle( )”。
8. 阅读以下说明和Java程序,填写程序中的空(1)~(6),将解答写入答题纸的对应栏内。【说明】 以下Java代码实现一个简单绘图工具,绘制不同形状以及不同颜色的图形。部分接口、类及其关系如图5一1所示。【Java代码】 interface DrawCircle{ //绘制圆形 public (1) ; } class RedCircle implements DrawCircle { //绘制红色圆形 public void drawCircle(int radius,int x,int y){ System.out.println(“Drawing Circle[red,radius:”+radius+”,x: “ + x + “, y: “ + y + “]”); } } class GreenCircle implements DrawCircle{ //绘制绿色圆形 public void drawCircle(int radius,int x,int y){ System,out.println(“Drawing Circle[green,radius:”+radius+”,x: “ + x + “, y: “ + y + “]”); } } abstract class Shape {//形状 protected (2) ; public Shape(Drawcircle drawCircle){ this.drawCircle=drawCircle; } public abstract void draw( ); } class Circle extends Shape{//圆形 private int x,y,radius; public Circle(int x,int y,int radius,DrawCircle drawCircle){ (3) ; this.x=x; this.y=y; this.radius=radius; } public void draw( ){ drawCircle. (4) ; } } public class DrawCircleMain{ public static void main(String[]args){ Shape redCircle=new Circle(100,100,10, (5) );//绘制红色圆形 Shape greenCircle=new Circle(200,200,10, (6) );//绘制绿色圆形 redCircle.draw( ); greenCircle.draw( ); } }
正确答案:(1)void drawCircle(int radius,int x,int y)(2)DrawCircle drawCircle(3)super(drawCircle)(4)drawCircle(radius,x,y)(5)new RedCircle( )(6)new GreenCircle( )
解析:本题考查Java程序设计能力,涉及接口、类、对象、方法的定义和使用。要求考生根据给出的案例和代码说明,认真阅读理清程序思路,然后完成题目。题目所给代码清晰,易十理清思路。 先考查题目说明,实现一个简单绘图工具,绘制不同形状以及不同颜色的图形示意(采用打印相应信息的方式实现)。根据题目说明进行设计,给出图5—1的类图,定义相关的接口、类及其之间的关系。其中Shape定义抽象炎形状的接口(抽象方法)draw( ),维护一个指向DrawCircle对象的引用drawCircle:Circle作为Shape的实现类,扩展了抽象类Shape,并具体实现draw( )方法。DrawCircle定义实现绘制Circle的接口 drawCircle( ),RedCircle和GreenCircle实现DrawCircle接口并定义绘制不同颜色Circle的具体drawCircle( )方法的实现。 绘制圆形(DrawCircle)定义为接口,用interface关键字,其中声明一个方法接口,其中声明的方法默认为public,此处显式给出了public关键字,约定绘制圆形的方法名称、返回类型、参数,没有方法实现,直接用分号(;)结束,即: public void drawCircle(int radius,int x,int y); 接口没有实现,不能创建对象,需要由具体实现类RedCircle和GreenCircle实现接口DrawCircle,接口实现采用implements关键字,即: class RedCircle implements DrawCircle{…} class GreenCircle implements DrawCircle{…} 其中定义了drawCircle( )方法的具体实现,具体绘制红色圆形和绿色圆形: public void drawCircle(int radius,int x,int y){…} 此方法的名称、返回类型、参数和访问控制与所实现接口中的相同。 Shape定义为抽象类,其中定义一个向DrawCircle类型对象的引用drawCircle: protected DrawCircle drawCircle; 在Shape类中定义一个带参数的构造器,构造器参数DrawCircle drawCircle与对象的属性同名,用this关键字加以区分。其中this关键字用来引用当前对象或类实例,可以用点取属性或行为,即: this.drawCircle=drawCircle; 其中,this.drawCircle表示当前对象的drawCircle属性,赋值符号右侧drawCircle表示参数。 抽象方法public abstract void draw( )定义绘制图形的方法标识,具体绘制哪个图形由Shape的子类Circle实现。即Circle继承Shape,并在构造器中指定绘制圆形的参数——圆心、半径和DrawCircle实现,实现具体draw( )方法,印: class Circle extends Shape{ public Circle(int x,int y,int radius,DrawCircle drawCircle){…} public void draw( ){…} } 其中,因为Shape中只定义了一个带参数的构造器,所以Circle的构造器中需显式调用父类Shape的构造器,并且只能出现在第一句,即super(drawCircle);Circle中实现父类的抽象方法draw( ),具体调用drawCircle所引用对象的drawCircle( )方法: public void draw( ){ drawCircle.drawCircle(radius,x,y); } Java动态绑定机制方便实现引用对象的绑定和多态方法调用。在RedCircle和GreenCircle中,采用DrawCircle接口类型引用,动态绑定具体对象,多态实现相应颜色圆形的绘制。 绘制图形工具的主程序中,可以根据需求定制所需绘制的图形。本题中在DrawCircleMain类的main( )方法中,定义绘制红色圆形和绘制绿色圆形,创建具体绘制相应颜色圆形的对象并传递引用,并自动向上转型赋给Shape类型的引用,然后调用draw( )方法,动态绑定相应Circle对象进行具体绘制。即: public class DrawCircleMain{ public static void main(String[]args){ Shape redCircle=new Circle(100,100,10,new RedCircle( )); //绘制红色圆形 Shape greenCircle=new Circle(200,200,10,new GreenCircle( ));//绘制绿色圆形 redCircle.draw( ); greenCircle.draw( ); } } 综上所述,空(1)需要是实现接口中方法声明与实现类相同,即填入“void drawCircle(int radius,int x,int y)”;空(2)要表示维护一个指向DrawCircle的引用drawCircle,即填入“DrawCircle drawCircle”;空(3)处需要调用父类的构造器,即填入“super(drawCircle)”;空(4)为drawCircle调用其drawCircle方法绘制对应圆形,即填入“drawCircle(radius,x,y)”;空(5)处为创建绘制红色圆形对象,即填入“newRedCircle( )”;空(6)处为绘制绿色圆形,即填入“new GreenCircle( )”。 下载本文