1067 试密码 (20 分)
题意描述:
当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死。本题就请你实现这个小功能。
输入格式:
输入在第一行给出一个密码(长度不超过 20 的、不包含空格、Tab、回车的非空字符串)和一个正整数 N(≤ 10),分别是正确的密码和系统允许尝试的次数。随后每行给出一个以回车结束的非空字符串,是用户尝试输入的密码。输入保证至少有一次尝试。当读到一行只有单个 # 字符时,输入结束,并且这一行不是用户的输入。
输出格式:
对用户的每个输入,如果是正确的密码且尝试次数不超过 N,则在一行中输出 Welcome in,并结束程序;如果是错误的,则在一行中按格式输出 Wrong password: 用户输入的错误密码;当错误尝试达到 N 次时,再输出一行 Account locked,并结束程序。
输入样例 1:
Correct%pw 3
correct%pw
Correct@PW
whatisthepassword!
Correct%pw
#
输出样例 1:
Wrong password: correct%pw
Wrong password: Correct@PW
Wrong password: whatisthepassword!
Account locked
输入样例 2:
cool@gplt 3
coolman@gplt
coollady@gplt
cool@gplt
try again
#
输出样例 2:
Wrong password: coolman@gplt
Wrong password: coollady@gplt
Welcome in
解题思路:
Mara: 又是字符串,比较两个字符串是不是相等。用Python直接比就好了,用C语言还要自己写个函数比较。
Jack: C语言很快的,也可以写的很优雅好不好。
Mara: 这些样例有点奇怪啊,终止符‘#’根本就没有用到啊,直接就退出了。
Jack: 终止符没有遇到??可能是没有给出这样的样例,假如用户在还有机会尝试的情况下输入了终止符’#'就应该直接退出程序。
Mara: 还有一件事,题目中说:
随后每行给出一个以回车结束的非空字符串
我们需要特殊处理结束的回车吗 ? 写成 input().split()
???
Jack: 不不不,我试过了,这样不对。input( ) 函数会接收一行的字符串,也就是说会忽略字符串结尾的换行符。而split( )参数为空的情况下会去除字符串首尾的空格,回车,TAB键等。这样就会把用户输入的字符串变成另一个字符串了,比如说‘ # ’ = 》 ‘#’
Mara: 是哦,写习惯了还真是有思维定式的。
Jack: 其实我也是看了别人的答案,罒ω罒。
代码:
def main():
password, N = (x for x in input().split(' '))
# 接收输入的第一行的正确的密码字符串和 正整数 N
N = int(N)
# 将字符串变成正整数
for x in range(N):
# 依次读入输入的字符串,可能是用户尝试的字符串也可能是终止字符'#'
input_password = input()
# 获得用户输入的字符串, input()方法会自动去除字符串末尾的换行符
if input_password == '#':
# 输入的是终止符,程序结束
return
if input_password == password:
print("Welcome in")
return
# 密码正确,返回提示并结束程序。
else:
print("Wrong password: {}".format(input_password))
# 密码错误,返回提示
print("Account locked")
# N 次机会使用完毕,账户被锁定
return
if __name__ == '__main__':
main()
易错点:
- 程序结束的方式有三种:1)用户给出正确的密码,2)用户使用了N次输入机会并且账户被锁定,3)用户在N次输入机会用尽之前,输入‘#’终止了程序。
Python 的 input()
从控制台获取输出的时候会读取一行的字符串并且忽略结尾的换行符。而使用string.strip()
将去除字符串首尾 的空格 换行 回车等字符。
总结:
Don Quixote | |
---|---|