问答题【说明】某超市的销售业务由一个销售业务管理系统进行管理,该系统每完成一次交易都需要提供顾客发票,其格式如表1-1所示。对于这样一个销售业务管理系统,分别给出了以下两种关系数据库的设计(下划线表示主关键字)设计一:顾客Customer(顾客代码Cno,姓名name,住址address,联系电话phone)收银员Salesman(收银员代码Sno,身份证号idno,姓名flame,住址address,联系电话phone)商品Merchandise(商品代码Milo,商品名称Mname,价格price)发票Invoice(发票号码Ino,交易日期Idate,顾客代码Cno,收银员代码Sno,商品代码Mno,单价unitprice,数量amount)设计二:顾客Customer(顾客代码Cno,姓名name,住址address,联系电话phone)收银员Salesman(收银员代码Sno,身份证号idno,姓名name,住址address,联系电话吵one)商品Merchandise(商品代码Mno,商品名称mllame,价格pnce)发票Invoice(发票号码Ino,交易日期Idate,顾客代码Cno,收银员代码Sno)发票明细Invoicedetail(发票号码Ino,商品代码Uno,单价unitprice,数量amount)1.【问题1】设计一的关系模式Invoice最高满足第几范式?为什么?设计一和设计二哪个更加合理?为什么?
问答题[说明]以下代码实现了对象引用作为函数参数,仔细阅读以下代码,分析运行结果,填入 (n) 处。[代码] #include<iostream.h> class Sample int x,y; public: Sample() x=y=0; Sample (int i, int j ) x=i; y=j; void copy ( Sample y=j; void print ( cout<<"x="<<x<<end1 ; cout <<"y="<<y<<end1; ; void Sample: copy ( Sample y=s.y; void func ( Sample s1, Sample s2.setxy ( 30,40 ); void main ( ) Sample p ( 1,2 ) ,q; q.copy ( p ); time ( p,q ); p.print ( ); q.print ( ); 运行结果 (1) (2) (3) (4)
问答题【说明】 某供销系统接受顾客的订货单,当库存中某配件的数量小于订购量或库存量低于一定数量时,向供应商发出采购单;当某配件的库存量大于或等于定购粮食,或者收到供应商的送货单并更新了库存后,向顾客发出提货单。该系统还可随时向总经理提供销售和库存情况表。该供销系统的分层数据流图中部分数据流和文件的组成如下: 文件 配件库存=配件号+配件名+规格+数量+允许的最低库存量 数据流 订货单=配件号+配件名+规格+数量+顾客名+地址 提货单=订货单+金额 采购单=配件号+配件名+规格+数量+供应商名+地址 送货单=配件号+配件名+规格+数量+金额 假定顶层图(如图6所示)是正确的,“供应商”文件已由其他系统生成。
问答题[说明] 下面代码实现类A、B、C、D的继承定义和应用。仔细阅读[代码5-1],在 (n) 处写出正确的运行结果。 [代码5-1] #include<iostream.h> class A public: int a; A (int v1): a(v1) //构造函数 void disp ( ) cout<<"a in class A="<<a<<endl; ; class B: virtual public A public: int b; B (int v1,int v2): A(v1),b v2) //构造函数 void disp ( ) cout<<"a in class B="<<a<<endl cout<<"b in class B="<<b<<endl; ; class C: virtual public A public: int c; C (int v1,int v2): A(v1) ,c(v2) //构造函数 void disp ( ) cout<<"a in class C="<<a<<endl; cout<<"c in class C="<<c<<endl; ; class D: public B, public C public: int d; D (int v1,int v2,int v3,int v4 ): A(v1) ,B(v1,v2) ,C(v1,v3),d(v4) //构造函数 void disp ( ) cout<<"a="<<a<<endl; cout<<"b="<< b<<endl; cout<<"c="<<c<<endl; cout<<"d="<<d<<endl; ; void main( ) D demo (10,20,30,40); demo.disp ( ); [运行结果] a= (1) b= (2) c= (3) d= (4)
问答题[说明]在数据链路层扩展局域网时使用网桥。网桥工作在数据链路层,它根据MAC帧的目的地址对收到的帧进行转发。网桥具有过滤帧的功能:当网桥收到一个帧时,并不是向所有的端口转发此帧,而是先检查此帧的目的MAC地址,然后确认将该帧转发到哪个端口。最简单的网桥有两个端口(即接口)。网桥的每个端口与一个网段相连。每当收到一个帧时,通过查找转发表将收到的帧转发。当一个网桥刚刚连接到局域网上时,其转发表是空的,此时若收到一个帧,按照以下算法处理和建立自己的转发表:(1)从端口x收到的无差错的帧(如有差错即丢弃),在转发表中查找目的站MAC地址;(2)如有,则查找出到此MAC地址应走的端口d,然后进行(3),否则转到(5);(3)如到这个MAC地址去的端口d=x,则丢弃此帧(因为这表示不需要经网桥进行转发),否则从端口d转发此帧;(4)转到(6);(5)向网桥除x以外的所有端口转发此帧(这样做可以保证找到目的站);(6)如源站不在转发表中,则将源站MAC地址加入转发表,登记该帧进入网桥的端口号,设置计时器,然后转到(8),如源站在转发表中,则执行(7);(7)更新计时器;(8)等待新的数据帧,转到(1)。这时,网桥就在转发表中登记以下三个信息:站地址——登记收到帧的源MAC地址、端口——登记收到的帧进入该网桥的端口号、时间——登记收到的帧进入该网桥的时间。现有五个工作站分别连接在三个局域网上,并且用两个网桥连接起来,如图3-1。每一个网桥的两个端口号都标明在图上。在一开始,两个网桥中的转发表都是空的。以后有以下各站向其他的站发送了数据帧,即H1发送给H5,H3发送给H2,H4发送给H3,H2发送给H1。[图3-1]1.试将有关数据填写在表中。其中,网桥的处理有:转发、丢弃或登记。假定帧均无差错。发送的帧网桥1的转发表网桥2的转发表网桥1的处理网桥2的处理站地址端口站地址端口H1->H5H3->H2H4->H3H2->H1
问答题【程序说明】 本程序先从文件读人各考生的准考证号(设为整型数)及成绩,并将其存放在一棵检索二叉树上,二叉树结点的健值是成绩,每个结点带一链表,链表结点存放取得该成绩的考生的准考证号。然后,程序按中序遍历检索二叉树,从高分到低分输出结果,使每行输出成绩及其取得成绩的考生的准考证号。 【程序】 #include < stdio. h > typedef struet idnode int id; struct idnode * next; ldNode; typedef struct marknode I int mark; ldNode * head; struct marknode * left, * right; MarkNode; char fname [ ] = "sp07.dat"; main( ) int id, mark; MarkNode * root = null; FILE * fp = fopen(fname," r" ); if(!fp) printf("file%s open error, /n" , fname); exit(0); while (!feop(fp)) fscanf(fp," %d%d", btree( fclose(fp); print(root); btree(MarkNod * * mpptr, int id, int mark) ldNode * ip; MarkNode *mp = * mpptr; if (1) if (mark==p->mark) addldNODE ( (2) , id); else if ( mark >mp -> mark) btree ( else btree( else Imp = ( marknode * ) malloc(sizeo (marknode) ); mp -> mark = mark; mp -> left =mp -> right = NULL; (3) addldNode( (4) ; addldNode(ldNode * * ipp, int id) ldNode * ip = * ipp; if ( (5) )addldNode ( (6) ), id; else ip = (ldNode * )malloc(sizeof(ldNode) ); sp - > id = id; ip -> next = NULL; (7) print(MarkNode * rap) ldNode *ip, *ip0; if (mp) print ( mp -> left); printf(" %6d: /t" ,mp -> mark); ip = mp -> head; while(ip) printf(" %6d" ,ip -> id); ip0 =ip; ip = ip -> next; free (ip0); printf(" /n" ); printf( mp -> right); free(mp);
问答题[说明]为了有效记录交通事故情况,欲设计一个交通事故记录系统。一辆汽车有一个唯一的“车牌号”,车主购买汽车时需要提供相关信息,包括身份证、姓名、年龄、性别、地址等。一个车主可以拥有多辆汽车,而一辆汽车只有一个车主。驾驶员不一定是车主,因此记录交通事故时要记录驾驶员身份证号,同时记录事故发生时刻。图2-1描绘了人、汽车、交通事故三个实体类型及实体间联系的一个E-R图。[图2-1]对应的关系模式为:·人(身份证号,姓名,性别,年龄,地址)·汽车(车牌号,型号)·事故(车牌号,身份证号,时刻,损失,描述)·拥有(身份证号,车牌号)
问答题【程序5说明】 设M叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根结点的值部分(设为一个字符)和用“()”括起来的各子树的列表(如有子树的话),各子列表间用“,”分隔。例如下面的三叉树可用列表a(b(c,d),e,f(g,h,i))表示。 本程序输入列表,生成一棵M叉树,并由M叉树输出列表。假定输入无错误。 【程序5】 #include<Stdio.h> #include<Stdlib.h> #define M 3 typedef struct nodechar val; struct node,subTree[M]; NODE; char buf[255],*Str=buf; NODE * d=NULL NODE*makeTree()/*由列表生成M叉树*/ int k;NODE*s; s= (1) ; s->val= *Str++; for(k=0;k<M;k++)s->subTree[k]=NULL; if(* str='(') k=0; dostr++; s->sub Tree[k]= (2) ; if(*Str==')')Str++;break; k=k+1; while( (3) ); return s; void walkTree(NODE*t)/*由M又树输出列表*/ int i; if(t!=NULL) (4) if(t->subTree[0]==NULL)return; putchar('('); for(i=0;i<M;i++) (5) ; if(i!=M-1&&t->subTree[i+1]!=NULL) putchar(','); putchar(')'); void main() printf("Enter exp:"); scanf("%s",str); d=makeTree(); walkTree(d);putchar('/n");
问答题阅读以下技术说明,根据要求回答问题1~问题4。[说明]某汽车停车场欲建立一个信息系统,已经调查到的需求如下。1.在停车场的入口和出口分别安装一个自动栏杆、一台停车卡打印机、一台读卡器和一个车辆通过传感器等,其示意图见如图3-21所示。2.当汽车到达入口时,驾驶员按下停车卡打印机的按钮获取停车卡。当驾驶员拿走停车卡后,系统命令栏杆自动抬起;汽车通过入口后,入口处的传感器通知系统发出命令,栏杆自动放下。3.在停车场内分布着若干个付款机器。驾驶员将在入口处获取的停车卡插入付款机器,并缴纳停车费。付清停车费之后,将获得一张出场卡,用于离开停车场。4.当汽车到达出口时,驾驶员将出场卡插入出口处的读卡器。如果这张卡是有效的,系统命令栏杆自动抬起;汽车通过出口后,出口传感器通知系统发出命令,栏杆自动放下。若这张卡是无效的,系统不发出栏杆抬起命令而发出告警信号。5.系统自动记录停车场内空闲的停车位的数量。若停车场当前没有车位,系统将在入口处显示“车位已满”信息。这时,停车卡打印机将不再出卡,只允许场内汽车出场。根据上述描述,采用面向对象方法对其进行分析与设计,得到如表3-11所示的类/用例/状态列表,如图3-22所示的用例图,如图3-23所示的初始类图以及如图3-24所示的描述入口自动栏杆行为的UML状态图。{{B}}表3-11类/用例/状态列表{{/B}}{{B}}用例名{{/B}}{{B}}说明{{/B}}{{B}}类名{{/B}}{{B}}说明{{/B}}{{B}}状态名{{/B}}{{B}}说明{{/B}}Carentry汽车进入停车场CentralComputer停车场信息系统Idle空闲状态,汽车可以进入停车场Carexit汽车离开停车场PaymentMachine付款机器Disable没有车位ReportStatistics记录停车场的相关信息CarPark停车场,保存车位信息AwaitEntry等待汽车进入Barrier自动护栏AwaitTicketTake等待打印停车卡Carentrywhenfull没有车位时,汽车请求进入停车场EntryBarrier入口的护栏AwaitEnable等待停车场内有空闲车位ExitBarrier出口的护栏
问答题[说明] 下面代码实现class C对class A和B的protected成员和public成员的调用。仔细阅读[代码5-1]、[代码5-2],在{{U}} (n) {{/U}}处写出正确的运行结果。 [代码5-1] #include <iostream.h> class A { private: int a1; protected: int a2; public: A ( int v1,int v2,int v3 ): a1 ( v1 ) ,a2 ( v2 ) ,a3 ( v3 ) {} int a3 }; class B : pubiic A{ private: int b1; protected: int b2; public: B ( int v1,int v2,int v3,int v4,int v5,int v6 ) : A(v1,v2,v3),b1 (v4),b2(v5),b3 (v6) {} int b3; }; class C : public B{ private: int c1; protected: int c2; public: int c3; C (int v1,int v2,int v3,int v4,int v5,int v6,int v7,int v8,int v9 ) : B ( v1,v2,v3,v4,v5,v6 ) ,c1 ( v7 ),c2 ( v8 ) ,c3 v9 void disp ( ) { cout << "a2 in class C =" << a2 << endl; cout << "a3 in class C =" << a3 << eudl; cout << "b2 in class C =" << b2 << endl; tout << "b3 in class C =" << b3 << endl; } }; [代码5-2] voidmain() { Cdemo(10,20,30,40,50,60,70,80,90); cout<<"对象demo.a3="<<demo.a3 cout<<"对象demo.b3="<<demo.b3 cout<<"对象demo.c3="<<demo.c3 demo.disp( ); } [运行结果] 对象demo.a3={{U}} (1) {{/U}} 对象demo.b3={{U}} (2) {{/U}} 对象demo.c3={{U}} (3) {{/U}} a2 in class C={{U}} (4) {{/U}} a3 in class C={{U}} (5) {{/U}} b2 in class C={{U}} (6) {{/U}} b2 in class C={{U}} (7) {{/U}}
问答题【说明】银行客户需要从ATM取100元,他向ATM的读卡机插卡,读卡机读取他的卡号,然后ATM屏幕初始化,ATM提示输入密码,客户输入密码(123456),ATM打开他的账户,密码有效,因此ATM提示选择事务,客户选择取钱,ATM提示输入金额,客户输入100元,ATM验证账户上有足够的钱,就从账上减去100元,ATM吐出100元,并退出的卡。【问题】根据上面的描述,在下面填写,完成未完成的协作图。1.插卡(客户一读卡机)2._(____→____)3._(____→____)4.提示输入PIN(123456)(ATM显示屏→客户)5._(____→____)6._(____→____)7.验证PIN(__→__)8.提示选择事务(__→__)9._(客户→ATM屏幕)10.提示金额(ATM屏幕→客户)11.输入金额(客户→ATM屏幕)12.取钱(ATM屏幕→的账户)13._(____→____)14._(____→____)15._(____→____)16.提供收据(客户的账户→取钱机)17._(____→____)
问答题[说明]现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设计模式进行设计,所得类图如下图所示。采用该设计模式的原因在于:系统解析BMP、GIF与JPEG文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。[Java程序]classMatrix{//各种格式的文件最终都被转化为像素矩阵//此处代码省略};abstractclassImageImp{publicabstractvoiddoPaint(Matrixm);//显示像素矩阵m};classWinImpextendsImageImp{publicvoiddoPaint(Matrixm){/*调用Windows系统的绘制函数绘制像素矩阵*/}};classLinuxImpextendsImageImp{publicvoiddoPaint(Matrixm){/*调用Linux系统的绘制函数绘制像素矩阵*/}};abstractclassImage{publicvoidsetImp(ImageImpimp){______=imp;}publicabstractvoidparseFile(StringfileName);protected______imp;};classBMPextendsImage{publicvoidparseFile(StringfileName){//此处解析BMP文件并获得一个像素矩阵对象m______;//显示像素矩阵m}};classGIFextendsImage{//此处代码省略};classJPEGextendsImage{//此处代码省略};publicclassjavaMain{publicstaticvoidmain(String[]args){//在Windows操作系统上查看demo.bmp图像文件Imageimage1=______;ImageImpimageImp1=______;______;image1.parseFile("demo.bmp");}}现假设该系统需要支持10种格式的图像文件和5种操作系统,不考虑类Matrix和类iavaMain,若采用桥接设计模式,则至少需要设计______个类。
问答题阅读下列程序说明,将应填入 (n) 处的字句写在答卷纸的对应栏内。 【程序说明】 对于一个公司的雇员来说,无非有3种:普通雇员、管理人员和主管。这些雇员有共同的数据:名字、每小时的工资,也有一些共同的操作:数据成员初始化、读雇员的数据成员及计算雇员的工资。但是,他们也有不同。例如,管理人员除有这些共同的特征外,有可能付固定薪水,主管除有管理人员的共同特征外,还有其他物质奖励等。3种雇员中,管理人员可以看作普通雇员的一种,而主管又可以看作管理人员的一种。我们很容易想到使用类继承来实现这个问题:普通雇员作为基类,管理人员类从普通雇员类中派生,而主管人员类又从管理人员类中派生。 下面的程序1完成上述各个类的定义,并建立了3个雇员(一个普通雇员、一个管理人员和一个主管)的档案,并打印出各自的工资表。将“程序1”中的成员函数定义为内联函数,pay成员函数定义为虚函数,重新完成上述要求。 【程序1】 //普通雇员类 class Employee public: Employee(char *theName, float thePayRate); char *getName0 const; float getPayRate0 const; float pay,(float hours Worked) eonst; protected: ehar *name; //雇员名称 float payRate; //薪水等级 ; Employee::Employee(char *theName, float thePa~Rate) name = the Name; payRate = the PayRate; char *Employee::getName0 eonst return name; float Employee::getPayRate0 const return payRate; float Employee::pay(float hoursWorked) const return hours Worked * payRate; class Manager: public Employee public: //is Salaried 付薪文方式:true 付薪固定工资,false 按小时付薪 Manager(char *the Name, float the Pay Rate, bool is Salaried); bool getSalaried0 const; float pay(float hoursWorked) const; protected: bool salaried; ; Manager::Manager(ehar *theName,fioat thePayRate,bool isSalaried) : Employee(theName, thePayRate) salaried = isSalaried; bool Manager::getSalaried0 eonst return salaried; float Manager::pay(float hoursWorked) eonst if (salaried) return payRate; /* else */ return Employee::pay(hoursWorked); //主管人员类 class Supervisor: public Employee public: Supervisor(char *theName, float thePayRate, float theBouns): Employee (theName, thePayRate, (1) .) ,bouns(theBouns) float getBouns0 const return bouns; float pay(float hoursWorked) const return (2) ; protected: float houris; #include "iostream.h" void main() Employee e("Jack",50.00); Manager m("Tom",8000.00,tme); Supervior sCTanya",8000.00,8000.00); cout<<"Name:"<<e.getName0<<endl; cout <<"Pay: "<<e.pay(80)<<endl; //设每月工作80小时 cout <<"Name: "<<m.getName0<<endl; cout <<"Pay: "<<m.pay(40)<<endl; cout <<"Name: "<<s.getName0<<endl; cout <<"Pay: "<<s.pay(40)<<endl; //参数40在这里不起作用 #include "employee.h" class Employee public: Employee(string theName, float thePayRate): name(theName),payRate(thePayRate) string getName0 const return name; float getPayRate0 const return payRate; virtual float pay(float hoursWorked) const return (3) ; protected:, string name; //雇员名 Boat payRate; //薪水等级 ; //管理人员类 //继承普通雇员类 class Manager: public Employee public: //构造函数 //isSalaried标识管理人员类的付薪方式 //true 按阶段付薪(固定工资) //false 按小时付薪 Manager(string theName, float thePayRate, bool isSalaried): Employee(theName,thePayRate),salaried(isSalaried) bool getSalaried0 const return salaried; virtual float pay(float (4) ) const; protected: bool salaried; ; float Manager ::pay(float hoursWorked) const if (salaried) //固定付薪方式 return payRate; else //按小时付薪 return (5) ; //主管人员类 class Supervisor: (6) public: //构造函数 Supervisor (string theName, float thePayRate, float theBouns) : Manager(theName, thePayRate, true), bouns(theBouns) //取奖金数额 float getBouns0 const return bouns; //计算薪水 virtual float pay(float hours Worked) const (7) float bouns; #include "employee.h" #nclude "iostream.h" void main() (8) *ep[3]; ep[0]=new Employee("Jack" ,"50.00"); ep[1]=new Manager("Tom", "8000.00",true); ep[2]=new Supervior("Tanya","8000.00","8000.00"); for (int i=0;i<3;i++) Cout<<"Name: "<< (9) <<endl; Cout<<"Pay: "<< (10) <<endl; //设每月工作80小时
问答题[说明] 在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都要画出与单词列表所对应的单词查找树。 程序构造一棵二叉排序树,每个节点存储一个单词,按字典序列,较小的在左子树,较大的在右子树。 函数中使用的预定义符号如下: typedef struct TreeNode/*二叉排序树节点*/ char *word; struct TreeNode *left, *right; BNODE; [函数] int getWord(FILE *fpt, char *word) /*从文件fpt中读取单词到word中,到达文件结束时返回0*/ char c; c = fgetc(fpt); if(c == EOF)return 0; /*跳过单词间的非字母字符*/ while(!(tolower(c) >= 'a' if(c == EOF)return 0; /*不区分大小写*/ while(tolower(c) >= 'a' c = fqetc(fpt); *word = '/0'; return 1; void BTree(BNODE **t, char *word) BNODE *ptr, *p; int compres; p = NITLL; (1) ; while(ptr) compres = strcmp(word, (2) ); if(!compres) return; else (3) ; ptr = compres > 0 ? ptr->right : ptr->left; ptr = (BNODE*)malloc(sizeof ptr); ptr->left = ptr->right = NULL; ptr->word = (char*)malloc(strlen(word) + 1); strcpy(ptr->word, word); if(p == NULL) (4) ; else if(compres > 0) p->right = ptr; else p->left = ptr; int main() FILE *fpt; char word[40]; BNODE *root = NULL; if((fpt = fopen("text.in", "r")) == NULL) printf("不能打开文件text.in! /n"); return 1; while(getWord(fpt, word) == 1) BTree (5) ; fclose(fpt); return 0;
问答题【说明】 下面给出的是某高级公寓管理系统的一套分层数据流图。其功能描述如下所述。 (1)系统随时根据住户送来的入住单更新住户基本信息文件。 (2)每月初系统根据物业管理委员会提供的月附加费(清洁费、保安费等)表和房租调整表,计算每家住户的月租费(包括月附加费),向住户发出交费通知单。住户交费时,系统输入交费凭证,核对后输出数据给住户。 (3)系统定期向物业管理委员会提供住房分配表和交费情况表。 (4)住户因分户或换房,在更新账户基本信息文件的同时,系统应立即对这些住户做月租费计算,以了结分尸或换房前的房租。 假定题中提供的顶层图是正确的,请回答下列问题。
问答题问题:4.3 (3分)
上述C代码的输出为:(7) 。
问答题
问答题
问答题[问题1]收费部门业务活动数据流图如图8-6所示,图中缺少了与“票根上缴”相关的数据流,请指出该数据流的起点和终点。图8-6收费部门业务数据流图□数据来源和去向;○过程处理;=需要存储的信息