中国大学MOOCPython语言程序设计基础学习笔记和课后练习5-6周(南京邮电大学)
- 第5周 程序的流程控制
- 单元测试
- 单元作业
- 1.请编写Python程序完成以下要求:输出所有100到999之间的水仙花数。(水仙花是指一个三位数,其各位数字的立方和等于该数本身,比如153就是一个水仙花数,因为153=1**3+5**3+3**3)
- 2.请编写Python程序完成以下要求:提示用户从键盘上输入一个大于1的自然数,判断其是否为素数(所谓素数就是除了1和它本身外,不能被其他自然数整除)。
- 3.请编写Python程序完成以下要求:提示用户从键盘上输入一个数num,判断该数num是否为回文数。(所谓回文数就是一个正数顺过来和反过来都是一样的,比如123321、15851等等,就是回文数)
- 4.请编写Python程序完成以下要求:定义函数用于求两个整数的最大公约数和最小公倍数,并编写主程序,提示用户从键盘上输入两个正整数,通过调用你定义的函数完成计算,并返回结果。
- 实验周 实验报告:程序的流程控制
- 第6周 数据结构
- 单元测试
- 单元作业
- 实验周:函数的定义与使用
- 实验报告 单元作业
- 1.请编写Python程序完成以下要求:验证哥德巴赫猜想之一:2000以内的正偶数(大于等于4)都能够分解为两个质数之和。每个偶数表达成形如:4=2+2的形式,每行放6个式子。
- 2.请编写Python程序完成以下要求:使用time 函数库中的函数求当前系统的日期,并计算当前日期是本年度的第几天。
- 3.请编写Python程序完成以下要求:题目:编写inputStu()和outputStu()函数输入、输出学生的数据记录。在主程序中通过调用定义好的inputStu()和outputStu()函数,完成5个学生的信息输入和输出,每个学生信息包括学号,姓名及三门课程的成绩。要求使用list来模拟学生记录结构。
第5周 程序的流程控制
单元测试
单元作业
1.请编写Python程序完成以下要求:输出所有100到999之间的水仙花数。(水仙花是指一个三位数,其各位数字的立方和等于该数本身,比如153就是一个水仙花数,因为153=13+53+3**3)
注意点
循环遍历,//和%的用法
#循环遍历100-999之间的数:
print("100到999之间的水仙花数分别为:")
for i in range(100,999):
#对每一个数用a,b,c分别表示百、十、个位上的数字
a=i//100
b=i//10%10
c=i%10
if a**3+b**3+c**3==i:
#打印所有的符合条件的数
print(i)
2.请编写Python程序完成以下要求:提示用户从键盘上输入一个大于1的自然数,判断其是否为素数(所谓素数就是除了1和它本身外,不能被其他自然数整除)。
注意点
循环与break混合使用,素数的判断条件
#2.请编写Python程序完成以下要求:
#提示用户从键盘上输入一个大于1的自然数,
# 判断其是否为素数(所谓素数就是除了1和它本身外,不能被其他自然数整除)。
#方法1:
N=eval(input("请输入一个大于1的自然数:"))
for i in range(2,N):
#判断从2到这个数之间的数
#如果有能被整除的数,说明这个数不是素数,退出循环
if N%i==0:
print("您输入的数不是素数")
# 判断完输出即退出循环
break
#判断素数只需要判断它的根号之前的数
if i*i>N:
print("您输入的数不是素数")
# 判断完输出即退出循环
break
else:
print("您输入的数是素数%d"%N)
#判断完输出即退出循环
break
或者使用标记来判断
#或者使用标记来判断
N=eval(input("请输入一个大于1的自然数:"))
for i in range(2,N):
#判断从2到这个数之间的数
if N%i==0:
result=False
break
#判断素数只需要判断它的根号之前的数
if i*i>N:
result=False
break
#如果都不能整除,则该数是素数
else:
result=True
if result:
print("您输入的数是素数%d" % N)
else:
print("您输入的数不是素数%d" % N)
3.请编写Python程序完成以下要求:提示用户从键盘上输入一个数num,判断该数num是否为回文数。(所谓回文数就是一个正数顺过来和反过来都是一样的,比如123321、15851等等,就是回文数)
注意点
#方法1:
num=input("请输入一个需要判断的整数:")
if num[::-1]==num:
print("这个数%s是回文数,它的回文数是%s"%(num,num[::-1]))
else:
print("这个数%s不是回文数"%num)
使用循环判断:
#方法2:
#构造逆序数
num=int(input("请输入一个需要判断的整数:"))
old_num=num
new_num=0
#只要num不为0,表示num里还有需要提取的最后一位
while num!=0:
last=num%10
num=num//10
new_num=new_num*10+last
if old_num==new_num:
print("这个数%d是回文数,它的回文数是%d"%(old_num,new_num))
else:
print("这个数%d不是回文数"%old_num)
4.请编写Python程序完成以下要求:定义函数用于求两个整数的最大公约数和最小公倍数,并编写主程序,提示用户从键盘上输入两个正整数,通过调用你定义的函数完成计算,并返回结果。
#方法1:
def maxDivider(a,b):
c=a
if a>b:
c=b
for i in range(c,0,-1):
if a%i==0 and b%i==0:
return i
def minMultipler(a,b):
c=max(a,b)
for j in range(c,a*b+1):
if j%a==0 and j%b==0:
return j
x,y=map(int,input("请输入两个整数:").split())
maxDivider=maxDivider(x,y)
minMultipler=minMultipler(x,y)
print("{}和{}的最大公约数是{},最小公倍数是{}".format(x,y,maxDivider,minMultipler))
#或者写得详细一点
def gcd(x, y):
"""求最大公约数"""
(x, y) = (y, x) if x > y else (x, y) # 如果x大于y就交换x和y的值
for factor in range(x, 0, -1): # 从两个数中较的数开始做递减的循环
if x % factor == 0 and y % factor == 0:
return factor
def lcm(x, y):
"""求最小公倍数"""
return x * y // gcd(x, y) #最小公倍数就是x*y/最大公约数
if __name__ == '__main__':
x = int(input('请输入一个正整数x :'))
y = int(input('请输入一个正整数y :'))
print('{}与{}的最大公约数是:{}'.format(x,y,gcd(x, y)))
print('{}与{}的最小公倍数是:{}'.format(x,y,lcm(x, y)))
#方法2:使用辗转相除法
def maxDivider_minMultipler(num1,num2):
n1,n2=num1,num2
while num1%num2!=0:
num1,num2=num2,num1%num2
maxDivider=num2
minMultipler=n1*n2//maxDivider
return maxDivider,minMultipler
x,y=map(int,input("请输入两个整数:").split())
#调用函数,return返回时候分别赋值给maxDivider,minMultipler
maxDivider,minMultipler=maxDivider_minMultipler(x,y)
print("{}和{}的最大公约数是{},最小公倍数是{}".format(x,y,maxDivider,minMultipler))
实验周 实验报告:程序的流程控制
1.请编写Python程序完成以下要求:编写程序提示用户从键盘输入3个整数,求出其中的最小值并输出。
a,b,c=map(int,input("请用户从键盘输入3个整数:").split())
#可以用自带函数做:print("最小的数是:{}".format(min(a,b,c)))
#定义函数比较两个数
def min_Num(x,y):
if x<y:
m=x
else:
m=y
return m
#两次调用
M=min_Num(min_Num(a,b),c)
print("最小的数是:{}".format(M))
2.请编写Python程序完成以下要求:编写程序从键盘输入一个1-7之间的整数,输出对应的英文单词表达的星期几。
提示:1表示星期一,7表示星期日,请将程序代码复制在下方:
(得分点提示:程序的可读性、功能是否正确、输入输出是否有提示信息)
N=int(input("请输入一个1-7之间的整数:"))
#把星期收集到一个列表中
list=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
#遍历列表判断
for i in range(len(list)):
if i == N:
print("输出的是:{}".format(list[i-1]))
3.请编写Python程序完成以下要求:编程实现输出10~50之间的3的倍数,并规定一行输出5个数。
提示:不要忘记一行输出5个数,请将程序代码复制在下方
#构造循环从10-50
#计数器初值为0
count=0
for i in range(10,51,3):
print("{:2}".format(i),end=" ")
count+=1
#每5个数换行
if count%5==0:
#因为python默认换行,所以不需要再次换行
print()
4.请编写Python程序完成以下要求:编写程序,输出100-1000之间的水仙花数。所谓水仙花数是指一个3位数,其各位数字的立方和等于该数本身。
# 所谓水仙花数是指一个3位数,其各位数字的立方和等于该数本身。
print("100-1000之间的水仙花分别是:")
for i in range(100,1000):
a=i//100
b=i//10%10
c=i%10
if a**3+b**3+c**3==i:
print(i)
5.请编写Python程序完成以下要求:打印*组成的倒置等腰三角形。利用循环语句打印如下图所示的图案。
* * *
*
#方法1:使用空格和循环调控
#打印星三角形
#遍历,空格与星搭配
for i in range(7,0,-2):
print(" "*((7-i)//2)+"*"*i)
#方法2:使用format格式化调控
for i in range(7,0,-2):
#居中显示
print("{:^7}".format("*"*i))
第6周 数据结构
单元测试
单元作业
1.请编写Python程序完成以下要求:编写函数,求斐波那契数列第n项的值,F0=1,F1=1,Fn=Fn-1+Fn-2。
提示:此题没有太大难度,只需要按照通项公式构造函数即可;需要注意的是:函数中需要对n=0和n=1这两种情况做特殊处理。
注意点
此题是求第几项,当然更多时候是打印前n项或者求前n项之和,可以使用递归和循环。
#定义一个求斐波那些数列的函数
def Fibo(n):
#判断前两项都是1
if n==0 or n==1:
return 1
else:
return Fibo(n-1)+Fibo(n-2)
if __name__ == '__main__':
n=int(input("请输入想求的第几项?"))
print(Fibo(n))
#如果是打印前n项并求和
print("本题根据题意包括第0项。")
def Fibo(n): #定义函数,输出斐波那契数列的前n项
a,b=1,1
sum=0
print(1,end=" ")
for i in range(1,n):
a, b = b, a + b # 更新斐波那契数列第i+1项的值,并计算第 i+2项的值
print(a, end=' ') #输出斐波那契数列的第i项
sum+=a
return "求和为:{}".format(sum+1)
if __name__ == '__main__':
n=int(input("请输入想求的第几项?"))
print(Fibo(n))
2.请编写Python程序完成以下要求:发红包了!请从李力的好友列表中依次读取好友的姓名,并给他(她)发送一个1-10元之间的随机红包,打印在屏幕上,并编写函数显示谁是最幸运的人(红包最大的那个人)。(lst = [“张伟”,“莉莉”,“小明”,“王刚”])
提示:本题需要建立一个字典存放人名和他随机得到的红包;使用random.uniform(1,10)可生成1-10以内的随机数。请将代码粘贴在下方。
注意点
random函数,random.uniform()
匿名函数lambda的用法
import random
#给出好友列表
lst = ["张伟","莉莉","小明","王刚"]
#建立一个空列表存放红包
d={}
#遍历字典,往红包里塞钱
for i in lst:
#生成随机红包
d[i]=random.uniform(1,10)
print(d)
#方法1:
#使用循环遍历字典,寻找最幸运者
max_num=0
luck_man=None
for i in lst:
if d[i]>max_num:
max_num=d[i]
luck_man=i
print("运气最好的人是{},他得到的红包是{:.2f}".format(luck_man,max_num))
#方法2:利用max函数或者
def Luck_man(x):
return d[x]
luck_man=max(d,key=Luck_man)
print("运气最好的人是{},他得到的红包是{:.2f}".format(luck_man,d[luck_man]))
#方法3:使用函数但是简写成lambda函数
luck_man=max(d,key=lambda i:d[i])
print("运气最好的人是{},他得到的红包是{:.2f}".format(luck_man,d[luck_man]))
实验周:函数的定义与使用
实验报告 单元作业
1.请编写Python程序完成以下要求:验证哥德巴赫猜想之一:2000以内的正偶数(大于等于4)都能够分解为两个质数之和。每个偶数表达成形如:4=2+2的形式,每行放6个式子。
提示:依照题意,应该将判断某个整数是否为质数的功能定义为一个函数,函数的输入为该整数,输出为逻辑类型数据:True或者False;主程序中构造循环,在循环体内将需要判断的数n拆成i和n-i(i和n-i都为小于n的正整数);调用定义好的函数分别判断i和n-i是否为质数,若i和n-i均为质数,就将n打印出来;因为格式的问题,一行不宜打印太多的式子,我们可以设置计数器count,每打印一条式子计数器+1,如果count能够被6整数,则打印一个换行。
注意点
质数的判断,计数器的使用。
#定义判断质数的函数
def IsPrime(x):
m=int(x**0.5)
for i in range(2,m+1):
if x%i==0:
return False
else:
return True
if __name__ == '__main__':
#设置计数器
count=0
for n in range(4,2001,2):
for i in range(2,n):
if IsPrime(i) and IsPrime(n-i):
print("{}={}+{}".format(n,i,n-i),end=" ")
count+=1
#每6个一行
if count%6==0:
print()
break
2.请编写Python程序完成以下要求:使用time 函数库中的函数求当前系统的日期,并计算当前日期是本年度的第几天。
提示:使用time函数库中的strftime()函数可以获得当前日期的字符形式;为了判断今年的年份是不是闰年,我们需要使用int()函数将获得的字符串格式的日期数据转换成整数;判断某年是否为闰年的规则为:闰年的年份应该可以被4整数但不能被100整数,或者该年份直接能被400整除;为了简化程序,可以在程序开始处设置两个列表,分别存放平年和闰年中每个月的天数,只需根据今年的年份是否为闰年选择使用对应列表中的数据进行累加即可得到系统日期为该年中的第几天。
(得分点提示:程序的可读性、功能是否正确)
获取当前系统日期的范例代码
import time
now = time.strftime("%Y/%m/%d")
year,month,day = now.split("/")
注意点
time函数的使用,闰年的判断,循环的遍历,累加。
代码
import time
#自动获取当前系统时间
now = time.strftime("%Y/%m/%d")
year,month,day = now.split("/")
#需要把字符串转换为整型
year,month,day =int(year),int(month),int(day)
#考虑闰年和平年二月时间不一样
Faburary=29 if year%4==0 and year%100!=0 or year%400==0 else 28
#把每个月天数放入容器
months=(31,Faburary,31,30,31,30,31,31,30,31,30,31)
sum_days=0
#根据月份来统计时间
for i in range(month-1):
sum_days+=int(months[i])
sum_days+=day
print("{}年{}月{}日是本年度第{}天。".format(year,month,day,sum_days))
3.请编写Python程序完成以下要求:题目:编写inputStu()和outputStu()函数输入、输出学生的数据记录。在主程序中通过调用定义好的inputStu()和outputStu()函数,完成5个学生的信息输入和输出,每个学生信息包括学号,姓名及三门课程的成绩。要求使用list来模拟学生记录结构。
#stu = [num,name,[Chinese,Math,English]]
#例如:stu=["B17130101","张三",[80,90,85]]
注意点
函数内部没有创建对象,stulist在外部构建新列表,不过也可以使用参数来做。
#定义inputStu函数添加内容
def inputStu():
sno,sname=input("请输入学生的学号和姓名(空格分隔)").split()
score=input("请输入学生的三门成绩(逗号分隔):").split(',')
#需要将分数转换
score=list(map(float,score))
stu=[sno,sname,score]
stulist.append(stu)
#定义outputStu()函数输出内容
def outputStu():
for i in stulist:
print("{}的学号为{},分数分别是{}分,{}分,{}分。".format(i[1],i[0],i[2][0],i[2][1],i[2][2]))
#在主程序中调用两个函数
if __name__ == '__main__':
stulist=[]
for i in range(5):
inputStu()
outputStu()