代码框中给出的代码是提示代码,你可以局部修改,或者全部删除重写。
本题对应三个问题,请按照文件内说明修改代码,实现以下功能:
二千多年前希腊的天文学家希巴克斯命名十二星座,它们是水瓶座、双鱼座、白羊座、金牛座、双子座、巨蟹座、狮子座、处女座、天秤座、天蝎座、射手座、魔蝎座。给出一个CSV文件(PY301-SunSign.csv),内容示例如下:
序号,星座,开始月日,结束月日,Unicode
1,水瓶座,120,218,9810
2,双鱼座,219,320,9811
3,白羊座,321,419,9800
4,金牛座,420,520,9801
5,双子座,521,621,9802
…(略)
以第1行为例,120表示1月20日,218表示2月18日,9810是Unicode码。
问题1(5分):在代码框中修改代码,读入CSV文件中的数据,获得用户输入。根据用户输入的星座名称,输出此星座的出生日期范围。
参考输入和输出示例格式如下:
请输入星座中文名称(例如,双子座):双子座
双子座的生日位于521-621之间
fi=open('PY301-SunSign.csv','r',encoding='utf-8')
name=input('请输入星座中文名称(例如,双子座):')
ls=[]
for m in fi.readlines():
ls.append(m.strip('\n').split(','))
for n in range(len(ls)):
if ls[n][1]==name:
print("{}的生日位于{}-{}之间".format(name,ls[n][2],ls[n][3]))
这一问采取的步骤比较简单,先读入文件(不要忘记encoding=‘utf-8’哦,不然在idle上可能会出现报错),然后遍历fi.readlines(),记住这个fi.readlines()的结果是一个列表,每一行的文本都是里面的一个元素,但是每个元素后面都有’\n’,所以取到后要去掉,然后用split(‘,’),把每一行元素里的子元素以逗号分隔变成列表,加到ls里面。这个时候ls是一个二维列表。然后以这个二维列表的个数去遍历,如果某一行的第一个元素刚好和用户输入的星座名一样,那我们就把这行元素的相关值输出出来。
问题2(10分):在代码框中修改代码,读入CSV文件中数据,获得用户输入。用户键盘输入一组范围是1-12的证书作为序号,序号间采用空格分隔,以回车结束。屏幕输出这些序号对应的星座的名称、支付编码以及出生日期范围,每个星座的信息一行。本次屏幕显示完成后,重新回到输入序号的状态。
参考输入和输出示例格式如下:
请输入星座序号(例如,5):5 10
双子座(9802)的生日是5月21日至6月21日之间
天蝎座(9807)的生日是10月24日至11月22日之间
请输入星座序号(例如,5):
fi=open('PY301-SunSign.csv','r',encoding='utf-8')
ls = []
num=input('请输入星座序号(例如,5):')
while num:
lst=num.split(' ')
for m in fi:
ls.append(m.strip('\n').split(','))
for n in range(len(ls)):
for k in lst:
if ls[n][0]==k:
print("{}({})的生日是{}月{}日至{}月{}日之间".format(ls[n][1],ls[n][-1],ls[n][2][:-2],ls[n][2][-2:],ls[n][3][:-2],ls[n][3][-2:]))
num=input('请输入星座序号(例如,5):')
这一问的一个难点就是while使用,用来实现上一次输出结束后,又回到新的输入状态。我们可以把while的条件干脆定义成num这个输入的值,这样如果啥也不输,它就结束了,就没有下一次了。如果输了值,就会进入下一次循环。然后剩下遍历搜索的思路和框架都和第一问如出一辙。
问题3(5分):在问题2的基础上,在编程模板 文件中修改代码,对键盘输入的每个序号做合法性处理。如果输入的数字不合法,请输出“输入星座编号有误!”,继续输出后续信息,然后重新回到输入序号的状态。
参考输入和输出示例格式如下:
请输入星座序号(例如,5):5 14 11
双子座(9802)的生日是5月21日至6月21日之间
输入星座序号有误!
射手座(9808)的生日是11月23日至12月21日之间
请输入星座序号(例如,5):
fi=open('PY301-SunSign.csv','r',encoding='utf-8')
ls = []
num=input('请输入星座序号(例如,5):')
for m in fi:
ls.append(m.strip('\n').split(','))
while num:
lst=num.strip('\n').split(' ')
for k in lst:
if 0<int(k)<len(ls):
for n in range(len(ls)):
if ls[n][0]==k:
print("{}({})的生日是{}月{}日至{}月{}日之间".format(ls[n][1],ls[n][-1],ls[n][2][:-2],ls[n][2][-2:],ls[n][3][:-2],ls[n][3][-2:]))
else:
print('输入星座序号有误!')
num=input('请输入星座序号(例如,5):')
这里有几个需要提醒的点: