《Python程序設計應用教程》課后答案作者:夏敏捷 張西廣_第1頁
《Python程序設計應用教程》課后答案作者:夏敏捷 張西廣_第2頁
《Python程序設計應用教程》課后答案作者:夏敏捷 張西廣_第3頁
《Python程序設計應用教程》課后答案作者:夏敏捷 張西廣_第4頁
《Python程序設計應用教程》課后答案作者:夏敏捷 張西廣_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

《Python程序設計應用教程》課后答案作者:夏敏捷張西廣習題一Python語言介紹1.Python語言有哪些特點和缺點?Python支持命令式編程、函數(shù)式編程,完全支持面向對象程序設計,語法簡潔清晰,并且擁有大量的幾乎支持所有領域應用開發(fā)的成熟擴展庫。Python為我們提供了非常完善的基礎代碼庫,覆蓋了網絡、文件、GUI、數(shù)據(jù)庫、文本等大量內容。用Python開發(fā),許多功能不必從零編寫,直接使用現(xiàn)成的即可。除了內置的庫外,Python還有大量的第三方庫,也就是別人開發(fā)的,供你直接使用的東西。當然,如果你開發(fā)的代碼通過很好的封裝,也可以作為第三方庫給別人使用。Python同時也支持偽編譯將Python源程序轉換為字節(jié)碼來優(yōu)化程序和提高運行速度,可以在沒有安裝Python解釋器和相關依賴包的平臺上運行。任何編程語言都有缺點,Python缺點主要有:(1)運行速度慢。(2)代碼不能加密。(3)用縮進來區(qū)分語句關系的方式還是給很多初學者帶來了困惑。最常見的情況是tab和空格的混用會導致錯誤。2.Python基本輸入輸出函數(shù)是什么?用Python進行程序設計,輸入是通過input()函數(shù)來實現(xiàn)的,input()的一般格式為:x=input('提示:')該函數(shù)返回輸入的對象??奢斎霐?shù)字、字符串和其它任意類型對象。Python3.5中使用print()函數(shù)進行輸出。3.如何在IDLE中運行和調試Python程序?在“PythonShell”窗口中單擊“Debug”菜單中的“Debugger”菜單項,就可以啟動IDLE的交互式調試器。這時,IDLE會打開的“DebugControl”窗口,并在“PythonShell”窗口中輸出“[DEBUGON]”并后跟一個“>>>”提示符。這樣,我們就能像平時那樣使用這個“PythonShell”窗口了,只不過現(xiàn)在輸入的任何命令都是允許在調試器下。我們可以在“DebugControl”窗口查看局部變量和全局變量等有關內容。4.為什么要在程序中加入注釋?怎么在程序中加入注釋?一個好的、可讀性強的程序一般包含20%以上的注釋。方法一:以#開始,表示本行#之后的內容為注釋。#循環(huán)輸出0到9數(shù)字foriinrange(10):print(i,end='')方法二:包含在一對三引號'''...'''或"""..."""之間且不屬于任何語句的內容將被解釋器認為是注釋。習題二語法基礎1.Python數(shù)據(jù)類型有哪些?分別什么用途?

Python數(shù)值類型用于存儲數(shù)值。

整型(int):通常被稱為是整型或整數(shù),是正或負整數(shù),不帶小數(shù)點。

長整型(long):無限大小的整數(shù),整數(shù)最后是一個大寫或小寫的L。在Python3里,只有一種整數(shù)類型int,沒有Python2中的Long。

浮點型(float):浮點型由整數(shù)部分與小數(shù)部分組成,浮點型也可以使用科學計數(shù)法表示(2.78e2就是2.78x102=278)

復數(shù)(complex):復數(shù)由實數(shù)部分和虛數(shù)部分構成,可以用a+bj,或者complex(a,b)表示,復數(shù)的虛部以字母j或J結尾。如:2+3j。2.把下列數(shù)學表達式轉換成等價的Python表達式。(1):(-b+(b*b-4*a*c)**(1/2))/(2*a)(2):(x*x+y*y)/(2*a*a)(3):(x+y+z)/((x**3+y**3+z**3)**(1/2))(4):((3+a)**2)/(2*c+4*d)(5):2*sin((x+y)/2)*cos((x-y)/2)提示:math.sin(x)函數(shù)返回的x弧度的正弦值,math.cos(x)函數(shù)返回的x弧度的余弦值,math.sqrt(x)函數(shù)返回數(shù)字x的平方根。函數(shù)請參考第四章。3.數(shù)學上3<x<10表示成正確的Python表達式為(x>3)and(x<10)。4.以3為實部4為虛部,Python復數(shù)的表達形式為3+4j。5.表達式[1,2,3]*3的執(zhí)行結果為〔1,2,3,1,2,3,1,2,3〕。6.假設列表對象aList的值為[3,4,5,6,7,9,11,13,15,17],那么切片aList[3:7]得到的值是[6,7,9,11]。7.語句[5foriinrange(10)]執(zhí)行結果為[5,5,5,5,5,5,5,5,5,5]。8.Python內置函數(shù)len()可以返回列表、元組、字典、集合、字符串以及range對象中元素個數(shù)。9.計算下列表達式的值(可在上機時驗證),設a=7,b=-2,c=4。(1)3*4**5/2:1536.0 (2)a*3%2:1(3)a%3+b*b-c//5:5 (4)b**2-4*a*c:-10810.求列表s=[9,7,8,3,2,1,55,6]中的元素個數(shù),最大數(shù),最小數(shù)?如何在列表s中添加一個元素10?如何從列表s中刪除一個元素55?s=[9,7,8,3,2,1,55,6]len(s)max(s)min(s)s.append(10)print(s)s.remove(55)print(s)11.元祖與列表主要區(qū)別?s=(9,7,8,3,2,1,55,6)能添加元素嗎?元祖不能添加元素,列表可以添加元素習題三控制語句1.輸入一個整數(shù)n,判斷其能否同時被5和7整除,如能則輸出“xx能同時被5和7整除”,否則輸出“xx不能同時被5和7整除”。要求“xx”為輸入的具體數(shù)據(jù)。a=input("輸入一個整數(shù):")a=int(a)ifa%5==0anda%7==0:print(a,"能同時被5和7整除")else:print(a,"不能同時被5和7整除")2.輸入一個百分制的成績,經判斷后輸出該成績的對應等級。其中,90分以上為“A”,80~89分為“B”,70~79分為“C”,60~69分為“D”,60分以下為“E”。a=input("輸入百分制成績:")a=int(a)ifa>89:print("A")elifa>79anda<90:print("B")elifa>69anda<80:print("C")elifa>59anda<70:print("D")else:print("E")3.某百貨公司為了促銷,采用購物打折的辦法。1000元以上者,按九五折優(yōu)惠;2000元以上者,按九折優(yōu)惠;3000元以上者,按八五折優(yōu)惠;5000元以上者,按八折優(yōu)惠。編寫程序,輸入購物款數(shù),計算并輸出優(yōu)惠價。a=input("輸入購物款數(shù):")a=int(a)ifa>=5000:print("優(yōu)惠價為:",a*0.8)elifa>=3000:print("優(yōu)惠價為:",a*0.85)elifa>=2000:print("優(yōu)惠價為:",a*0.9)elifa>=1000:print("優(yōu)惠價為:",a*0.95)else:print("沒有優(yōu)惠哦!價格為:",a)4.編寫一個求整數(shù)n階乘(n!)的程序。n=input("輸入整數(shù)n:")n=int(n)s=1m=1whilem<=n:s*=mm=m+1print(s)5.編寫程序,求1!+3!+5!+7!+9!。sum=0s=1m=1whilem<=9:s*=mifm%2==1:sum+=sm=m+1print(sum)6.編寫程序,計算下列公式中s的值(n是運行程序時輸入的一個正整數(shù))。s=1+(1+2)+(1+2+3)+…+(1+2+3+…+n)s=1+(1+2)+(1+2+3)+…+(1+2+3+…+n)m=input("輸入項數(shù)")m=int(m)n=1s=0a=0whilen<=m:a=a+ns=s+an+=1print(s)s=12+22+32+…+(10×n+2)s=12+22+32+…+(10×n+2)m=input("輸入項數(shù)")m=int(m)n=1s=0whilen<=m:a=10*n+2s=s+an+=1print(s)s=1×2-2×3+3×4-4×5+…+(-1)(n-1)×n×(n+1)s=1×2-2×3+3×4-4×5+…+(-1)(n-1)×n×(n+1)m=input("輸入項數(shù)")m=int(m)n=1s=0f=1whilen<=m:s=s+f*n*(n+1)f=-fn+=1print(s)7.“百馬百瓦問題”:有100匹馬馱100塊瓦,大馬馱3塊,小馬馱2塊,兩個馬駒馱1塊。問大馬、小馬、馬駒各有多少匹?foriinrange(34):forjinrange(51):k=100-i-jif3*i+2*j+k/2==100andk%2==0:print("大馬有:",i,"小馬有:",j,"馬駒有:",k)8.有一個數(shù)列,其前三項分別為1、2、3,從第四項開始,每項均為其相鄰的前三項之和的1/2,問:該數(shù)列從第幾項開始,其數(shù)值超過1200。a=[0forxinrange(0,100)]a[0]=1a[1]=2a[2]=3i=0while1:i=i+1ifi>2:a[i]=a[i-1]+a[i-2]+a[i-3]ifa[i]>1200:print("該數(shù)列從第",i+1,"項開始,其數(shù)值超過1200")break9.找出1與100之間的全部“同構數(shù)”?!巴瑯嫈?shù)”是這樣一種數(shù),它出現(xiàn)在它的平方數(shù)的右端。例如,5的平方是25,5是25中右端的數(shù),5就是同構數(shù),25也是一個同構數(shù),它的平方是625。foriinrange(1,101):k=i*iifi<10:ifk%10==i:print(i)elifi<100:ifk%100==i:print(i)else:ifk%1000==i:print(i)10.猴子吃桃問題。猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個,第二天早上將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃前一天剩下的子。程序分析:采取逆向思維的方法,從后往前推斷。程序源代碼:x2=1fordayinrange(9,0,-1):x1=(x2+1)*2x2=x1print(x1)

第三章習題補充11.一球從100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地時,共經過多少米?第10次反彈多高?Sn=100.0Hn=Sn/2forninrange(2,11):Sn+=2*HnHn/=2print('Totalofroadis%f'%Sn)print('Thetenthis%fmeter'%Hn)12.輸入某年某月某日,判斷這一天是這一年的第幾天?程序分析:以3月5日為例,應該先把前兩個月的加起來,然后再加上5天即本年的第幾天,特殊情況,閏年2月29天。importmathyear=int(input('輸入某年某月某日,判斷這一天是這一年的第幾天。\n請輸入年:'))month=int(input('請輸入月:'))day=int(input("請輸入日:"))Day_month=[31,28,31,30,31,30,31,31,30,31,30,31]ifyear%4==0andyear%100!=0oryear%400==0:Day_month[1]=29i=0s=0whilei<month-1:s+=Day_month[i]i=i+1print(s+day)13.輸入一行字符,分別統(tǒng)計出其中英文字母、空格、數(shù)字和其它字符的個數(shù)。oStr=input('請輸入一串字符:')str_num=0spac_num=0figue_num=0other_num=0forstrsinoStr:ifstrs.isalpha():#字母str_num+=1elifstrs.isdigit():#數(shù)字figue_num+=1elifstrs=='':#空格spac_num+=1else:other_num+=1print('英文字母有:%d'%str_num)print('數(shù)字有:%d'%figue_num)print('空格有:%d'%spac_num)print('其它字符有:%d'%other_num)14.題目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數(shù)字。例如2+22+222+2222+22222(此時共有5個數(shù)相加),幾個數(shù)相加由鍵盤控制。程序分析:關鍵是計算出每一項的值。源代碼:fromfunctoolsimportreduceTn=0Sn=[]n=int(input('n=:\n'))a=int(input('a=:\n'))forcountinrange(n):Tn=Tn+aa=a*10Sn.append(Tn)print(Tn)print(reduce(lambdax,y:x+y,[2,4,5,7,12]))print(reduce(lambdax,y:x+y,Sn))print(sum(Sn))題目:一個數(shù)如果恰好等于它的因子之和,這個數(shù)就稱為“完數(shù)”。例如6=1+2+3.編程找出1000以內的所有完數(shù)。forjinrange(2,1001):k=[]n=-1s=jforiinrange(1,j):ifj%i==0:n+=1s-=ik.append(i)ifs==0:#是完數(shù)print(j)foriinrange(n):print(k[i],end='')print(k[n])結果:6123281247144961248163162124248習題四函數(shù)編寫一個函數(shù),將華氏溫度轉換為攝氏溫度。公式為C=(F-32)×5/9。defm(a):return(a-32)*5/9a=int(input('輸入華氏溫度'))c=m(a)print(c)2.編寫一個函數(shù)判斷一個數(shù)是否為素數(shù),并通過調用該函數(shù)求出所有三位數(shù)的素數(shù)。importmathdefIsPrime(Num):ifNum==1:returnFalseforiinrange(2,int(math.sqrt(Num))+1):ifNum%i==0:returnFalsereturnTrueoList=[]foriinrange(100,999+1):ifIsPrime(i)==True:oList.append(i)print(oList)3.編寫一個函數(shù),求滿足以下條件的最大的n值:(答案13)12+22+32+42+…+n2<1000非遞歸實現(xiàn)defs():sum=0n=0whilesum<1000:n=n+1sum=sum+n*nreturnn-1print(s())遞歸實現(xiàn):defs(sum,n):ifsum>=1000:returnn-1else:n=n+1sum=sum+n*nreturns(sum,n)sum=0n=0print(s(sum,n))驗證:sum=0foriinrange(1,15):sum=sum+i*iprint(i,sum)1125314430555691714082049285103851150612650138191410154.反序輸出輸入的5個字符。#對于str類型,python并沒有reverse函數(shù)。然而,通過反向步進切片,我們可以高效地反轉一串字符串。defrevser(s):returns[::-1]print(revser("abcde"))(4)編寫一遞歸函數(shù)將所輸入的5個字符按相反的順序排列出來。(遞歸)defshuru(n):ifn==0:returnc=input()#僅輸入1個字符shuru(n-1)print(c)shuru(5)4.編寫一個函數(shù)multi(),參數(shù)個數(shù)不限,返回所有參數(shù)的乘積。defmulti(*num):sum=1foriinnum:sum=sum*ireturnsumprint(multi(2,3,4))5.編寫一個函數(shù),功能是求兩個正整數(shù)m和n的最大公約數(shù)。defgcd(m,n):ifm<n:m,n=n,mwhilen!=0:temp=m%nm=nn=tempreturnmprint(gcd(24,36))6.求一元二次方程ax2+bx+c=0的根,用3個函數(shù)分別求當b2-4ac大于0,等于0和小于0時的根,并輸出結果。要求從主函數(shù)輸入a,b,c的值。importmathdefm(a,b,c):delta=b**2-4*a*croot=math.sqrt(delta)s1=(-b+root)/(2*a)s2=(-b-root)/(2*a)print('實根為:',s1,s2)defn(a,b,c):delta=(b**2-4*a*c)*(-1)root=complex(0,math.sqrt(delta))s1=(-b+root)/(2*a)s2=(-b-root)/(2*a)print('虛根為',s1,s2)a=float(input('輸入a:'))b=float(input('輸入b:'))c=float(input('輸入c:'))ifa==0:s=-c/bprint('實根為:',s)else:delta=b**2-4*a*cifdelta==0:s=-b/(2*a)print('實根為:',s)elifdelta<0:n(a,b,c)else:m(a,b,c)編寫一個函數(shù),求方程ax2+bx+c=0的根,用1個函數(shù)分別求當b2-4ac大于0,等于0和小于0時的根,并輸出結果。要求從主函數(shù)輸入a,b,c的值。importmathdefsolve(a,b,c):ifa==0:return–c/b;else:ifb*b-4*a*c<0:x1=complex((-b)/(2*a),math.sqrt(abs((b*b-4*a*c))))x2=complex((-b)/(2*a),-math.sqrt(abs((b*b-4*a*c))))elifb*b-4*a*c==0:x1=(-b)/(2*a)x2=(-b)/(2*a)elifb*b-4*a*c>0:x1=(-b+math.sqrt(b*b-4*a*c))/(2*a)x2=(-b-math.sqrt(b*b-4*a*c))/(2*a)return(x1,x2)x=int(input("請輸入a:"))y=int(input("請輸入b:"))z=int(input("請輸入c:"))print("求解:",solve(x,y,z))7.編寫一個函數(shù),調用該函數(shù)能夠打印一個由指定字符組成的n行金字塔。其中,指定打印的字符和行數(shù)n分別由兩個形參表示。defjinzita(n):foriinrange(1,n):#[1,2,3,4,...n-1]print(''*(20-(i-1))+'*'*(2*i-1))#主程序a=int(input("輸入打印行數(shù):"))jinzita(a+1)8.判斷完數(shù)defjudge(n):sum=0foriinrange(1,n):ifn%i==0:sum+=iifsum==n:print(n,"是完數(shù)!")else:print(n,"不是完數(shù)!")if__name__=="__main__":n=int(input("請輸入一個數(shù):"))judge(n)9.十進制轉二進制defbinary(n):list=[]whilen//2!=0:list.append(n%2)n=n//2ifn//2==0:list.append(n%2)breaklist.reverse()fortinlist:print(t,end='')print()if__name__=="__main__":n=int(input("請輸入一個數(shù):"))binary(n)習題五文件1.編寫程序,打開任意的文本文件,讀出其中內容,判斷該文件中某些給定關鍵字如“中國”出現(xiàn)的次數(shù)。n=0#hellofile=open("d:\\152\\612.txt")filename=input("pleaseinputfilename")hellofile=open("d:\\152\\"+filename)filecontent=hellofile.readlines()hellofile.close()print(filecontent)#['中國\n','美國\n','中國人民\n','日本\n','中國人']forsinfilecontent:n=n+s.count("中國")print(n)2.編寫程序,打開任意的文本文件,在指定的位置產生一個相同文件的副本,即實現(xiàn)文件的拷貝功能。方法一:defcopy_file(oldfile,newfile):oldFile=open(oldfile,"r")newFile=open(newfile,"w")whileTrue:filecontent=oldFile.read(50)iffilecontent=="":breaknewFile.write(filecontent)oldFile.close()newFile.close()return#主程序copy_file("d:\\152\\612.txt","d:\\152\\615.txt")方法二:importshutilshutil.copyfile("d:\\152\\612.txt","d:\\152\\615.txt")方法三:defmain():#用戶輸入文件名f1=input("Enterasoucefile:").strip()f2=input("Enterasoucefile:").strip()#打開文件infile=open(f1,"r")outfile=open(f2,"w")#拷貝數(shù)據(jù)countLines=countChars=0forlineininfile:countLines+=1countChars+=len(line)outfile.write(line)print(countLines,"linesand",countChars,"charscopied")infile.close()outfile.close()main()【運行結果】Enterasoucefile:s.txtEnterasoucefile:q.txt46linesand1500charscopied3.用Windows“記事本”創(chuàng)建一個文本文件,其中每行包含一段英文。試讀出文件的全部內容,并判斷:(1)該文本文件共有多少行?file1=open("d:\\152\\test.txt")filecontent=file1.readlines()#列表file1.close()a=len(filecontent)print(a)(2)文件中以大寫字母P開頭的有多少行?string.startswith(obj,beg=0,end=len(string))檢查字符串是否是以obj開頭,是則返回True,否則返回False。如果beg和end指定值,則在指定范圍內檢查.>>>s="pig">>>s.startswith('p')True>>>s="hello">>>s.startswith('p')Falsefile1=open("d:\\test.txt")filecontent=file1.readlines()#列表print(filecontent)file1.close()a=len(filecontent)n=0forsinfilecontent:ifs.startswith('P')==True:print(s)n+=1print("以大寫字母P開頭的有",n,"行")(3)一行中包含字符最多的和包含字符最少的分別在第幾行?file1=open("d:\\test.txt")filecontent=file1.readlines()#列表print(filecontent)file1.close()a=len(filecontent)n=1maxnum=0forsinfilecontent:k=len(s)ifk>maxnum:maxnum=kpos=nn+=1print("一行中包含字符最多的是",pos,"行")print("一行字符最多的是",maxnum)習題六面向對象程序設計1.簡述面向對象程序設計的概念及類和對象的關系,在Python語言中如何聲明類和定義對象?2.簡述面向對象程序設計中繼承與多態(tài)性的作用是什么?3.定義一個圓柱體類Cylinder,包含底面半徑和高兩個屬性(數(shù)據(jù)成員);包含一個可以計算圓柱體體積的方法。然后編寫相關程序測試相關功能。classCylinder:num=3.14def__init__(self,a,b):self.r=aself.h=bdefvolume(self):r=float(self.r)h=float(self.h)self.v=r*r*h*Cylinder.numdefprint(self):print(self.v)#主函數(shù)a=input("請輸入圓柱體的半徑:")b=input("請輸入圓柱體的高:")c1=Cylinder(a,b)c1.volume()print("圓柱體的體積為:")c1.print()4.定義一個學生類,包括學號、姓名和出生日期三個屬性(數(shù)據(jù)成員);包括一個用于給定數(shù)據(jù)成員初始值的構造函數(shù);包含一個可計算學生年齡的方法。編寫該類并對其進行測試。classStudent:def__init__(self,a,b,c):self.number=a=bself.birthday=cdefAge(self):self.age=2017-int(self.birthday[0:4])defprint(self):print("學生的學號為:",self.number)print("學生的名字為:",)print("學生的生日為:",self.birthday)print("學生的年齡為:",self.age)#主函數(shù)a,b,c=input("請輸入學生的學號、名字以及生日(空格隔開):").split('')s1=Student(a,b,c)s1.Age()s1.print()5.定義一個shape類,利用它作為基類派生出Rectangle、Circle等具體形狀類,已知具體形狀類均具有兩個方法GetArea和GetColor,分別用來得到形狀的面積和顏色。最后編寫一個測試程序對產生的類的功能進行驗證。習題七圖形界面1.設計一個電子標題板。要求:(1)實現(xiàn)字幕從右向左循環(huán)滾動。(2)單擊“開始”按鈕,字幕開始滾動,單擊“暫?!卑粹o,字幕停止?jié)L動。2.設計一個倒計時程序,應用程序界面自己設計。3.設計一個程序,用兩個文本框輸入數(shù)值數(shù)據(jù),用列表框存放“+、-、×、÷、冪次方、余數(shù)”。用戶先輸入兩個操作數(shù),再從列表框中選擇一種運算,即可在標簽中顯示出計算結果。實現(xiàn)簡單加減乘除程序。使用兩個單行文本框輸入數(shù)字,使用列表框選擇運算。fromtkinterimport*importtkinterastkroot=Tk()m=StringVar()defcallbutton2():a=float(num1.get())b=float(num2.get())ifk=='加':print(a+b)result["text"]=str(a+b)#result.config(text=str(a+b))ifk=='減':print(a-b)result["text"]=str(a-b)ifk=='乘':print(a*b)result["text"]=str(a*b)ifk=='除':print(a*b)result["text"]=str(a/b)root.title("使用Listbox組件的例子")#設置窗口標題lab1=Label(root,text='請輸入第1個數(shù)',width=20)lab1.pack()num1=tk.Entry(root) #Entry組件num1.pack()lab2=Label(root,text='請輸入第2個數(shù)',width=20)lab2.pack()num2=tk.Entry(root) #Entry組件num2.pack()lb=Listbox(root,listvariable=m)#將一字符串與Listbox的值綁定lb.insert(END,'加')lb.insert(END,'減')lb.insert(END,'乘')lb.insert(END,'除')lb.pack()b2=Button(root,text='計算',command=callbutton2,width=20)#創(chuàng)建Button組件b2.pack()#顯示Button組件result=Label(root,text='結果',width=6)result.pack()root.mainloop()4.編寫選課程序。左側列表框顯示學生可以選擇的課程名,右側列表框顯示學生已經選擇的課程名,通過4個按鈕在兩個列表框中移動數(shù)據(jù)項。通過“〉”、“〈”按鈕移動一門課程,通過“》”、“《”按鈕移動全部課程。程序運行界面見圖7-42所示。fromtkinterimport*root=Tk()defcallbutton1():#>選中一門foriinlistb.curselection():listb2.insert(0,listb.get(i))listb.delete(i)defcallbutton2():#<取消一門foriinlistb2.curselection():listb.insert(0,listb2.get(i))listb2.delete(i)defcallbutton3():#>>全部選中foriinrange(0,listb.size()):listb2.insert(0,listb.get(i))foriinrange(listb.size()-1,-1,-1):listb.delete(i)defcallbutton4():#>>全部取消foriinrange(0,listb2.size()):listb.insert(0,listb2.get(i))foriinrange(listb2.size()-1,-1,-1):listb2.delete(i)li=['Flash動畫設計','數(shù)據(jù)庫原理','大數(shù)據(jù)應用','Java程序設計','C#程序設計','網站開發(fā)','計算機導論','數(shù)據(jù)結構']listb=Listbox(root)#左邊列表框listb2=Listbox(root)#右邊列表框foriteminli:listb.insert(0,item)listb.grid(row=0,column=0,rowspan=4)b1=Button(root,text='>',command=callbutton1,width=20)b2=Button(root,text='>>',command=callbutton3,width=20)b3=Button(root,text='<',command=callbutton2,width=20)b4=Button(root,text='<<',command=callbutton4,width=20)b1.grid(row=0,column=1)b2.grid(row=1,column=1)b3.grid(row=2,column=1)b4.grid(row=3,column=1)listb2.grid(row=0,column=2,rowspan=4)root.mainloop()5.設計井字棋游戲程序。游戲是一個有3*3方格的棋盤。雙方各執(zhí)一種顏色棋子,在規(guī)定的方格內輪流布棋。如果一方橫豎斜方向連接成3子則勝利。6.設計一個單選題考試程序。習題八數(shù)據(jù)庫題目:創(chuàng)建一個數(shù)據(jù)庫stuinfo,并在其中創(chuàng)建數(shù)據(jù)庫表student,表中包含stuid(學號)、stuname(姓名)、birthday(出生日期)、sex(性別)、address(家庭地址)、rxrq(入學日期)6列,其中stuid設為主鍵,并添加5條記錄。將所有記錄的rxrq屬性更新為2017-9-1。查詢性別為“女”的所有學生的stuname和address字段值。代碼:importsqlite3con=sqlite3.connect("sales.db")cur=con.cursor()cur.execute("DROPtablebook")#第一次運行時這句刪掉,之后再運行加上。con.execute("createtablebook(stuidprimarykey,stunamevarchar(20),birthdayinteger(20),sexvarchar(20),addressvarchar(20),rxrqinteger(20))")cur.execute("insertintobook(stuid,stuname,birthday,sex,address,rxrq)values(1,'張一',19980301,'男','黃河路1號',20160901)")cur.execute("insertintobook(stuid,stuname,birthday,sex,address,rxrq)values(2,'張二',19980302,'女','黃河路2號',20160902)")cur.execute("insertintobook(stuid,stuname,birthday,sex,address,rxrq)values(3,'張三',19980303,'男','黃河路3號',20160903)")cur.execute("insertintobook(stuid,stuname,birthday,sex,address,rxrq)values(4,'張四',19980304,'男','黃河路4號',20160904)")cur.execute("insertintobook(stuid,stuname,birthday,sex,address,rxrq)values(5,'張五',19980305,'女','黃河路5號',20160905)")print('記錄計入完成')cur.execute('select*frombook')values=cur.fetchall()forrowinvalues:print(row)print('記錄更新完成')cur.execute("Updatebooksetrxrq=20170901")cur.execute('select*frombook')values=cur.fetchall()forrowinvalues:print(row)print('性別為女的名字和地址信息為:')cur.execute('selectstuname,sex,addressfrombook')values=cur.fetchall()forrowinvalues:ifrow[1]=='女':print(row[0],row[2])cur.close()mit()con.close()習題九網絡編程和多線程1.TCP協(xié)議和UDP協(xié)議的主要區(qū)別是什么?TCP協(xié)議建立在IP協(xié)議之上,負責在兩臺計算機之間建立可靠連接,保證數(shù)據(jù)包按順序到達。TCP協(xié)議會通過握手建立連接,然后,對每個IP包編號,確保對方按順序收到。如果包丟掉了,就自動重發(fā)。UDP協(xié)議也建立在IP協(xié)議之上,但是UDP協(xié)議是面向無連接的通信協(xié)議,不保證數(shù)據(jù)包的順利到達,不可靠傳輸。所以效率比TCP要高。使用UDP協(xié)議時,不需要建立連接,只需要知道對方的IP地址和端口號,就可以直接發(fā)數(shù)據(jù)包。但是,能不能到達就不知道了。雖然用UDP傳輸數(shù)據(jù)不可靠,但它的優(yōu)點是和TCP相比,速度快,對于不要求可靠到達的數(shù)據(jù),就可以使用UDP協(xié)議。2.Socket有什么用途?socket用來寫網絡通訊程序的,簡單來說在遠程機器(服務器)和本地機器各建一個socket,然后即可進行連接通訊。Socket非常類似于電話插座。以一個國家級電話網為例,電話的通話雙方相當于相互通信的2個進程,區(qū)號是它的網絡地址;分配給每個用戶的電話號碼相當于Socket號。任何用戶在通話之前,首先要占有一部電話機,相當于申請一個Socket;同時要知道對方的號碼,相當于對方有一個固定的Socket。然后向對方撥號呼叫,相當于發(fā)出連接請求(假如對方不在同一區(qū)內,還要撥對方區(qū)號,相當于給出網絡地址)。假如對方在場并空閑(相當于通信的另一主機開機且可以接受連接請求),拿起電話話筒,雙方就可以正式通話,相當于連接成功。雙方通話的過程,是一方向電話機發(fā)出信號和對方從電話機接收信號的過程,相當于向Socket發(fā)送數(shù)據(jù)和從socket接收數(shù)據(jù)。通話結束后,一方掛起電話機相當于關閉Socket,撤消連接。3.簡單描述開發(fā)UDP程序的過程。pythonudp是無連接,沒有TCP的三次握手,錯誤重傳機制,發(fā)的只管發(fā),收的只管收,效率比TCP高,運用于對數(shù)據(jù)幀不高的地方,如視頻,音頻的傳輸。一、實現(xiàn)過程:服務器端過程如下:1.建立UDP的SOCKET2.綁定一個接口,讓客戶端連接3.接受數(shù)據(jù)客戶端過程如下:1.創(chuàng)建一個socket2.收發(fā)數(shù)據(jù)報二、代碼實現(xiàn)1.服務器端:importsocketfromtimeimportctimedefudpServer():buffer=2048address=('',8080)udpsock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)udpsock.bind(address)whileTrue:#不斷循環(huán)print('waitformessage...')data,addr=udpsock.recvfrom(buffer)#接受數(shù)據(jù)str='[%s]%s'%(ctime(),data.decode('utf-8'))udpsock.sendto(str.encode('utf-8'),addr)#發(fā)送數(shù)據(jù)print('...receivedfromandretunedto:',addr)udpsock.close()if__name__=='__main__':udpServer()2.客戶端:importsocketdefudpClient():address=('localhost',8080)udpClientSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#創(chuàng)建socketwhileTrue:#不斷循環(huán)data=input('>')ifnotdata:breakudpClientSocket.sendto(data.encode('utf-8'),address)#發(fā)送數(shù)據(jù)data,addr=udpClientSocket.recvfrom(2048)print(data.decode('utf-8'))udpClientSocket.close()if__name__=='__main__':udpClient()運行結果:服務器端:waitformessagereceivedfromandretunedto:('',61957)waitformessagereceivedfromandretunedto:('',61957)waitformessage...客戶端:>中國[SatMar2410:35:192018]中國>hello[SatMar2410:35:292018]hello>4.設計網絡井字棋游戲,具有“聯(lián)機”“悔棋”“退出”功能。服務器fromtkinterimport*fromtkinter.messageboximport*importsocketimportthreadingimportosroot=Tk()root.title("網絡井字棋--服務器端")imgs=[PhotoImage(file='.\\bmp\\BlackStone.gif'),PhotoImage(file='.\\bmp\\WhiteStone.gif')]turn=0#輪到那方走棋,0黑方1是白方Myturn=-1#第一次確定自己的角色defcallexit(event):#退出pos="exit|"sendMessage(pos)os._exit(0)defcallpos(event):#走棋globalturnglobalMyturnifMyturn==-1:#第一次確定自己的角色(白方還是黑方)Myturn=turnelse:if(Myturn!=turn):showinfo(title="提示",message="還沒輪到自己走棋")return#print("clickedat",event.x,event.y,turn)x=(event.x-20)//40#換算棋盤坐標y=(event.y-20)//40print("clickedat",x,y,turn)ifmap[x][y]!="":showinfo(title="提示",message="已有棋子")else:img1=imgs[turn]cv.create_image((x*40+40,y*40+40),image=img1)cv.pack()map[x][y]=str(turn)pos=str(x)+","+str(y)sendMessage("move|"+pos)print("服務器走的位置",pos)label1["text"]="服務器走的位置"+pos#輸出輸贏信息ifwin_lose()==True:ifturn==0:showinfo(title="提示",message="黑方你贏了")sendMessage("over|黑方你贏了")else:showinfo(title="提示",message="白方你贏了")sendMessage("over|白方你贏了")#換下一方走棋ifturn==0:turn=1else:turn=0defdrawOtherChess(x,y):#畫對方棋子globalturnimg1=imgs[turn]cv.create_image((x*40+40,y*40+40),image=img1)cv.pack()map[x][y]=str(turn)#換下一方走棋ifturn==0:turn=1else:turn=0defdrawQiPan():#畫棋盤foriinrange(0,4):cv.create_line(20,20+40*i,140,20+40*i,width=2)foriinrange(0,4):cv.create_line(20+40*i,20,20+40*i,140,width=2)cv.pack()#判斷輸贏,判斷是否連成3個defwin_lose():#所有贏的可能情況,例如(0,1,2)就是第一行,(0,4,8),(2,4,6)就是對角線#012#345#678#棋盤九宮格的編號,按以上位置編號的贏的可能情況WAYS_TO_WIN=((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))forrowinWAYS_TO_WIN:ifmap[row[0]//3][row[0]%3]==map[row[1]//3][row[1]%3]==map[row[2]//3][row[2]%3]!="":returnTrue #返回贏方#棋盤沒有空位置if""notinmap:return"和棋" #"平局和棋,游戲結束"returnFalsedefprint_map():#輸出map地圖forjinrange(0,3):#0--2foriinrange(0,3):#0--2print(map[i][j],end='')print('w')#接收消息defreceiveMessage():globalswhileTrue:#接收客戶端發(fā)送的消息globaladdrdata,addr=s.recvfrom(1024)data=data.decode('utf-8')a=data.split("|")#分割數(shù)據(jù)ifnotdata:print('clienthasexited!')breakelifa[0]=='join':#連接服務器請求print('client連接服務器!')label1["text"]='client連接服務器成功,請你走棋!'elifa[0]=='exit':#對方退出信息print('client對方退出!')label1["text"]='client對方退出,游戲結束!'elifa[0]=='over':#對方贏信息print('對方贏信息!')label1["text"]=data.split("|")[0]showinfo(title="提示",message=data.split("|")[1])elifa[0]=='move':#客戶端走的位置信息print('received:',data,'from',addr)p=a[1].split(",")x=int(p[0]);y=int(p[1]);print(p[0],p[1])label1["text"]="客戶端走的位置"+p[0]+p[1]drawOtherChess(x,y)#畫對方棋子s.close()#發(fā)送消息defsendMessage(pos):globalsglobaladdrs.sendto(pos.encode(),addr)#啟動線程接收客戶端的消息defstartNewThread():#啟動一個新線程來接收客戶器端的消息#thread.start_new_thread(function,args[,kwargs])函數(shù)原型,#其中function參數(shù)是將要調用的線程函數(shù),args是傳遞給線程函數(shù)的參數(shù),它必須是個元組類型,而kwargs是可選的參數(shù)#receiveMessage函數(shù)不需要參數(shù),就傳一個空元組thread=threading.Thread(target=receiveMessage,args=())thread.setDaemon(True);thread.start();map=[["","",""],["","",""],["","",""]]cv=Canvas(root,bg='green',width=160,height=160)drawQiPan()cv.bind("<Button-1>",callpos)cv.pack()label1=Label(root,text="服務器端")label1.pack()button1=Button(root,text="退出游戲")button1.bind("<Button-1>",callexit)button1.pack()#創(chuàng)建UDPSOCKETs=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind(('localhost',8000))addr=('localhost',8000)startNewThread()##啟動線程接收客戶端的消息receiveMessage();root.mainloop()客戶端:fromtkinterimport*fromtkinter.messageboximport*importsocketimportthreadingimportosroot=Tk()root.title("網絡井字棋--UDP客戶端")imgs=[PhotoImage(file='.\\bmp\\BlackStone.gif'),PhotoImage(file='.\\bmp\\WhiteStone.gif')]turn=0Myturn=-1defcallexit(event):#退出pos="exit|"sendMessage(pos)os._exit(0)defcalljoin(event):#連接服務器pos='join|'#"連接服務器"命令sendMessage(pos);#發(fā)送連接服務器請求startNewThread()#啟動線程接收服務器端的消息receiveMessage();defcallback(event):#走棋globalturnglobalMyturnifMyturn==-1:#第一次確定自己的角色(白方還是黑方)Myturn=turnelse:if(Myturn!=turn):showinfo(title="提示",message="還沒輪到自己走棋")return#print("clickedat",event.x,event.y,turn)x=(event.x-20)//40#換算棋盤坐標y=(event.y-20)//40print("clickedat",x,y,turn)ifmap[x][y]!="":showinfo(title="提示",message="已有棋子")else:img1=imgs[turn]cv.create_image((x*40+40,y*40+40),image=img1)cv.pack()map[x][y]=str(turn)pos=str(x)+","+str(y)sendMessage("move|"+pos)print("客戶端走的位置",pos)label1["text"]="客戶端走的位置"+posk=win_lose()#輸出輸贏信息ifwin_lose()==True:ifturn==0:showinfo(title="提示",message="黑方你贏了")sendMessage("over|黑方你贏了")else:showinfo(title="提示",message="白方你贏了")sendMessage("over|白方你贏了")#換下一方走棋ifturn==0:turn=1else:turn=0defdrawQiPan():#畫棋盤foriinrange(0,4):cv.create_line(20,20+40*i,140,20+40*i,width=2)foriinrange(0,4):cv.create_line(20+40*i,20,20+40*i,140,width=2)cv.pack()#判斷輸贏,判斷是否連成3個defwin_lose():#所有贏的可能情況,例如(0,1,2)就是第一行,(0,4,8),(2,4,6)就是對角線#012#345#678#棋盤九宮格的編號,按以上位置編號的贏的可能情況WAYS_TO_WIN=((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))forrowinWAYS_TO_WIN:ifmap[row[0]//3][row[0]%3]==map[row[1]//3][row[1]%3]==map[row[2]//3][row[2]%3]!="":returnTrue #返回贏方#棋盤沒有空位置if""notinmap:return"和棋" #"平局和棋,游戲結束"returnFalsedefprint_map():#輸出map地圖forjinrange(0,3):#0--2foriinrange(0,3):#0--2print(map[i][j],end='')print('w')defdrawOtherChess(x,y):#畫對方棋子globalturnimg1=imgs[turn]cv.create_image((x*40+40,y*40+40),image=img1)cv.pack()map[x][y]=str(turn)#換下一方走棋ifturn==0:turn=1else:turn=0#接收消息defreceiveMessage():globalswhileTrue:data=s.recv(1024).decode('utf-8')a=data.split("|")#分割數(shù)據(jù)ifnotdata:print('clienthasexited!')breakelifa[0]=='exit':#對方退出信息print('對方退出!')label1["text"]='對方退出,游戲結束!'elifa[0]=='over':

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論