Python第二次作业
目录
一、编写程序实现对称数字图案打印功能
1. 题目分析
2. 程序分析
3.代码
4. 运行结果示例
二、编写程序实现数字密码锁模拟功能
1. 题目分析
2. 程序分析
3. 代码
4. 运行结果示例
三、编写程序实现统计特定数字功能(while 循环版)
1. 题目分析
2. 程序分析
3. 代码
4. 运行结果示例
四、编写程序实现找零最少硬币组合功能
1. 题目分析
2. 程序分析
3. 代码
4. 运行结果示例
五、编写程序实现简易 ATM 机操作功能
1. 题目分析
2. 程序分析
3. 代码
4. 运行结果示例
六、编写程序实现猜数字游戏功能
1. 题目分析
2. 程序分析
3. 代码
4. 运行结果示例
七、编写程序实现星号菱形打印功能(嵌套 for 循环版)
1. 题目分析
2. 程序分析
3. 代码
4. 运行结果示例
一、编写程序实现对称数字图案打印功能
输入一个正整数 k(2≤k≤5),使用 嵌套 for 循环 打印对称数字图案,
规则:
共 k 行,第 i 行(从 1 开始)打印 i 个数字,数字从 1 递增到 i;
每行数字之间用空格分隔。
示例:
输入 k=3,
输出:
1
1 2
1 2 3
1. 题目分析
(1)输入要求:需输入一个正整数 k
,且 k
的取值范围限定为 2≤k≤5
。
(2)核心规则:使用嵌套 for 循环打印对称数字图案,具体要求为 “共 k
行,第 i
行(从 1 开始计数)打印 i
个数字,数字从 1 递增到 i
”。
(3)格式要求:每行中的数字之间必须用空格分隔,确保图案整洁易读。
2. 程序分析
(1)输入处理:通过 input()
函数获取用户输入的内容,再用 int()
函数将其转换为整数类型,赋值给变量 k
,确保后续循环逻辑可基于整数正常执行。
(2)外层循环(控制行数):使用 for i in range(1, k+1)
构建外层循环,其中变量 i
表示当前行数(取值从 1 到 k
),直接决定总打印行数为 k
行,符合 “共 k
行” 的规则。
(3)内层循环(控制每行数字):针对第 i
行,通过 for j in range(1, i+1)
构建内层循环,变量 j
表示当前行需打印的数字(取值从 1 到 i
),实现 “第 i
行打印 i
个递增数字” 的需求。
(4)格式控制:内层循环中,print(j, end=" ")
通过 end=" "
参数让每个数字打印后紧跟一个空格,保证数字间的分隔;内层循环结束后执行 print()
(无参数),触发换行操作,确保每行图案独立显示,符合格式要求。
3.代码
k = int(input("请输入一个正整数k(2≤k≤5):"))
for i in range(1,k+1):for j in range(1,i+1):print(j,end=" ")print()
4. 运行结果示例
二、编写程序实现数字密码锁模拟功能
模拟一个数字密码锁的工作过程,规则如下:
1.初始密码为四位数:1234
2.用户有3次输入密码的机会
3.每次输入后:
若密码正确,提示“密码正确,锁已打开”并结束程序
若密码错误,提示“密码错误,剩余x次机会”
若输入的不是四位数,提示“请输入四位数密码”,不消耗尝试次数
4.额外功能:
连续输错3次后,提示“密码错误次数过多,锁已锁定”锁定后询问是否重置(y/n),输入y则重新获得3次机会,输入n则退出程序
1. 题目分析
(1)初始设置:数字密码锁的初始密码固定为四位数 1234
,用户初始拥有 3
次输入密码的机会。(2)输入验证规则:
- 若输入为四位数:进一步判断密码是否正确;
- 若输入非四位数:提示 “请输入四位数密码”,且不消耗尝试次数,需重新输入。
(3)密码判断逻辑:
- 密码正确:提示 “密码正确,锁已打开”,直接结束程序;
- 密码错误:尝试次数减 1,提示 “密码错误,剩余 x 次机会”(x 为当前剩余次数)。
(4)锁定与重置功能:
当连续输错 3 次后,提示 “密码错误次数过多,锁已锁定”;锁定后询问用户是否重置(输入 y
或 n
),输入 y
则重新获得 3 次机会,输入 n
则退出程序。
2. 程序分析
(1)变量初始化:用字符串 passwd = "1234"
存储初始密码(避免整数类型无法直接判断位数),用 chance = 3
记录剩余尝试次数。
(2)循环控制:通过 while chance > 0
构建循环,确保只有剩余次数大于 0 时,用户才能继续输入密码。
(3)输入处理与位数验证:
- 用
input()
获取用户输入的密码user_input_passwd
; - 通过
len(user_input_passwd) != 4
判断是否为四位数,若不是则提示并执行continue
,跳过后续逻辑,不消耗尝试次数。
(4)密码正确性判断:
- 若
user_input_passwd == passwd
:打印正确提示,程序后续随循环结束自然终止; - 若密码错误:
chance
减 1,若剩余次数>0
,提示剩余次数;若次数耗尽,触发锁定逻辑。
(5)锁定与重置逻辑:
- 锁定时提示 “密码错误次数过多,锁已锁定”,通过
input()
获取用户重置选择reset_choice
; - 输入
y
:将chance
重置为 3,提示 “已重置,重新获得 3 次机会”,循环继续; - 输入
n
:提示 “程序退出”,循环随后续chance
为 0 终止。
3. 代码
passwd = "1234"
chance = 3
while chance > 0:user_input_passwd = input("请输入四位数密码:")if len(user_input_passwd) != 4:print("请输入四位数密码:")continueif user_input_passwd == passwd:print("密码正确,锁已打开")else:chance -=1if chance > 0:print(f"密码错误,剩余{chance}次机会")else:print("密码错误次数过多,锁已锁定")reset_choice = input("是否重置密码?(y/n)")if reset_choice == "y":chance = 3print("已重置,重新获得3次机会")else:print("程序退出")
4. 运行结果示例
三、编写程序实现统计特定数字功能(while 循环版)
输入一个正整数 n,使用 while 循环统计 1 到 n 之间(含 n)所有 “既是偶数又能被 4 整除” 的数,并打印:
这些数的总和;
这些数的个数。
示例:输入 n=10,符合条件的数为 4、8,总和 12,个数 2。
1. 题目分析
(1)输入要求:需输入一个正整数 n
,程序将遍历 1
到 n
之间(包含 n
本身)的所有整数。
(2)统计规则:筛选出 “既是偶数又能被 4 整除” 的数字。
(3)输出要求:最终需打印两个结果
① 符合条件数字的总和;
② 符合条件数字的个数。
2. 程序分析
(1)变量初始化:
total = 0
:用于存储符合条件数字的总和,初始值设为 0(避免初始值影响累加结果);count = 0
:用于统计符合条件数字的个数,初始值设为 0;m = 1
:作为 while 循环的计数器,从 1 开始(对应 “1 到 n” 的遍历起点)。
(2)循环控制逻辑:通过 while m <= n
构建循环,确保计数器 m
遍历从 1 到 n
的所有整数,直到 m
超过 n
时循环终止。
(3)条件判断:使用 if m % 2 == 0 and m % 4 == 0
判断数字是否符合要求
m % 2 == 0
:判断数字是否为偶数;m % 4 == 0
:判断数字是否能被 4 整除;- 两者用
and
连接,仅当同时满足时才执行后续操作。
(4)循环内操作:若数字符合条件,将其值累加到 total
(total += m
),同时将计数 count
加 1(count += 1
);无论是否符合条件,计数器 m
均需自增 1(m += 1
),确保遍历不中断。
(5)结果输出:通过格式化字符串 print(f"...")
清晰打印总和与个数,符合题目输出要求。
3. 代码
n = int(input("请输入一个正整数:"))
total = 0
count = 0
m = 1
while m <= n:if m % 2 == 0 and m % 4 == 0:total += mcount += 1m += 1
print(f"这些数的总和为:{total}")
print(f"这些数的个数为:{count}")
4. 运行结果示例
四、编写程序实现找零最少硬币组合功能
输入商品价格 price(整数,0 < price < 100)和支付金额 payment(整数,payment ≥ price),
计算找零金额并使用最少硬币数组合:
(硬币面额:1 元、5 元、10 元、20 元)。
示例:找零 36 元,最优组合为 20+10+5+1(共 4 枚)。
1. 题目分析
(1)输入要求:需输入两个整数
① 商品价格 price
(范围:0 < price < 100
);
② 支付金额 payment
(要求:payment ≥ price
,确保找零金额非负)。
(2)核心需求:
① 计算找零金额(找零金额 = 支付金额 - 商品价格
);
② 用最少硬币数组合找零,硬币面额固定为 1 元、5 元、10 元、20 元(优先使用大面额硬币可保证硬币数最少,即贪心算法逻辑)。
(3)输出要求:需打印两个关键信息
① 实际找零金额;
② 最优硬币组合(格式如 “20+10+5+1”)及总硬币数(如 “共 4 枚”)。
2. 程序分析
(1)变量初始化:
price
/payment
:通过input()
获取用户输入,用int()
转换为整数,分别存储商品价格和支付金额;change
:计算并存储原始找零金额(change = payment - price
),用于最终输出(避免后续计算修改原始值);left
:存储实时剩余待找零金额(初始值等于change
),后续循环中会逐渐递减至 0,避免修改change
;coins = [20, 10, 5, 1]
:按从大到小顺序存储硬币面额,核心逻辑是 “优先用大面额硬币”,确保总硬币数最少;combination
:空列表,用于存储最终的硬币组合(存储为字符串类型,方便后续用 “+” 拼接)。
(2)循环逻辑(贪心算法实现):
- 外层
for coin in coins
:遍历每种面额的硬币,从 20 元开始依次处理; - 内层
while left >= coin
:只要剩余待找零金额left
大于等于当前硬币面额,就用该面额硬币找零
① left -= coin
:剩余金额减去当前面额;
②combination.append(str(coin))
:将当前面额转为字符串存入组合列表,直到 left
小于当前面额,再切换到下一个小面额硬币。
3. 代码
price = int(input("请您输入商品价格(整数,0 < price < 100):"))
payment = int(input("请您输入支付金额(整数,payment ≥ price):"))
change = payment - price
left = change
coins = [20,10,5,1]
combination = []
for coin in coins:while left >=coin:left -= coincombination.append(str(coin))
print(f"找零{change}元")
print(f"最优组合为 {'+'.join(combination)}(共 {len(combination)} 枚)")
4. 运行结果示例
五、编写程序实现简易 ATM 机操作功能
初始化账户信息:余额(如 1000 元)、当前账号;
主菜单阶段:用 while True 循环持续显示选项,用户输入选项后,用 if/elif 分支执行对应功能;
各功能逻辑:
存款 / 取款 / 转账:用 if 判断输入金额是否为正整数(简化处理,假设输入合法),取款 / 转账需额外判断金额≤余额;
转账需验证目标账号非空(if target_account.strip() == "");
输入 “退出” 时,用 break 退出主循环,程序结束。
1. 题目分析
(1)登录验证需求:
- 预设固定账号(
"123456"
)和密码("654321"
); - 允许最多 3 次输入错误,若连续 3 次错误则锁定 ATM 机(直接退出程序);
- 仅登录成功后,才能进入主菜单操作。
(2)主菜单功能需求:登录成功后显示 5 个操作选项:1.查询余额、2.存款、3.取款、4.转账、5.退出
,且用 while
循环控制主菜单持续运行,仅输入 “退出”(对应选项 5)时结束程序。
(3)核心功能规则:
- 查询余额:直接显示当前账户余额(初始余额预设为 1000 元);
- 存款:输入正整数金额,余额随存款金额累加,存款后显示更新后的余额;
- 取款:输入正整数金额,需先判断 “金额是否 ≤ 余额”,若余额不足则提示 “余额不足”,否则余额递减并显示更新后余额;
- 转账:需先输入目标账号(判断非空,空则提示 “目标账号不能为空”),再输入正整数金额;金额需 ≤ 余额(不足则提示),转账后余额递减并显示更新后余额;
- 退出:选择该选项时,提示 “程序结束” 并退出主菜单循环,最终结束程序。
2. 程序分析
(1)变量初始化:
account = "123456"
/passwd = "654321"
:存储预设的正确账号和密码;chance = 3
:记录登录剩余尝试次数(初始为 3 次);balance = 1000
:存储账户初始余额(固定为 1000 元,后续随操作更新)。
(2)登录阶段逻辑(外层 while
循环):
- 循环条件
while chance > 0
:仅剩余尝试次数 > 0 时,允许输入账号密码; - 输入判断:通过
input()
获取用户输入的账号(user_input_accout
)和密码(user_input_passwd
),对比预设值:- 若匹配:提示 “登录成功”,进入主菜单循环;
- 若不匹配:
chance -= 1
(次数减 1),提示剩余次数;
- 次数耗尽处理:
while
循环的else
分支(当chance
减至 0 时触发),提示 “错误次数过多,锁已锁定”,用exit()
强制退出程序。
(3)主菜单阶段逻辑(内层 while True
循环):
- 菜单显示:每次循环先打印 “主菜单” 标题和 5 个操作选项,引导用户选择;
- 选项处理(
if/elif
分支):- 选项 1(查询余额):直接打印
balance
的当前值; - 选项 2(存款):
input()
获取存款金额(转为整数),balance += save
更新余额,打印结果; - 选项 3(取款):先判断金额是否 > 余额(是则提示 “余额不足”),否则
balance -= amount
更新余额,打印结果; - 选项 4(转账):先判断目标账号是否为空(
target.strip() == ""
),空则提示;非空则输入转账金额,判断余额是否足够,足够则更新余额并打印结果; - 选项 5(退出):提示 “程序结束”,用
break
跳出主菜单循环,程序随外层登录循环结束而终止。
- 选项 1(查询余额):直接打印
3. 代码
account = "123456"
passwd = "654321"
chance = 3
balance = 1000
while chance > 0:user_input_accout = input("请输入账号:")user_input_passwd = input("请输入密码:")if user_input_accout == account and user_input_passwd == passwd:print("登录成功")while True:print("----------------主菜单-----------------")print("1.查询余额 2.存款 3.取款 4.转账 5.退出")choice = input("请选择操作:")if choice == "1":print(f"当前余额:{balance}元")elif choice == "2":save = int(input("请输入存款金额:"))balance +=saveprint(f"存款成功,当前余额:{balance}元")elif choice == "3":amount = int(input("请输入取款金额:"))if amount > balance:print("余额不足")elif amount > 0:balance -= amountprint(f"取款成功,当前余额:{balance}元")elif choice == "4":target = input("请输入目标账号:")if target.strip() == "":print("目标账号不能为空")else:amount = int(input("请输入转账金额:"))if amount > balance:print("余额不足")elif amount > 0:balance -= amountprint(f"转账成功,当前余额:{balance}元")elif choice == "5":print("程序结束")breakelse:chance -= 1print(f"账号或密码错误,剩余{chance}次机会")
else:print("错误次数过多,锁已锁定")exit()
4. 运行结果示例
六、编写程序实现猜数字游戏功能
程序随机生成1-20的整数作为答案,玩家有5次猜测机会,规则如下:
用for循环控制5次猜测机会,每次输入猜测的数,
若猜对,打印“恭喜!第x次猜对了”并提前结束游戏;
若猜错,提示“猜大了”或“猜小了”,并显剩余次数;
5次都猜错,打印“游戏结束,正确答案是xx”。
1. 题目分析
(1)核心规则:程序随机生成 1-20
之间的整数作为 “答案”,玩家拥有 5
次猜测机会,通过 for
循环严格控制猜测次数。
(2)交互逻辑:
- 每次猜测:玩家输入一个整数,程序对比输入值与答案;
- 猜对处理:打印 “恭喜!第 x 次猜对了”(x 为当前猜测次数,1-5),并提前结束游戏(终止循环);
- 猜错处理:提示 “猜大了” 或 “猜小了”,同时显示剩余猜测次数(如第 1 次猜错,剩余 4 次);
- 次数耗尽:若 5 次均猜错,打印 “游戏结束,正确答案是 xx”(xx 为随机生成的答案)。
(3)技术要求:需使用 random
模块生成随机答案,用 for
循环控制次数,通过 if/elif/else
判断猜测结果。
2. 程序分析
(1)随机答案生成:通过 random.randint(1,20)
生成 1-20
范围内的整数,赋值给 answer
,确保每次运行游戏答案不同。
(2)循环控制:for i in range(1,6)
构建循环,i
表示当前猜测次数(从 1 到 5,共 5 次机会),无需额外计数变量。
(3)输入与判断逻辑:
- 输入处理:
int(input(f"第{i}次猜:"))
获取玩家输入,转为整数类型(假设输入合法,聚焦核心逻辑); - 猜对判断:若
user_guess_input == answer
,打印恭喜信息,用break
终止for
循环,提前结束游戏; - 猜错判断:
- 输入 > 答案:提示 “猜大了”,剩余次数为
5 - i
(如第 3 次猜,剩余5-3=2
次); - 输入 <答案:提示 “猜小了”,剩余次数计算方式同上;
- 输入 > 答案:提示 “猜大了”,剩余次数为
(4)次数耗尽处理:for
循环的 else
分支(仅当循环未被 break
中断时执行,即 5 次均猜错),打印游戏结束信息和正确答案。
3. 代码
import randomanswer = random.randint(1,20)
for i in range(1,6):user_guess_input = int(input(f"第{i}次猜:"))if user_guess_input == answer:print(f"恭喜!第{i}次猜对了")breakelif user_guess_input > answer:print(f"猜大了,剩余{5-i}次机会")else:print(f"猜小了,剩余{5-i}次机会")
else:print(f"游戏结束,正确答案是{answer}")
4. 运行结果示例
七、编写程序实现星号菱形打印功能(嵌套 for 循环版)
输入一个正整数 k(k 为奇数,3≤k≤7), 使用 嵌套 for 循环 打印由星号(*)组成的菱形, 菱形的对角线长度为 k。示例:输入 k=5,输出:**** *********
1. 题目分析
(1)输入要求:需输入一个奇数 k
,且 k
的取值范围限定为 3≤k≤7
(保证菱形结构对称,对角线长度等于 k
)。
(2)核心规则:使用嵌套 for 循环打印星号(*
)组成的菱形,菱形的 “水平对角线” 和 “垂直对角线” 长度均为 k
(中间行的星号数量等于 k
,是菱形最宽的一行)。
(3)结构拆解:菱形可分为 “上半部分(含中间行)” 和 “下半部分” 两部分,上半部分星号数量逐行递增,下半部分星号数量逐行递减,且每行星号均居中显示(通过打印前置空格实现)。
2. 程序分析
(1)变量初始化:通过 input()
获取用户输入的奇数 k
,转换为整数类型,作为菱形对角线长度的核心参数。
(2)上半部分打印逻辑(含中间行):
- 行数计算:上半部分(含中间行)的行数为
upper_rows = (k + 1) // 2
(如k=5
时,(5+1)//2=3
行;k=3
时,(3+1)//2=2
行)。 - 外层 for 循环:
for i in range(1, upper_rows + 1)
控制上半部分的行数,i
表示当前是上半部分的第i
行。 - 内层空格循环:每行星号前的空格数为
spaces = (k - (2*i - 1)) // 2
(2*i - 1
是当前行的星号数量,用总长度k
减去星号数,再除以 2,得到每行两侧对称的空格数,确保星号居中);通过for _ in range(spaces)
打印对应数量的空格。 - 内层星号循环:当前行的星号数量为
stars = 2*i - 1
(第 1 行 1 个、第 2 行 3 个... 中间行k
个,逐行递增 2);通过for _ in range(stars)
打印对应数量的星号。 - 换行处理:每行空格和星号打印完成后,执行
print()
(无参数)实现换行,进入下一行。
(3)下半部分打印逻辑:
- 行数计算:下半部分的行数为
lower_rows = (k - 1) // 2
(如k=5
时,(5-1)//2=2
行;k=3
时,(3-1)//2=1
行),比上半部分少 1 行(不含中间行)。 - 外层 for 循环:
for i in range(1, lower_rows + 1)
控制下半部分的行数,i
表示当前是下半部分的第i
行。 - 内层空格循环:每行星号前的空格数为
spaces = i
(第 1 行 1 个、第 2 行 2 个... 逐行递增 1,与上半部分空格数变化相反);通过for _ in range(spaces)
打印空格。 - 内层星号循环:当前行的星号数量为
stars = k - 2*i
(从k-2
开始,逐行递减 2,如k=5
时,第 1 行 3 个、第 2 行 1 个);通过for _ in range(stars)
打印星号。 - 换行处理:同前,每行结束后执行
print()
换行。
3. 代码
k = int(input("请输入一个奇数k(3≤k≤7):"))# 打印上半部分(包括中间行)
upper_rows = (k + 1) // 2
for i in range(1, upper_rows + 1):# 打印每行的空格spaces = (k - (2 * i - 1)) // 2for _ in range(spaces):print(" ", end="")# 打印每行的星号stars = 2 * i - 1for _ in range(stars):print("*", end="")print() # 换行,进入下一行# 打印下半部分
lower_rows = (k - 1) // 2
for i in range(1, lower_rows + 1):# 打印每行的空格spaces = ifor _ in range(spaces):print(" ", end="")# 打印每行的星号stars = k - 2 * ifor _ in range(stars):print("*", end="")print() # 换行,进入下一行