计算机类
公务员类
工程类
语言类
金融会计类
计算机类
医学类
研究生类
专业技术资格
职业技能资格
学历类
党建思政类
计算机软件水平考试
全国计算机应用水平考试(NIT)
计算机软件水平考试
计算机等级考试(NCRE)
全国高校计算机等级考试CCT
行业认证
信息素养
软件设计师(中级)
信息系统项目管理师(高级)
系统分析师(高级)
系统架构设计师(高级)
网络规划设计师(高级)
系统规划与管理师(高级)
软件评测师(中级)
软件设计师(中级)
网络工程师(中级)
多媒体应用设计师(中级)
嵌入式系统设计师(中级)
电子商务设计师(中级)
系统集成项目管理工程师(中级)
信息系统监理师(中级)
信息安全工程师(中级)
数据库系统工程师(中级)
信息系统管理工程师(中级)
软件过程能力评估师(中级)
计算机辅助设计师(中级)
计算机硬件工程师(中级)
信息技术支持工程师(中级)
程序员(初级)
网络管理员(初级)
信息处理技术员(初级)
电子商务技术员(初级)
信息系统运行管理员(初级)
网页制作员(初级)
多媒体应用制作技术员(初级)
PMP项目管理员资格认证
软件设计应用技术
软件设计基础知识
软件设计应用技术
填空题阅读以下说明和程序流程图,将应填入(n)处的字句写在对应栏内。[说明]假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]×10+a[2]其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数、1表示负数。注:数组下标从0开始。流程图(图4-1)用于计算长整数的加(减)法。运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减情况。注,此处不考虑溢出情况,即数组足够大。这样在程序中引进两个指针pA和pB,分别指向绝对值较大者和较小者。而对绝对值相加,情况,让pA指向LA,pB指向LB,不区分绝对值大小。pA±pB可用通式pA+flag*pB来计算,flag为+1时即对应pA+pB,flag为-1时即对应pA-pB。需特别注意的是,对于相减,不够减时要进行借位,而当最高位借位后正好为0时,结果的总位数应减1;对于加法,有最高进位时,结果的总位数应加1。流程图中涉及的函数说明如下:(1)cmp(int*LA,int*LB)函数,用于比较长整数LA与LB的绝对值大小,若LA绝对值大于LB绝对值则返回正值,LA绝对值小于LB绝对值返回负值,相等则返回0。(2)max(intA,intB)函数,用于返回整数A与B中较大数。另外,对流程图中的写法进行约定:(1)“:=”表示赋值,如“flag:=LA[0]+LB[0]”表示将“LA[0]+LB[0]”的结果赋给flag,相当于C中的赋值语句:“flag=LA[0]+LB[0];”;(2)“:”表示比较运算,如“flag:1”表示flag与1比较。
进入题库练习
填空题[说明]假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:m=a[k]×10k-2+a[k-1]×10k-3+...+a[3]×10+a[2]其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数、1表示负数。注:数组下标从0开始。流程图用于计算长整数的加(减)法。运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减情况。注,此处不考虑溢出情况,即数组足够大。这样在程序中引进两个指针pA和pB,分别指向绝对值较大者和较小者。而对绝对值相加情况,让pA指向LA,pB指向LB,不区分绝对值大小。pA±pB可用通式pA+flag*pB来计算,flag为+1时即对应pA+pB,flag为-1时即对应pA-pB。需特别注意的是,对于相减,不够减时要进行借位,而当最高位借位后正好为0时,结果的总位数应减1;对于加法,有最高进位时,结果的总位数应加1。流程图中涉及的函数说明如下:(1)cmp(int*LA,int*LB)函数,用于比较长整数LA与LB的绝对值大小,若LA绝对值大于LB绝对值则返回正值,LA绝对值小于LB绝对值返回负值,相等则返回0。(2)max(intA,intB)函数,用于返回整数A与B中较大数。另外,对流程图中的写法进行约定:(1)“:=”表示赋值,如“flag:=LA[0]+LB[0]”表示将“LA[0]+LB[0]”的结果赋给flag,相当于C中的赋值语句:“flag=LA[0]+LB[0];”;(2)“:”表示比较运算,如“flag:1”表示flag与1比较。
进入题库练习
填空题阅读下列函数说明和C代码, [说明] 所谓货郎担问题,是指给定一个无向图,并已知各边的权,在这样的图中,要找一个闭合回路,使回路经过图中的每一个点,而且回路各边的权之和最小。 应用贪婪法求解该问题,程序先计算由各点构成的所有边的长度(作为边的权值),按长度大小对各边进行排序后,按贪婪准则从排序后的各边中选择组成回路的边,贪婪准则使得边的选择按各边长度从小到大选择。 函数中使用的预定义符号如下: #define M 100 typedef struct/*x为两端点p1、p2之间的距离,p1、p2所组成边的长度*/ float x; int p1,p2; tdr; typedef struct/*p1、p2为和端点相联系的两个端点,n为端点的度*/ int n,p1,p2; tr; typedef struct/*给出两点坐标*/ float x,y; tpd; typedef int tl[M]; int n=10; [函数] float distance(tpd a,tpd b);/*计算端点a、b之间的距离*/ void sortArr(tdr a[M],int m); /*将已经计算好的距离关系表按距离大小从小到大排序形成排序表,m为边的条数*/ int isCircuit(tr r[M],int i,int j); /*判断边(i,j)选入端点关系表r[M]后,是否形成回路,若形成回路返回0*/ void selected(tr r[M],int i,int j);/*边(i,j)选入端点关系表r*/ void course(tr r [M],tl l[M]);/*从端点关系表r中得出回路轨迹表*/ void exchange(tdr a[M],int m,int b); /*调整表排序表,b表示是否可调,即是否有长度相同的边存在*/ void travling(tpd pd [M],int n,float dist,tl locus[M]) /*dist记录总路程*/ tdr dr[M];/*距离关系表*/ tr r[M];/*端点关系表*/ int i,j,k,h,m;/*h表示选入端点关系表中的边数*/ int b;/*标识是否有长度相等的边*/ k=0; /*计算距离关系表中各边的长度*/ for(i=1;i<n; i++) for(j=i+1;J<=n;j++) k++; dr[k].x= (1) ; dr[k].pl=i; dr[k].p2=j; m=k; sortArr(dr,m);/*按距离大小从小到大排序形成排序表*/ do b=1; dist=0; k=h=0: do k++; i=dr[k].p1; j=dr[k].p2; if((r(i].n<=1)(r[j].n<=1))/*度数不能大于2*/ if (2) /*若边(i,j)加入r后形成回路,则不能加入*/ (3) ; h++; dist+=dr[k].x; else if (4) /*最后一边选入r成回路,则该边必须加入且得到解*/ selected(r,i,j); h++: dist+=dr[k].x; while((k !=n) (h !=n)); if(h==n)/*最后一边选入构成回路,完成输出结果*/ course(r,locus); else(/*找不到解,调整dr,交换表中边长相同的边在表中的顺序,并将b置0*/ (5) ; while(!b);
进入题库练习
填空题阅读以下说明和程序流程图,将应填入(n)处的字句写在对应栏内。[说明]当一元多项式中有许多系数为零时,可用一个单链表来存储,每个节点存储一个非零项的指受和对应系数。为了便于进行运算,用带头节点的单链表存储,头节点中存储多项式中的非零项数,且各节点按指数递减顺序存储。例如:多项式8x5-2x2+7的存储结构为:流程图图3-1用于将pC(Node结构体指针)节点按指数降序插入到多项式C(多项式POLY指针)中。流程图中使用的符号说明如下:(1)数据结构定义如下:#defineEPSI1e-6structNode/*多项式中的一项*/doublec;/*系数*/inte;/*指数*/StructNode*next;;typedefstruct/*多项式头节点*/intn;/*多项式不为零的项数*/structNode*head;POLY;(2)Del(POLY*C,structNode*p)函数,若p是空指针则删除头节点,否则删除p节点的后继。(3)fabs(doublec)函数返回实数C的绝对值。[图3-1]
进入题库练习
填空题Private Sub Command1_ Click( ) If List1. ListIndex > ={{U}} (1) {{/U}}Then List1. RemoveItem{{U}} (2) {{/U}}Label1. Caption ={{U}} (3) {{/U}} Else MsgBox “请选择要删除的项目” End If End Sub
进入题库练习
填空题[说明]以下函数完成求表达式的值,请填空使之完成此功能。floatsum(floatx)floats=0.0;intsign=1;(1);for(inti=1;(2);i++)t=t*x;s=s+(3);sign=-sign;(4);
进入题库练习
填空题 阅读以下说明和Jrdva代码,将应填入{{U}} (n) {{/U}}处的字句写在对应栏内。 [说明] 在销售系统中常常需要打印销售票据,有时需要在一般的票据基础上打印脚注。这样就需要动态地添加一些额外的职责。如下展示了Decorator(修饰)模式。SalesOrder对象使用一个SalesTicket对象打印销售票据。图6-1显示了各个类间的关系。以下是Java语言实现,能够正确编译通过。 [图6-1] [Java代码] //Component.java文件 public{{U}} (1) {{/U}}class Component { abstract publ ic void prtTicket(); } //salesTicket.java文件 public class SalesTicket extends Component{ public void prtTicket(){ //Sales ticket printing code here System.out.printin("SalesTicket"); } } //Decorator.java文件 publ ic abstract class Decorator extends Component{ public void prtTicket(){ if(myComp!=null)myComp.prtTicket(); } private{{U}} (2) {{/U}}myComp; public Decorator(Component myC){ myComp=myC; } } //Footer.java文件 public class Footer extends Decorator { public Footer(Component myC){ {{U}} (3) {{/U}}; } public void prtTicket(){ {{U}} (4) {{/U}}; prtFooter(); } publ ic void prtFooter(){ //place printing footer code here System.out.println("Footer"); } } //salesorder.java文件 public class SalesOrder{ void prtTicket(){ Component myST; myST=new Footer({{U}} (5) {{/U}}); //Print Ticket with footers as needed myST.prtTicket(); } }
进入题库练习
填空题 阅读下列函数说明和C代码,将应填入{{U}} (n) {{/U}}外的字句写在对应栏内。 [说明] 为网球比赛的选手安排比赛日程。设有n(n=2m)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手赛一场,且每位选手每天赛一场,不轮空。 设n位选手被顺序编号为1,2,…,n,比赛的日程表是一个n行n-1列的表,第i行j列的内容是第i号选手第j天的比赛对手。用分治法设计日程表,就是从其中一半选手(2m-1位)的比赛日程导出全体2m选手的比赛日程。从众所周知的只有两位选手的比赛日程出发,反复这个过程,直至为n位选手安排好比赛日程为止。 如两位选手比赛日程表如下所示: 1 1 2 2 1如四位选手比赛日程表如下所示: 1 2 3 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 函数中使用的预定义符号如下: #define M 64 int a[M+1][M]; [函数] voidd main(){ int twoml,twom,i,j,m,k; printf("指定n(=2的k次幂)位选手,请输入k:/n"); scanf("%d",&k); /*8预设两位选手的比赛日程*/ a[1][1] =2; a[2][1] =1; m=1; twoml=1; while ({{U}} (1) {{/U}}){ m++; twoml+=twoml; twom=twoml*2;/*为2^m位选手安排比赛日程*/ /*填日程表的左下角*/ for(i=twoml+1;{{U}} (2) {{/U}};i++){ for(j=1; j a[i][j]=a[i-twoml][j]+twoml; } } /*填日程表的右上角*/ a[1][twoml]={{U}} (3) {{/U}};/+填日程表右上角的第1列*/ for(i=2; i a[i][twoml]=a[i-1][twoml]+1; } /*填日程表右上角的其他列,参照前一列填当前列*/ for(j=twoml+1; j(twom;j++){ for(i=1; i a[i][j]={{U}} (4) {{/U}}; } a[twoml][j]=a[1][j-1]; } /*填日程表的右下角*/ for(j=twoml; j for(i=1;i a[{{U}} (5) {{/U}}[j]=i; } } /*输出日程表*/ for(i=1; i for(j=1;j printf("%4d",a[i][j]); } printf("/n"); } printf("/n"); } }
进入题库练习
填空题阅读以下说明和程序流程图,将应填入{{U}}(n){{/U}}处的字句写在对应栏内。[说明]当一元多项式中有许多系数为零时,可用一个单链表来存储,每个节点存储一个非零项的指受和对应系数。为了便于进行运算,用带头节点的单链表存储,头节点中存储多项式中的非零项数,且各节点按指数递减顺序存储。例如:多项式8x5-2x2+7的存储结构为:流程图图3-1用于将pC(Node结构体指针)节点按指数降序插入到多项式C(多项式POLY指针)中。流程图中使用的符号说明如下:(1)数据结构定义如下:#defineEPSI1e-6structNode{/*多项式中的一项*/doublec;/*系数*/inte;/*指数*/StructNode*next;};typedefstruct{/*多项式头节点*/intn;/*多项式不为零的项数*/structNode*head;}POLY;(2)Del(POLY*C,structNode*p)函数,若p是空指针则删除头节点,否则删除p节点的后继。(3)fabs(doublec)函数返回实数C的绝对值。[图3-1]
进入题库练习
填空题[说明] 编写一个Application,从键盘输入整数n,并计算从1到n的累加和。 import java. io. *; public class Application1 public static void main(String [] args) String s = " "; int n, sum = 0; System. out. println (“计算从1到n 的累加和。”); System. out. print( “请输入n的值:”); try (1) BufferedReader br = new BufferedReader(isr); (2) catch(Exception e) (3) for(int i=l; i< =n; i++) (4) System. out. println ( “你刚才的输入是:” + n); System. out. println ( “1到n的累加和是:”+ sum);
进入题库练习
填空题 阅读以下说明和Java代码,将应填入{{U}} (n) {{/U}}处的字句写在对应栏内。 [说明] 在一些大型系统中,大多数的功能在初始化时要花费很多时间,如果在启动的时候,所有功能(连不用的功能)都要全面初始化的话,会连带影响到应用软件要花很多时间才能启动。因此常将程序设计成到了实际要使用某种功能的阶段才初始化该功能。 以下示例展示了Proxy(代理)模式,PrinterProxy类执行一些比较“轻”的方法——设置名称和取得名称,需要真正执行“重”的方法——真正打印——时才初始Print类。图6-1显示了各个类间的关系。 [图6-1] [Java代码] //Printable.Java publiC{{U}} (1) {{/U}}Printable{ public abstract void setPrinterName(String name); public abstract String getprinterName(); public abstract void print(String string); } //Printer.Java public class Printer implements Printable{ private String name; public Printer(){ System.out.println("正在产生Printer的对象实例"); } public Printer(String name){ this.name=name; heavyJob("正在产生Printer的对象实例("+name+")"); public void setPrinterName(String name){ this.name=name; public String getPrinterName(){ return name; public void print(String string){ System.out.println("===" +name+" ===="); System.out.println(string); } } //PrinterProxy.Java public class PrinterProxy{{U}} (2) {{/U}}Printable{ private String name; private Printer real; public PrinterProxy(){} public PrinterProxy(String name){ this.name=name; } public gynchronized void setPrinterName(String name){ if({{U}} (3) {{/U}}){ real.setPrinterName(name); } this.name=name; } public String getprinterName(){ return name; } public void print(String string){ {{U}} (4) {{/U}}; real.print(string); } private synchronized void realize(){//产生真正的Printer对象 if(real==null){ real={{U}} (5) {{/U}}; } } }
进入题库练习
填空题阅读以下说明和Java代码,将应填入(n)处的字句写在对应栏内。[说明]在一些大型系统中,大多数的功能在初始化时要花费很多时间,如果在启动的时候,所有功能(连不用的功能)都要全面初始化的话,会连带影响到应用软件要花很多时间才能启动。因此常将程序设计成到了实际要使用某种功能的阶段才初始化该功能。以下示例展示了Proxy(代理)模式,PrinterProxy类执行一些比较“轻”的方法——设置名称和取得名称,需要真正执行“重”的方法——真正打印——时才初始Print类。图6-1显示了各个类间的关系。[图6-1][Java代码]//Printable.JavapubliC(1)PrintablepublicabstractvoidsetPrinterName(Stringname);publicabstractStringgetprinterName();publicabstractvoidprint(Stringstring);//Printer.JavapublicclassPrinterimplementsPrintableprivateStringname;publicPrinter()System.out.println("正在产生Printer的对象实例");publicPrinter(Stringname)this.name=name;heavyJob("正在产生Printer的对象实例("+name+")");publicvoidsetPrinterName(Stringname)this.name=name;publicStringgetPrinterName()returnname;publicvoidprint(Stringstring)System.out.println("==="+name+"====");System.out.println(string);//PrinterProxy.JavapublicclassPrinterProxy(2)PrintableprivateStringname;privatePrinterreal;publicPrinterProxy()publicPrinterProxy(Stringname)this.name=name;publicgynchronizedvoidsetPrinterName(Stringname)if((3))real.setPrinterName(name);this.name=name;publicStringgetprinterName()returnname;publicvoidprint(Stringstring)(4);real.print(string);privatesynchronizedvoidrealize()//产生真正的Printer对象if(real==null)real=(5);
进入题库练习
填空题Private Sub Command1_ Click( )If List1. ListIndex > = (1) Then List1. RemoveItem (2) Label1. Caption = (3) ElseMsgBox “请选择要删除的项目”End IfEnd Sub
进入题库练习
填空题[说明] 若s和t是用单链表存储的两个串,设计一个函数将s串中首次与串t匹配的字串逆置。 linkstring * invert - substring ( s, t) linkstring * s, * t; linkstring *prior, *p, *t1, *r, *q, *u; prior =s; p=s; t1 =t; if ( (1) ) printf ( "error/n") ; else while p ! = NULL t1 = t1- >link; else (2) p = prior - > link; t1 = t- >link; if ( t1 ! : NULL) printf ("cannot find"); else (3) r = q- >link; q- >link = p; while (r ! = p) u = r- >link; (4) q=r; r = u; (5)
进入题库练习
填空题[说明] 设计一个普通函数distance (Point public: Point(int i, int j) {{{U}} (1) {{/U}} int getx( ) { return x;} int gety( ) { return y; } void disp( ) { {{U}} (2) {{/U}} } }; float distance( Point {{U}}(3) {{/U}} return d; } void main( ) { {{U}} (4) {{/U}} p1. disp ( ); cout < <“与”; p2. diap( ); cout< <“之间距离=” < <distance (p1,p2) < <end1; }
进入题库练习
填空题[说明] 已有一个工程文件,窗体上有两个图片框,名称为P1,P2。分别用来表示信号灯合汽车,其中在P1中轮流装入“黄灯.ico”、“红灯.ico”、“绿灯.ico”文件来实现信号灯的切换;还有两个计时器 Timer1 和Timer2,Timer1 用于变换信号灯,黄灯1秒,红灯2秒,绿灯3秒;Timer2用于控制汽车向左移动。运动时,信号灯不断变换,单击“开车”按钮后,汽车开始移动,如果移动到信号灯前或信号灯下,遇到红灯或黄灯,则停止移动。下面是实现上述功能的程序,请填空。 Private Sub Timer41_ Timer() a=a+1 If{{U}} (1) {{/U}}Then a=1 End If Select Case a Case 1 P1. Picture = LoadPicture( “黄灯.ico” ) Case 2, 3 P1. Picture = LoadPicture( “红灯”.ico” ) Case4, 5, 6 P1. Picture = LeadPicture( “绿灯. ico” ) {{U}} (2) {{/U}} End Select End Sub Private Sub Timer2_Timer( ) If{{U}} (3) {{/U}}And (P2. Left > P1. Left And P2. Left < P1. Left + P1. Width) Or P2. Left < = 100 Then Timer2. Enabled = False Else {{U}} (4) {{/U}} End If End Sub
进入题库练习
填空题[说明] 若s和t是用单链表存储的两个串,设计一个函数将s串中首次与串t匹配的字串逆置。 linkstring * invert - substring ( s, t) linkstring * s, * t; { linkstring *prior, *p, *t1, *r, *q, *u; prior =s; p=s; t1 =t; if ({{U}} (1) {{/U}}) printf ( "error/n") ; else { while { p ! = NULL t1 = t1- >link; } else { {{U}} (2) {{/U}} p = prior - > link; } t1 = t- >link; } if ( t1 ! : NULL) printf ("cannot find"); else { {{U}} (3) {{/U}} r = q- >link; q- >link = p; while (r ! = p) { u = r- >link; {{U}} (4) {{/U}} q=r; r = u; } {{U}} (5) {{/U}} } } }
进入题库练习
填空题 阅读以下函数说明和Java代码,将应填入{{U}} (n) {{/U}}处的字句写上。 [说明] 现有一个显示系统,要显示的图形有线Line、矩形Square,抽象出一个Shape类(接口),有方法显示display()。 需要新增图形Circle,又已知有类XXCircle实现了所需要实现的功能:显示displayIt()。为了继承自shape以提供统一接口,又不希望从头开发代码,希望使用XXCircle。这样将XXCircle作为Circle的一个属性,即Circle的对象包含一个XXCircle对象。当一个Circle对象被实例化时,它必须实例化一个相应的XXCircle对象;当Circle对象收到的做任何事的请求都将转发给这个XXCircle对象。通过这种称为Adapter模式,Circle对象就可以通过“让XXCircle做实际工作”来表现自己的行为了。图7-1显示了各个类间的关系。以下是JAVA语言实现,能够正确编译通过。 [图7-1] [Java代码] //Shape.java文件 public interface Shape{ public {{U}}(1) {{/U}}void display(); } //XXCircle.jave文件 public class XXCircle{ public void displayIt(){ //省略具体实现 } } //Circle.java文件 public class Circle{{U}} (2) {{/U}}Shape{ private XXCircle pcx={{U}} (3) {{/U}}; public void display(){ pcx.displayIt(); } } //Factory.java文件 public class Factory{ public{{U}} (4) {{/U}}getShapeInstance(int type){ switch(type){ case 1:return new Line(); case 2:return new Square(); case 3:return new Circle(); default:return null; } } } //Main.java文件 public class Main{ public static void main(String[]args){ int type=1; Factory factory=new Factory(); Shape s; s=factory.{{U}} (5) {{/U}}; if(s==null){ System.out.println("Error get the instance!"); return; } s.display(); return; } }
进入题库练习
填空题阅读下列说明和E-R图,回答问题1至问题3,将解答填入对应栏内。[说明]设有下列关于学生成绩管理系统的E-R图(见图2-1)。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体间的联系。假定已通过下列SQL语言建立了基本表:CREATETABLESTUDENT(SNoCHAR(6)NOTNULLUNIQUE,SNameCHAR(20),SexCHAR(1),DeptCHAR(20),AgeSMALLINT);CREATETABLECOURSE(CNoCHAR(6)NOTNULLUNIQUE,CNameCHAR(20),HourSMALLINT,CreditSMALLINT);CREATETABLESC(SNoCHAR(6),CNoCHAR(6),GRADESMALLINT,PRIMARYKEY(SNo,CNo));为了答题的方便,图中的实体和属性同时给出了中英文两种名字,回答问题时只须写出英文名即可。填充下列SQL程序5.1~5.4中的(1)~(6),使它们分别完成以下查询功能:程序5.1:检索选修所有课程的学生姓名。程序5.2:给出全体学生人数。程序5.3:按学号给出每个学生的平均成绩。程序5.4:按学号给出每个学生选修课程的门数。[程序5.1]SELECTSNameFROMSTUDENTWHERE{{U}}(1){{/U}}(SELECTFROMCOURSEWHERE{{U}}(2){{/U}}(SELECT*FROMSCWHERE{{U}}(3){{/U}}))[程序5.2]SELECT{{U}}(4){{/U}}FROMSTUDENT[程序5.3]SELECT{{U}}(5){{/U}}FROMSCGROUPBYSNO[程序5.4]SELECT{{U}}(6){{/U}}FROMSCGROUPBYSNO
进入题库练习
填空题[说明]已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10~50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。采用责任链设计模式(ChainofResponsibility)对上述过程进行设计后得到的类图如图6-1所示。[Java代码]classPurchaseRequestpublicdoubleAmount;//一个采购的金额publicintNumber;//采购单编号publicStringPurpose;//采购目的;classApprover//审批者类publicApprover()successor=null;publicvoidProcessRequest(purchaseRequestaRequest)if(successor!=null)successor.(1);)publicvoidSetSuccessor(ApproveraSuccesssor)successor=aSuccesssor:private(2)successor;;classCongressextendsApproverpublicvoidProcessRequest(purchaseRequestaRequest)if(aRequest.Amount>=500000)/*决定是否审批的代码省略*/)else(3).ProcessRequest(aRequest);;classDirectorextendsApproverpublicvoidProcessRequest(PurchaseRequestaRequest)/*此处代码省略*/;classPresidentextendsApproverpublicvoidProcessRequest(PurchaseRequestaRequest)/*此处代码省略*/;classVicePresidentextendsApproverpublicvoidProcessRequest(purchaseRequestaRequest)/*此处代码省略*/);publicclassrspublicstaticvoidmain(String[]args)throwsIOExceptionCongressMeeting=newCongress();VicePresidentSam=newVicePresident();DirectorLarry=newmirector();PresidentTammy=newPresident();//构造责任链Meeting.SetSuccessor(null);Sam.SetSuccessor((4));Tammy.SetSuccessor((5));Larry.SetSuccessor((6));//构造一采购审批请求PurchaseRequestaRequest=newPurchaseRequest();BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));aRequest.Amount=Double.parseDouble(br.readLine());(7).processRequest(aRequest);//开始审批return;
进入题库练习