1081 检查密码 (15 分)
题意描述:
本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点 .,还必须既有字母也有数字。
输入格式:
输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行给出一个用户设置的密码,为不超过 80 个字符的非空字符串,以回车结束。
输出格式:
对每个用户的密码,在一行中输出系统反馈信息,分以下5种:
- 如果密码合法,输出
Your password is wan mei.
; - 如果密码太短,不论合法与否,都输出
Your password is tai duan le.
; - 如果密码长度合法,但存在不合法字符,则输出
Your password is tai luan le.
; - 如果密码长度合法,但只有字母没有数字,则输出
Your password needs shu zi.
; - 如果密码长度合法,但只有数字没有字母,则输出
Your password needs zi mu.
。
输入样例:
5
123s
zheshi.wodepw
1234.5678
WanMei23333
pass*word.6
输出样例:
Your password is tai duan le.
Your password needs shu zi.
Your password needs zi mu.
Your password is wan mei.
Your password is tai luan le.
解题思路:
Mara:检查密码⊙0⊙,又是处理字符串,我看看题目。
Jack: 就是计算字符串的长度,里面某种字符的个数,然后看是不是有别的字符之类的,这些操作我们都很熟悉了。
Mara: 恩,不错不错,有一点问题你看到没,后三种非法字符串都是在密码长度合法的条件下的。如果它们同时出现怎么办,就是一个字符串既存在不合法字符,也缺少数字,也缺少字母。
Jack: (¦3」∠) ,是啊,不过题目里面怎么说
长度合法,但只有字母没有数字
,那不是连小数点也没有啊。
Mara: 小数点不是必须的啦,但是必须既有数字又有字母。按理说,应该不会出现既没有数字也没有字母的情况,因为题目中对这种情况根本没有说明啊。
Jack: 如果有我们该怎么办 ?输出两行??
Mara: 题目说:
对每个用户的密码,在一行中输出系统反馈信息,分以下5种:
肯定是只能输出一行,一条信息的。可能是按照顺序来的,判定规则的顺序有时候就代表着重要性,先判断是不是有不合法字符,不是的话再判断是不是只有字母没有数字,然后再判断是不是只有数字没有字母。
Jack: 我去试试。。
Jack: 过了过了。○( ^皿^)っHiahiahia…
代码:
def main():
N = int(input())
# 接收输入的正整数N
for x in range(N):
# 依次读入每行输入的密码字符串并输出判别结果。
print("Your password {}".format(check_password(input())))
return
def check_password(string):
"""
根据题意检查一个密码是否是合法密码,返回对应的字符串。要注意题目中对非法字
符串的检测顺序,从上到下在逻辑上是递进的。
"""
ret = ""
if len(string) < 6:
ret = "is tai duan le."
# 密码太短
else:
# 密码长度合法的情况下,累计密码字符串中数字字符,字母字符的个数并判断是
# 否有非法的其他字符存在。
alphas = 0
# 累计字母字符的数量
number = 0
# 累计数字字符的数量
for x in string:
if is_number(x):
number += 1
# 数字字符数量加一
elif is_aplhabets(x):
alphas += 1
# 字母字符数量加一
elif x != '.':
# 非数字字符,非字母字符,也不是'.',那就是非法的其他字符了。根据
# 题意中规则的顺序,这里应该直接判定是'tai luan le.'
ret = 'is tai luan le.'
if ret == '':
# 如果字符不是太短了,也不是太乱了,再查看是不是缺少字母或者数字。
if number == 0:
ret = 'needs shu zi.'
# 缺少数字的情况
elif alphas == 0:
# 缺少字母的情况
ret = 'needs zi mu.'
if ret == '':
# 通过了重重检查,恭喜你得到了一个合法的密码字符串
ret = 'is wan mei.'
return ret
def is_number(x):
# 判断一个字符是否是数字字符
return x in '0123456789'
def is_aplhabets(x):
# 判断一个字符是否是英文字母
if ord(x) >= ord('a') and ord(x) <= ord('z'):
# 若该字母是小写英文字母
return True
if ord(x) >= ord('A') and ord(x) <= ord('Z'):
# 若该字母是大写英文字母
return True
# 既不是大写英文字母也不是小写英文字母
return False
if __name__ == '__main__':
main()
易错点:
- 拼写错误 !!
- 密码长度合法的情况下有三种可能的违法形式:1)不合法字符,2)没有数字,3)没有字母。这三者可能是同时出现的,怎么判断呢 ? 按照题目中给出的顺序判断。
总结:
- 复制粘贴能够避免一些拼写错误。
- 尽可能多的考虑另一些可能,然后读一读题目中有没有说明另外的情况(不是输入样例中的情况,一般是边界值,特殊的样例等)该怎么处理。
- ord( )