第七章学习小结

输入格式:

输入首先给出一个正整数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”。

这个题目如果用map会非常简单,否则就要用hash实现。

这里我是通过一个简单的结构体数组实现的。

根据题目要求我们创建一个结构体

struct Account {
    char command;
    string qq;
    string key;
}a[100000];
struct

在主函数中,把输入的“N”和“L”单独拿出来做调用函数的判断。若为“L”则调用与登录相关的函数,否则调用与创建相关的函数。

对于每次的创建和登录,都需要判断一下账号是否已经存在,因此,在单独创建一个判断函数来判断。在这个函数中,我们需要与之前存储过的内容相比较,因此要把当前的循环数也传进去。

int check(Account a[], int n,string qqt)
{
    for (int i = 0; i <= n; i++)
    {
        if (qqt == a[i].qq)return i;//如果能在a数组中找到账号,则返回下标
    }
    return -1;//若退出循环则证明没找到
}
check

接下来进入与“N”有关的函数。不论是调用创建函数还是登录函数,在传参的时候都要把当前的循环数传进去。在这个函数中先调用check函数判断账号是否存在,若不存在,则将账号密码写入当前循环数的数组中

void Create(Account a[], int n)
{
    string qqt;
    string keyt;
    cin >> qqt >> keyt;//将当前的两个字符串输入
    if (check(a, n, qqt) >= 0)
        {//返回值大于0代表可以在a数组中找到账号
            cout << "ERROR: Exist" << endl;
            return;
        }
    a[n].qq = qqt;
    a[n].key = keyt;//若退出循环则证明账号不存在,将存储的两个字符串存入a数组,代表创建账号
    cout << "New: OK" << endl;
    return;
}
Create

与“L”有关的函数同理,只不过稍微复杂一点。

bool Login(Account a[], int n)
{
    string qqt;
    string keyt;
    cin >> qqt >> keyt;
    if (check(a, n, qqt) == -1) {//判断账号是否存在
        cout << "ERROR: Not Exist" << endl;
        return false;
    }
    if (check(a, n, qqt) >= 0) {//判断密码是否正确
        int x = check(a, n, qqt);//将账号下标回传给x
        if (keyt == a[x].key) {
            cout << "Login: OK" << endl;
            return true;
        }
    }
    cout << "ERROR: Wrong PW" << endl;//若退出循环则表明账号存在但是密码不正确
    return false;
}
Login

在写完这几个函数之后基本就大功告成了。拿去pta上跑,会发现sample毫无意外的过了。但是后面两个监测点都会超时,因此需要对代码进行优化。首先对代码进行检查,很容易发现,超时点位于check函数,因为每次调用check函数都要比较n遍,所以当数组开到十的五次方的时候就会超时。然后就优化就好啦

 

posted @ 2019-06-02 09:53  CharlesKassel  阅读(120)  评论(0编辑  收藏  举报