Python习题选编 下载本文

Python习题选编

华东师大信息学院计算中心

一.程序结构与算法部分:

1. 编写一个python程序,输入两个数,比较它们的大小并输出其中较大者。

参考代码:

x = int(input(\y = int(input(\if (x == y):

print(\两数相同!\elif (x > y):

print(\较大数为:\else:

print(\较大数为:\

2. 写一个算法(流程图和python程序):输入三个数,输出其最大者。

参考代码:

a,b,c=3,4,5 if a <= b: if c < b:

print (\是最大的数\ else:

print (\是最大的数\else:

if c < a:

print (\是最大的数\ else:

print (\是最大的数\

3. 使用Python编程,求1~100间所有偶数的和。

参考代码: sum=0

for x in range(1,101): if x % 2==0: print(x) sum=sum+x print(\累加和是:\

4. 用Python编写程序,输入一年份,判断该年份是否是闰年并输出结果。

注:凡符合下面两个条件之一的年份是闰年。 (1) 能被4整除但不能被100整除。 (2) 能被400整除。

参考代码:

year = int(input(\

if ((year%4==0 and year0!=0) or (year@0==0)): print(year,\else:

print(year,\

5. 用Python编程,假设一年期定期利率为3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?

参考代码:

cunkuan = 10000 #本金10000元 years=0

while cunkuan<20000: years+=1

cunkuan=cunkuan*(1+0.0325) print(str(years)+\年以后,存款会翻番\

6. 从键盘接收一百分制成绩(0~100),要求输出其对应的成绩等级A~E。其中,90分以上为'A',80~89分为'B',70~79分为'C',60~69分为'D',60分以下为'E'。

参考答案:

score=int(input('请输入成绩(0~100):'))

if score > 100:

grade = \输入错误!\elif score >= 90: grade = 'A' elif score >= 80: grade = 'B' elif score >= 70: grade = 'C' elif score >= 60: grade = 'D' elif score >= 0: grade = 'E' else:

grade = \输入错误!\print(grade)

7. 猜数游戏。预设一个0~9之间的整数,让用户猜一猜并输入所猜的数,如果大于预设的数,显示“太大”;小于预设的数,显示“太小”,如此循环,直至猜中该数,显示“恭喜!你猜中了!”。

参考答案: num=7 while True:

guess=int(input('请输入你猜的数(0~9):')) if guess == num:

print(\恭喜!你猜中了!\ break;

elif guess > num: print(\太大\ else:

print(\太小\

8. 输入一个数,判断这个数是否为素数,并输出判断结果。

(所谓素数,是指除了1和该数本身之外,不能被其它任何整数整除的数。下

图为参考流程图)

参考答案: import math

n=int(input(\请输入一个数:\x=int(math.sqrt(n)) i,w=2,0

for i in range (2,x+1): if n%i==0: w=1 if w==1:

print(n,\不是素数。\else:

print(n,\是素数。\ 或

import math

n=int(input('请输入一个数:')) i,w=2,0

while i <= int(math.sqrt(n)) and w==0: if n%i == 0: w = 1 break else:

i = i+1 if w==0:

print(n,\是素数!\else:

print(n,\不是素数!\或

import math

n=int(input('请输入一个数:')) i=2

while i <= int(math.sqrt(n)) : if n%i == 0:

print(n,\不是素数!\ break else:

i=i+1 else:

print(n,\是素数!\

9. 输入一个时间(小时:分钟:秒),输出该时间经过5分30秒后的时间。

参考答案:

hour,minute,second=input('请输入一个时间(h:m:s):').split(':') hour=int(hour) minute=int(minute) second=int(second) second+=30 if second >= 60:

second = second-60 minute += 1 minute+=5 if minute >= 60:

minute = minute-60 hour += 1 if hour == 24: hour = 0

print('%d:%d:%d'%(hour,minute,second))

10. 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是完数。编程,找出1000之内的所有完数,并输出该完数及对应的因子。(枚举法)

参考答案:

m=1000

for a in range(2,m+1): s=a L1=[]

for i in range(1,a): if a%i==0: s-=i

L1.append(i) if s==0:

print(\完数:%d,因子包括:\ for j in range(1,len(L1)):

print(\ print(\

11.编程,解决猴子吃桃问题。

猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想吃时,只剩下一个桃子了。求第一天共摘多少个桃子。(迭代法)

参考答案: day=9 x=1

while day>0: x=(x+1)*2 day-=1 print(\

二.输入输出与文件部分:

1. 编写一个python程序,输入两个数,输出两数之和。

参考代码:

x = int(input(\y = int(input(\print(\print(x+y);

2. 在当前目录下有一个文件名为temp.txt的文件,存放着上海从2014年3月10日(周一)到3月16日(周日)间一周的最高和最低气温(单位为摄氏度)。其中,第一行为最高气温,第二行为最低气温。编程,找出这一周中第几天最热(按最高气温计算)?最高多少度?这一周中第几天最冷(按最低气温计算)?最冷多少度?

参考答案:

flname=\f=open(flname)

ht=(f.readline()).strip() L1=list(ht.split(',')) lt=(f.readline()).strip() L2=list(lt.split(',')) f.close()

for i in range(len(L1)): L1[i]=int(L1[i]) L2[i]=int(L2[i]) maxVal=L1[0] maxDay=0 minVal=L2[0] minDay=0

for i in range(1,len(L1)): if L1[i]>maxVal: maxVal=L1[i] maxDay=i if L2[i]

print(\这周第\天最热,最高\摄氏度\print(\这周第\天最冷,最低\摄氏度\

3.在上题的基础上,求出全周的平均气温(这一周各天平均温度的平均值,取整数)。假设在气象意义上,入春标准是连续5天日均气温超过10℃,根据这一周的气象数据是否能判断上海已经入春? 参考答案:

flname=\f=open(flname)

ht=(f.readline()).strip() L1=list(ht.split(',')) lt=(f.readline()).strip() L2=list(lt.split(',')) f.close() L3=[]

for i in range(len(L1)): L1[i]=int(L1[i]) L2[i]=int(L2[i])

L3.append(int((L1[i]+L2[i])/2)) sum=0 k=0

for i in range(len(L3)):

sum=sum+L3[i] if L3[i]>=10: k+=1 else: k=0

avg=int(sum/len(L3))

print(\周平均气温为:\if k>=5:

print(\上海这周已入春。\else:

print(\上海这周未入春。\

4.当前目录下有一个文件名为score1.txt的文本文件,存放着某班学生的计算机课成绩,共有学号、平时成绩、期末成绩三列。请根据平时成绩占40%,期末成绩占60%的比例计算总评成绩(取整数),并分学号、总评成绩两列写入另一文件score2.txt。同时在屏幕上输出学生总人数,按总评成绩计90以上、80~89、70~79、60~69、60分以下各成绩档的人数和班级总平均分(取整数)。 参考答案:

f=open(\a=f.readline()

line=(f.readline()).strip() f2=open(\

f2.write(\学号 平均成绩\\n\L2=[0,0,0,0,0] count=0 sum=0

while (len(line) != 0): #print(line) L1=line.split() f2.write(L1[0]+\

f_score=int(int(L1[1])*0.4+int(L1[2])*0.6) if 90=80: L2[1]+=1 elif f_score>=70: L2[2]+=1 elif f_score>=60: L2[3]+=1 else:

L2[4]+=1 count+=1 sum+=f_score

f2.write(str(f_score)+\

line=(f.readline()).strip() f.close() f2.close()

avg_score=int(sum/count)

print(\学生总人数为%d,按总评成绩计,90以上%d人、80~89间%d人、70~79间%d人、60~69间%d人、60分以下%d人。班级总平均分为%d分。\

f=open(\a=f.readlines() del a[0] L3=[]

for line in a:

line=line.strip() L1=line.split()

f_score=int(int(L1[1])*0.4+int(L1[2])*0.6) L3.append([L1[0],f_score]) f.close() c=[0,0,0,0,0] count=0 sum=0

f2=open(\

f2.write(\学号 平均成绩\\n\for L2 in L3:

if 90=80: c[1]+=1 elif L2[1]>=70: c[2]+=1 elif L2[1]>=60: c[3]+=1 else:

c[4]+=1 count+=1 sum+=L2[1]

f2.write(L2[0]+\f2.close()

avg_score=int(sum/count)

print(\学生总人数为%d,按总评成绩计,90以上%d人、80~89间%d人、70~79间%d人、60~69间%d人、60分以下%d人。班级总平均分为%d分。\

5.当前目录下有一个文本文件sample12.txt,其内容包含小写字母和大写字母。请将该文件复制到另一文件sample12_copy.txt,并将原文件中的小写字母全部转换为大写字母,其余格式均不变。

参考答案:

f=open(\L1=f.readlines()

f2=open(\for line in L1:

f2.write(line.upper()) f.close() f2.close()

6.当前目录下有一个文件名为class_score.txt的文本文件,存放着某班学生的学号、数学课成绩(第2列)和语文课成绩(第3列)。请编程完成下列要求:

(1)分别求这个班数学和语文的平均分(保留1位小数)并输出。

(2)找出两门课都不及格(<60)的学生,输出他们的学号和各科成绩。 (3)找出两门课的平均分在90分以上的学生,输出他们的学号和各科成绩。 建议用三个函数分别实现以上要求。

参考答案:

def output_avg(L): sum1,sum2=0,0 for line in L:

L1=line.strip().split() sum1+=int(L1[1]) sum2+=int(L1[2]) count=len(L)

avg1=round(sum1/count,1) avg2=round(sum2/count,1)

print(\这个班的数学平均分为:%4.1f,语文平均分为:%4.1f\

def output_notpass(L):

print(\两门课均不及格的学生学号及数学、语文成绩为:\ for line in L:

L1=line.strip().split()

if int(L1[1])<60 and int(L1[2])<60: print(line)

def output_good(L):

print(\两门课平均分在90分以上的学生学号及数学、语文成绩为:\ for line in L:

L1=line.strip().split()

f_score=round((int(L1[1])+int(L1[2]))/2)

if f_score>=90: print(line)

f=open(\L=f.readlines() del L[0]

output_avg(L) output_notpass(L) output_good(L)

三. 算法分析与设计部分

1. 编程,从键盘接收若干个整数(直接输入回车表示结束),用冒泡法或选择法进行排序(从小到大),并将排序结果在屏幕上输出。同时估计算法的复杂度。

参考答案: 选择排序: def bubble(List): num=len(List)

for i in range(0,num-1): for j in range(i+1,num): if List[i]>List[j]:

List[i],List[j]=List[j],List[i] return List

L1=[]

num_str=input('请输入一个需排序的整数:') while len(num_str) != 0:

L1.append(int(num_str))

num_str=input('请输入一个需排序的整数:') print('排序后结果:', bubble(L1)) 或

冒泡排序: def bubble(List):

for i in range(0,len(List)-1):

for j in range(len(List)-1,i,-1): if List[j-1]>List[j]:

List[j-1],List[j]=List[j],List[j-1] return List L1=[]

num_str=input('请输入一个需排序的整数:') while len(num_str) != 0:

L1.append(int(num_str))

num_str=input('请输入一个需排序的整数:') print('排序后结果:', bubble(L1))

上述两个程序算法的时间复杂度均为O(n2). 2.从键盘接收一个正整数n,输出对应斐波那契(Fibonacci)数列的前n项(计算数列中某项的值请用递归函数实现)。另外,请指出所用算法的复杂度。 有能力的同学还可进一步改进算法的效率。 参考答案:

def fib(n):

if n==0 or n==1: return n else:

return fib(n-1) + fib(n-2)

n=int(input('n=')) for i in range(n+1):

print(fib(i),end=\ 算法时间复杂度为O(n*2n).

可改进为:

def fib(n,List): a,b=0,1

List.append(a) while b<=n:

List.append(b) a,b = b,a+b n=int(input('n=')) L1=[] fib(n,L1) print(L1)

算法的时间复杂性为O(n)

3.当前目录下有一个文件名为score2.txt的文本文件,存放着某班学生的计算机课成绩,共有学号、总评成绩两列。请查找最高分和最低分的学生,并在屏幕上显示其学号和成绩。另外,请指出所用算法的复杂度。

参考答案:

f=open(\a=f.readlines()

del a[0] L2=[] L3=[]

for line in a:

line=line.strip() L1=line.split() L2.append(L1[0]) L3.append(L1[1]) f.close()

maxScore=L3[0] maxIndex=0 minScore=L3[0] minIndex=0

for i in range(1,len(L3)): if L3[i]>maxScore: maxScore=L3[i] maxIndex=i if L3[i]

print(\最高分为:\分,该学生学号为:\print(\最低分为:\分,该学生学号为:\时间复杂度为O(n).

四. 数据结构部分:

1. 编程,输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

参考答案:

letters,space,digit,other=0,0,0,0 s=input(\请输入一行字符:\for i in range(len(s)):

if (s[i]>='a' and s[i]<='z') or (s[i]>='A' and s[i]<='Z'): letters+=1 elif s[i]==' ': space+=1

elif s[i]>='0' and s[i]<='9': digit+=1 else:

other+=1

print(\字母数:%d\\n空格数:%d\\n数字数:%d\\n其他字符

数:%d\\n\ 或

p=input('请输入一行字符:') a,b,c,d=0,0,0,0 for i in p:

if((i<='Z' and i>='A') or (i<='z' and i>='a')): a+=1 elif (i==' '): b+=1

elif(i>='0' and i<='9'): c+=1 else:

d+=1

print ('英文字母的个数为:'+str(a)) print ('空格的个数为:'+str(b)) print ('数字的个数为:'+str(c))

print ('其他字符的个数为:'+str(d)) 或

letter,space,digit,other=0,0,0,0 s = input('input a string:') for c in s:

if c.isalpha(): letter +=1 elif c.isspace(): space +=1 elif c.isdigit(): digit +=1 else:

other +=1

print(\字母数:%d\\n空格数:%d\\n数字数:%d\\n其他字符数:%d\\n\

2.小王希望用电脑记录他每天掌握的英文单词。请设计程序和相应的数据结构,使小王能记录新学的英文单词和其中文翻译,并能很方便地根据英文来查找中文。

(参考:数据结构建议用集合。集合添加:dic[key]=value 判断key是否在集合中:if key in dic)。

参考答案: def add_dic(dic):

while True:

word=input(\请输入英文单词(直接按回车结束):\ if len(word)==0: break;

meaning=input(\请输入中文翻译:\ dic[word]=meaning

print(\该单词已添加到字典库。\ return

def search_dic(dic): while True:

word=input(\请输入要查询的英文单词(直接按回车结束):\ if len(word)==0: break; if word in dic:

print(\的中文翻译是%s\ else:

print(\字典库中未找到这个单词\ return

worddic=dict() while True:

print(\请选择功能:\\n1:输入\\n2:查找\\n3:退出\ c=input() if c==\

add_dic(worddic) elif c==\

search_dic(worddic) elif c==\ break else:

print(\输入有误!\

五.异常处理部分:

1.以下是两数相加的程序: x = int(input(\y = int(input(\print(\

该程序要求接收两个整数,并输出相加结果。但如果输入的不是整数(如字母、浮点数等),程序就会终止执行并输出异常信息。请对程序进行修改,要求输入非整数时,给出“输入内容必须为整数!”的提示,并提示用户重新输入,直至输入正确。

参考答案: while True: try:

x = int(input(\ except ValueError:

print(\输入内容必须为整数!\ else:

break while True: try:

y = int(input(\ except ValueError:

print(\输入内容必须为整数!\ else:

break print(\

2.编程,请输入一个文件路径名或文件名,查看该文件是否存在,如存在,打开文件并在屏幕上输出该文件内容;如不存在,显示“输入的文件未找到!”并要求重新输入;如文件存在但在读文件过程中发生异常,则显示“文件无法正常读出!”并要求重新输入。

(提示:请使用异常处理。“文件未找到”对应的异常名为:FileNotFoundError,其他异常直接用except匹配)

参考答案: while True: try:

filename=input('请输入文件路径名或文件名:') f=open(filename.strip()) print(f.read())

except FileNotFoundError:

print(\输入的文件未找到!\ except:

print(\文件无法正常读出!\ else:

break f.close()

五. 函数部分:

1. 写一判素数的函数,在主函数中输入一个整数,调用该函数进行判断并输出

结果。

参考答案: def shushu(n): import math

i,w=2,0 if n<=1: w=1

while i <= int(math.sqrt(n)) and w==0: if n%i == 0: w = 1 break else:

i = i+1 return w

n=int(input('n=')) if shushu(n)==0:

print(n,\是素数!\else:

print(n,\不是素数!\

2. 当前目录下有一个文件名为score3.txt的文本文件,存放着某班学生的学号和其两门专业课的成绩。分别用函数实现以下功能:

(1) 定义函数function1,计算每个学生的平均分(取整数),并将所有学生的学号

和平均分在屏幕上输出。(函数参数为要读取文件的文件名)

def function1(flname):

#函数代码

function1(\

参考答案:

def function1(flname): f=open(flname) a=f.readlines() del a[0] L3=[]

for line in a:

line=line.strip() L1=line.split()

avg_score=int((int(L1[1])+int(L1[2]))/2) L3.append([L1[0],avg_score]) f.close()

print(\学号 平均分\

for L2 in L3:

print(L2[0]+\

(2) 定义函数calAvg(),计算某一门课程的平均分(函数参数为某门课成绩对应的

列表名,返回值为该门课的平均分)

def calAvg(L): #函数代码

f=open(\a=f.readlines() del a[0] L2=[] L3=[]

for line in a:

line=line.strip() L1=line.split()

L2.append(int(L1[1])) L3.append(int(L1[2])) f.close()

print(\专业课1的总平均分为\print(\专业课2的总平均分为\

参考答案: def calAvg(L):

sum,count=0,0 for score in L: sum+=score count+=1

avg_score=int(sum/count) return avg_score

3.

用函数或函数的递归实现求n!的算法。(主程序已给出)。同时估计程序的复杂度。 def fact(n):

//函数代码

n=int(input(\print(n,'!=',fact(n))

参考答案: def fact(n): value=1

for count in range(1,n+1): value*=count

return value

def fact(n): if n==1:

value=1 else:

value=n*fact(n-1) return value 程序复杂度为O(n).

4.分别编写求两个整数的最大公约数的函数hcf和求最小公倍数的函数lcd。主函数已给出,其从键盘接收两个整数,调用这两个函数后输出结果。

(提示:求最大公约数可用辗转相除法。即将大数作为被除数,小数作为除数,若二者余数不为0,则将小数作为被除数,余数作为除数,?直到余数为0。求最小公倍数则用两数的积除以最大公约数即可。)

参考答案: def hcf(u,v): if v>u:

u,v=v,u r=u%v while r!=0: u=v v=r r=u%v return v

def lcd(u,v,h): return u*v/h

u=int(input(\请输入第一个整数:\v=int(input(\请输入第二个整数:\h=hcf(u,v)

print(\和%d的最大公约数为%d:\l=lcd(u,v,h)

print(\和%d的最小公倍数为%d:\

5.编程,统计列表中各数据的方差和标准差。主函数已给出,请编写计算方差的函数var。

(提示:方差的计算公式为: ∑Xi/n-(∑Xi/n) ,其中,n为列表中元素个数,Xi为列表中的第i项。标准差则为方差的算术平方根。)

2

2

参考答案: import math def var(L1):

s,psum=0,0

for i in range(len(L1)): v=L1[i] s+=v

psum+=v*v s=s/len(L1)

mse=psum/len(L1)-s*s return mse

L1=[5,3,7,8,14,9,12,6] dx=var(L1)

print('方差为:%.2f'%dx) mse=math.sqrt(dx)

print('标准差为:%.2f'%mse)

6.主程序中已有一个排好序的列表,请编写函数insertList,将从键盘接收的整数按原来从小到大的排序规律插入到该列表中。

def insertList(L1,x): #函数代码

L1=[1,4,6,9,13,16,28,40,100]

x=int(input('请输入一个要插入的整数:')) insertList(L1,x) print(L1)

参考答案:

def insertList(L1,x): if x>L1[len(L1)-1]: L1.append(x) return

for i in range(0,len(L1)): if x

L1.insert(i,x) break return

L1=[1,4,6,9,13,16,28,40,100]

x=int(input('请输入一个要插入的整数:')) insertList(L1,x) print(L1)