[期中][Class and Object] Cat & CatFamily

[期中][Deep copy && Shallow Copy] SongList
Problem Description
以下是一个简单的信息系统的例子。这个例子中缺少Cat类和CatFamily类(假设CatFamily中至多有100只猫)。
请阅读C++主程序,并了解类你需要实现一些什么。
EXAMPLE INPUT

2
CWIGAKZPB
4
4
3
PAUGOCDWM
4
1
XLAQWFT 10
2
ZINYSVEH
4
2
ZTYMHJGO
3
YITJLASK
4
2
CIXSDKMZ
4
2
XLAQWFT
2
KLPMURWX
4
2
USFTVBJMK
4
1
HAFGM 2
1
NVUIH 4
0

EXAMPLE OUTPUT

1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
Fail to remove cat: CWIGAKZPB
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
We have these cats:
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
We have these cats:
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
No such cat: PAUGOCDWM
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
We have these cats:
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
Successfully added cat: XLAQWFT
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
Fail to remove cat: ZINYSVEH
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
We have these cats:
    XLAQWFT of 10years old
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
Fail to remove cat: ZTYMHJGO
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
No such cat: YITJLASK
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
We have these cats:
    XLAQWFT of 10years old
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
Fail to remove cat: CIXSDKMZ
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
We have these cats:
    XLAQWFT of 10years old
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
Successfully removed cat: XLAQWFT
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
Fail to remove cat: KLPMURWX
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
We have these cats:
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
Fail to remove cat: USFTVBJMK
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
We have these cats:
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
Successfully added cat: HAFGM
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
Successfully added cat: NVUIH
1. Add a cat
2. Remove a cat
3. Find a cat
4. Print all cats
0. Exit this game
See you

主程序(C/C++)

#include <iostream>
#include <string>
using namespace std;

#include "source.cpp"

int main_menu() {
    cout << "1. Add a cat" << endl;
    cout << "2. Remove a cat" << endl;
    cout << "3. Find a cat" << endl;
    cout << "4. Print all cats" << endl;
    cout << "0. Exit this game" << endl;
    int choice;
    cin >> choice;
    return choice;
}

void add_a_cat(CatFamily & cat_family) {
    string cat_name;
    int cat_age;
    cin >> cat_name >> cat_age;
    if (cat_family.add_a_cat(cat_name, cat_age)) 
        cout << "Successfully added cat: " << cat_name << endl;
    else 
        cout << "Fail to add cat: " << cat_name << endl;
}

void remove_a_cat(CatFamily & cat_family) {
    string cat_name;
    cin >> cat_name;
    if (cat_family.remove_a_cat(cat_name))
        cout << "Successfully removed cat: " << cat_name << endl;
    else
        cout << "Fail to remove cat: " << cat_name << endl;
}

void find_a_cat(CatFamily & cat_family) {
    string cat_name;
    cin >> cat_name;
    if (cat_family.has_cat(cat_name)) {
        cout << "Here is your cat: " 
            << cat_family.get_cat(cat_name).cat_name 
            << " of " << cat_family.get_cat(cat_name).cat_age << "years old" << endl;
    }
    else
        cout << "No such cat: " << cat_name << endl;
}

void print_all_cats(CatFamily & cat_family) {
    cout << "We have these cats:" << endl;
    for (int i = 0; i < cat_family.number_of_cats(); ++ i) {
        string cat_name = cat_family[i];
        cout << '\t' << cat_family.get_cat(cat_name).cat_name 
            << " of " << cat_family.get_cat(cat_name).cat_age << "years old" << endl;        
    } 
}

int main() {
    CatFamily cat_family;
    while (true) {
        int choice = main_menu();
        switch (choice) {
            case 0: cout << "See you" << endl; exit(0);
            case 1: add_a_cat(cat_family); break;
            case 2: remove_a_cat(cat_family); break;
            case 3: find_a_cat(cat_family); break;
            case 4: print_all_cats(cat_family);
        }
    }
}

答案

#include<iostream>
#include<string>
using namespace std;

class Cat {
public:
    string cat_name;
    int cat_age;
};

class CatFamily
{
    Cat cats[100];
    int count;
    int _index(const string & name) const {
        for (int i = 0; i < count; ++ i)
            if (cats[i].cat_name == name) return i;
        return -1;
    }
public:
    CatFamily() {
        count = 0;
    }
    
    int number_of_cats() const {
        return count;
    }
    
    string operator[] (int num) const {
        return cats[num].cat_name;
    }
    
    bool add_a_cat(const string & name, int age) {
        int i = _index(name);
        if (i != -1) 
            return false;
        Cat cat;
        cat.cat_name = name;
        cat.cat_age = age;
        cats[count] = cat;
        ++ count;
        return true;
    }
    
    bool remove_a_cat(const string & name) {
        int i = _index(name);
        if (i == -1) 
            return false;
        cats[i] = cats[count - 1];
        -- count;
        return true;
    }
    
    bool has_cat(const string & name) const {
        int i = _index(name);
        return (i != -1);
    }
    
    Cat get_cat(const string & name) const {
        int i = _index(name);
        return cats[i];
    }
    
};

随机测试文本产生程序 (C)

#include "stdio.h"

int main() {
    printf("2\n\
CWIGAKZPB\n\
4\n\
4\n\
3\n\
PAUGOCDWM\n\
4\n\
1\n\
XLAQWFT 10\n\
2\n\
ZINYSVEH\n\
4\n\
2\n\
ZTYMHJGO\n\
3\n\
YITJLASK\n\
4\n\
2\n\
CIXSDKMZ\n\
4\n\
2\n\
XLAQWFT\n\
2\n\
KLPMURWX\n\
4\n\
2\n\
USFTVBJMK\n\
4\n\
1\n\
HAFGM 2\n\
1\n\
NVUIH 4\n\
0");    
}
支持 makedown语法