[C++]Virtual_World_1(练习)

本文通过C++实现了一个虚拟世界,其中包括人员(person)和团体(group)的概念。人员可以建立朋友关系,团体内部成员间的关系则根据初始化类型默认陌生或熟悉。文章详细展示了如何创建这些类,并通过几个测试案例来演示其功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Virtual_World_1

Description:

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 somone, 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 knowned to each other defaultly;

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

Answer:

#include <iostream>
using namespace std;
#define MAX_FRIEND 99
#define MAX_COUNT 100

static int total_person = 0;

struct person {
    int id, friend_count, friends[MAX_FRIEND];
    person() {
        id = total_person++;
        friend_count = 0;
    }
    bool addFriend(int _id) {
        for (int i = 0; i < friend_count; i++)
            if (friends[i] == _id) return false;
        friends[friend_count++] = _id;
        return true;
    }
    bool deleteFriend(int _id) {
        for (int i = 0; i < friend_count; i++)
            if (friends[i] == _id) {
                friend_count--;
                for (int j = i; j < friend_count; j++)
                    friends[j] = friends[j+1];
                return true;
            }
        return false;
    }
};

// type_0: everybody is strange to each other at first
// type_1: everybody is known to each other at first
class group {
    int person_count, type;
    person member[MAX_COUNT];
public:
explicit group(int _type) {
    type = _type;
    person_count = 0;
}
~group() {}
void displayGroup() {
    for (int i = 0; i < person_count; i++) {
        cout << "Person_" << member[i].id << ": ";
        for (int j = 0; j < member[i].friend_count-1; j++)
            cout << member[i].friends[j] << ", ";
        if (member[i].friend_count)
            cout << member[i].friends[member[i].friend_count-1] << "\n";
        else cout << "null\n";
    }
}
bool addMember(const person &p) {
    for (int i = 0; i < person_count; i++)
        if (member[i].id == p.id) return false;
    member[person_count++] = p;
    for (int i = 0; type && i < person_count-1; i++)
        makeFriend(member[i], member[person_count-1]);
    return true;
}
bool deleteMember(const person &p) {
    for (int i = 0; i < person_count; i++)
        if (member[i].id == p.id) {
            person_count--;
            for (int j = i; j < person_count; j++)
                member[j] = member[j+1];
            return true;
        }
    return false;
}
bool makeFriend(const person &p1, const person &p2) {
    int a = -1, b = -1;
    for (int i = 0; i < person_count; 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;
    else return member[a].addFriend(member[b].id) &&
        member[b].addFriend(member[a].id);
}
bool breakRelation(const person &p1, const person &p2) {
    int a = -1, b = -1;
    for (int i = 0; i < person_count; 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;
    else return member[a].deleteFriend(member[b].id) &&
        member[b].deleteFriend(member[a].id);
}
};


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;
    } 

My Answer:

//
//  World.h
//  World
//
//  Created by 颜泽鑫 on 4/22/16.
//  Copyright © 2016 颜泽鑫. All rights reserved.
//

#ifndef World_h
#define World_h
#include <iostream>
#include <vector>
using namespace std;
struct person {
    static int num;
    int ID;
    vector<int> friends;
    person() {
        ID = num++;
    }
    int get_ID() {
        return ID;
    }
    bool addFriends(person newFriend) {
        for (int i = 0; i != friends.size(); i++) {
            if (friends[i] == newFriend.get_ID()) {
                return false;
            }
        }
        friends.push_back(newFriend.get_ID());
        return true;
    }
    bool break_Friends(person NoFriend) {
        vector<int>::iterator iter = friends.begin();
        while (iter != friends.end()) {
            if (*iter == NoFriend.get_ID()) {
                friends.erase(iter);
                return true;
            }
            iter++;
        }
        return false;
    }
};
int person::num = 0;
class group {
private
:
    int Known;
    vector<person> member;
public
:
    explicit group(int i = 0) : Known(i) {
    }
    void displayGroup() {
        for (int i = 0; i != member.size(); i++) {
            cout << "Person_" << member[i].get_ID() << ": ";
            if (member[i].friends.begin() == member[i].friends.end()) {
                cout << "null" << endl;
            }
            for (vector<int>::iterator iter = member[i].friends.begin();
                 iter != member[i].friends.end(); iter++) {
                if (iter + 1 == member[i].friends.end()) {
                    cout << *iter << endl;
                    break;
                }
                cout << *iter << ", ";
            }
        }
    }
    bool addMember(person p) {
        for (int i = 0; i != member.size(); i++) {
            if (member[i].get_ID() == p.get_ID()) {
                return false;
            }
        }
        member.push_back(p);
        for (int i = 0; Known && i != member.size() - 1; i++) {
            makeFriend(member[i], member[member.size() - 1]);
        }
        return true;
    }
    bool deleteMember(person p) {
        for (vector<person>::iterator iter = member.begin();
             iter != member.end(); iter++) {
            if (iter->get_ID() == p.get_ID()) {
                member.erase(iter);
                return true;
            }
        }
        return false;
    }
    bool makeFriend(person p1, person p2) {
        for (int i = 0; i != member.size(); i++) {
            if (member[i].get_ID() == p1.get_ID()) {
                member[i].addFriends(p2);
            }
            if (member[i].get_ID() == p2.get_ID()) {
                member[i].addFriends(p1);
            }
        }
        return true;
    }
    bool breakRelation(person p1, person p2) {
        int p1_loc = 0;
        int p2_loc = 0;
        for (int i = 0; i != member.size(); i++) {
            if (member[i].get_ID() == p1.get_ID()) {
                p1_loc = i;
            }
            if (member[i].get_ID() == p2.get_ID()) {
                p2_loc = i;
            }
        }
        member[p1_loc].break_Friends(p2);
        member[p2_loc].break_Friends(p1);
        return true;
    }
};

#endif /* World_h */

反思&总结:

此题难度在于==建立模型==!也就是根据题目要求完成对类的构建。最开始我尝试着使用==vector< person> friends==,但最后发现,这是不必要的。因为push_back会产生大量的开销,而且本质上,我们只需要获得person的id就足够了。所以直接做一个vector< int>即可。另外,对于==type==,我研究了很久,最后浑水摸鱼完成了,但答案给出了更好的方法,就是在没增加一个member的时候,都让其他的成员和新增的member之间建立联系,这种方法代码量很少,而且效率并不低,值得学习。此外,还是同样的问题,对于C++这种面向对象的编程,一定要学会调用已经写好的函数,就像此题的make friend之类的函数,这是非常重要的一种思想。最后,在代码完成之后,最好进行代码重构,这样代码看起来会更加的简洁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值