whenever

  • Home

  • Tags21

  • Categories6

  • Archives122

  • About

PAT乙级1067 || 试密码(详解,C/C++示例,测试点分析)

Posted on 2019-10-20 In PAT

试密码

题目描述

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

输入格式

输入在第一行给出一个密码(长度不超过 20 的、不包含空格、Tab、回车的非空字符串)和一个正整数 N(≤ 10),分别是正确的密码和系统允许尝试的次数。随后每行给出一个以回车结束的非空字符串,是用户尝试输入的密码。输入保证至少有一次尝试。当读到一行只有单个 # 字符时,输入结束,并且这一行不是用户的输入。

输出格式

对用户的每个输入,如果是正确的密码且尝试次数不超过 N,则在一行中输出 Welcome in,并结束程序;如果是错误的,则在一行中按格式输出 Wrong password: 用户输入的错误密码;当错误尝试达到 N 次时,再输出一行 Account locked,并结束程序。

输入样例1

1
2
3
4
5
6
Correct%pw 3
correct%pw
Correct@PW
whatisthepassword!
Correct%pw
#

输出样例1

1
2
3
4
Wrong password: correct%pw
Wrong password: Correct@PW
Wrong password: whatisthepassword!
Account locked

输入样例2

1
2
3
4
5
6
cool@gplt 3
coolman@gplt
coollady@gplt
cool@gplt
try again
#

输出样例2

1
2
3
Wrong password: coolman@gplt
Wrong password: coollady@gplt
Welcome in

问题解决

解题思想

此题也是简单的逻辑题,但是要特别注意以下几点:

  1. 正确的密码是不含空格的,但是错误的输入可能会含空格(输入样例2可见)。因此读入输入密码时需用getline(),不能用cin,但getline()会读入空换行,因此需要用getchar()吸收。
  2. 注意遇到#号时要跳出循环。

    坑点提醒

    请大家观察代码1与代码2的差异,这一坑点可能比较难发现。代码1在没有遇到正确的输入密码(也没有遇到#)之前会读入N + 1次,第N + 1次时不判断密码是否正确,直接输出Account locked(因超过允许次数),然后跳出循环,这样的话面对某些特殊输入时会产生错误;而代码2在没有遇到正确的输入密码(也没有遇到#)之前会读入N次,第N次时判断密码是否正确并进行相应输出后再判断是否达到允许次数,达到就输出Account locked,并跳出循环。

代码示例(C/C++)

代码1(测试点4错误)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main() {
string str;
int n;
cin >> str >> n;
getchar(); //吸收换行
string tmp;
getline(cin, tmp); //字符串中可能含空格,不能用cin直接输入
for(int i= 0; tmp != "#"; i++) {
if(i == n) {
cout << "Account locked";
break;
}
else if(str == tmp) {
cout << "Welcome in";
break;
}
else {
cout << "Wrong password: " << tmp << endl;
}
getline(cin, tmp);
}
return 0;
}

代码2(AC)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main() {
string str;
int n, coun = 0;
cin >> str >> n;
getchar(); //吸收换行
string tmp;
//字符串中可能含空格,不能用cin直接输入,要用getline
while(getline(cin, tmp), tmp != "#") {
if(str == tmp) {
cout << "Welcome in";
break;
}
else {
cout << "Wrong password: " << tmp << endl;
}
if(++coun == n) {
cout << "Account locked";
break;
}
}
return 0;
}

题目来源:PAT乙级1067
作者:CHEN, Yue
单位:浙江大学

稀罕作者
Mengzhao Wang WeChat Pay

WeChat Pay

Mengzhao Wang Alipay

Alipay

# C/C++ # PAT # 编程
PAT乙级1066 || 图像过滤(详解,C/C++示例,测试点分析)
PAT乙级1068 || 万绿丛中一点红(详解,C/C++示例,测试点分析)
  • Table of Contents
  • Overview
Mengzhao Wang

Mengzhao Wang

Try? All the way !
122 posts
6 categories
21 tags
  1. 1. 试密码
    1. 1.1. 题目描述
    2. 1.2. 输入格式
    3. 1.3. 输出格式
    4. 1.4. 输入样例1
    5. 1.5. 输出样例1
    6. 1.6. 输入样例2
    7. 1.7. 输出样例2
    8. 1.8. 问题解决
      1. 1.8.1. 解题思想
      2. 1.8.2. 坑点提醒
      3. 1.8.3. 代码示例(C/C++)
© 2021 Mengzhao Wang