1067 试密码——C++

题目:

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

思路:

从这道题目开始,决定以后编程都用C++。从字符串函数开始,还有vector()已经开始体会到C++的好处和易用性了。

这道题主要是要保证思路清晰,首先对于输入注意cin只能读取到空格,因此如果有两个空格符,一行信息不能完全读入,这里要用到getline(cin,tmp)将所读到的一行输入全部赋值给tmp。

题目说:当读到一行只有单个 # 字符时,输入结束,并且这一行不是用户的输入。因此需要自己定义“#”这个字符串进行比较,当输入是#时,终止。


2018.12.03

这次做暴露了这样几个问题:

1、没有深刻理解getline(cin,tmp)的含义:如果将下面的输入赋值给tmp的话,一定要在前面加一个getchar()吞掉空格,否则还是会将前一个输入赋值给tmp;

2、“#”的意思是如果在没有account locked之前输入的话,输入也就停止了。题目的设置必然是有寓意的;

见代码2.

要深刻理解逻辑上的先后、包含等关系。比如代码3就是错误的,因为当用户第一次输入是“#”的时候,会输出判断说是错误密码,但实际上应该没有任何提示,用户输入停止的。

代码:

1、

//1067 试密码 v1
#include 
#include 
using namespace std;

int main(){
	string str,tmp,x="#";	cin>>str;	//str是给定正确的密码 
	int N,cnt=0,flag=1;	cin>>N;	//N是输入次数限制 
	getchar();	//吸收回车键
	getline(cin,tmp);	//读取一行输入,赋给tmp 
	while(tmp!=x){
		cnt++;
		if(tmp==str){
			cout<<"Welcome in"<

2、AC

#include 
#include 
using namespace std;
int main(){
	string s;
	int N,cnt=0;	cin>>s>>N;
	getchar();
	string tmp;
	getline(cin,tmp);
	while(cnt

3、考虑不够全面,特例“#”没有考虑到

#include 
#include 
using namespace std;
int main(){
	string s;
	int N,cnt=0;	cin>>s>>N;
	getchar();
	string tmp;
	while(cnt

 

你可能感兴趣的:(1067 试密码——C++)