视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
2018年上半年软件水平考试(初级)程序员下午(应用技术)真题试
2025-10-05 17:08:40 责编:小OO
文档
2018年上半年软件水平考试(初级)程序员下午(应用技术)真题试卷 (题后含答案及解析)

题型有: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(   )”。  下载本文

显示全文
专题