1. 程式人生 > >PAT乙級1081 檢查密碼

PAT乙級1081 檢查密碼

本題要求你幫助某網站的使用者註冊模組寫一個密碼合法性檢查的小功能。該網站要求使用者設定的密碼必須由不少於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.

不能用scanf,題目上說的是不超過80個字元的非空字串,但測試點二就是空的,唉,那就用gets,fgets,或者是getline(cin,line),還有,如果把getchar(),放到迴圈裡面,倒數第二個樣例過不去。如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cstdlib>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
bool cmp(int a, int b)
{
	return a>b;
}

int main()
{
	int n;
	char a[200];
	int zimu;
	int shuzi;
	int xiaoshudian;
	scanf("%d",&n);
	getchar();
	while(n--)
	{
		zimu=0;
		xiaoshudian=0;
		shuzi=0;
		gets(a);
		for(int i=0;i<strlen(a);i++)
			{
				if(a[i]=='.')
				xiaoshudian++;
				if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z'))
				zimu++;
				if(a[i]>='0'&&a[i]<='9')
				shuzi++;
			}
		if(strlen(a)<6)	printf("Your password is tai duan le.\n");
		else if(xiaoshudian+zimu+shuzi!=strlen(a)) printf("Your password is tai luan le.\n");
		else if(zimu!=0&&shuzi==0) printf("Your password needs shu zi.\n");
		else if(shuzi != 0 &&zimu == 0) printf("Your password needs zi mu.\n");
		else printf("Your password is wan mei.\n");
		memset(a,0,sizeof(a));
	}
	return 0;
}