程序题
1、程序设计结构
1.编写题目,实现分段函数计算
代码
x = int(input('Please input x:'))
if x < 0:
print(0)
elif x < 5:
print(x)
elif x < 10:
print(3*x - 5)
elif x < 20:
print(0.5*x - 2)
else :
print(x)
测试图示
2.编写程序,运行后用户输入4位整数作为年份,判断其是否为闰年。如果年份能被400整除,则为闰年;如果年份能被4整除但不能被100整除也为闰年。
代码
year = int(input("请输入一个4位数字的年份:"))
if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
print(year, "是闰年")
else:
print(year, "不是闰年")
测试图示
3.有1、2、3、4四个数字,能组成多少个互不相同的3位数(3位数的每位数字都不相同)?
代码
num = 4
pnum = 3
i = 0
sum = 1
while i < pnum:
sum = sum * (num-i)
i = i + 1
print("共有", sum, "个")
测试图示
4.使用选择结构和循环结构求解百钱买百鸡问题。假设大鸡5元一只,中鸡3元一只,小鸡1元三只,现有100元钱想买100只鸡,有多少种买法?
代码
i = 0
j = 0
while i <= 14:
j = 0
while j <= 25:
if 7*i + 4*j == 100:
print(i, j, 100-i-j)
j = j + 1
i = i + 1
测试图示
5.编写程序,打印九九乘法表,同一行上的两个式子之间输出时空两个空格。
代码
i = 1
j = 1
while i <= 9:
j = 1
while j <= i:
print(f"{i}*{j}={i*j}", end=" ")
j = j + 1
i = i + 1
print("\n")
测试图示
2、组合数据类型
1.列表list1=[3,8,11,26,47],从键盘输入一个新的元素,将该元素插入列表list1中,保持列表list1中的元素有序。编程实现上述功能。
代码
list1 = [3, 8, 11, 26, 47]
num = int(input("请输入一个新的数字:"))
list1.append(num)
print(list1)
测试图示
元组grade=(68,87,83,91,93,79,68,86,66,78),按学号从小到大的顺序保存学生的成绩,实现如下功能:
(1)输出grade中的第2个元素
(2)输出grade中的第3-7个元素。
(3)使用in查询 grade中是否包含成绩87
(4)调用index函数在 grade中查找给定成绩为78的学生学号,第一个学生的学号为1.
(5)调用count()函数查询成绩68在 grade中的出现次数
(6)使用len( )函数获取 grade中的元素个数。
代码
grade = (68, 87, 83, 91, 93, 79, 68, 86, 66, 78)
print("元组grade为:", grade)
print("元组grade中第二个元素为:", grade[1])
print("元组中第3-7个元素为:", grade[2:7:1])
print("grade中是否有给定成绩87:", grade.index(87) != -1)
print("成绩68在元组grade中的出现次数为:", grade.count(68))
print("元组grade中的元素个数为:", len(grade))
测试图示
将某班学生的《Python程序设计》这门课程的成绩保存在字典中,学号为键(key),分数为值(value),如score = {‘001’: 96, ‘002’: 98, ‘003’: 92, ‘004’: 93, ‘005’: 94}。实现如下功能:
(1)向字典中添加学号为:006,成绩为:100分的学生成绩。
(2)修改字典中指定学生成绩,修改字典中学号为002的学生成绩为99分。
(3)删除学号为001的学生成绩。
(4)查询学号为004的学生的成绩。
(5)统计学生成绩,如最高分、最低分、平均分等。
代码
score = {'001': 96, '002': 98, '003': 92, '004': 93, '005': 94}
print("最初的学生成绩为:", score)
score['006'] = 100
print("向字典中添加006号学生成绩为:", score)
score['002'] = 99
print("修改字典中002号学生成绩后:", score)
score.pop('001')
print("删除001号学生成绩后:", score)
print("编号为004的分数为:", score.get('004'))
print("最高分为:", max(score.values()))
print("最低分为:", min(score.values()))
print("平均分为:", sum(score.values())/len(score))
测试图示
- set1={2,5,9,1,3},set2={3,6,8,2,5},调用集合操作符或函数完成以下功能:
(1)向set1中添加一个新的元素7。
(2)求set1和set2的并集。
(3)求set1和set2的交集。
(4)求set1和set2的差集。
(5)判断给定关键字key=4是否在set1或se2中。
代码
set1 = {2, 5, 9, 1, 3}
set2 = {3, 6, 8, 2, 5}
set1.add(7)
print("添加元素7后的集合为:", set1)
print("集合set1和set2的并集为:", set1 | set2)
print("集合set1和set2的交集为:", set1 & set2)
print("集合set1和set2的差集为:", set1 - set2)
print("关键字key = 4 是否在集合中:", (4 in set1) or (4 in set2))
测试图示
3、字符串
1.给定一个字符串str1 = “君子之行,静以修身,俭以养德,非淡泊无以明志,非宁静无以致远”,编程实现以下功能:
(1)输出字符串str1。
(2)输出字符串str1中的字符"德"。
(3)输出字符串str1的子字符串"非淡泊无以明志,非宁静无以致远"。
代码
str1 = "君子之行,静以修身,俭以养德,非淡泊无以明志,非宁静无以致远"
print(str1)
print(str1[str1.index('德')])
print(str1[str1.find('非'):])
测试图示
2.编写程序,输入一个包含若干整数的列表,把列表中所有整数转换为字符串,然后输出包含这些字符串的列表。例如,输入[1,2,3,4,5,888],输出[‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘888’]。
代码编写提示:使用“map函数”或者“列表推导式”
代码
print(list(map(str, eval(input("请输入整数列表:")))))
测试图示
3.编写一个程序,删除列表list1 = [“Python”,“Java”,“Php”,“Java”,“Python”]中的重复元素。删除后的列表为[‘Python’, ‘Java’, ‘Php’]。
输出语句可直接使用下面写法:
print(“原列表=”,list1)
print(“删除后列表=”,list1)
代码
list1 = ["Python", "Java", "Php", "Java", "Python"]
print("原列表=", list1)
list2 = []
for i in list1:
if i not in list2:
list2.append(i)
print("删除后列表:", list2)
测试图示
编写程序,检查用户输入的密码字符串的安全强度。
(1)检测用户输入的密码长度大于等于6位。若不符合要求,请输出"长度小于6个字符"。
(2)密码有"weak"、 “middle”、“strong”三个等级,密码中包含数字、小写字母、大写字母三类字符中的一种强度为"weak”,两种强度为"middle",三种强度为"strong"。(密码中也可以含有其他字符)
代码
# 采用正则表达式
import re
pwd = input("请输入密码:")
if len(pwd) < 6:
print("长度小于6个字符")
elif re.findall("(^[0-9]+$)|(^[a-z]+$)|(^[A-Z]+$)", pwd):
print("week")
elif re.findall("(^[0-9a-z]+$)|(^[0-9A-Z]+$)|(^[a-zA-Z]+$)", pwd):
print("middle")
elif re.findall("\w", pwd):
print("strong")
测试图示
4、函数
1.编写函数,接收一个字符串,判断该字符串是否为回文。所谓回文是指从前向后读和从后向前读是一样的。
代码
def check_hw(str):
if str == str[-1::-1]:
return True
return False
str1 = input("请输入字符串:")
if check_hw(str1):
print(str1, "是回文")
else:
print(str1, "不是回文")
测试图示
判断用户是否登录成功。
(1)系统里面有多个用户, 用户名和对应的密码信息保存在以下元组和列表里面:
userName = (“zhangsan”,“lisi”,“wangwu”,“zhaoliu”,“xiaolin”,“xiaohua”)
pwList=[‘123’,‘456’,‘789’,‘246’,‘abc’,‘abc1234’]
用户名和密码的顺序是对应的,例如:zhangsan的密码是123,lisi的密码是456
(2)用户登录(判断用户登录是否成功):
①编写一个函数判断用户是否存在?(如果用户存在,返回用户索引)
②编写一个函数,判断用户密码是否正确?, (根据pwList[用户索引]取出该用户的密码与输入的密码对比)
如果用户名和密码正确:登录成功, 退出程序;
如果输入的用户不存在:重新输入用户名,总共有三次输入用户名的机会,三次输入都失败,退出程序。
如果密码不正确:重新输入密码,总共有三次输入密码的机会,三次输入密码失败,退出程序
代码
import sys
def isExistUser(user,username):
if user in userName:
return userName.index(user)
return False
def isPwdTrue(pwd,pwList,index):
if pwList[index] == pwd:
return True
return False
userName = ("zhangsan", "lisi", "wangwu", "zhaoliu", "xiaolin", "xiaohua")
pwdList = ['123', '456', '789', '246', 'abc', 'abc1234']
while True:
i = 0
while True:
user = input("请输入用户名:")
if isExistUser(user,userName):
j = 0
while True:
pwd = input("请输入密码:")
if isPwdTrue(pwd,pwdList,isExistUser(user,userName)):
print("登录成功")
sys.exit(0)
else:
print("密码不正确")
j = j + 1
if j == 3:
print("密码输入超过3次")
sys.exit(0)
else:
print("用户不存在")
i = i + 1
if i == 3:
print("用户名输入超过3次")
sys.exit(0)
测试图示
5、面向对象程序设计
1.设计一个“超市管理系统”,要求如下:
(1)系统包括5种操作,分别是:1.查询商品;2.新增商品;3.卖出商品;4.汇总;-1.退出系统。
(2)选择操作序号“1”,显示所有库存商品
(3)选择操作序号“2”,添加新的商品(包括商品名称、进货价格、销售价格、进货数量)。
(4)选择操作序号“3”,卖出商品(输入卖出商品名称,若商品有库存,输入销售数量,若库存数量大于等于销售数量,卖出商品,并进行收银,并将库存数量减去销售数量)
(5)选择操作序号“4”,汇总现有库存商品,包括每种商品名称、进货价格、销售价格、库存数量,显示进货总货款,显示总销售额。
(6)选择操作序号“-1”,退出系统。
代码
# 定义商品类
class Good:
# 定义构造方法
def __init__(self, g_name, in_price, out_price, g_num):
self.g_name = g_name
self.in_price = in_price
self.out_price = out_price
self.g_num = g_num
# 定义toString方法
def __str__(self):
return f"商品名称:{self.g_name},进货价格{self.in_price},销售价格{self.out_price},库存数量{self.g_num}"
def output_list(self):
return f"{self.g_name}\t\t\t{self.in_price}\t\t\t{self.out_price}\t\t\t{self.g_num}"
# 定义管理员类
class Manger:
goods = [] # 商品列表
total_sales = 0 # 总销售额
total_purchase = 0 # 总进货额
# 菜单栏
def menu(self):
print("***********欢迎进入超市管理系统***********\n"
"1. 查询商品\n"
"2. 新增商品\n"
"3. 卖出商品\n"
"4. 汇总\n"
"-1.退出\n")
while True:
index = input("******请输入菜单编号:")
if index == "1":
self.show_all_goods()
elif index == "2":
self.add_goods()
elif index == "3":
self.sales_out()
elif index == "4":
self.count_goods()
elif index == "-1":
print("谢谢使用!")
break
else:
print("输入错误请重新输入!")
# 显示全部商品
def show_all_goods(self):
if len(self.goods) == 0:
print("当前库存商品为零")
else:
for k in self.goods:
print(k)
# 添加商品
def add_goods(self):
name = input("请输入商品名称:")
if self.check_good(name):
print("商品存在,无法添加")
else:
in_price = eval(input("请输入进货价格:"))
out_price = eval(input("请输入售货价格:"))
num = eval(input("请输入进货数量:"))
good = Good(name, in_price, out_price, num)
self.goods.append(good)
print("添加成功")
self.total_purchase -= num * good.in_price
# 卖出商品
def sales_out(self):
g_name = input("请输入商品名称:")
if self.check_good(g_name):
good = self.find_good(g_name)
sales_num = eval(input("请输入销售数量:"))
if sales_num < good.g_num:
good.g_num -= sales_num
f_money = good.out_price * sales_num
print(f"应付款={f_money}")
self.total_sales += f_money
good.g_num -= sales_num
money = eval(input("请输入付款金额:"))
if money > f_money:
print(f"找零={money - f_money}")
else:
print("无法支付")
if good.g_num == 0:
self.goods.remove(good)
else:
print("库存不足")
else:
print("商品不存在")
# 输出汇总
def count_goods(self):
if len(self.goods) == 0:
print("当前库存商品为零")
else:
print("----------------------------------------------------")
print("商品名称\t\t进货价格\t\t销售价格\t\t库存数量")
for k in self.goods:
print(k.output_list())
print(f"总销售额:{self.total_sales}")
print(f"总进货额:{self.total_purchase}")
print("----------------------------------------------------")
# 检查商品是否存在
def check_good(self, name):
if len(self.goods) == 0:
return False
for k in self.goods:
if k.g_name == name:
return True
return False
# 查找商品
def find_good(self, name):
for k in self.goods:
if k.g_name == name:
return k
if __name__ == '__main__':
Manger().menu()
2.编程实现如下功能:
(1)定义一个抽象类Shape,在抽象类 Shape中定义求面积 getArea()和周长 getPerimeter()的抽象方法。
(2)分别定义继承抽象类Shape的3个子类即Triangle(三角形)、Rectangle(矩形)、和Circle(圆),在这3个子类中重写 Shape中的方法getArea()和 getPerimeter( )。
(3)分别创建类Triangle的对象t1,创建类Rectangle的对象r1,创建类Circle的对象c1,并输入所需的边长和半径,分别调用对象t1、r1、c1的getArea方法和getPerimeter(),输出各个对象的面积和周长。(求圆的周长和面积时π值取3.14)
import abc
import math
import sys
# 抽象类
class Shape(metaclass=abc.ABCMeta):
# 面积
@abc.abstractmethod
def getArea(self):
pass
# 周长
@abc.abstractmethod
def getPerimeter(self):
pass
# 三角形
class Triangle(Shape):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
if not self.judgeInput():
print("输入的三边长不能构成三角形")
sys.exit(0)
def getArea(self):
return 0.25*math.sqrt((self.a+self.b+self.c)*(self.a+self.b-self.c)*(self.b+self.c-self.a)*(self.a+self.c-self.b))
def getPerimeter(self):
return self.a+self.b+self.c
def judgeInput(self):
a1 = self.a+self.b - self.c
a2 = (self.a-self.b) - self.c
b1 = self.b+self.c - self.a
b2 = (self.b-self.c) - self.a
c1 = self.a+self.c-self.b
c2 = (self.a-self.c)-self.b
if (a1 > 0 and a2 < 0) and (b1 > 0 and b2 < 0) and (c1 > 0and c2 < 0):
return True
else:
return False
# 矩形
class Rectangle(Shape):
def __init__(self,a,b):
self.a = a
self.b = b
def getArea(self):
return self.a*self.b
def getPerimeter(self):
return (self.a+self.b)*2
# 圆
class Circle(Shape):
def __init__(self,r):
self.r = r
def getArea(self):
return 3.14*self.r**2
def getPerimeter(self):
return 2*3.14*self.r
if __name__ == '__main__':
a1 = eval(input("请输入三角形边长a1:"))
a2 = eval(input("请输入三角形边长a2:"))
a3 = eval(input("请输入三角形边长a3:"))
t1 = Triangle(a1, a2, a3)
print(f"三角形面积={t1.getArea()}")
print(f"三角形周长={t1.getPerimeter()}")
b1 = eval(input("请输入矩形边长b1:"))
b2 = eval(input("请输入矩形边长b2:"))
r1 = Rectangle(b1, b2)
print(f"矩形面积={r1.getArea()}")
print(f"矩形周长={r1.getPerimeter()}")
r1 = eval(input("请输入圆的半径r1:"))
c1 = Circle(r1)
print(f"圆面积={c1.getArea()}")
print(f"圆周长={c1.getPerimeter()}")
6、模块、包和库
1.使用Turtle模块绘制一个五角星。
代码
import turtle
turtle.screensize(700, 600, "#0099CC") # 设置画布尺寸和背景颜色
turtle.setup(600, 600, 100, 200) # 设置画布尺寸和相对窗口出现位置
turtle.pensize(2) # 设置画笔的宽度
turtle.speed(20) # 设置绘制速度
turtle.penup() # 提起画笔
turtle.goto(-100, 50) # 调整起始绘制点
turtle.pendown() # 按下画笔,开始作画
turtle.begin_fill() # 开始填充
turtle.pencolor("#ed1c24") # 设置画笔颜色
turtle.fillcolor('#ed1c24') # 设置填充颜色
i = 0
while i < 5:
turtle.forward(200)
turtle.right(144)
i = i + 1
turtle.end_fill() # 结束填充
turtle.done() # 使窗口一直显示
测试图示
2.利用random模块中的randint()函数,产生30个介于1-100间的随机整数,将产生的数据放在列表list1中,按照从小到大的顺序排序并输出。
代码
import random
list1 = []
for i in range(30):
list1.append(random.randint(1,100))
list1.sort()
print(list1)
测试图示
3.通过datetime模块中的datetime类的now方法创建一个对象,获取系统当前日期时间,并按照:XXXX年X月X日X时X分X秒的格式输出。格式例如下图所示。
代码
from datetime import datetime
now = datetime.now()
print(f"现在时刻是:{now.year} 年{now.month}月{now.day}日{now.hour}时{now.minute}分{now.second}秒")
测试图示
7、正则表达式
1.编写一个程序,使用正则表达式校验输入的手机号是否正确?
代码
import re
while True:
phone_str = input("请输入手机号,输入-1程序结束:")
if phone_str == "-1":
break
elif re.match('^1[0-9]{10}$', phone_str):
print("您输入的手机号格式正确")
else:
print("您输入的手机号格式不正确")
测试图示
2.编写一个程序,使用正则表达式校验输入的车牌号那种类型的车辆。
注意:中国车牌规则。
一、燃油汽车号牌共七位。
1、车牌第1位是汉字代表该车户口所在的省级行政区,为各(省、直辖市、自治区)的简称:[京沪津渝鲁冀晋蒙辽吉黑苏浙皖闽赣豫湘鄂粤桂琼川贵云藏陕甘青宁新港澳台];
2、车牌第2位是英文字母代表该车户口所在的地级行政区,为各(地级市、地区、自治州、盟)字母代码。
3、车牌3-7位编号字符由阿拉伯数字或阿拉伯数字和英文字母组成。序号编码规则有二种,分别是:
① 序号的每一位可以都使用阿拉伯数字;
② 序号的每一位可单独使用英文字母或阿拉伯数字,26个英文字母中O和I不能使用;
二、新能源车号牌共八位:
第1位和第2位与传统车牌一致,第3到第8位的序号规则如下:
① 小型车:第3位只能是字母D或F,第4位可以是数字或字母,第5到8位必须是数字。
② 大型车:第3位到第7位必须是数字,第8位只能是字母D或F。
③ 26个英文字母中O和I不能使用;
代码
import re
# 检查燃油车辆
def check_p(car_str):
pattern = re.compile('^[京沪津渝鲁冀晋蒙辽吉黑苏浙皖闽赣豫湘鄂粤桂琼川贵云藏陕甘青宁新港澳台]{1}[A-Z]{1}[a-zA-HJ-NP-Z0-9]{5}$')
res = pattern.findall(car_str)
if res:
return True
else:
return False
# 检查新能源小型车辆
def check_x(car_str):
pattern = re.compile('^[京沪津渝鲁冀晋蒙辽吉黑苏浙皖闽赣豫湘鄂粤桂琼川贵云藏陕甘青宁新港澳台]{1}[A-Z]{1}(D|F){1}[a-zA-HJ-NP-Z0-9]{1}[0-9]{4}$')
res = pattern.findall(car_str)
if res:
return True
else:
return False
# 检查新能源大型车辆
def check_d(car_str):
pattern = re.compile('^[京沪津渝鲁冀晋蒙辽吉黑苏浙皖闽赣豫湘鄂粤桂琼川贵云藏陕甘青宁新港澳台]{1}[A-Z]{1}[0-9]{5}(D|F){1}$')
res = pattern.findall(car_str)
if res:
return True
else:
return False
if __name__ == '__main__':
car_id = input("请输入车牌号:")
if check_p(car_id):
print(f"{car_id}是燃油车")
elif check_x(car_id):
print(f"{car_id}是小型新能源车")
elif check_d(car_id):
print(f"{car_id}是大型新能源车")
else:
print(f"输入的车牌{car_id}格式是错误的")
测试图示
8、文件访问与异常处理
编写一个程序,通过键盘输入曹操的诗歌《观沧海》,并将内容写入文本文件gch.txt中,标题和作者都单独占行,每句诗占一行。
将程序代码和写入数据后的文本文件打开,分别截图粘贴至答案框。
观沧海
曹操
东临碣石,以观沧海。
水何澹澹,山岛竦峙。
树木丛生,百草丰茂。
秋风萧瑟,洪波涌起。
日月之行,若出其中。
星汉灿烂,若出其里。
幸甚至哉,歌以咏志。
代码
listStr = [
"观沧海",
"曹操",
"东临碣石,以观沧海。",
"水何澹澹,山岛竦峙。",
"树木丛生,百草丰茂。",
"秋风萧瑟,洪波涌起。",
"日月之行,若出其中。",
"星汉灿烂,若出其里。",
"幸甚至哉,歌以咏志。"]
with open("gch.txt", "w") as file:
for k in listStr:
file.write(k+"\n")
测试图示
2.编写一个程序实现如下功能:
(1) 随机产生20个1~100之间的随机整数,写入文本文件sjs.txt中。
(2) 再从文本文件sjs.txt中读出数据,计算并输出标准方差,写入sjs.txt的第二行。
(标准方差=sqrt(((x1-x)^2 +(x2-x)^2 +…(xn-x)^2)/n ),x是平均值)
代码
import random
import math
with open("sjs.txt", 'w') as file:
for k in range(20) :
file.writelines(str(random.randint(1,100))+' ')
listNum = []
with open("sjs.txt", 'r') as file:
listNum = file.readline().split(" ")
newList = []
for i in listNum:
if i :
newList.append(int(i))
listNum = newList
del newList
pValue = sum(listNum)/len(listNum)
vSum = 0
for k in listNum:
vSum += (k-pValue)**2
value = math.sqrt(vSum/len(listNum))
with open('sjs.txt', 'a+') as file:
file.write("\n")
file.writelines(f"标准方差={value}")
测试图示
3.编写一个程序,分别将整数a1=100,字符串a2=“I am a student”,列表list1 = [1,2,3,4,5,6],字典dict1 = {“姓名”:“张三”,“毕业学校”:“河南科技大学”},集合set1 = {3.5,5,“abc”}用pickle模块写入一个二进制文件中。写入成功后,再次打开文件,读取二进制文件中的数据。
代码
import pickle
a1=100
a2="I am a student"
list1 = [1,2,3,4,5,6]
dict1 = {"姓名":"张三","毕业学校":"haust"}
set1 = {3.5,5,"abc"}
data = [a1,a2,list1,dict1,set1]
# 写入数据
try:
with open("pickle_file.dat","wb") as file:
for k in data:
pickle.dump(k,file)
print("写入成功")
except:
print("写入失败")
# 读出数据
print("读取数据如下")
with open("pickle_file.dat","rb") as file:
for k in range(1,6):
print(pickle.load(file))
测试图示