软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷3(共121题)_第1页
软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷3(共121题)_第2页
软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷3(共121题)_第3页
软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷3(共121题)_第4页
软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷3(共121题)_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷3(共9套)(共121题)软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷第1套一、必答题(本题共10题,每题1.0分,共10分。)[说明]一个新的音像商店准备向比较广泛的人群出租录像带和光碟。该商店的管理决定在计算机系统的支持下来运作。音像商店在货架上存放着题材广泛的当前流行的电影库。由于同一个电影片名可能有于不同的导演而有不同的版本,因此电影用电影代码区分,而不用电影片名;同一个版本有多份拷贝,因此音像制品用一个唯一的编号标识。某个特定的电影可以存放在录像带或光碟上,录像带和光碟的租金不同。录像带要么是Beta格式要么是VHS格式;光碟为DVD格式,容量比较大,一张光碟可以存储同一电影片名的不同版本。每个电影都有特定的租用期(用天表示),并带有在租用期内的租金。音像商店必须能够立即回答关于某个电影的库存和有多少供租用的带子或光碟。音像商店的店员负责定购音像、联系客户、音像上架,并对客户的询问给出答复。该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图1-1是该系统的用例图,图1-2是该系统的类图的一部分。[图1-1]1、根据题意,给出“电影”类的主要属性。标准答案:电影代码、电影片名、导演知识点解析:暂无解析2、根据题意,指出图1-1中缺失的用例。标准答案:(A)“定购音像”(B)“联系客户”知识点解析:暂无解析[说明]为了有效记录交通事故情况,欲设计一个交通事故记录系统。一辆汽车有一个唯一的“车牌号”,车主购买汽车时需要提供相关信息,包括身份证、姓名、年龄、性别、地址等。一个车主可以拥有多辆汽车,而一辆汽车只有一个车主。驾驶员不一定是车主,因此记录交通事故时要记录驾驶员身份证号,同时记录事故发生时刻。图2-1描绘了人、汽车、交通事故三个实体类型及实体间联系的一个E-R图。[图2-1]对应的关系模式为:·人(身份证号,姓名,性别,年龄,地址)·汽车(车牌号,型号)·事故(车牌号,身份证号,时刻,损失,描述)·拥有(身份证号,车牌号)3、指出每种关系模式的主键。标准答案:人:身份证汽车:车牌号事故:(车牌号,身份证)拥有:车牌号知识点解析:暂无解析4、创建人表时,“身份证号”使用INTEGER数据类型,并且要求此列值不能为空、值惟一,姓名列不能为空。请在下列用于创建表人的SQL语句空缺处填入正确的内容。CREATETABLE人(身份证号INTEGER,姓名CHAR(20)(1),性别CHAR(1),年龄INTEGER,地址CHAR(20),(2))标准答案:(1)NOTNULL(2)PRIMARYKEY(身份证号)知识点解析:暂无解析5、请在下列SQL查询语句空缺处填入正确的内容(1)查询身份证号为“123456”的人作为驾驶员时所有的事故记录。SELECT*FROM事故WHERE(1)(2)查询身份证号为“123456”的车主所拥有的汽车的事故记录。SELECT*FROM事故WHERE车牌号(2)(SELECT车牌号FROM(3)WHERE身份证号="123456")(3)查询车牌号为“123456”汽车在车主是驾驶员时的事故记录。SELECT*FROM事故WHERE(4)(SELECT*FROM(5)WHERE车牌号="123456"AND(6))标准答案:(1)身份证号="123456"(2)IN(3)拥有(4)EXISTS(5)拥有(6)拥有.身份证号=事故.身份证号知识点解析:暂无解析6、阅读下列函数说明、图和C代码,回答问题[说明]假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]×10+a[2]其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数、1表示负数。运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减情况。注意,不考虑溢出情况,即数组足够大。[函数]intcmp(int*LA,int*LB);/*比较长整数LA与LB的绝对值大小*//*若LA绝对值较大返回正值,LA较小返回负值,相等则返回0*/intADD(int*LA,int*LB,int*LC)/*计算长整数LA与LB的和,结果存储于LC中*//*注意:正数与负数的和相当于正数与负数绝对值的差*//*数据有误返回0,正常返回1*/{if(LA==NULL||LB==NULL||LC==NULL)return0;int*pA,*pB,i,N,carry,flag;flag=LA[0]+LB[0];switch(flag){/*根据参与运算的两个数的符号进行不同的操作*/case0:case2:Lc[0]=LA[0];/*LA与LB同号,结果符号与LA(LB)相同*/pA=LA;pB=LB;(1);break;case1:/*LA与LB异号*//*比较两者的绝对值大小,结果符号与较大者相同*/flag=(2);if(flag>0){/*LA较大*/LC[0]=LA[0];pA=LA;pB=LB;}elseif(flag<0)(/*LB较大*/LC[0]=LB[0];pA=LB;pB=LA;}else{/*LA与LB相等*/LC[0]=0;LC[1]=0;return1;}flag=-1;break;default:return0;break;}/*switch*//*绝对值相加减*//*注意对于减法pA指向较大数,pB指向较小数,不可能出现不够减情况*/(3);N=LA[1]>LB[1]?LA[1]:LB[1];for(i=0;i<N;i++){if(i>=pA[1]){/*LA计算完毕*/carry+=flag*pB[i+2];}elseif(i>=pB[1]){/*LB计算完毕*/carry+=pA[i+2];}else{carry+=pA[i+2]+flag*pB[i+2];}LC[i+2]=carry%10;carry/=10;if((4)){/*需要借位,针对减法*/LC[i+2]+=10;carry--;}}/*for*/if((5)){/*最高进位,针对加法*/LC[i+2]=carry;i++;}if(LC[i+1]==0)i--;/*若最高位为零,针对减法*/LC[1]=i;return1;};/*ADD*/标准答案:flag=1cmp(LA,LB)carry=0LC[i+2]<0carry知识点解析:暂无解析7、阅读下列函数说明、图和C代码,回答问题[说明]在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都要画出与单词列表所对应的单词查找树。程序构造一棵二叉排序树,每个节点存储一个单词,按字典序列,较小的在左子树,较大的在右子树。函数中使用的预定义符号如下:typedefstructTreeNode{/*二叉排序树节点*/char*word;structTreeNode*left,*right;}BNODE;[函数]intgetWord(FILE*fpt,char*word)/*从文件fpt中读取单词到word中,到达文件结束时返回0*/{charc;c=fgetc(fpt);if(c==EOF)return0;/*跳过单词间的非字母字符*/while(!(tolower(c)>=’a’&&tolower(c)<=’z’)){c=fgetc(fpt);if(c==EOF)return0;}/*不区分大小写*/while(tolower(c)>=’a’&&tolower(c)<=’z’){*word++=c;c=fqetc(fpt);}*word=’\0’;return1;}voidBTree(BNODE**t,char*word){BNODE*ptr,*p;intcompres;p=NITLL;(1);while(ptr){compres=strcmp(word,(2));if(!compres){return;}else{(3);ptr=compres>0?ptr->right:ptr->left;}}ptr=(BNODE*)malloc(sizeofptr);ptr->left=ptr->right=NULL;ptr->word=(char*)malloc(strlen(word)+1);strcpy(ptr->word,word);if(p==NULL){(4);}elseif(compres>0){p->right=ptr;}else{p->left=ptr;}}intmain(){FILE*fpt;charword[40];BNODE*root=NULL;if((fpt=fopen("text.in","r"))==NULL){printf("不能打开文件text.in!\n");return1;}while(getWord(fpt,word)==1){BTree(5);}fclose(fpt);return0;}标准答案:ptr=*tptr->wordp=ptr*t=ptr&root,word知识点解析:暂无解析8、阅读下列函数说明和C++代码,回答问题[说明]任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式中,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。以下是C++语言实现,能够正确编译通过。[C++代码]classHand{private:inthandvalue;staticHand*hand0;staticHand*hand1;staticHand*hand2;(1);Hand(inthandvalue){this->handvalue=handvalue;}public:(2)Hand*getHand(inthandvalue){/*省略具体实现*/}};Hand*Hand::hand0=newHand(0);Hand*Hand::hand1=newHand(1);Hand*Hand::hand2=newHand(2);classStrategy{public:(3)Hand*nextHand()=0;};classWinningStrategy:publicStrategy{private:boolwon;Hand*prevHand;public:winningStrategy(){won=false;}Hand*nextHand(){if(!won){prevHand=Hand::getHand(rand()%3);}returnprevHand;}};classprobstrategy:publicStrategy{public:Hand*nextHand(){inthandvalue=0;/*省略具体实现*/returnHand::getHand(handvalue);}};classPlayer{private:stringname;Strategy*strategy;public:Player(stringname,(4)strategy){this->name=name;this->strategy=strategy;}Hand*nextHand()(//向战略请示手势return(5);}};标准答案:(1)privatestaticvirtualStrategy*strategy->nextHand()知识点解析:Hand类要保证只产生3个实例,就要求不能随便生成Hand类,因此其构造方法需要是private型的,故空(1)应填private。先看空(3),由后面的“=0”易判知nexthand()函数是纯虚函数,故空(3)应填virtual。再来看空(2),由对getHand()方法的调用方式Hand::getHand(rand()%3)及Hand::getHand(handvalue),可知该方法是类Hand的静态方法,故空(2)应填static。由语句this->strategy=strategy;可知:this->strategy与strategy是同数据类型,this表示自身指针,而this->strategy是Strategy*类型,故空(4)应填Strategy*,注意是指针。方法nextHand()是“向战略请示手势”,取得手势是通过其所采用的“策略”实现的,故空(5)应填strategy->nextHand()。注意指针写法。9、阅读以下说明和Java代码,回答问题[说明]任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式种,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。以下是Java语言实现,省略了不相关属性及方法,方法实现体亦有所省略,能够正确编译通过。[Java代码]//Hand.java文件publicclassHand{publicstaticfinalintHANDVALUE_GUU=0;//石头publicstaticfinalintHANDVALUE_CHO=1;//剪刀publicstaticfinalintHANDVALUE_PAA=2;//布publicstaticfinalHand[]hand={newHand(HANDVALUE_GUU),newHand(HANDVALUE_CHO),newHand(HANDVALUE_PAA),};privateinthandvalue;(1)Hand(inthandvalue){this.handvalue=handvalue;}public(2)HandgetHand(inthandvalue)(//从值取得对象实例returnhand[handvalue];}}//Strategy.java文件publicinterfaceStrategy{public(3)HandnextHand();}//ProbStrategy.java文件importjava.util.Random;publicclassProbStrategyimplementsStrategy{publicHandnextHand(){inthandvalue=0;/*省略具体实现*/returnHand.getHand(handvalue);}}//WinningStrategy.java文件importjava.util.Random;publicclassWinningStrategyimplementsStrategy{/*省略了不相关属性*/publicHandnextHand(){if(!won){prevHand=Hand.getHand(random.nextInt(3));}returnprevHand;}}//Player.java文件publicclassPlayer{privateStringname;privateStrategystrategy;publicPlayer(Stringname,(4)strategy){=name;this.strategy=strategy;}publicHandnextHand(){//向战略请示手势return(5);}}标准答案:privatestaticabstractStrategystrategy.nextHand()知识点解析:暂无解析10、阅读以下函数说明和C代码,回答问题[说明]任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式种,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。以下是C语言实现,省略了不相关属性及方法,方法实现体亦有所省略,能够正确编译通过。[C代码]typedef(1)(*funl)();enumHandValue{HANDVALUE_GUU=0,HANDVALUE_CHO=1,HANDVALUE_PAA=2};//手势可取值,依次为“石头”、“剪刀”、“布”//其大小顺序是循环相克的,即:石头赢剪刀,剪刀赢布,布赢石头boolwon;structHand*WSprevHand;structHand{//手势enumHandValuehandvalue;}hand[3]={HANDVALUE_GUU,HANDVALUE_CHO,HANDVALUE_PAA};intfight(structHand*h1,structHand*h2)//比较h1和h2。h1代表的手势较大时返回1,h1较小时返回-1,相等时返回0//{if(h1->handvalue==h2->handvalue){return0;}elseif((h1->handvalue+1)%(2)==h2>handvalue){return1;}else{return-1;}}structHand*getHand(inthandvalue){//依据手势代表的值取得手势,若handvalue不合法,返回NULLswitch(handvalue){case0:return&hand[0];break;case1:return&hand[1];bteak;case2;return&hand[2];break;}return(3);}structStrategy{//策略funlnextHand;//下一个手势};structHand*WSnextHand(){if(!won){PSprevHand=getHand(rand()%3);}returnPSprevHand;}structPlayer{charname[20];(4)strategy;//策略intwincount;intlosecount;intgamecount;};voidmain(){StrategyWS;WS.nextHand=WSnextHand;WSpreVHand=NULL;structPlayerWSplayer;(5)(WS,"ww");WSplayer.wincount=0;WSplayer.losecount=0;WSplayer.gamecount=0;WSplayer.strategy=&WS;}标准答案:structHand*3NULLstructStrategy*strcpy知识点解析:条件(h1->handvalue+1)%(2)==h2->handvalue是指h1大于h2,根据手势间大小顺序:石头(0)赢剪刀(1),剪刀(1)赢布(2),布(2)赢石头(0)。可得应填3。例如h1为布(2),h2为石头(0)时,h1->handvalue+1)%(2)的值应为0。所以空(2)填3。handvalue取值为:0、1、2,由注释“若handbalue不合法,返回NULL”可得空(3)应填NULL。先看空(5)。结构体WSplayer的strategy是字符数组,对字符数组的赋值需要调用strcpy库函数。故空(5)应填strcpy。来看空(4)。由语句“WSplayer.strategy=&WS;”及“StrategyWS;”可知,结构体WSplayer的strategy应该是Strategy结构体指针。故空(4)应填structStrategy*。最后来看空(1)。这明显是一个函数指针,函数指针的定义:函数返回类型函数指针变量名(参数列表)。故空(1)是该函数的函数返回类型。用到该定义的是在结构体Strategy中,“funlnextHand;//下一个手势”,此处只是一个声明,不能判断其返回类型,真正应用的是语句“WS.nextHand=WSnextHand;”,而其右端的函数原型为structHand*WSnextHand(),因此该函数指针的返回类型应为structHand*。故空(1)应填structHand*。软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷第2套一、必答题(本题共16题,每题1.0分,共16分。)阅读以下某建账软件的技术说明和数据流图,根据要求回答问题1~问题6。[说明]某商业银行已有一套基于客户机/服务器(C/S)模式的储蓄系统X和一套建账软件Y。建账软件Y主要用于将储蓄所手工处理的原始数据转换为系统X所需的数据格式。该建账软件具有以下功能。(1)分户账录入:手工办理业务时建立的每个分户账数据均由初录员和复录员分别录入,以确保数据的正确性。(2)初录/复录比对:将初录员和复录员录入的数据进行一一比较,并标记两套数据是否一致。(3)数据确认:当上述两套数据完全一致后,将其中任一套作为最终进入系统X的原始数据。(4)汇总核对和打印:对经过确认的数据进行汇总,并和会计账目中的相关数据进行核对,以确保数据的整体正确性,并打印输出经过确认的数据,为以后核查可能的错误提供依据。该建账软件需要打印的分户账清单样式如表3-8所示。(5)数据转换:将经过确认的数据转换为储蓄系统X需要的中间格式数据。(6)数据清除:为加快初录和复录的处理速度,在数据确认之后,可以有选择地清除初录员和复录员录入的数据。该软件的数据流图如图3-17~图3-19所示,图中部分数据流数据文件的格式如下。初录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质复录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质会计账目=储蓄所号+总户数+总余额操作结果=初录操作结果+比对操作结果+复录操作结果1、不考虑数据确认处理(加工2),请指出图3-17~图3-19数据流图中可能存在的错误。标准答案:这是一道要求考生掌握分层数据流图输入/输出平衡原则的分析题。本题的解答思路如下。每个加工必须既有输入数据流,又有输出数据流。但一个加工的输入数据流不要与输出数据流同名。在整套数据流图中,每个数据存储必须既有读的数据流,也有写的数据流。但在某张子图中,可能只有读没有写,或者是只有写而没有读。在数据流图(DFD)中,加工处理是对输入数据进行相关处理并生成输出数据的过程,因此,对于DFD中的每个加工处理至少要有一个输入数据流和一个输出数据流。根据这一原则仔细检查图3-17~图3-19可知,在建账软件第0层数据流图(见图3-18)中,数据确认处理(加工2)和数据清除处理(加工6)只有输出数据流而没有输入数据,这是图3-18中存在的错误之处。由于题目中已说明“不考虑数据确认处理(加工2)”,因此,本试题的正确答案是“在建账软件第0层数据流图(图3-18)中,数据清除处理(加工6)没有输入数据流”。知识点解析:暂无解析2、请使用[说明]中的词汇,给出数据确认处理所需的数据流,在图3-19建账软件第1层数据流图中的全部可选起点。标准答案:这也是一道要求考生掌握分层数据流图输入/输出平衡原则的综合分析题。本题的解答思路如下。在本试题说明中关于“数据确认”功能的描述——“数据确认:当上述两套数据(即初录员和复录员录入的数据)完全一致后,将其中任一套作为最终进入系统X的原始数据”中,“进入系统X”其对应于建账软件第0层数据流图(见图3-18)中“数据确认”处理。由此可知,在图3-19建账软件第1层数据流图中,无论是“初录数据”数据存储还是“复录数据”数据存储都可作为“数据确认”处理的数据源。知识点解析:暂无解析3、请使用[说明]中数据字典条目定义形式,将以下(1)和(2)空缺处的内容填写完整。初录数据=(1)复录数据=(2)标准答案:由题干中给出的关键信息“分户账录入:手工办理业务时建立的每个分户账数据均由初录员和复录员分别录入……”和“初录/复录比对:将初录员和复录员录入的数据进行一一比较,并标记两套数据是否一致”可知,初录员录入的“初录数据”中应包含“初录分户账”和“一致性标志”,而复录员录入的“复录数据”中应包含“复录分户账”和“一致性标志”。然后将它们表达成[说明]中数据字典条目定义形式如下。初录数据=初录分户账+一致性标志(或初录数据=手工分户账+一致性标志)复录数据=复录分户账+一致性标志(或复录数据=手工分户账+一致性标志)知识点解析:暂无解析4、请使用[说明]中数据字典条目定义形式,给出图3-18中的“手工分户账”数据流和图3-19中的“初录分户账”和“复录分户账”的关系。标准答案:这是一道要求考生掌握分层数据流图中父图与子图平衡原则的综合分析题。本题的解答思路如下。任何一个数据流子图必须与它上一层父图的某个加工相对应,即父图中某加工的输入/输出数据流必须与它的子图的输入/输出数据流在数量和名字上相同。但如果父图中的数据流是由子图中的几个数据流合并而成,即子图中组成这些数据流的数据项全体正好是父图中的这一个数据流,这种情况下也认为是平衡的。在建账软件第0层数据流图(见图3-18)中,“手工分户账”数据流是“1录入比对”处理的输入数据流,而“1录入比对”处理包含了建账软件第1层数据流图(见图3-19)中的“1.1初录”处理、“1.2复录”处理和“1.3比对”处理。在图3-19中,“1.1初录”处理的输入数据流是“初录分户账”,“1.2复录”处理的输入数据流是“复录分户账”,因此,“手工分户账”数据流包含了“初录分户账”和“复录分户账”,将其表达成本试题[说明]所示例的数据字典条目定义形式如下。手工分户账=初录分户账+复录分户账知识点解析:暂无解析5、加工1(录入比对处理)除能够检查出初录数据和复录数据不一致之外,还应检测的错误有(3)。A.显示器无法显示B.输入的无效字符C.输入数据的格式D.输入数据的界限E.打印机卡纸F.重复录入同一账户G.输入的半个汉字H.汇总数据与会计账目不符标准答案:由[问题3]要点解析可知,建账软件第0层数据流图(见图3-18)中“1录入比对”处理包含了第1层数据流图(图3-19)中的“1.1初录”、“1.2复录”和“1.3比对”这3个处理。结合题干给出的关键信息“初录/复录比对:将初录员和复录员录入的数据进行一一比较,并标记两套数据是否一致”和常识可知,加工1(录入比对处理)除能够检查出初录数据和复录数据不一致之外,还应检测的错误有①输入的无效字符(如在“账号”数据项中输入了小数点、$和@等其他字符)、②输入数据的格式(如“账号”数据项规定每4位数字后加一位半角空格字符等)、③输入数据的界限(例如“开户日”的数值是否超过了当前日期等)、④输入的半个汉字(在某些运行环境中(或输入法)中可能存在这种情况)和⑤(初录员/复录员)重复录入同一账户等。由题干给出的关键信息“汇总核对和打印:对经过确认的数据进行汇总,并和会计账目中的相关数据进行核对……”可知,检查汇总数据和会计账目是否相符是在图3-18中处理“3汇总核对”所完成的功能;数据打印是在图3-18中处理“4打印清单”所完成的功能。同时根据常识可知,“1录入比对”处理通常未涉及检查“显示器无法显示”和“打印机卡纸”等硬件故障的功能。知识点解析:暂无解析6、打印分户账清单(表3-8)时,必须以“(4)”作为关键字进行排序才能满足系统需求。A.储蓄所B.账号C.开户日D.户名E.其他分户账数据F.总户数和总余额标准答案:仔细阅读分户账清单样式表(见表3-8)可知,表中数据是按照“储蓄所”这一数据字段进行分组的,每一分组中均通过“共XXXX户,总余额YYYYYYY.YY元”格式给出了储蓄所的统计数据。这就要求在数据查询/打印操作中,至少要按照“储蓄所”这一数据字段进行排序才能实现。在实际应用中,在软件实现时也可以按照“账号”和“开户日”等数据字段进行排序,但从表3-8数据格式中无法确定是否需要这些排序工作。知识点解析:暂无解析阅读下列说明,根据要求回答问题1~问题3。[说明]某地区举行篮球比赛,需要开发一个比赛信息管理系统来记录比赛的相关信息。[需求分析结果]1.登记参赛球队的信息。记录球队的名称、代表地区、成立时间等信息。系统记录球队的每个队员的姓名、年龄、身高、体重等信息。每个球队有一个教练负责管理球队,一个教练仅负责一个球队。系统记录教练的姓名、年龄等信息。2.安排球队的训练信息。比赛组织者为球队提供了若干个场地,供球队进行适应性训练。系统记录现有的场地信息,包括:场地名称、场地规模、位置等信息。系统可为每个球队安排不同的训练场地,如表3-9所示。系统记录训练场地安排的信息。3.安排比赛。该赛事聘请有专职裁判,每场比赛只安排一个裁判。系统记录裁判的姓名、年龄、级别等信息。系统按照一定的规则,首先分组,然后根据球队、场地和裁判情况,安排比赛(每场比赛的对阵双方分别称为甲队和乙队)。记录参赛球队、比赛时间、比分、场地名称等信息,如表3-10所示。4.所有球员、教练和裁判可能出现重名情况。[概念模型设计]根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下。1.实体联系图(图3-20)2.关系模式教练(教练编号,姓名,年龄)队员(队员编号,姓名,年龄,身高,体重,(a)球队(球队名称,代表地区,成立时间,(b)场地(场地名称,场地规模,位置)训练记录((c))裁判(裁判编号,姓名,年龄,级别)比赛记录((d))7、根据问题描述,补充4个联系,完善图3-20的实体联系图。标准答案:本题考查读者对数据库概念结构设计及向逻辑结构转换的掌握情况。此类题目要求认真阅读题目对现实问题的描述,经过分类、聚集、概括等方法,从中确定实体及其联系。题目已经给出了4个实体,需要根据需求描述,给出实体间的联系。由“每个球队有一个教练负责管理球队,一个教练仅负责一个球队。”知球队与教练间为1:1联系;球队与队员之间应为1:N联系;多个球队使用多个训练场地,球队与场地之间为M:N联系;比赛是球队、场地与裁判之间的联系,一个球队会与同组的其他多个队之间比赛,有多个场地和裁决,一位裁判会对多场比赛判罚,一个场地会有多场比赛,涉及多个球队和裁判,因此球队、场地与裁判之间的比赛关系为M:N:P联系。补充完整的实体联系图如图3-29所示。知识点解析:暂无解析8、根据你的实体联系图,完成关系模式,并给出训练记录和比赛记录关系模式的主键和外键。标准答案:根据补充后的E-R图,球队与球员之间的1:N联系应通过将1端实体(球员)的主码(球队名称)加入到N端实体(球员)对应的关系中来表达。这类联系也可通过独立的一个关系来表达,如球队-球员(球队名称,队员编号),这样会对查询增加多余的连接操作,因此一般不采用这种方法。同样,球队与教练之间的1:1联系也应通过将一方的主码增加到另一方实体对应的关系中,来表达联系。训练和比赛为多对多联系,只能独立成一个关系模式,取该联系相关联的各实体的码及联系自有的属性构成。如比分和分组应该是比赛的属性,再加上球队、裁判、场地的码,即构成“比赛记录”的关系模式。比赛记录关系模式的主键可以是“场地名称,比赛时间”,也可以是“裁判,比赛时间”,或者是“甲队,比赛时间”,再或者是“乙队,比赛时间”。其外键是“甲队,乙队,场地名称,裁判”。同理,训练是球队和场地的多对多联系,训练开始时间和结束时间为训练的属性,加上球队的码和场地的码,构成“训练记录”关系模式。训练记录关系模式的主键可以是“球队,开始时间”,也可以是“场地名称,开始时间”,或者是“球队,结束时间”,再或者是“场地名称,结束时间”。其外键是“球队名称,场地名称”。知识点解析:暂无解析9、如果考虑记录一些特别资深的热心球迷的情况,每个热心球迷可能支持多个球队。热心球迷的基本信息包括:姓名、住址和喜欢的俱乐部等。根据这一要求修改图3-20的实体联系图,给出修改后的关系模式。标准答案:球迷与球队之间为多对多联系,需新增球迷实体和球迷与球队之间的支持联系,如图3-30所示。新增的关系模式如下。热心球迷(球迷编号,姓名,住址,俱乐部)支持球队(球迷编号,球队)知识点解析:暂无解析阅读以下技术说明,根据要求回答问题1~问题4。[说明]某汽车停车场欲建立一个信息系统,已经调查到的需求如下。1.在停车场的入口和出口分别安装一个自动栏杆、一台停车卡打印机、一台读卡器和一个车辆通过传感器等,其示意图见如图3-21所示。2.当汽车到达入口时,驾驶员按下停车卡打印机的按钮获取停车卡。当驾驶员拿走停车卡后,系统命令栏杆自动抬起;汽车通过入口后,入口处的传感器通知系统发出命令,栏杆自动放下。3.在停车场内分布着若干个付款机器。驾驶员将在入口处获取的停车卡插入付款机器,并缴纳停车费。付清停车费之后,将获得一张出场卡,用于离开停车场。4.当汽车到达出口时,驾驶员将出场卡插入出口处的读卡器。如果这张卡是有效的,系统命令栏杆自动抬起;汽车通过出口后,出口传感器通知系统发出命令,栏杆自动放下。若这张卡是无效的,系统不发出栏杆抬起命令而发出告警信号。5.系统自动记录停车场内空闲的停车位的数量。若停车场当前没有车位,系统将在入口处显示“车位已满”信息。这时,停车卡打印机将不再出卡,只允许场内汽车出场。根据上述描述,采用面向对象方法对其进行分析与设计,得到如表3-11所示的类/用例/状态列表,如图3-22所示的用例图,如图3-23所示的初始类图以及如图3-24所示的描述入口自动栏杆行为的UML状态图。10、根据说明中的描述,使用表3-11给出的用例名称,给出图3-22中U1、U2和U3所对应的用例。标准答案:表3-11中给出了Carentry、Carexit、ReportStatistics、Carentrywhenfull等4个用例。在这4个用例中,两个用例表示汽车进入停车场,一个用例表示汽车退出停车场,另一个用例表示记录停车场相关信息。经分析得出,前3个用例的参与者都是驾驶员,因此U1、U2和U3对应进入和退出停车场。U1和U3之间存在扩展关系,而用例之间的延伸关系用于对被用户看作是可选系统行为的用例的一部分建模。通过这种方式,可以把可选行为从必需的行为中分离出来。Carentrywhenfull和Carentry之间就可以使用extend关系进行建模。知识点解析:暂无解析11、根据说明中的描述,使用表3-11给出的类的名称,给出图3-23中的A~D所对应的类。标准答案:在UML类图中,类与类之间的5种关系从弱到强依次为:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition)和继承(Inheritance)。因此依赖关系最弱,继承表示类与类之间关系最强。依赖(Dependency)关系是类与类之间的连接,并且依赖总是单向的,其标准UML图形表示为表示其相联的两个类之间存在关联关系,用于描述两个概念上位于相同级别的类的实例之间存在的某种语义上的联系。聚合关系是关联关系的一种特例,代表两个类之间的整体/局部关系,其标准UML图形表示为表示其相联的两个类之间存在继承关系。子类继承父类的行为与含义,子类还可以增加或者覆盖父类的行为。子类可以出现在父类出现的任何位置。依题意可以判断Barrier、EntryBarrier和ExitBarrier之间存在继承关系,而在图3-23类图中所表示的继承关系的部分只有一处,因此这3个类分别对应于图3-23中的类B、类C和类D,而剩下的类A只有选择类CarPark了。知识点解析:暂无解析12、根据说明中的描述,使用表3-11给出的状态名称,给出图3-24中S1~S4所对应的状态。标准答案:在图3-24状态图中,Idle表示有空闲车位,Disable表示没有空闲车位,因此在其之间存在双向的状态迁移,即状态图上的状态S1为Idle状态。当停车场存在空闲车位时,汽车请求进入停车场,根据说明描述“当汽车到达入口时,驾驶员按下停车卡打印机的按钮获取停车卡”,可知在该动作正对应于状态图上的S1和状态S2之间的迁移,因此,状态S2表示的含义应该是按下按钮后状态,此时,驾驶员等待打印停车卡,所以状态S2为AwaitTicketTake。同理可分析出状态S3和状态S4。知识点解析:暂无解析13、简要解释图3-22中用例U1和U3之间的extend关系的内涵。标准答案:在用例的执行过程中,可能会在不同的流程分支中选择执行,也可能会出现异常行为。此时,可以将异常行为或可选分支抽象成一个单独的扩展用例,它与主用例之间形成“扩展(extend)”关系。知识点解析:暂无解析阅读下列算法说明和流程图,根据要求回答问题1~问题3。[说明]某机器上需要处理n个作业job1,job2,…,jobn,其中:(1)每个作业jobi(1≤i≤n)的编号为i,jobi有一个收益值P[i]和最后期限值d[i];(2)机器在一个时刻只能处理一个作业,而且每个作业需要一个单位时间进行处理,一旦作业开始就不可中断,每个作业的最后期限值为单位时间的正整数倍;(3)job1~jobn的收益值呈非递增顺序排列,即p[1]≥p[2]≥…≥p[n];(4)如果作业jobi在其期限之内完成,则获得收益p[i];如果在其期限之后完成,则没有收益。为获得较高的收益,采用贪心策略求解在期限之内完成的作业序列。图3-25是基于贪心策略求解该问题的流程图。(1)整型数组J[]有n个存储单元,变量k表示在期限之内完成的作业数,J[1..k]存储所有能够在期限内完成的作业编号,数组J[1..k)里的作业按其最后期限非递减排序,即d[J[1]]≤…≤d[J[k]]。(2)为了便于在数组J中加入作业,增加一个虚拟作业job0,并令d[0]=0,J[0]=0。(3)算法大致思想是:先将作业job1的编号1放入J[1],然后,依次对每个作业jobi(2≤i≤n)进行判定,看其能否插入到数组J中。若能,则将其编号插入到数组J的适当位置,并保证J中作业按其最后期限非递减排列;否则不插入。jobi能插入数组J的充要条件是:jobi和数组J中已有作业均能在其期限之内完成。(4)流程图中的主要变量说明如下。i:循环控制变量,表示作业的编号;k:表示在期限内完成的作业数;r:若jobi能插入数组J,则其在数组J中的位置为r+1;q:循环控制变量,用于移动数组J中的元素。14、请将图3-25中的(1)~(3)空缺处的内容填写完整。标准答案:这是一道考查贪心算法的流程图分析的试题。(1)空缺处表示第2个作业到第n个作业的主循环的条件判断,由于i是循环控制变量,因此(1)空缺处所填写的内容是i<=h。注意到题干中给出的关键信息“J[1..k)存储所有能够在期限内完成的作业编号,数组J[1..k]里的作业按其最后期限非递减排序,即”。换言之,数组J中的作业J[i](1≤i≤k)是在其期限之前完成的作业,且。由图3-25给出的算法流程图可知,主循环内嵌套了两个循环,第1个循环判断当前考虑的作业i应该插入到J中的什么位置,用循环控制变量r表示当前考虑的J中的作业。使用虚拟作业J[0],允许作业较方便地插入到第1个位置。为了保证J中的作业期限按升序排序,作业J[r]若比作业i的期限大,则循环控制变量r要自减,因此(2)空缺处所填写的内容是d[J[r]]>d[i]。d[J[r]]与r的关系只有两种:d[J[r]]>r,表示还可能在J[1]与J[r]之间插入作业“d[J[r]]=r,表示不可以在J[1]~J[r]之间插入作业i。d[J[r]]<r的情况不会存在,因为J中若有r个作业,那么最后一个作业的期限不可能小于r。当作业i大于等于作业J[r]的期限时,此时找到了作业i插入的位置,即r+1。第2个循环的作用是将作业J[r+1]……J[k]依次往后移动,此处用插入排序算法的思想。最后把作业i插入到J[r+1]处,因此(3)空缺处所填写的内容是J[r+1]=i(或J[q+1]=i)。知识点解析:暂无解析15、假设有6个作业job1,job2,…,job6;完成作业的收益数组p=(p[1],p[2],p[3],p[4],p[5],p[6])=(90,80,50,30,20,10);每个作业的处理期限数组d=(d[1],d[2],d[3],d[4],d[5],d[6])=(1,2,1,3,4,3)。请应用试题中描述的贪心策略算法,给出在期限之内处理的作业编号序列(4)(按作业处理的顺序给出),得到的总收益为(5)。标准答案:这是一道考查贪心算法实例应用的分析题。6个作业job1,job2,…,job6的收益已经按降序排列,根据图3-25的算法流程,将作业1,2,4和5放入数组J中,并得到总收益为220,具体分析过程见表3-13。知识点解析:暂无解析16、对于本试题的作业处理问题,用图3-25的贪心算法能否求得最高收益?(6)。(能或不能)用贪心算法求解任意给定问题时,是否一定能得到最优解?(7)。(能或不能)标准答案:这是一道判断贪心算法是否能求得最优解的应用分析题。对于本试题的作业处理问题,用图3-25的贪心算法策略,能求得最优解(即能求得最高收益)。但不是所有的问题都能通过贪心策略来求得最优解,一个典型的例子是0—1背包问题。例如,有3件物品,背包可容纳50磅重的东西,每件物品的详细信息如表3-14所示,问如何装包使得其价值最大?如果按贪心策略求解该问题,优先选择单位价值最大的物品,则先选择物品R,然后选择物品S。由于此时背包容量还剩下50-10-20=20,不足以容纳物品T,故总价值为60+100=160美元。但若选择物品S和物品T,容量总和为20+30,小于等于总容量50,得到总价值为100+120=220美元,会得到更优解。此时用贪心策略不能得到最优解。知识点解析:暂无解析二、选答题(本题共3题,每题1.0分,共3分。)17、阅读以下函数说明、图和C程序代码,将C程序段中(1)~(6)空缺处的语句填写完整。[说明]散列文件的存储单位称为桶(BUCKET)。假如一个桶能存放m个记录,当桶中已有m个同义词(散列函数值相同)的记录时,存放第m+1个同义词会发生“溢出”。此时需要将第m+1个同义词存放到另一个称为“溢出桶”的桶中。相对地,称存放前m个同义词的桶为“基桶”。溢出桶和基桶大小相同,用指针链接。查找指定元素记录时,首先在基桶中查找。若找到,则成功返回,否则沿指针到溢出桶中进行查找。例如,设散列函数为Hash(Key)=Keymod7,记录的关键字序列为15,14,21,87,96,293,35,24,149,19,63,16,103,77,5,153,145,356,51,68,705,453,建立的散列文件内容如图2-27所示。为简化起见,散列文件的存储单位以内存单元表示。函数InsertToHashTable(intNewElemKey)的功能是:若新元素NewElemKey正确插入散列文件中,则返回值0;否则返回值-1。采用的散列函数为Hash(NewElemKey)=NewElemKey%P,其中P设定基桶的数目。函数中使用的预定义符号如下。标准答案:这是一道要求读者掌握如何在散列文件中插入一个新的数据元素的编程题。本题的解答思路如下。在散列文件中插入一个新的数据元素的基本思路是,首先将要插入的元素代入到散列函数中,从而计算出该元素的散列地址。然后按照散列地址,在基桶中查找空闲单元,若找到,则将元素插入,若基桶已满,则在溢出桶中查找空闲单元。若溢出桶中也查找不到,则申请新的溢出桶,然后将元素存入。在散列文件中查找一个元素的基本思路是,查找指定元素记录时,首先在基桶中查找,若找到,则成功返回,否则沿指针到溢出桶中进行查找。在本试题中,将元素存储在预先设定的基桶或根据需要申请的溢出桶中,只要基桶中有空闲单元,就将新元素NewElemkey插入在基桶中,若基桶中无空闲单元,则看是否存在溢出桶,若存在,则在溢出桶中查找空闲单元,若不存在溢出桶或溢出桶中无空闲单元,则申请一个溢出桶并存入新元素。在基桶查找空闲单元时,使用的桶号为Index,由此可知(1)空缺处所填写的内容是“Index=NewElemKey%P”,或“Index=Hash(NewElemKey)”等其他等价形式。一旦在基桶中找到空闲单元,即“Bucket[1ndex].keyData[i]==NULLKEY”(0≤i<ITEMS),则可将元素NewElemkey放入Bucket[Index].keyData[i],至此元素已经插入散列桶中,函数可返回,因此(2)空缺处所填写的内容是“i<ITEMS”。反之,若在基桶中没有找到空闲单元,则需查找溢出桶。“t=Bucket[Index].Link”,指针t首先指向桶号Index的第一个溢出桶。以下的代码完成在溢出桶中查找空闲单元的功能。由于每个溢出桶都可以存储ITEMS个元素,因此在溢出桶中查找空闲单元与在基桶中的查找过程相同,代码如下。若在指针t指向的溢出桶中找到空闲单元则插入元素,否则,由“t=t->Link”得到下一个溢出桶的指针,因此“k<ITEMS”可作为是否在当前溢出桶中找到空闲单元的判定条件。显然,在桶号Index的基桶和其所有溢出桶都已满的情况下,t的值为空指针。此时才需要申请新的溢出桶并建立链接关系,因此在上面查找溢出桶中空闲单元时,进行指针t的后移“t=t->Link’’前应先用front记录t的值,以便于后面建立链接关系。所以(3)空缺处应给front置初值,即所填写的内容是“front=&Bucket[Index]”,或“front=Bucket+Index”等其他等价形式。(4)空缺处用于判断该溢出桶是否已满,即所填写的内容是“k=ITEMS(或k>=ITEMS)”。如果该溢出桶已满,则继续查找下一个溢出桶,直到查找到空闲单元为止。若所有溢出桶都不存在空闲单元(即t==NULL),则申请新的溢出桶,并将新的溢出桶的首地址保存在原有的最后一个溢出桶的Link域中(即front->Link=s)。因此(5)空缺处所填写的内容是“t==NULL”,(6)空缺处用于建立新申请溢出桶的链接关系——“front->Link=s”。知识点解析:暂无解析18、阅读以下技术说明及C++代码,将C++程序中(1)~(5)空缺处的语句填写完整。[说明]在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文件中内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的DocExplorer对象都将得到通知,这种应用被称为Observer(观察者)模式。以下代码采用C++语言实现,能够正确编译通过。[C++代码]标准答案:Observer(观察者)模式的设计意图是:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。首先,DocExplorer需要知道OfficeDoc是一个类,但由于OfficeDoc定义在DocExplorer之后,因此需要在DocExplorer类的定义前加上classOfficeDoc的声明,即(1)空缺处所填写的内容是:classOfficeDoc。(2)空缺处可根据程序最后的构造函数的实现知道,应该填写OfficeDoc。在观察者模式中,不同的观察者更新自身的方法不同,因此(3)空缺处应填写virtual,而且程序最后的“=0”也表明是一个纯虚拟函数。由(4)空缺处所在行的程序注释说明可知,所有与OfficeDoc相关联的对象更新自身状态,因此需要使用update函数。但update函数的参数是一个OfficeDoc类的对象,所以参数应该为this。(5)空缺处所在行语句的功能是,将OfficeDoc类的对象和DocExplorer类的对象相关联,关联的函数是OfficeDoc中的attach方法,其参数是一个DocExplorer对象,使用this能够表示当前的对象,因此该空缺处应填写attach(this)。知识点解析:暂无解析19、阅读以下技术说明及Java代码,将Java程序中(1)~(5)空缺处的语句填写完整。[说明]在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文件的内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的DocExplorer对象都将得到通知,这种应用被称为Observer(观察者)模式。以下代码采用Java语言实现,能够正确编译通过。[Java代码]标准答案:Observer(观察者)模式的设计意图是:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。(1)空缺处观察者对象更新自身的状态,更新的数据应该来自被观察者对象,所以此处应该为一Subject,因此(1)空缺处所填写的内容是:Subjectsubject。同理,(5)空缺处与(1)空缺处所填写的内容是相同的。notifyObservers方法通知所有的观察者对象更新自身的状态,因此(2)空缺处应该返回所有的观察者对象,调用方法Observers()即可获得。(3)空缺处对每个观察者对象更新状态,所以应该调用update方法,update方法需要此被观察者对象作为参数,所以使用this宋获取对象自身。DocExplorer是一个观察者,因此需要实现接口Observer,即(4)空缺处所填写的内容是:Observer。知识点解析:暂无解析软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷第3套一、必答题(本题共13题,每题1.0分,共13分。)[说明]公司IT部门决定开发一个计算机管理系统以记录期刊的传阅情况。期刊在公司内部传阅,员工可以要求加入传阅队列。图书室登记公司收到的期刊,交给名单中的第一名员工。员工应在三个工作日内完成阅读,员工阅读完毕后通知系统,系统提醒下一位阅读者取书,下一个员工必须确认已收到期刊。当传阅名单中“下一位”员工出差在外时将无法进行传阅,此时将期刊传给再下一位,而将该员工作标记,再次传递此书时优先考虑该员工。最后一位员工阅读完毕后,将期刊交还图书室以便共用。系统能在员工忘记传递期刊时发出提醒信息。系统详细记录期刊传阅情况,当员工阅读完后通知系统,系统记录该员工员工号及日期,并在备注栏注明是传出;同样,当员工收到期刊后给系统确认,系统记录该员工员工号及日期,并在备注栏注明是收到。公司的员工都有一个唯一的员工号。公司订阅了多种期刊,为每一本期刊(有唯一期刊流水号)产生一份传阅名单,并详细记录传阅情况。员工的出差情况存储在系统主机中。该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图1-1是该系统的类图的一部分,图1-2描述了成功传递期刊的序列图。[图1-1]1、根据题意,给出类“传阅记录”的主要属性。标准答案:“传阅记录”属性:期刊流水号、员工号、日期、备注。知识点解析:暂无解析2、根据题意,将图1-2中的(1)~(5)处补充完整。标准答案:读取下一位阅读者(3)读取员工状态(4)提醒取书(5)添加传阅记录根据期刊传阅过程的描述,员工阅读完毕“通知系统”,系统“添加传阅记录”,并从“传阅名单”中“读取下一位阅读者”,然后“读取员工状态”,若该员工可传,“提醒取书”,员工收到期刊后向系统确认,系统“添加传阅记录”。知识点解析:暂无解析3、同一种期刊分不同的期,所以有多本同一种期刊。“传阅名单”只需每一种期刊一份,还是应该每本期刊一份,为什么?标准答案:“传阅名单”应该每一本期刊一份,以便当员工出差时正确做标记,保证正确传递。当传阅名单中“下一位”员工出差在外时将无法进行传阅,此时将期刊传给再下一位,而将该员工作标记,再次传递此书时优先考虑该员工。仔细分析该句题设,不难发现,“传阅名单”应该每一本期刊一份,如果一种期刊一份,则没法做标记,当员工出差时将无法正确传递。知识点解析:暂无解析[说明]某学校的教学系统描述如下:学生信息包括:学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、入学年份(Syear)、主修专业(Smajor),其中学号是入学时唯一编定的。教师信息包括:教工号(Tno)、姓名(Tname)、性别(Tsex)、年龄(Tage)、职称(Title),其中教工号是唯一编定的。课程信息包括:课程号(Cno)、课程名称(Cname)、学时(Cpeiiod)、学分(Ccredit),其中课程号是唯一编定的。每个专业每个年级只有一个班级,这样班级就可用入学年份标识。每位教师只教授特定的一门的课程,每门课程可以有多个教师教授,各位老师的上课地点及上课时间有所不同。注意:一门课程至少有一位教师教授,否则这门课程就视为不存在。每位学生可以同时选修多门不同的课程,一门课程至少要有10位学生选修,否则就取消这门课程的开设。注意:选修课程时要指定任课教师,不能重复选修同一门课程。课程结束后,任课教师给选修该课程的学生一个成绩(Grade)。注意:教师不能给没有选修他所教授课程的学生成绩,即使选修了其他教师教授的同一门课也不行。图2-1是经分析得到的E-R图。[图2-1]4、根据题意,给出联系的属性。实体间的联系有“一对一”、“一对多”和“多对多”,指出各联系分别属于哪一种。标准答案:教授:上课地点、上课时间,一对多选修:任课教师、成绩,多对多“每位教师只教授特定的一门的课程,每门课程可以有多个教师教授,各位老师的上课地点及上课时间有所不同”,因此联系“教授”的属性应有:上课地点,上课时间,是一对多联系。“每位学生可以同时选修多门不同的课程,一门课程至少要有10位学生选修,……,选修课程时要指定任课教师,……,任课教师给选修该课程的学生一个成绩(Grade)”,因此联系“选修”的属性应有:任课教师、成绩,是多对多联系。知识点解析:暂无解析5、按照“有关模式名(属性,属性,…)”的格式,将此E-R图转换为5个关系模式,指出每个关系模式中的主码和外码,其中模式名根据需要取实体名或联系名。标准答案:教师(教工号,姓名,性别。年龄,职称),主码:教工号课程(课程号,课程名称,学时,学分),主码:课程号学生(学号,姓名,性别,年龄,主修专业,入学年份),主码:学号教授(教工号,课程号,上课地点,上课时间),主码:(教工号)选修(学号,课程号,任课教师,成绩),主码:(学号,课程号)或(学号,任课教师)E-R模型向关系模型的转换应遵循如下原则:①每个实体类型转换成一个关系模式。②一个1:1的联系(一对一联系)可转换为一个关系模式,或与任意一段的关系模式合并。③一个1:n的联系(一对多联系)可转换为一个关系模式,或与n段的关系模式合并。若独立转换为一个关系模式,那么两端关系的码及其联系的属性为该关系的属性,而n端的码为关系的码。④一个n:m的联系(多对多联系)可转换为一个关系模式,两端关系的码及其联系的属性为该关系的属性,而关系的码为两端实体的码的组合。⑤三个或三个以上多对多的联系可转换为一个关系模式,诸关系的码及联系的属性为关系的属性,而关系的码为各实体的码的组合。⑥具有相同码的关系可以合并。由于“每位教师只教授特定的一门的课程,学生不能重复选修同一门课程”,因此教授联系的主码是“教工号”,修选联系的主码可以是“(学号,课程号)”,也可以是“(学号,任课教师)”。知识点解析:暂无解析6、若用Student表存储学生信息,Teacher表存储教师信息,Course表存储课程信息,Study表存储学生选修课程情况。教务处想要“查询2006年入学的计算机专业(CS)的学生中平均成绩在85分以上的学生信息”。请将以下SQL语句补充完整。注:用对应英文表示。SELECT*FROMstudentWHERESmajor="CS"ANDSyear="2006"AND(1)(SELECTSnoFROMStudyGROUPBYSnoHAVING(2))标准答案:SnoIN(2)AVG(Grade)>85SELECT[ALL|DISTINCT]<目标列表达式>[,(目标列表达式>]…FROM<表名或视图名>[,<表名或视图名>][WHERE(条件表达式>][GROUIBY<列名1>[HAVING<条件表达式>]][ORDERBY<列名2>[ASC|DESC]…]子句顺序为SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY,但SELECT和FROM是必须的,HAVING子句只能与GROUPBY搭配起来使用。子查询的语意应为“按学号分组、平均分大于85的学生的学号”,可得空(1)应填SnoIN,空(2)应填AVG(Grade)>85。知识点解析:暂无解析[说明]图3-1描述某超市销售数据的部分处理流程。超市中有若干台收款机和若干名收款员。这里,我们把一个收款员开始使用一台收款机到离开这台收款机称为该收款员的一次作业。作业开始时,收款员先在收款机上输入收款员号和作业前金额。作业前金额是为了销售时的找零而在作业前预先放入钱柜的金额数。作业结束时,收款员要打开钱柜,取走全部现金,并把这些现金的金额数(称为作业后金额)输入收款机。当作业前金额+本次作业售货总金额-本次作业退货总金额≠作业后金额时,表示这次作业存在金额差错。本流程图已作简化,并作以下假定;该超市只有现金交易(不用信用卡和礼券);一个收款员因某种原因(如吃饭)在一天中可以有多个作业;销售方式只有售货和退货两种。整个超市分成若干部门(如食品部、服装部),系统按部门统计一个月中各类货物的销售数量和金额,最后根据月销售计划文件分析各部门完成销售计划的情况。系统还统计每个收款员的差错情况和退货情况。图中处理4和处理8每月的最后一天执行一次(营业结束后),其他处理每天执行一次。图中部分数据、文件的记录格式如下:日销售数据:收款机号+收款员号+作业前金额+{(售货标记|退货标记)+货号+数量+单价+金额}+作业后金额日销售文件记录:(作业开始标记+收款机号+收款员号+作业前金额)|((售货标记|退货标记)+货号+数量+金额)|(作业结束标记+收款机号+收款员号+作业后金额)部门目销售文件记录:部门号+(售货标记|退货标记)+货号+数量+金额部门月销售计划文件记录:部门号+月计划金额收款员差错月报:月份+收款员号+差错作业数+差错总金额收款员退货月报:月份+收款员号+退货次数+退货总金额其中{w}表示w重复出现多次;a|b表示a或b;a+b表示a与b。7、分别写出收款员日销售文件、商品文件、部门日销售汇总文件至少应包含哪些数据项。标准答案:收款员日销售文件:收款员号+差错作业数+差错金额+退货次数+退货金额商品文件:货号+部门号+单价部门日销售汇总文件:部门号+货号+销售数量+销售总金额知识点解析:暂无解析8、“处理1”能检查出日销售数据中的哪些错误。标准答案:存在非法字符或非法数据(如金额小于0)数量×单价≠金额货号(或单价)与商品文件中的货号(或单价)不一致知识点解析:暂无解析9、处理4对收款员月销售文件作何种操作。标准答案:删除其中的所有记录或初始化知识点解析:暂无解析10、阅读下列函数说明、图和C代码,回答问题[说明]假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]×10+a[2]其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数、1表示负数。运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减情况。注意,不考虑溢出情况,即数组足够大。[函数]intcmp(int*LA,int*LB);/*比较长整数LA与LB的绝对值大小*//*若LA绝对值较大返回正值,LA较小返回负值,相等则返回0*/intADD(int*LA,int*LB,int*LC)/*计算长整数LA与LB的和,结果存储于LC中*//*注意:正数与负数的和相当于正数与负数绝对值的差*//*数据有误返回0,正常返回1*/{if(LA==NULL||LB==NULL||LC==NULL)return0;int*pA,*pB,i,N,carry,flag;flag=LA[0]+LB[0];switch(flag){/*根据参与运算的两个数的符号进行不同的操作*/case0:case2:Lc[0]=L

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论