1067 试密码 (20 point(s))——简析及测试点问题

当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死。本题就请你实现这个小功能。

输入格式:

输入在第一行给出一个密码(长度不超过 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),实现输入正确密码后结束程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值