问答题[说明]下面的流程图(如图所示)用N-S盒图形式描述了数组A中的元素被划分的过程。其划分方法是:以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动。当划分结束时,基准数定位于A[i],并且数组中下标小于i的元素的值均小于基准数,下标大于i的元素的值均大于基准数。设数组A的下界为low,上界为high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以4为基准数的划分过程如下:[流程图][算法说明]将上述划分的思想进一步用于被划分出的数组的两部分,就可以对整个数组实现递增排序。设函数intp(intA[],intlow,inthieh)实现了上述流程图的划分过程并返回基准数在数组A中的下标。递归函数voidsort(intA[],intL,intH)的功能是实现数组A中元素的递增排序。[算法]voidsort(intA[],intL,intH)if(L<H)k=p(A,L,R);//p()返回基准数在数组A中的下标sort((4));//小于基准敷的元素排序sort((5));//大于基准数的元素排序
问答题
问答题阅读以下说明和数据流图,回答问题1~3问题。[说明]学生信息管理系统旨在用微型计算机对全校的学生事务进行管理,其内容包括新生管理、成绩管理、重修管理、毕业资格审定以及随机查询和打印报表等。教务人员在进入系统时,系统通过注册登录来提供用户的访问权限,系统会检查用户的合法性,如不合法,系统拒绝用户进入,如是合法用户,则根据命令要求类型处理。本系统主要有新生管理、成绩管理、重修处理、资格审定四大功能,分别进行不同的管理。新生管理首先按照各专业录入新生信息,录入时若录入的信息不完整,则给出提示信息,要求用户录入完整信息;若新生库中已经存在该生信息了,则给出提示信息,保证不重复录入新生信息。在录入阶段,会显示新生库中的记录,可以进行浏览、删除、修改等操作,以便用户录入正确无误的新生信息。录入完毕后,打印编好学号和分好班次的新生名单并将新生记录写入学生信息库。成绩管理使用一般方法和特殊方法对学生成绩进行管理。分别按照这两种方法进行成绩的录入和计算。成绩处理完毕后,合并到学生成绩库,可以对学生成绩总库进行浏览、修改、删除、插入、查找等操作,同时提供成绩查询功能,可按照学号、姓名、课程号、课程名称、专业班级查询学生成绩,最后打印各种形式的学生成绩单。重修处理首先对学生重修总体情况进行浏览,可以查询未交费学生重修情况、某个学生重修情况等,打印各种形式的重修单和重修证。另外进行重修交费登记,输入某个重修学生学号,则显示该生相关信息(姓名、专业等)、重修课程信息、重修总学分、应交金额等,交费登记后,写入重修表和交费表。资格审定主要对毕业生的毕业资格进行审定,计算毕业生的已修学分,审定后填写资格库,显示审定结果,打印毕业生资格表和毕业证书等。学生信息管理系统顶层图如图10-1所示;学生信息管理系统的第0层DFD图如图10-2所示,其中,加工3的细化图如图10-3所示,加工4的细化图如图10-4所示。[数据流图10-1][数据流图10-2][数据流图10-3][数据流图10-4]
问答题【说明】Point是平面坐标系上的点类,Line是从Point派生出来的直线类。 #include <iostream.h> class Point public: Point (int x, int y) ; Point (Point ~Point(); void set (double x, double y) ; void print(); private:double X,Y; ; Point::Point (int x, int y) //Point 构造函数 X=x; Y=y; Point::Point ( (1) ) //Point 拷贝构造函数 X=p.X; Y=p.Y; void Point::set (double x, double y) X=x; Y=y; void Point::print() cout<<' ('<<X<<","<<Y<<") "<<endl; Point::~Point() cout<<"Point 的析构函数被调用! "<<endl; class Line: public Point public: Line (int x, int y, int k) ; Line (Line ~Line(); void set (double x, double y, double k) void print(); private:double K; ; (2) //Line 构造函数实现 K=k; (3) //Line 拷贝构造函数实现 K=s.K; void Line::set (double x, double y, double k) (4) ; K=k; void Line::print() cout<<" 直线经过点"; (5) ; cout<<"斜率为: k="<<K<<endl; Line: :~Line() cout<<"Line 析构函数被调用! "<<endl; void main() Line 11 (1,1,2) ; 11 .print(); Linel2 (11) ; 12.set (3,2,1) ; 12.print();
问答题问题:5.1 请填写(1)(2)(3)(4)(5)
问答题[说明]公司IT部门决定开发一个计算机管理系统以记录期刊的传阅情况。期刊在公司内部传阅,员工可以要求加入传阅队列。图书室登记公司收到的期刊,交给名单中的第一名员工。员工应在三个工作日内完成阅读,员工阅读完毕后通知系统,系统提醒下一位阅读者取书,下一个员工必须确认已收到期刊。当传阅名单中“下一位”员工出差在外时将无法进行传阅,此时将期刊传给再下一位,而将该员工作标记,再次传递此书时优先考虑该员工。最后一位员工阅读完毕后,将期刊交还图书室以便共用。系统能在员工忘记传递期刊时发出提醒信息。系统详细记录期刊传阅情况,当员工阅读完后通知系统,系统记录该员工员工号及日期,并在备注栏注明是传出;同样,当员工收到期刊后给系统确认,系统记录该员工员工号及日期,并在备注栏注明是收到。公司的员工都有一个唯一的员工号。公司订阅了多种期刊,为每一本期刊(有唯一期刊流水号)产生一份传阅名单,并详细记录传阅情况。员工的出差情况存储在系统主机中。该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图1-1是该系统的类图的一部分,图1-2描述了成功传递期刊的序列图。[图1-1][图1-2]
问答题【说明】 本程序在3×3方格中填入1~N(N≥10)内的某9个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。试求出满足这个要求的所有填法。3×3方格中的每个方格按行按列(先行后列)序号排列为:0,1,2,3,4,5,6,7,8。 程序采用试探法,即从序号为0的方格开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如不能为当前方格找到一个合理的可填整数,就要回退到前一方格,调整前一方格的填入整数;直至序号为8的方格也填入合理的整数后,就找到了一个解,将该解输出。再调整序号为8的方格所填整数,继续去找下一个解。为了检查当前方格的填入整数的合理性,程序引入二维数组check Matrix,存放需要进行合理性检查的相邻方格的序号。 # include <stdio. h> # define N 12 int b[N+1]; int pos; int a[9];/* 用于存储诸方格所填入的整数*/ int AllNum=0;/* 统计有多少种填法*/ int checkMatrix[][3]= -1,0,-1,1,-1, 0,-1,1,3,-1,2,4,-1, 3,-1,4,6,-1,5,7,-1; void write(int a[]) int i, j; for(i=0; i<3; i++) for(j=0; j<3; j++) printf("%3d", a[3*i+j]); printf("/n"); int isPrime(int m) int i; if(m==2)return 1; if(m==1 ‖ m%2==0)return 0; for(i=3; i*i<m;) if(m%i==0)return 0; i+=2; return 1; int selectNum(int start) int j; for(j=start; j<=N; j++) if(b[j])return j; return 0; int check()/*检查填入pos位置的整数是否合理*/ int i,j; for(i=0; (j= (1) )>=0; i++) if(!isPrime(a[pos]+a[j])) (2) ; (3) ; extend ()/* 为下一方格找一个尚未使用过的整数*/ a[ (4) ]=selectNum(1); b[a[pos]]=0; void change ()/*为当前方格找下一个尚未使用过的整数(找不到回溯)*/ int j; while(pos >=0 if(pos<0)return; b[a[pos]]=1; a[pos]=j; b[j]=0; int find () int ok=1; pos=0; a[pos]=1; b[a[pos]]=0; do if(ok) if(pos==8) write(a); change(); AllNum++;/* 统计有多少种填法*/ else extend(); else change(); ok=check(); while(pos>=0); void main() int i; for(i=1; i<=N; i++) b[i]=1; find(); prinrf("共有%d种不同填法!/n", AllNum);
问答题【问题 4】(3 分)
根据问题描述,写出客户、委托书和派工单这三个关系的主键。
问答题问题:5.1 (15分)
阅读上述说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
问答题
问答题[问题2] 如果在游戏A中付5元,游戏B中付4元,使用风险决策树分析应该选择哪个游戏。
问答题[说明]某机器上需要处理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中的元素。
问答题 阅读以下说明和流程图,回答问题1至问题3,将答案写在对应栏内。
【说明】 下面给出的是某高级公寓管理系统的一套分层数据流图。其功能描述如下所述。
(1)系统随时根据住户送来的入住单更新住户基本信息文件。
(2)每月初系统根据物业管理委员会提供的月附加费(清洁费、保安费等)表和房租调整表,计算每家住户的月租费(包括月附加费),向住户发出交费通知单。住户交费时,系统输入交费凭证,核对后输出数据给住户。
(3)系统定期向物业管理委员会提供住房分配表和交费情况表。
(4)住户因分户或换房,在更新账户基本信息文件的同时,系统应立即对这些住户做月租费计算,以了结分尸或换房前的房租。
假定题中提供的顶层图是正确的,请回答下列问题。
问答题[说明]计算机在处理算术表达式时,首先将其转换为后缀表达式。例如,表达式“46+5*120-37)”的后缀表达式形式为“46512037-*+”。计算后缀表达式时,从左至右扫描后缀表达式:若遇到运算对象,则压入栈中;遇到运算符,则从栈中弹出相关运算对象进行计算,并将运算结果压入栈中。重复以上过程,直到后缀表达式扫描结束。例如,后缀表达式“46512037-*+”的计算过程如下:a.依次将46、5、120、37压入栈中;b.遇到“-”,取出37、120,计算120-37=83,将其压入栈中;c.遇到“*”,取出83、5,计算5×83=415,将其压入栈中;d.遇到“+”,取出415、46,计算46+415=461,将其压入栈中;e.表达式结束,则计算过程完成。函数computing(charexpr[],int*result)的功能是基于栈计算后缀形式的表达式(以串形式存入字符数组expr)的值,并通过参数result返回该值。函数的返回值为-1/0,分别表示表达式有/无错误。假设表达式中仅包含数字、空格和算术运算符号,其中所有项均以空格分隔,且运算符仅包含加(“+”)、减(“-”)、乘(“*”)、除(“\”)。函数computing中所用栈的基本操作的函数原型说明如下。●voidInitStack(STACK*s):初始化栈。●voidPush(STACK*s,inte):将一个整数压栈,栈中元素数目增1。●voidPop(STACK*s):栈顶元素出栈,栈中元素数目减1。●intTop(STACKs):返回非空栈的栈顶元素值,栈中元素数目不变。●intIsEmpty(STACKs):若s是空栈,则返回1;否则返回0。[C函数]
问答题[说明]下面是一个Appkt程序,其功能是从3~100之间(包括3和100)每隔0.5秒显示一个新的数字,如果数字为素数,则显示为灰色,其他为绿色。程序运行结果如图4所示。importjava.awt.*importjava.applet.Applet<appletcode=ex2_7,classwidth=800height=400></applet>publicclassex2_7extendsAppletpublicColorcolor2_7=Color.black;privateihtn2_7=3;publicmyPrimethPrime2_7;publicvoidinit()thPrime2_7=newmyPrime(this);thPrime2_7,start();publicvoidpaint(Graphicsg)g,setColor(color2_7);g.drawString((1),50,50);publicintgetlnt()returnn2_7;publicvoidsetlnt(inti)n2_7=i;classmyPrimeextendsThreadIex2_7obj2_7;myPrime(ex2_7o)this.obj2_7=o;publicbooleanisPrime(intn)booleanbPrime=true;ihti=2;if((2))returnfalse;while(i<n-]i++;returnbPrime;publicvoidrun()inti;for(i=3;(4);i++)if(isPrime(i))obj2_7,color2_7=Color,gray;elseobj2_7,color2_7=Color.green;(5);obj2_7,repaint();trysleep(S00);catch(InterruptedExceptionie)ex2_7,html<HTML><HEAD><TITLE>ex2_7</TITLE></HEAD><BODY><appletcode="ex2_?,class"width=800height=400></applet></BODY></HTML>
问答题阅读以下说明和数据流图,根据要求回答下列问题。[说明]现准备为某银行开发一个信用卡管理系统CCMS,该系统的基本功能如下。1.信用卡申请。非信用卡客户填写信用卡申请表,说明所要申请的信用卡类型及申请者的基本信息,提交CCMS。如果信用卡申请被银行接受,CCMS将记录该客户的基本信息,并发送确认函给该客户,告知客户信用卡的有效期及信贷限额;否则该客户将会收到一封拒绝函。非信用卡客户收到确认函后成为信用卡客户。2.信用卡激活。信用卡客户向CCMS提交激活请求,用信用卡号和密码激活该信用卡。激活操作结束后,CCMS将激活通知发送给客户,告知客户其信用卡是否被成功激活。3.信用卡客户信息管理。信用卡客户的个人信息可以在CCMS中进行在线管理。每位信用卡客户可以在线查询和修改个人信息。4.交易信息查询。信用卡客户使用信用卡进行的每一笔交易都会记录在CCMS中。信用卡客户可以通过CCMS查询并核实其交易信息(包括信用卡交易记录及交易额)。图8-15和图8-16分别给出了该系统的顶层数据流图和0层数据流图的初稿。
问答题请补充函数fun(),该函数的功能是:只保留字符串中的大写字母,删除其他字符,结果仍保存在原来的字符串中,由全局变量m对删除后字符串的长度进行保存。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。 试题程序: #include<stdio.h> #include<conio.h> int m; void fun(char*s) int i=0,j=0; char *p=s; while(*(p+i)) if(*(p+i)>='A'&&*(p+i)<='Z') (1) ; (2) ; s[j]='/0'; (3) ; main() char str[80]; clrscr(); printf("/nEnter a string:"); gets(str); printf("/n/nThe string is:/%s/n",str); fun(str); printf("/n/nThe string of changing is: /%s/n",str); printf("/n/nThe length of changed strtng is:/%d/n",m);
问答题【说明】现要编写一个画矩形的程序,目前有两个画图程序:DP1和DP2,DP1用函数draw_a_line(x1,y1,x2,y2)画一条直线,DF2则用drawline(x1,x2,y1,y2)画一条直线。当实例画矩形时,确定使用DP1还是DP2。为了适应变化,包括“不同类型的形状”和“不同类型的画图程序”,将抽象部分与实现部分分离,使它们可以独立地变化。这里,“抽象部分”对应“形状”,“实现部分”对应“画图”,与一般的接口(抽象方法)与具体实现不同。这种应用称为Bridge(桥接)模式。图9-7显示了各个类间的关系。这样,系统始终只处理3个对象:Shape对象、Drawing对象、DP1或DP2对象。以下是C++语言实现,能够正确编译通过。【C++代码】classDP1{public:staticvoiddraw_a_line(doublex1,doubley1,doublex2,doubley2){//省略具体实现});classDP2{public:staticvoiddrawline(doublex1,doublex2,doubley1,doubley2){//省略具体实现}};classDrawing{public:{{U}}(1){{/U}}voiddrawLine(doublex1,doubley1,doublex2,doubley2)=0;};classV1Drawing:publicDrawing{public:voiddrawLine(doublex1,doubley1,doublex2,doubley2){DP1::draw_a_line(x1,y1,x2,y2);}};classV2Drawing:publicDrawing{public:voiddrawLine(doublex1,doubley1,doublex2,doubley2){ {{U}}(2){{/U}};}};classShape{private:{{U}}(3){{/U}}_dp;public:Shape(Drawing*dp);virtualvoiddraw()=0;voiddrawLine(doublex1,doubley1,doublex2,doubley2);};Shape::Shape(Drawing*dp){_dp=dp;}voidShape::drawLine(doublex1,doubley1,doublex2,doubley2){//画一条直线 {{U}}(4){{/U}};}classRectangle:publicShape{private:double_x1,_y1,_x2,_y2;public:Rectangle(Drawing*dp,doublex1,doubley1,doublex2,doubley2);voiddraw();};Rectangle::Rectangle(Drawing*dp,doublex1,doubley1,doublex2,doubley2):{{U}}(5){{/U}}{_x1=x1;_y1=y1;_x2=x2;_y2=y2;}voidRectangle::draw(){//省略具体实现}
问答题试题七(共15分)阅读以下说明和C程序,将应填入(n)处的字句写在答题纸的对应栏内。【说明】现有n(n<1000)节火车车厢,顺序编号为1,2,3,...,n,按编号连续依次从A方向的铁轨驶入,从B方向铁轨驶出,一旦车厢进入车站(Station)就不能再回到A方向的铁轨上;一旦车厢驶入B方向铁轨就不能再回到车站,如图7-1所示,其中Station为栈结构,初始为空且最多能停放1000节车厢。
问答题【程序说明】 定义一个多边形结构:struct polygon实现以下内容:(1)建立该结构的链表:create函数是创建链表,每输入一个结点的数据,就把该结点加入到链表当中,它返回创建的链表的头指针。(2)显示链表的各个结点数据:结点数据包括:多边形顶点数、各顶点的纵横坐标、当多边形顶点数为0时,链表创建结束。(3)编写一个函数disp,删除链表中的所有结点。需要注意的是:要先释放结点数据内存,再删除结点,如果在释放结点数据内存单元之前删除结点,则无法找到结点数据内存单元的地址,也就无法释放数据的内存单元。 【程序】 #include "iomanip.h" struct polygon int n; int* x; int *y; polygon * next; ; void Push(polygon * & head,int n) polygon * newNOde=newpolygon; newNOde=newpo,Ygon; newNOde->next= (1) ; newNOde->x=new int [n]; newNOde->y=new int[n]; newNOde->n= (2) ; for(int i=0;i<= (3) ;i++) cout<<“请输入多边形各顶点x、y坐标,坐标值之间用空格分隔:”; cin>>newNOde->x[i]>>newNOde->y[i]; (4) =head; //在head前不需要额外的。 head=newNOde; polygon * create() polygon * head=NULL; polygon * tail; int n; cout<<“请输入多边形顶点的个数(顶点个数为0时结束):”; cin>>n; if(n==0)return (5) ; Push(head, (6) ; tail=head; cout<<“请输入多边形顶点的个数(顶点个数为0时结束):”; cin>>n; while(n!=0) Push(tail->next, (7) ; //在tail->next增加结点 tail =tail->next; //advance tail to point to last node cout<<“请输入多边形顶点的个数(顶点个数为0时结束):”; cin>>n; return head; void disp(polygon * head) int i,No=1; cout<<setw(10)<<"x" <<setw(6)<<"y"<<end1; while(head!=NULL) cout<<“第” <<No<<“结点:” <<end1; for(i=0;i<=head->n-1;i++) cout<<setw(10)<<head- >x[i]<<setw(6)<<head- >y[i]<<endl; (8) ; head= (9) ; //Match while statement void del(polygon * head) polygon * p; while(head!=NULL) p= (10) ; head=head->next; delete p->x; delete P->y; deletep; //Match while statement void main() polygon * head; head=create(); disp(head); del(head);