如何用C ++解决这个打印输出

时间:2015-12-18 05:49:11

标签: c++

我在最近的采访中遇到了以下C ++问题,但却无法做到。请帮忙。

考虑到公司结构,每个员工向上级报告,一直到CEO,您将如何打印出特定个人监督的所有员工?

编写一个实现此方法的方法,如下所示:

// Employee object contains a string denoting the. 
// employee name, and an array containing 
// employees who report to this employee

 Employee {
 String name;
 Employee[] employees;
 }

我已经看到并理解了递归函数。但我没有遇到像这样的递归对象/结构。

我的新问题是如何从这个类/结构创建和初始化对象,因为它是递归的? 再次感谢你。

2 个答案:

答案 0 :(得分:3)

根据给出的信息,很难回答(问题可能应该暂停)。总之...

我认为递归方法就是答案。您需要一个可以获取名称的函数,在该完整的员工列表中搜索该名称,然后再次为本地数组中的每个员工调用该函数。类似的东西:

void doit(Employee& e)
{
    // Print e.name

    // For each employee tmp in e.employees (i.e. local array)
    doit(tmp);
}

注意 - 这要求manager-employee数组中没有循环。如果有这将是一个无限循环。所以这是一种危险的方法。

编辑:

这是由于OP的评论而添加的。

如上所述,问题含糊不清,并没有提供足够的信息来提供一个好的答案。问题中给出的结构不是有效的C ++,也没有描述如何维护公司的员工名单。

然而,为了简单起见,打印可能如下所示:

struct Employee
{
    void PrintAllReportingEmployee(int level)
    {
        cout << string(4*level, ' ') << name << endl;
        level++;
        for (auto& e : employeesDirectlyReportingToThisEmployee)
        {
            e.PrintAllReportingEmployee(level);
        }
    }

    string name;
    vector<Employee> employeesDirectlyReportingToThisEmployee;
};


// Code in some print function:

// Step 1 - find the relevant employee
Employee tmp = SomeFunctionReturningAnEmployeeBasedOnName("NameOfPerson");

// Step 2 - print all employees reporting directly and indirectly
tmp.PrintAllReportingEmployee(0);

这假设一名顶级员工(例如董事)带有直接向董事报告的员工。然后,每个人都会有一个向他们报告的员工矢量等等。所以它是一种树状结构。

注意,如果我应该设计一个员工数据库,我就不会采用这样的解决方案。

答案 1 :(得分:-2)

曾经问过这个问题的人正在寻找与类继承有关的答案。所以Persion类是由Employee扩展的,其中Person也由Manager等扩展,在那里他们都共享一些类似的属性,但不是一切。

这意味着您的代码可以被其他程序员扩展,一个更改可以修复许多不同的类!

虽然这段代码没有演示类继承,但它可以正常工作。

 /*
    THE OUTPUT:

    Jacobs-MacBook-Pro:~ jacob$ ./employee
    Foo McGoo
    Bar Too
    Jacobs-MacBook-Pro:~ jacob$ 
    */

    #include <iostream>
    #include <string>
    #include <vector>

    using std::string;
    using std::vector;
    using std::cout;
    using std::endl;

    /* define class (this should be in a header file) */
    class Employee{
    public:
        //Variables
        string Name;
        //Functions
        Employee(const string&); //constructor
        void AddCoWorker(const Employee&);
        void ShowCoWorkers();
    private:
        vector<Employee> employees;
    }; //Note the semicolon

    //Entry point
    int main(int argc, char **argv){
        Employee foo("Foo McGoo");
        Employee bar("Bar Too");
        Employee me("Bevis");

        me.AddCoWorker(foo);
        me.AddCoWorker(bar);
        me.ShowCoWorkers();
    return 0;
    }

    //Class functions (should be in a separate cpp file)
    Employee::Employee(const string& name){
        this->Name = name;
    }

    void Employee::AddCoWorker(const Employee &e){
        this->employees.push_back(e);
    }

    void Employee::ShowCoWorkers(){
        int count = this->employees.size();
        for(int i = 0; i < count; i++){
            //Print the names of each co worker on separate lines
            cout << this->employees[i].Name << endl;
        }
    }