鱼C论坛

 找回密码
 立即注册
查看: 425|回复: 2

14课作业密码安全性提问!想了两天都没想明白的问题!求解答!

[复制链接]
发表于 2020-3-28 17:29:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
所有的问题我都注释在代码里了,比较啰嗦,最后也有总结存疑,希望大佬不要嫌我笨~嘤嘤嘤 不知道自己到底哪里想错了,总觉得答案和题目对不上

symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'

passwd = input('请输入需要检查的密码组合:')

# 判断长度
length = len(passwd)

while (passwd.isspace() or length == 0) :
    passwd = input("您输入的密码为空(或空格),请重新输入:")
# 不能用if:因为如果用户输入密码为空时,让其重新输入一次就过了,而while是如果密码一直为空就一直重填
   
if length <= 8:
    flag_len = 1
elif 8 < length < 16:
    flag_len = 2
else:
    flag_len = 3

flag_con = 0

# 判断是否包含特殊字符
for each in passwd:
    if each in symbols:
        flag_con += 1
        break

# 判断是否包含字母
for each in passwd:
    if each in chars:
        flag_con += 1
        break

# 判断是否包含数字
for each in passwd:
    if each in nums:
        flag_con += 1
        break  

# 打印结果
# 疑问:为什么要用循环?
# 回答:当安全等级为高时,break直接跳出循环,不打印提高等级的方法,
#      当等级为中,低时打印提高等级的方法,然后再跳出循环
while 1 :
    print("您的密码安全级别评定为:", end='')
    if flag_len == 1 or flag_con == 1 :
    # <=8的 或者 全部为字母/数字/符号 被判定为低
    # 疑问:只满足<=8、全部为字母/数字/符号且>8,不符合低级的要求,也被判定为低
    # 疑问:低级的两个要求是要同时满足还是满足其一即可判定?
    # 疑问:为什么字母+数字(flag_con == 2)也可以判定为低?
    # 个人理解:从代码解释,低级的两个要求满足其一即可判定,所以用or连接,
    #          当只有字母+数字时,若<=8判定为低;>8则同时符合中级的两个条件
        print("低")
    elif flag_len == 2 or flag_con == 2 :
    # 疑问:为什么用or连接?中级的要求一中使用了“必须”,所以要求一必须满足,即必须两种组合
    # 个人理解:只满足 <=8 、 全部为字母/数字/符号 会直接先被判定为低,
    #          所以进入这一层的必定满足 >8 且 不全部为字母/数字/符号(即不单一,即两种或三种组合),
    #          因此条件二>8已经符合,那么规定flag_con == 2限制为两种组合,即可同时满足中级的两个条件,
    #          由此看来,中级需要同时满足两个条件才可判定,>8的条件是else天然形成,只需人为增加两种组合的条件
    # 疑问:如果进入这一层的必定满足 >8,那么flag_len == 2有什么意义?
    #      难道是为了使下一层天然满足>=16?那为什么不省略这个语句,而在下一层直接增加>=16的条件?
    # 疑问:>8<16 且 三种组成,题目没有定义,代码运行为中级

        print("中")
    else :
    # 高级最复杂,直接放在最后else,但出现很多问题
    # 个人理解:高级的要求一中使用了“必须”,要求二中使用了“只能”,所以要求一和要求二必须满足
    #          进入这一层的必定满足 >=16 且 为三种组合,已经满足了要求三和要求一,
    #          所以这里应该增加一个只能由字母开头的条件来限制要求二,才能满足三个要求
    # 疑问:为什么不写上只能由字母开头的要求?没有限制“只能”由字母开头,若不是由字母开头依然判定为高
        print("高")
        print("请继续保持")
        break

    print("请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位")
    break




**总结:**  
密码的判定涉及两个条件,密码的长度和密码的组成。  
低级:<=8 **或** 一种(自己理解为“或”)   
中级:>8 且 两种组合  
高级:>=16 且 三种组合 且 **字母开头** (自己认为代码缺少)   
(这样的题目规定可基本符合代码运行的结果)  
  
**存疑!!!**  
**1. 低级的两个要求到底是满足其一即可还是必须满足两个才可以判定?**  
**2. 如果进入第二层的必定满足 >8,那么flag_len == 2有什么意义?**  
**3. >8<16 且 三种组合 上述方法没有定义,题目没有定义,代码运行为中级**  
**4. 第三层为什么不写上只能由字母开头的要求?**
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-28 17:41:00 | 显示全部楼层
**1. 低级的两个要求到底是满足其一即可还是必须满足两个才可以判定?**  
中间用的or,表示一个满足即可

**2. 如果进入第二层的必定满足 >8,那么flag_len == 2有什么意义?**  
前面第一层中没要求必须大于8

**3. >8<16 且 三种组合 上述方法没有定义,题目没有定义,代码运行为中级**  
因为符合第二层条件啊

**4. 第三层为什么不写上只能由字母开头的要求?**
看题设需求,有这个需求才增加这部分判断
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-28 18:37:14 | 显示全部楼层
BngThea 发表于 2020-3-28 17:41
**1. 低级的两个要求到底是满足其一即可还是必须满足两个才可以判定?**  
中间用的or,表示一个满足即可
...

1.题目里,高中低的要求是以1.2.3罗列的,所以意思是:低级的两个要求满足其一即可判断,中级和高级必须同时满足所有条件才可以判定?

2.第一层判断后,<=8的都直接归为低级,那么进入第二层必定>8了,为什么要多此一举?

3.第二层有两个要求:1.>8 2.任意两种组合。>8<16 且 三种组合 并不符合第二层条件。还是说中级这两个条件也是满足其一即可?

4.第三层高级有三个要求:1.必须三种 2.只能字母开头 3.>=16. 题目里是有要求的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-25 05:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表