【未来虫教育】Python二级编程题:十二星座日期范围

一、题目来源

二千多年前希腊的天文学家希巴克斯命名十二星座,它们是水瓶座、双鱼座、白羊座、金牛座、双子座、巨蟹座、狮子座、处女座、天秤座、天蝎座、射手座、摩羯座。给出一个 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 码。 (该题共三问,共计20分,需要用第一问的解答结果求解第二问,用第二问结果求解第三问。本题解答第一问)‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

问题1:在 P301-1.py 文件中修改代码,读入 CSV 文件中数据,获得用户输入。根据用户输入的星座名称,输出此星座的出生日期范围。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

参考输入和输出示例格式如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

请输入星座中文名称(例如, 双子座):双子座

双子座的生日位于521-621之间

问题2:在 P301-2.py 文件中修改代码,读入 CSV 文件中数据,获得用户输入。用户键盘输入一组范围是 1 - 12 的整数作为序号,序号间采用空格分隔,以回车结束。屏幕输出这些序号对应的星座的名称、字符编码以及出生日期范围,每个星座的信息一行。本次屏幕显示完成后,重新回到输入序号的状态。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

参考输入和输出示例格式如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

请输入星座序号(例如,5 10): 5 10

双子座(9802)的生日是5月21日至6月21日之间

天蝎座(9807)的生日是10月24日至11月22日之间

请输入星座序号(例如,5):

问题3:在P301-3.py文件中修改代码,在问题 2 的基础上,对键盘输入的每个序号做合法性处理。如果输入的数字不合法,请输出"输入星座编号有误!",继续输出后续信息,然后重新回到输入序号的状态。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

参考输入和输出示例格式如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

请输入星座序号(例如,5 10): 5 14 11

双子座(9802)的生日是5月21日至6月21日之间

输入星座序号有误!

射手座(9808)的生日是11月23日至12月21日之间

请输入星座序号(例如,5 10):

二、标准答案

第一题:

# -*- coding:utf-8 -*-

This is a python123.io file.

fo = open("PY301-SunSign.csv","r",encoding='utf-8')

ls = []

for line in fo.readlines():

line = line.replace("\n","")

ls.append(line.split(","))

s = input("请输入星座中文名称(例如, 双子座):")

for i in range(len(ls)):

if s == ls[i][1]:

print("{}的生日位于{}-{}之间".format(s,ls[i][2],ls[i][3]))

第二题:

# -*- coding:utf-8 -*-

This is a python123.io file.

fo = open("PY301-SunSign.csv", 'r',encoding='UTF-8')

ls = []

for line in fo.readlines():

ls.append(line.replace("\n", '').split(','))

# li = line.strip().split(',')

sall = input('请输入星座序号(例如,5 10):')

while sall != '':

lsNum = sall.split()

for s in lsNum:

for i in range(len(ls)):

if s == ls[i][0]:

print("{}({})的生日是{}月{}日至{}月{}日之间".format(ls[i][1],ls[i][4],ls[i][2][:-2],ls[i][2][-2:],ls[i][3][:-2],ls[i][3][-2:]))

sall = input('请输入星座序号(例如,5 10):')

第三题

# -*- coding:utf-8 -*-

This is a python123.io file.

fo = open("PY301-SunSign.csv", 'r',encoding='UTF-8')

ls = []

for line in fo.readlines():

ls.append(line.replace("\n", '').split(','))

# li = line.strip().split(',')

sall = input('请输入星座序号(例如,5 10):')

while sall != '':

lsNum = sall.split()

for s in lsNum:

if 1 <= int(s) <=12:

for i in range(len(ls)):

if s == ls[i][0]:

print("{}({})的生日是{}月{}日至{}月{}日之间".format(ls[i][1],ls[i][4],ls[i][2][:-2],ls[i][2][-2:],ls[i][3][:-2],ls[i][3][-2:]))

else:

print("输入星座序号有误!")

sall = input('请输入星座序号(例如,5 10):')

三、个人解法

第一题

xingzuo = input("请输入星座中文名称(例如,双子座):")

lst = []

with open("PY301-SunSign.csv","r",encoding="utf-8") as f:

for i in f.readlines():

lst.append(i.strip().split(','))

for item in lst:

if item[1]==xingzuo:

print("{0:}的生日位于{1:}-{2:}之间".format(xingzuo,item[2],item[3]))

第二题

xuhao = input("请输入星座序号(例如,5 10):").split()

lst = []

with open("PY301-SunSign.csv","r",encoding="utf-8") as f:

for i in f.readlines():

lst.append(i.strip().split(','))

for elm in xuhao:

for item in lst:

if item[0]==elm:

print("{0:}({1:})的生日是{2:}月{3:}日至{4:}月{5:}日之间".format(item[1],item[4],item[2][:-2],item[2][-2:],item[3][:-2],item[3][-2:]))

第三题

xuhao = input("请输入星座序号(例如,5 10):").split()

lst = []

with open("PY301-SunSign.csv","r",encoding="utf-8") as f:

for i in f.readlines():

lst.append(i.strip().split(','))

for elm in xuhao:

if eval(elm) in range(1,13):

for item in lst:

if item[0]==elm:

print("{0:}({1:})的生日是{2:}月{3:}日至{4:}月{5:}日之间".format(item[1],item[4],item[2][:-2],item[2][-2:],item[3][:-2],item[3][-2:]))

else:

print("输入星座编号有误!")

四、个人总结

代码书写中注意全角和半角符号的区别,很容易导致错误。编写过程中还是要细心认睦,保持谨慎负责的态度。