目录
一、实验目的与要求
(1)通过本次实验,学生应掌握字符串索引、切片和一些常用方法的使用;
(2)掌握列表创建的基本方法,能实现列表元素增加、查询、排序等常见操作;
(3)能结合应用问题选择合适的数据结构进行问题求解;
(4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果)
二、实验内容
请使用Python语言在Jupyter Notebook环境下编程,完成下列题目的要求:
1、通过用户输入的身份证号,输出对应的出生日期。程序运行的效果如下:
提示:可以使用字符串切片进行年月日信息的提取。
2、自幂数是指一个n位数 (n≥3),它的每个位上的数字的n次幂之和等于它本身。例如153就是一个自幂数(当n=3时也称为水仙花数),因为153=1^3+5^3+3^3。请按下面的运行结果找出用户输入范围内的所有自幂数。
提示:可以考虑把整数转换成数值字符串,再按顺序分离出各个位置上的数字字符串,并转换成整数后进行计算。例如:判断整数1234是否是自幂数,可以把它转换成字符串”1234”,然后通过for循环依次取出字符“1”、“2”、“3”和“4”,再分别转换成整数就可以快速得到原来整数1234各个位置上的数字了,这样再判断是否是自幂数就比较方便了。
3、对于给定的字符串"Where there is a will, there is a way. The important point is that you must have the will to achieve success.",请统计该字符串中不重复的单词数,并把这些单词按字母顺序降序排列,输出效果如下所示:
提示:考虑使用下列处理过程:
(1)用空格替换串中的英文逗号和句号,去除标点符号的影响;
(2)用字符串对象的split()方法提取出单词;
(3)把split()方法的结果转换为集合进行自动去重;
(4)而排序时则需要把去重后的集合转换为列表来实现。
4、请按照教材教材第83页实训2中表3-5给出的数据完成食物菜单的建立与查询。建议使用一个列表存储食品大类,另一个列表存储各类食物的详细菜单。程序运行结果可以参考如下图:
提示:本题主要涉及列表元素的增加与查询。
三、主要程序清单和程序运行结果
第1题
1、通过用户输入的身份证号,输出对应的出生日期。程序运行的效果如下:
提示:可以使用字符串切片进行年月日信息的提取。
id=input("请输入身份证号:")
year=id[6:10]
month=id[10:12]
day=id[12:14]
print("出生日期:{}年{}月{}日".format(id[6:10],id[10:12],id[12:14]))
第2题
2、自幂数是指一个n位数 (n≥3),它的每个位上的数字的n次幂之和等于它本身。例如153就是一个自幂数(当n=3时也称为水仙花数),因为153=1^3+5^3+3^3。请按下面的运行结果找出用户输入范围内的所有自幂数。
提示:可以考虑把整数转换成数值字符串,再按顺序分离出各个位置上的数字字符串,并转换成整数后进行计算。例如:判断整数1234是否是自幂数,可以把它转换成字符串”1234”,然后通过for循环依次取出字符“1”、“2”、“3”和“4”,再分别转换成整数就可以快速得到原来整数1234各个位置上的数字了,这样再判断是否是自幂数就比较方便了。
法一:for循环
n = int(input("请输入10的n次幂(n>=3): ")) # 使用int来确保输入的安全性
end = 10 ** n
print(f"{end}以内的自幂数包括:")
for j in range(100, end): # 直接使用end,end已经是10**n的结果
number_str = str(j)
length = len(number_str)
sum_of_powers = sum(int(digit) ** length for digit in number_str)
if sum_of_powers == j:
print(j)
直接在循环内部处理每个数字,而不是调用一个单独的函数来检查它是否是自幂数。这样做简化了代码的结构,但牺牲了一些可读性和重用性。对于这个特定的任务,由于逻辑相对简单,直接在循环中实现功能并不会造成太大的问题。
这段代码遍历从100到10**n的所有数字,对每个数字转换为字符串,然后计算其每一位数字的n次幂之和。如果这个和等于原始的数字,就打印出这个数字,表示它是一个自幂数。
法二:定义函数
n = int(input("请输入10的n次幂(n>=3): ")) # 使用int来确保输入的安全性
end = 10 ** n
print(f"{end}以内的自幂数包括:")
def is_armstrong(number_str):
length = len(number_str)
sum_of_powers = sum(int(digit) ** length for digit in number_str)
if sum_of_powers == int(number_str):
print(sum_of_powers)
for j in range(100, end): # 直接使用end,end已经是10**n的结果
is_armstrong(str(j))
这个代码保持了原有的逻辑结构,同时采用了一些更安全和更清晰的代码实践。注意,这里使用列表推导式来计算幂之和,使代码更加简洁。根据题目要求和自幂数的定义(n>=3),从100开始是合理的。
第3题
3、对于给定的字符串"Where there is a will, there is a way. The important point is that you must have the will to achieve success.",请统计该字符串中不重复的单词数,并把这些单词按字母顺序降序排列,输出效果如下所示:
提示:考虑使用下列处理过程:
(1)用空格替换串中的英文逗号和句号,去除标点符号的影响;
(2)用字符串对象的split()方法提取出单词;
(3)把split()方法的结果转换为集合进行自动去重;
(4)而排序时则需要把去重后的集合转换为列表来实现。
import re
s = "Where there is a will, there is a way. The important point is that you must have the will to achieve success."
a = s.replace('.',' ')
b = a.replace(',',' ')
words = b.split()
# 这里还可以使用正则表达式移除标点符号并分割单词
# words = re.findall(r'\b\w+\b', s)
# 转换成集合去除重复单词,然后计算不重复单词的数量
unique_words = set(words)
unique_count = len(unique_words)
print("字符串中不重复的单词数:", unique_count)
# 对不重复的单词列表进行降序排序
sorted_unique_words = sorted(unique_words, key=str.lower, reverse=True) # key=str.lower确保排序时不区分大小写
print("这些单词降序排列的结果:{}".format(sorted_unique_words))
在这个代码中,或者可以使用正则表达式re.findall(r'\b\w+\b', s)用于找到所有单词,其中\b表示单词边界,\w+匹配一个或多个字母数字字符。这样可以直接提取出所有单词,无需手动替换标点符号。
注意,这里在排序时使用了key=str.lower参数,这是为了确保排序过程中不区分大小写,因为默认的字符串排序是区分大小写的,可能会导致所有大写字母开头的单词排在小写字母开头的单词之前。
第4题
4、请按照教材教材第83页实训2中表3-5给出的数据完成食物菜单的建立与查询。建议使用一个列表存储食品大类,另一个列表存储各类食物的详细菜单。程序运行结果可以参考如下图:
提示:本题主要涉及列表元素的增加与查询。
#s1=['汉堡类','小食类','饮料类']
#s2=[['香辣鸡腿堡','劲脆鸡腿堡','新奥尔良烤鸡腿堡','半鸡半虾堡'],['薯条','黄金鸡块','香甜粟米棒'],['可口可乐','九珍果汁','经典咖啡']]
s1=[]
s2=[]
while(True):
menu=input("请输入食品大类(输入q退出食品输入):")
if menu=='q':
break
print()
s1.append(menu)
details=input("请输入{}的详细食物清单,多个食物直接用空格分开:".format(menu)).split()
s2.append(details)
print()
print("当前的食品大类包括:",s1)
print("当前的详细食品菜单是:",s2)
print()
while True:
try:
operation=int(input("请输入要查询的食品大类(输入0则退出程序):"))
if operation==0:
print("感谢使用")
break
print("{}食品的详细食物菜单是{}".format(s1[operation-1],s2[operation-1]))
except ValueError: # 处理非数字输入
print("请输入有效的数字")
except IndexError: # 处理数字不在范围内的情况
print("请输入有效的食品大类编号")
用户可以输入食品大类和对应的详细食物清单,随后可以通过输入食品大类的编号查询具体的食物清单。这个程序是基于列表的索引来实现的。
代码使用了try-except语句来处理可能出现的异常,例如用户输入的不是数字(ValueError)或者输入的数字超出了列表的范围(IndexError)。这样可以提高程序的健壮性,避免因为无效输入而崩溃。
四、实验结果分析与体会
通过本次实验,掌握了字符串索引、切片和一些常用方法的使用,以及列表创建的基本方法,能实现列表元素增加、查询、排序等常见操作,能结合应用问题选择合适的数据结构进行问题求解。在使用字符串时,我们需要注意Unicode编码的特点,即中英文字符都是一个长度单位。同时,我们可以使用strip()方法去掉字符串首尾的空格或指定字符,使用split()方法根据指定字符分割字符串。此外,字符串还支持拼接运算符+、重复操作符*、in操作符等。
列表是一种非常灵活的数据类型,可以存储各种类型的元素,并且支持增删改查等各种操作。我们可以使用append()方法向列表中添加元素,使用pop()方法删除元素,使用sort()方法排序等。此外,列表还支持切片操作、列表推导式等高级用法。