QQ账户申请

7-1 QQ帐户的申请与登陆 (30 point(s))
 

实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。

输入格式:

输入首先给出一个正整数N(≤),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。

输出格式:

针对每条指令,给出相应的信息:

1)若新申请帐户成功,则输出“New: OK”;
2)若新申请的号码已经存在,则输出“ERROR: Exist”;
3)若老帐户登陆成功,则输出“Login: OK”;
4)若老帐户QQ号码不存在,则输出“ERROR: Not Exist”;
5)若老帐户密码错误,则输出“ERROR: Wrong PW”。

输入样例:

5
L 1234567890 myQQ@qq.com
N 1234567890 myQQ@qq.com
N 1234567890 myQQ@qq.com
L 1234567890 myQQ@qq
L 1234567890 myQQ@qq.com

输出样例:

ERROR: Not Exist
New: OK
ERROR: Exist
ERROR: Wrong PW
Login: OK

由于这个周末事情实在有点多,这篇博客也写的有些仓促,今天就写一下关于QQ账号申请的思路吧。

首先看到这题我一开始是分析了一下这道题其实很简单,就是简单的对比判断,首先根据对象的身份是旧账户的话就判断是否已经存在,若存在就判断密码是否对。如果是新用户则判断是否存在就可以了。所以我一开始没考虑数据量的问题,就用了最简单的数据类型及简单的字符串的比较。但是毋庸置疑肯定是不行的啦,所以我参考了一下关于map的使用。简单来说map就是提供了一个容器把关键字与值连接起来。看一个例子:

enumMap[2] = "Two"; 

插入2时,先在enumMap中查找主键为2的项,没发现,然后将一个新的对象插入enumMap,键是2, 值是一个空字符串,插入完成后将字符串赋为"Two"; 该方法会将每个值都赋为缺省值,然后再赋为显示的值。我们在查找时就是使用map里的find函数find(),函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。

map<int ,string >::iterator l_it;; 

l_it=maplive.find(112); 

if(l_it==maplive.end()) 

cout<<"we do not find 112"<<endl; 

else cout<<"wo find 112"<<endl;
运用map函数就可以解决这道题了。

#include <iostream>
#include <map>
using namespace std;
typedef struct
{//定义每个qq账户信息 
    string num;//由于qq账号有10位数 
    string ps;
}qq;
qq a[100005];
int main()
{
    map<string,string> com;
    //将账号与密码关联起来 
    int n;
    cin>>n;
    char level;
    for(int i=0;i<n;i++)
    {//逐个输入并输出结果 
        cin>>level;
        if(level=='N')
        {//如果为新用户 
            cin>>a[i].num>>a[i].ps;
            if(com.find(a[i].num)==com.end())
            {//判断账号不存在 
                com[a[i].num]=a[i].ps;//把该新账户与密码关联起来 
                cout<<"New: OK"<<endl;
            }
            else
            {//判断新用户账号已存在 
                cout<<"ERROR: Exist"<<endl;
            }
            
        }
        else if(level=='L')
        {//如果是老用户 
            cin>>a[i].num>>a[i].ps;
            if(com.find(a[i].num)==com.end())
            {//如果老用户不存在 
                cout<<"ERROR: Not Exist"<<endl;
            }
            else
            {//如果与这个账号关联的密码与输入密码相等 
                if(com[a[i].num]==a[i].ps)
                cout<<"Login: OK"<<endl;
                else cout<<"ERROR: Wrong PW"<<endl;//密码不相等 
            }
        }
    }
    return 0;
}

关于第七章我们学习了关于查找的相关知识,根据线性表的查找有哨兵法,折半查找法。根据树表的查找,先是二叉排序树,为解决二叉排序树时间效率上的问题就引用了平衡二叉树,为了解决数据量的问题又引入了B树,为了实现区间查找引入了B+树。第二大块是散列表的查找问题,散列表的特点就是把关键字与相关记录的存储位置相联系,这个是采用了hash函数的方法,散列函数的构造方法有数字分析法平方取中法等等但最常用的还是除留余数法,在解决冲突的时候又有开放地址法里的线性探测法,二次探测法,伪随机探测法;链地址法则是采用了之前学的结构体数组的数据结构。

这一章关于前一大部分的练习比较少,希望下一章的学习可以有更多的练习的时间。

posted @ 2019-06-02 19:58  蓝jingjing  阅读(818)  评论(0编辑  收藏  举报