题目描述:
本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点 .,还必须既有字母也有数字。
输入格式:
输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行给出一个用户设置的密码,为不超过 80 个字符的非空字符串,以回车结束。
输出格式:
对每个用户的密码,在一行中输出系统反馈信息,分以下5种:
如果密码合法,输出 Your password is wan mei.
;
如果密码太短,不论合法与否,都输出Your password is tai duan le.
;
如果密码长度合法,但存在不合法字符,则输出Your password is tai luan le.
;
如果密码长度合法,但只有字母没有数字,则输出Your password needs shu zi.
;
如果密码长度合法,但只有数字没有字母,则输出Your password needs zi mu.
。
输入样例:
5
123s
zheshi.wodepw
1234.5678
WanMei23333
pass*word.6
输出样例:
Your password is tai duan le.
Your password needs shu zi.
Your password needs zi mu.
Your password is wan mei.
Your password is tai luan le.
思路:
在模拟赛的时候因为一点小小的失误,卡了一个两分的小样例。
这题就是一个简单的模拟,bool 数组分别对字母、数字和其他非法字符的出现进行标记。主要是想提醒一下自己要注意代码规范问题,if 一定要与 else 对应。
满分代码:
#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#define inf 0x3f3f3f3f
typedef long long LL;
using namespace std;
// 只能有英文字母、数字和小数点 .
// 还必须既有字母也有数字。
string c;
int main(){
int n;
cin >> n;
getchar();
while(n--) {
bool has[5] = {0};
// has 0:字母 1:数字 2:其他字符
getline(cin, c);
// 按行读取 空格也非法
// cout << c << endl;
if(c.length() < 6) {
cout << "Your password is tai duan le." << endl;
continue;
}else {
for(int i = 0; i < c.length(); i++) {
if((c[i] >= 'a' && c[i] <= 'z' ) || (c[i] >= 'A' && c[i] <= 'Z' )) {
has[0] = 1;
}
else if(c[i] >= '0' && c[i] <= '9') {
has[1] = 1;
}
else if(c[i] == '.') {
has[2] = 1;
} else {
// 非法字符标志位
has[3] = 1;
}
}
// 存在非法字符
if(has[3] == 1) {
cout << "Your password is tai luan le." << endl;
continue;
}
// 合法
if(has[0] == 1 && has[1] == 1 && has[3] == 0) {
cout << "Your password is wan mei." << endl;
continue;
}
if(has[0] == 1 && has[1] == 0) {
cout << "Your password needs shu zi." << endl;
continue;
}
if(has[0] == 0 && has[1] == 1) {
cout << "Your password needs zi mu." << endl;
continue;
}
}
}
return 0;
}