当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死。本题就请你实现这个小功能。
输入格式:
输入在第一行给出一个密码(长度不超过 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
分析:
该题是比较常规的逻辑分析题,里面存在的小坑如下:
1、输入格式中说给出一个密码(不包含空格),但需要注意的是这里的密码仅仅指正确密码符合这个条件,但不保证用户输入的密码也不含空格。
2、输出格式中当错误尝试达到 N 次时,再输出一行Account locked,
指的是第N次输入错误时,不仅要输出Wrong password: 用户输入的错误密码,还要再输出一行Account locked。
3、如果N次输入正确密码呢,按照题目给出的输出格式,仅在第一次输入正确密码时输出Welcome in,之后结束程序,对之后输入的正确密码直接跳过。而实际上题目并未增设此测试点(下面的会解释为什么说没有增设测试点)。
代码1:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string pwd,s;
int n;
cin>>pwd>>n;
int t=0;///记录输入错误次数
getchar();///获取缓冲区中的回车符,否则下面的getline会将回车符作为1次输入
bool flag=true;///j记录是否达到程序终止条件
while(getline(cin,s)&&s!="#")
{
if(flag){///如果程序未达到结束条件
if(s!=pwd){
cout<<"Wrong password: "<<s<<endl;
t++;
if(t>=n){
cout<<"Account locked"<<endl;
flag=false;
}
}else{
cout<<"Welcome in"<<endl;
flag=false;
}
}
}
return 0;
}
运行结果1:
代码2:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
string pwd,ss;
cin>>pwd>>n;
int t=0;
bool flag=true;
getchar();
while(getline(cin,ss)&&ss!="#"){
t++;
if(t<=n){
if(ss==pwd){
cout<<"Welcome in"<<endl;
flag=false;
}else{
if(flag){
cout<<"Wrong password: "<<ss<<endl;
if(t==n){
flag=false;
cout<<"Account locked"<<endl;
}
}
}
}
}
return 0;
}
执行结果2:
上述两个代码在提交测试时,均能通过所有测试点,但是正如分析中3所提到的,如果输入N次均为正确的呢?用下面的输入进行分析:
hello 3
hello
hello
hello
#
按照题目输出要求分析可知正确的输出应该为:
显然,代码1中把是否达到结束条件作为第一判断条件,在密码正确时结束程序(之后即使输入正确密码也不再进行输出)。但是,分析代码2,可以发现当N次输入正确密码时,实际得到的结果为(codeblocks测试):
这与实际题目要求的不一致, 在代码2中if(ss==pwd)部分不能在输入次数小于N且第一次输入正确密码之后结束程序。但是,代码提交上去之后也能通过。所以,测试中并未设置对输入正确密码后结束程序(例如:连续N次输入正确密码后)的测试点。当然,为了使逻辑更加合理,可将代码2中的if(ss==pwd)修改为if(ss==pwd&&flag),实现输入正确密码后结束程序。