[代码题]Simple_Virtual_World

题目描述:
This is a virtual world, none of us can tell whether it is real or not. But I need you now~
Now, you are require to build this world, first you should make ‘person’ and ‘group’.
In the world, we can make group to invite persons or remove someone, make friends with others or break up with someone.
The rules of the world is inside the ‘main.cpp’, and the structure of ‘world.h’ is at the bottom of ‘main.cpp’
Some notes:
for ‘person’, when build a person, an ID would be arrange to him;
the ID is from 0 - 9900, the first should be 0 and the next will be 1…;
for ‘group’, when build a group, an integer (0 or 1) is needed for initialization;
‘0’ means persons inside the group is strange to each other defaultly;
‘1’ means persons inside the group is already known to each other by default;
for ‘displayGroup()’, format is as the following:
Person_ID: ID sequence of the person’s friends (early-make friend should be print first!)
example => Person_0: 0, 2

测试文件:

#include <iostream>
#include "world.h"
using namespace std;

void test_1() {
    person mike, jack, lily, carson, sucie;
    group school(0), family_1(1), family_2(1);
    // make group (act as a society)
    school.addMember(mike);
    school.addMember(jack);
    school.addMember(lily);
    family_1.addMember(mike);
    family_1.addMember(carson);
    family_2.addMember(jack);
    family_2.addMember(lily);
    family_2.addMember(sucie);
    // construct relationship in the society
    school.makeFriend(mike, jack);
    school.makeFriend(mike, lily);
    // display the society
    cout << "\n------ SCHOOL -----\n";
    school.displayGroup();
    cout << "\n------ FAMILY_1 -----\n";
    family_1.displayGroup();
    cout << "\n------ FAMILY_2 -----\n";
    family_2.displayGroup();
}

void test_2() {
    person Baidu, Alibaba, Tencent, NTES, Kingsoft_Antivirus, _360safe;
    group BAT(1), ECommerce(1), Security(1);
    // make group (act as a society)
    BAT.addMember(Baidu);
    BAT.addMember(Alibaba);
    BAT.addMember(Tencent);
    ECommerce.addMember(Baidu);
    ECommerce.addMember(Alibaba);
    ECommerce.addMember(Tencent);
    ECommerce.addMember(NTES);
    Security.addMember(Kingsoft_Antivirus);
    Security.addMember(_360safe);
    // display the society
    cout << "\n------ BAT -----\n";
    BAT.displayGroup();
    cout << "\n------ ECommerce -----\n";
    ECommerce.displayGroup();
    cout << "\n------ Security -----\n";
    Security.displayGroup();
}

void test_3() {
    person p0, p1, p2, p3, p4;
    group g0(0), g1(0), g2(1);
    // make group (act as a society)
    g0.addMember(p0);
    g0.addMember(p1);
    g0.addMember(p2);
    g1.addMember(p0);
    g1.addMember(p3);
    g2.addMember(p3);
    g2.addMember(p4);
    // construct relationship in the society
    g1.makeFriend(p0, p3);
    g2.breakRelation(p3, p4);
    g0.deleteMember(p2);
    // display the society
    cout << "\n------ G0 -----\n";
    g0.displayGroup();
    cout << "\n------ G1 -----\n";
    g1.displayGroup();
    cout << "\n------ G2 -----\n";
    g2.displayGroup();
}

void test_4() {
    person p[50];
    group g0(0), g1(1);
    int p_count;
    cin >> p_count;
    // make group (act as a society)
    for (int i = 0; i < p_count/2; i++)
        g0.addMember(p[i]);
    for (int i = p_count/2; i < p_count; i++)
        g1.addMember(p[i]);
    // construct relationship in the society
    for (int i = 0; i < p_count/5; i += 2)
        g0.makeFriend(p[i], p[i+1]);
    for (int i = p_count/2; i < p_count*3/4-1; i += 2)
        g1.breakRelation(p[i], p[i+1]);
    for (int i = p_count/4; i < p_count/2; i++)
        g0.deleteMember(p[i]);
    for (int i = p_count*3/4; i < p_count; i++)
        g1.deleteMember(p[i]);
    // display the society
    cout << "\n------ G0 -----\n";
    g0.displayGroup();
    cout << "\n------ G1 -----\n";
    g1.displayGroup();
}

int main() {
    int test_id;
    cin >> test_id;
    switch (test_id) {
        case 1:
        test_1();
        break;
        case 2:
        test_2();
        break;
        case 3:
        test_3();
        break;
        case 4:
        test_4();
        break;
        default:
        cout << "wrong input\n";
    }
    return 0;
}

Virtual World1这道题貌似有三种方法,一种是句柄类,一种是用两个数组,一种是用STL里面的链表。
下面记录在写的过程中发现的一些知识点的漏洞:
发现如果函数参数仅仅这样写bool addMember(person &p)是会因为引用而不符合google style的,必须在person前面加一个const才能过,可是加了const又会导致更改不了变量p的内容,如果遇到需要更改的情况,该怎么处理?正确的姿势是在引用&符号左右两边都加上空格。

P.S.google style其实是一个不错的规范写代码风格的工具。

还有,如果定义person member[5],然后member[0] = p1,实际上只是复制了一个p1进了member,member[0]和p1的地址是不一样的,并不是同一个东西,所以才会出现以下的问题:
makeFriend函数和breakRelation函数,如果写成以下情况:

bool group::makeFriend(person &p1, person &p2) {
    int i;
    for (i = 0; i < p1.num_of_fri; ++i)
        if (p1.fri[i] == p2.ID) return false;
    for (i = 0; i < p2.num_of_fri; ++i)
        if (p2.fri[i] == p1.ID) return false;
    p1.fri[p1.num_of_fri++] = p2.ID;
    p2.fri[p2.num_of_fri++] = p1.ID;
    return true;
}

并不能实现member数组中的p1和p2makeFriends,只能实现传进来的p1、p2makefriend,虽然这里处理的是引用,但是这个引用的原型跟member里的并不是同一个东西,改成以下形式就可以了:

bool group::makeFriend(const person &p1, const person &p2) {
    int i, a = -1, b = -1;
    for (int i = 0; i < number; i++)
        if (member[i].ID == p1.ID) a = i;
        else if (member[i].ID == p2.ID) b = i;
    if (a == -1 || b == -1) return false;
    member[a].fri[member[a].num_of_fri++] = member[b].ID;
    member[b].fri[member[b].num_of_fri++] = member[a].ID;
    return true;
}

这样子直接在member中跟p1 p2一样的person上面操作,可以实现目的。

参考的解决问题的代码:

#ifndef world_h
#define world_h
#include "iostream"
using namespace std;
static int total = 0;
struct person {
    int ID;
    int fri[100];
    int num_of_fri;
    person() {
        num_of_fri = 0;
        ID = total++;
        for (int i = 0; i < 100; ++i)
            fri[i] = -1;
    }
};

class group {
 public:
    explicit group(bool b);
    ~group();
    void displayGroup();
    bool addMember(const person &p);
    bool deleteMember(const person &p);
    bool makeFriend(const person &p1, const person &p2);
    bool breakRelation(const person &p1, const person &p2);
 private:
    bool relation;
    int number;
    person member[100];
};
#endif /* world_h */
group::group(bool b) {
    relation = b;
    number = 0;
    for (int i = 0; i < 100; i++)
        member[i];
}
group::~group() {}
bool group::addMember(const person &p) {
    if (number > 100)
        return false;
    member[number] = p;
    if (relation == 1) {
        for (int i = 0; i < number; ++i)
            member[number].fri[i + member[number].num_of_fri] = member[i].ID;
        member[number].num_of_fri += number;
        for (int j = 0; j < number; ++j)
            member[j].fri[member[j].num_of_fri++] = member[number].ID;
    }
    number++;
    return true;
}
bool group::deleteMember(const person &p) {
    if (number < 1) return false;
    for (int i = 0; i < number; i++) {
        if (member[i].ID == p.ID) {
            for (int j = i; j < number - 1; ++j)
                member[j] = member[j + 1];
            number--;
            return true;
        }
    }
    return false;
}
bool group::makeFriend(const person &p1, const person &p2) {
    int i, a = -1, b = -1;
    for (int i = 0; i < number; i++)
        if (member[i].ID == p1.ID) a = i;
        else if (member[i].ID == p2.ID) b = i;
    if (a == -1 || b == -1) return false;
    member[a].fri[member[a].num_of_fri++] = member[b].ID;
    member[b].fri[member[b].num_of_fri++] = member[a].ID;
    return true;
}
bool group::breakRelation(const person &p1, const person &p2) {
    int i, j, a, b;
    for (i = 0; i < number; i++)
        if (member[i].ID == p1.ID) a = i;
        else if (member[i].ID == p2.ID) b = i;
    for (i = 0; i < member[a].num_of_fri; ++i)
        if (member[a].fri[i] == member[b].ID) {
            for (j = i; j < member[a].num_of_fri - 1; ++j)
                member[a].fri[j] = member[a].fri[j + 1];
            member[a].num_of_fri--;
        }
    for (i = 0; i < member[b].num_of_fri; ++i)
        if (member[b].fri[i] == member[a].ID) {
            for (j = i; j < member[b].num_of_fri - 1; ++j)
                member[b].fri[j] = member[b].fri[j + 1];
            member[b].num_of_fri--;
        }
    return true;
}
void group::displayGroup() {
    for (int i = 0; i < number; ++i) {
        cout << "Person_" << member[i].ID << ": ";
        for (int j = 0; j < member[i].num_of_fri - 1; ++j)
            cout << member[i].fri[j] << ", ";
        if (member[i].num_of_fri != 0)
            cout << member[i].fri[member[i].num_of_fri - 1] << endl;
        else
            cout << "null\n";
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值