首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于“设置一个安全密码”的有关问题

2013-11-11 
关于“设置一个安全密码”的问题本帖最后由 cookiedb 于 2011-11-25 09:29:49 编辑该题是杭电ACM上的C/C++的

关于“设置一个安全密码”的问题
本帖最后由 cookiedb 于 2011-11-25 09:29:49 编辑 该题是杭电ACM上的C/C++的题目,ID585,题目要求如下:

题目描述
假设一个比较安全的密码至少应该满足下面两个条件:
(1)密码长度大于等于8,且不要超过16。
(2)密码中的字符应该来自下面“字符类别”中四组中的至少三组。
这四个字符类别分别为:
1.大写字母:A,B,C...Z;
2.小写字母:a,b,c...z;
3.数字:0,1,2...9;
4.特殊符号:~,!,@,#,$,%,^;
给你一个密码,你的任务就是判断它是不是一个安全的密码。


输入描述
每组测试实例包含一个密码(长度最大为50),密码仅包括上面的四类字符。

输出描述
对于每个测试实例,判断这个密码是不是一个安全的密码,是的话输出YES,否则输出NO。
注意:测试数据只有一个串,不需要用循环实现多次判断。

输入样例
a1b2c3d4
Hzau@ACM
 

输出样例
NO
YES
 

我的代码如下:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
bool flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
char a[50],x,y;
int i=0;
    cin.getline(a,50,'\n');
    while(a[i]!=0) i++;
    if(i<7 || i>15)
{
cout << "NO" <<endl;
}
else
{
for(int j=0;j<i;j++)
{
y = a[j];
x = y;
if(x>=65 && x<=90)
{
flag1=1;
}
}
for(j=0;j<i;j++)
{
y = a[j];
x = y;
if(x>=97 && x<=122)
{
flag2=1;
}
}
for(j=0;j<i;j++)
{
y = a[j];
x = y;
if(x>=48 && x<=57)
{
flag3=1;
}
}
for(j=0;j<i;j++)
{
y = a[j];
x = y;
if(x==126 || x==33 ||x==64 || (x>=35 && x<=37) || x==94 )
{
flag4=1;
}
}
for(j=0;j<i;j++)
{
y = a[j];
x = y;
if(x < 33 || x==34 || (x>37 && x<48) || (x>57 && x<64) || (x>90 && x<94) || (x == 95) || x==96 || (x>122 && x<126) || x ==127 )
{
flag5=1;
}
}
}
if(flag5=1)
{
cout << "NO" << endl;
}
else
{
if(flag1 +flag2+ flag3 + flag4 >=3)
{
cout << "YES" << endl;
}
    else
{
    cout << "NO" << endl;
}
}
return 0;
}






一共十分的题,我打死都是7分,想了半天也不知道哪里不对,求高人指点!

ps:bool型判断那个地方写的是有点繁琐了,但是好歹也是写对了的。

[解决办法]

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <assert.h>

#define INVALID_CHAR        1
#define INVALID_LEN         2
#define NEED_MORE_GRP       3
#define SUCCESS             4

char grps[256] = {0};
char flag[5] = {0};

void initGrps()
{
    char c;
    // 第一组
    for(c = 'A'; c < 'Z'; ++c)
    {
        grps[c] = 1;
    }
    // 第二组
    for(c = 'a'; c < 'z'; ++c)
    {
        grps[c] = 2;
    }
    // 第三组
    for(c = '0'; c < '9'; ++c)
    {
        grps[c] = 3;
    }
    // 第四组
    grps['~'] = 4;
    grps['!'] = 4;
    grps['@'] = 4;
    grps['#'] = 4;
    grps['$'] = 4;
    grps['%'] = 4;
    grps['^'] = 4;
}

int checkStr(const char* str)
{
    assert(str);
    memset(flag, 0, 5);
    const char* tmp = str;
    int len = 0;
    while(*tmp)
    {
        flag[grps[*tmp]] = 1;
        len++;


        tmp++;
    }

    printf("%s", str);
    if(len < 8 
[解决办法]
 len > 16)
    {
        printf("长度为%d, 不合法\n", len);
        return INVALID_LEN;
    }

    if(flag[0])
    {
        printf("不合法:有非法字符\n");
        return INVALID_CHAR;
    }

    if((flag[1] + flag[2] + flag[3] + flag[4]) < 3)
    {
        printf("不合法:至少需要有三个组中的字符!\n");
        return NEED_MORE_GRP;
    }

    printf("检测通过\n");
    return SUCCESS;
}

int main()
{
    initGrps();
    checkStr("aaaaaaaaa");
    checkStr("aA1");
    checkStr("aA1aA1aA1");
    checkStr("aaaAAA%%");
}


[解决办法]
题目描述
假设一个比较安全的密码至少应该满足下面两个条件:
(1)密码长度大于等于8,且不要超过16。
但是你的代码中是这样的
if(i<7 
[解决办法]
 i>15)
{
    cout << "NO" <<endl;
}
应该是
if(i<7 
[解决办法]
 i>16) // i > 16才为假
{
    cout << "NO" <<endl;
}

[解决办法]

#include <iostream>
using namespace std;
int main()
{
int flag1 = 0,flag2 = 0,flag3 = 0,flag4 = 0;
    char a[50];
    int i=0;
    cin.getline(a,50,'\n');
    while(a[i]!=0) 
i++;
    if(i<7 
[解决办法]
 i>15)
    {
        cout << "NO" <<endl;
    }
    else
    {
        for( int j = 0; j < i ; j ++ )
{
if( a[j] >= 'A' && a[j] <= 'Z' )
{
flag1 = 1;
}
else if( a[j] >= 'a' && a[j] <= 'z' )
{
flag2 = 1;
}
else if( a[j] >= '0' && a[j] <= '9' )
{
flag3 = 1;
}
else if( a[j] == '~' 
[解决办法]
 a[j] == '@' 
[解决办法]
 a[j] == '#' 
[解决办法]
 a[j] == '$' 
[解决办法]
 a[j] == '%' )
{
flag4 = 1;
}
}
    }
    if( flag1 + flag2 + flag3 + flag4 >= 3 )
    {
        cout << "YES" << endl;
    }
    else
    {
        cout << "NO" << endl;
    }
    return 0;
}

热点排行