资源简介 中小学教育资源及组卷应用平台第二单元单元练习及参考答案1.设有一个正整数序列组成的有序表(按递增次序有序,且允许有相等的整数存在),请编写能实现下列功能的程序:(1)确定在序列中比正整数x大的数有几个(相同的数只计算一次,如序列{20,20,17,16,15,15,11,10,8,7,7,5,4}中比10大的数有5个);(2)将比正整数x小的数按递减次序排列;(3)将比正整数x大的偶数删除。(4)比较使用数组和链表实现上述功能的优劣。2.把二次多项式ax2+bx+c设计成一种抽象数据类型,该类型的数据对象为三个系数项a,b和c,操作部分为:(1)初始化a,b和c的值;(2)做两个多项式加法;(3)根据给定x的值计算多项式的值;(4)计算方程ax2+bx+c=0的两个实数根;(5)按照ax2+bx+c的格式输出二次多项式。3.某航空公司有一个自动预订飞机票的系统,假设该系统中有一张用单链表表示的乘客表,见表2-7。表中结点按乘客姓氏的字母次序进行链接(指针暂用序号表示),请为该系统编写有新乘客订票时修改乘客表的程序。表2-7乘客表datalinkLiu7Chen4Wang5Bao2Mai8Dong6Xi0Deng5Chang34.约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3,…,n分别表示)围坐在一张圆桌周围。编号为k的人从1开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个出列;依此规律重复下去,直到圆桌周围的人全部出列。请用单链表设计一个程序求出出列顺序(单链表最后一个结点的指针指向链表的首结点)。参考答案1.importrandomclassSeqList(object):def_init_(self,max=100):self.max=max#默认顺序表最多容纳10个元素#初始化顺序表数组self.num=0self.data[None]self.maxdefis_empty(self):#判定线性表是否为空returnself.numis0defis_full(self)):#判定线性表是否全满returnself.numisself.max#统计线性表中元素的个数defCount(self):returnself.num#表末尾插入操作defappendLast(self,value):ifself.num>=self.max:print(‘Thelistisfull')returnelse:self.data[self.num]=valueself.num+=1#表任意位置插入操作:definsert(self,i,value):ifnotisinstance(i,int):raiseTypeErrorifi<0andiself.num:raiseIndexErrorforjinrange(self.num,i-1,-1):self.data[j]=self.data[i-1]selfdata[i]=valueself.num+=1#对数据进行排序defsortlist(self):i=0j=0temp=0foriinrange(selfnum-1):forjinrange(i+1,self.num):if(self.data[j]temp=self.data[i]self.data[i]=self.data[j]Self.data[j]=temp#找比key大的,不重复的数据defcompareList(self,key):t=0if(self.data[0]>key)t=t+1Print(self.data[0])foriinrange(1,self.num-1):if(self.data[i]>keyandself.data[i]!=self.data(i-1]):t=t+1Print(self.data[i])Print(“一共有”,t,”个”)#小于key的数据递减排列defdijian(self,key):t=0foriinrange(0,self.num):if(self.data[i]t=t+1t=t-1K=int(t/2)temp=0#print(“------------k,t------------”,k,t)foriinrange(0,k):temp=self.data[i]self.data[i]=self.data[t]sel.data[t]=tempt=t-1#删除某一位置的操作defremove(self,i):ifnotisinstance(i,int):raiseTypeErrorifi<0andi>=self.num:raiseIndexErrorforjinrange(i,self.num-1):#此处是self.num-1,因为循环中是j+1#print(j,selfdata[j],self.data[j+1])self.data[j]=self.data[j+1])self.num-=1defdelete(self,index):foriinrange(index,self.num-1):self.data[i]=self.data[i+1]self.num-=1#删除key之后的偶数defdeleteKey(self,key):i=0while(iif(self.data[i]>keyandself.data(i)%2==0):self.delete(i)else:i+=1#输出操作defprintlist(self):foriinrange(0,self.num):print(selfdata[i])#print()Print(“----------------------------”)#销毁操作defdestroy(self):self._init_()seq=SeqList(20)foriinrange(10):#创建10个随机数的数据t=random.randint(1,100)#print(t)seq.appendLast(t)#print("")Seq.appendLast(seq.data[0])Seq.appendLast(seq.data[1])Seq.appendLast(seq.data[2])Seq.appendLast(seq.data[3])Seq.appendLast(seq.data[2])Seq.appendLast(seq.data[2])#seq.printList()#输出排序前的数据seq.sortList()#对数据进行排序seq.printList()#出排序后的数据x=int(input("请输入要比较的数字:"))seq.compareList(x)#和x比较,统计比x大的数据个数print(“将比x小的数按递减次序排列:")seq.printList()print("将比x大的偶数删除:")seq.deleteKey(x)#删除比x大的偶数seq.printList()2.把二次多项式ax2+bx+c设计成一种抽象数据类型,类型的数据对象为三个系数项a,b和c,操作部分为:?初始化a,b和c的值;?做两个多项式加法;?根据给定x的值计算多项式的值;?计算方程ax2+bx+c=0的两个实数根;?按照ax2+bx+c的格式输出二次多项式。参考答案:先创建链表,命名为NodeList.py,程序在第3题也需要使用#NodeList.pyclassNode:,,,data:结点保存的数据_next:保存下一个结点对象,,,def_init_(self,data,pnext=None):self.data=dataself.Next=pnextdef_repr_(self):returnstr(self.data)classNodeList:,,,head:头结点Length:链表长度,,,def_init_(self):self.head=Nineself.length=0#判断链表是否为空defisEmpty(self):return(self.length==0)#最后一位添加元素defappend(self,dataOrNode):item=Nodeifisinstance(dataOrNode,Node):item=dataOrNodeelse:item=Node(dataOrNode)ifnotself.head:self.head=itemself.length+=1else:node=self.headwhilenode._nextNode=node._nextnode._next=itemself.length+=1#删除元素defdelete(self,index):ifself.isEmpty():print("ERROR:NODELISTEMPTY")returnifindex<0orindex>selflength:print(“error:outofindex")returnifindex==0:self.head=self.head._nextself.length-=1returnj=0Node=self.headprev=self.headwhilenode._nextandj<index:prev=nodenode=node._nextself.length-=1#更新元素defupdate(self,index,data):ifself.isEmpty()orindex<0orindex>self.length:print(‘ERROR:OUTOFINDEX’)returnj=0Node=self.headwhilenode._nextandj<index:node=node._nextj+=1ifj==index:node.data=data#获取元素defgetltem(self,index):ifself.isEmpty()orindex<0orindex>=self.length:print("ERROR:OUTOFINDEX”)returnj=0node=self.headwhilenode._nextandj<index:node=node._nextj+=1returnnode.data#找到特定元素的位置defgetIndex(self,data):j=0ifself.isEmpty():print("ERROR:NODELISTEMPTY")returnnode=self.headwhilenode:ifnode.data=data:returnjnode=node._nextj+=1ifj==self.length:print("%snotfound"%str(data))return#在index的位置插入元素definsert(self,index,dataOrNode):ifself.isEmpty():print("ERROR:NODELISTEMPTY")returnifindex<0orindex>selflength:print("ERROR:OUTOFINDEX”)returnitem=NodeIfisintance(dataOrNode,Node):item=Node(dataOrNode)ifindex==0:item._next=self.headself.head=itemself.length+=1returnj=0node=self.headprev=self.headwhilenode._nextandj<index:prev=nodenode=node._nextj+=1ifj==index:item._next=nodeprev._next=itemself.length+=1#清空defclear(self):self.head=Noneself.length=0def_repr_(self):ifselfisEmpty()print("ERROR:NODELISTEMPTY")returnnode=self.headnlist=””whilenodenlist+=str(node.data)+”“node=node._nextreturnnlistdef_getitem_(self,ind):ifself.isEmpy()orind<0orind>=self.length:print("ERROR:OUTOFINDEX")returnreturnself.getltem(ind)def_setitem_(self,ind,val):ifself.isEmpty()orind<0orind>=self.length:print("ERROR:OUTOFINDEX")returnself.update(ind,val)def_len_(self):returnself.length#------------------------------以下是二次多项式的运算-------------------------------------importNodelistclassFomula:,,,a,b,c方程系数,,,#initdef_init_(self,a,b,c):nodeA=NodeList.Node(a)nodeB=Nodelist.Node(b)nodeC=NodeList.Node(c)nodeList=Nodelist.NodeList()nodeList.append(nodeA)nodeList.append(nodeB)nodeListappend(nodeC)Self.nodeList=nodeList#adddefadd(self,fomula2):f1=self.nodelist.headf2=fomula2.nodeList.headwhile(f1!=None)f1.data+=f2.dataf1=f1.nextf2=f2.next#calculatethesumdefcalValue(self,x):value=0ratio=2f=self.nodelist.headwhile(f!=None):value+=f.data(xratio)f=f._nextratio-=1returnvalue#calculateresultdefcalResult(self):f=self.nodeList.headlist=[]while(f!=None):listappend(f.data)f=f._nexttemp=list[1]2-4list[0]list[2]iftemp<0return”ERROR:NOANSWER”eliftemp==0return-list[1]/(2list[0])else:return[(-list[1]+temp0.5)/2/list[0],(-list[1]-temp0.5)/2/list[0]]#Demonstrationdefshow(self):f=self.nodelist.headlist=[]while(f!=None):list.append(fdata)f=f._nextreturnstr(list[0]+”x2+”+str(list[1]+”x+”+str(list[2])If_name_==”_main_”:print(fomula.Show())print(fomula.calResult())print(fomula.calValue(2))fomulaNew=fomula(2,4,0)fomula.add(fomulaNew)print(fomulashow())print(fomula.calResult())print(fomula.calRValue(2))3.某航空公司有一个自动预订飞机票的系统,假设该系统中有一张用单链表表示的乘客表,如下表所示。表中结点按乘客姓氏的字母次序进行链接(指针暂用序号表示),请为该系统编写有新乘客订票时修改乘客表的程序。datalinkLiu7Chen4Wang5Bao2Mai8Dong6Xi0Deng5Chang3参考答案:#本题需要用到第二题链表的创建Nodelist.pyimportNodeListnodelist=Nodelist,Nodelist()definsert(curString):ifnodeList.isEmptyo():nodeList.append(curString)else:head=nodeList.headposition=0While(head!=None):if(curString>head.data):head=head.nextPosition+=1else:nodeList.insert(position,curString)breakif(head==None):nodeList.append(curString)definit():initialSet=["Liu","Chen","Wang","Bao","Mai","Dong","Xi","Deng",”Chang”]foriinrange(initialSet._len_()):insert(initialSet[i])If_name_==”_main_”:init()headnodeList.headwhile(head!=None):print(head.data)head=head.next1s=input("输入姓名(输入#结束):\n”)while(Is!=‘#’):try:Insert(1s)Head=nodelist.headwhile(head!=None):print(head.data)head!=head._next1s=input("输入姓名(输入#结束):\n”)exceptExceptionase:Print(e)break4.约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3分别表示)围坐在一张圆桌周围。编号为k的人从1开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人出列;依此规律重复下去,直到圆桌周围的人全部出列。请用单链表设计一个程序求出出列顺序(单链表最后一个结点的指针指向链表的首结点)。classNode():#定义结点def_init_(self,value,next=None):self.value=valueself.next=nextdefcreateLink(n):#创建链表ifn<=0:returnFalseifn==1:returnNode(1)else:root=Node(1)tmp=rootforiinrange(2,n+1):tmp.next=Node(i)tmp=tmp.nexttmp.next=rootreturnrootdefshowLink(root):#打印链表tmp=rootwhileTrue:Print(rmp.value)tmp=tmp.nextiftmp==Noneortmp==root:breakdefjosephus(n,k,p):#具体的出圈ifk==1:print(‘最后出列’,n)returnroot=createLink(n)tmp=rootpT=1while(pT<p):tmp=tmp.nextpT+=1whileTrue:foriinrange(k-2):tmp=tmp.nextprint(‘出列:’,tmp.next.value)tmp.next=tmp.next.nexttmp=tmp.nextiftmp.ext=tmp:breakprint(‘最后出列:’,tmp.value)If_name_==”_main_”:n=int(input(“请输入总人数:"))m=int(input("请输入m:”))p=int(input("请输入开始的位置p:"))Josephus(n,m,p)Print(‘------------------------’)21世纪教育网www.21cnjy.com精品试卷·第2页(共2页)HYPERLINK"http://21世纪教育网(www.21cnjy.com)"21世纪教育网(www.21cnjy.com) 展开更多...... 收起↑ 资源预览