根据他们的年龄按升序显示他们的名字?

时间:2011-12-13 16:56:13

标签: c++

所述问题是“编写一个程序,将10名员工的姓名和年龄作为2D char数组中的输入,并按其年龄的升序显示其名称”。

我已粘贴到目前为止的下方,但我不知道如何按年龄按升序显示名称。我错过了什么?

#include<iostream.h>
#include<string.h>
void sort(int[],int);
void main(void)
{
    char a[10][5],x;
    int b[5],i,j;
    for(j=0;j<=5;j++)
    {
        cout<<"Enter name of Employee:";        
        for(i=0;i<10;i++)
        {

            cin>>x;
            x=a[j][i];
        }
        cout<<"Enter Employee's age:";
        cin>>b[j];
        cout<<endl;
    }
    sort(b,j);
    cout<<"Name of Employee \t\t Age \n";
    for(j=0;j<5;j++)
    {
        for(i=0;i<10;i++)
        {
            x=a[j][i];
            cout<<"\t"<<x;
        }   
        cout<<"\t\t"<<b[j]<<"\n";
    }
}
void sort(int x[],int size)
{
    int temp,i,j;
    for(j=0;j<size;j++)
    {
        for(i=0;i<size;i++)
        {
            if(x[i]>x[i+1])
            {
                temp=x[i+1];
                x[i+1]=x[i];
                x[i]=temp;
            }
        }
    }
}

4 个答案:

答案 0 :(得分:2)

我会指出你正确的方向。

你应该定义struct来保存一个Name和age对,然后做一个比较函数。

然后,您只需要填充结构的向量,然后使用标准库提供的排序函数对它们进行排序,遍历向量打印出内容,您可以定义为简化它们而生成的结构的流运算符。

http://www.cplusplus.com/doc/tutorial/structures/

http://en.cppreference.com/w/cpp/algorithm/sort

http://en.cppreference.com/w/cpp/container/vector

http://www.java2s.com/Code/Cpp/Overload/Overloadstreamoperator.htm

编辑:请为所有好的,请使用std :: string来保存名称。

http://www.cplusplus.com/reference/string/string/

使用像你这样的char数组已经被弃用了。

我开始在另一个解决方案之前写这个,因为我宁愿看看C ++能够做什么,而不是你的讲座为你提供什么。

#include <string>
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <fstream>

struct employee
{
    employee(const std::string& name_, unsigned age_)
    : name(name_), age(age_) {}

    std::string name;
    unsigned age;
};

std::ostream& operator<<(std::ostream& os, const employee& e)
{
    os << e.name << "   " << e.age;
    return os;
}

bool comp_age(const employee& e1, const employee& e2)
{
    return e1.age<e2.age;
}


int main()
{
    std::vector<employee> employees;
    employees.reserve(5);

    for(unsigned i=0; i!=5; ++i)
    {
        std::string name;
        unsigned age;

        std::cout << "Name:" << std::flush;
        std::cin >> name;
        std::cout << "Age:" << std::flush;
        if(!std::cin >> age) 
        {
            std::cerr << "not an number" << std::endl;
            --i;
            continue;
        }
        //note you should catch any failure to parse to int here

        employees.push_back(employee(name, age));
    }

    std::sort(employees.begin(), employees.end(), comp_age);

    std::copy(  employees.begin(), employees.end(),
                std::ostream_iterator<employee>(std::cout, "\n"));

    return 0;
}

所以这是一个替代方案,但请学习上面列出的构成这个例子的概念。

答案 1 :(得分:1)

您应该首先将void main更改为int main,因为void main无效C ++。然后将#include更改为真正的C ++头文件而不是您拥有的文件:

#include <iostream>
#include <string>

然后你应该为你的变量赋予有意义的名字。在ab s的海洋中遵循代码是不可能的。

然后,您需要按年龄对员工进行排序。您已经在那里编写了一个排序算法,因此您只需要调整它以交换所有员工数据而不是交换他们的年龄,同时仍然只对他们的年龄进行比较。如果代替员工数据的两个单独数组,您将更容易保留一个结构的单个数组,该数组同时包含员工的姓名和年龄:

struct employee {
    std::string name;
    int age;
};

排序后,您可以在所有员工中循环打印他们的名字。

我相信代码中还有一些问题,但它们应该很容易修复with a good reference和一些调试时间。如果你遇到麻烦,你可以用你到目前为止发布的新问题发布一个新问题,并解释一下你的问题。

如果你刚刚使用C ++标准库,这一切都会好得多,但不幸的是,有些老师决定向他们的学生教授Crippled ++而不是正确的C ++ :(

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

// treat an employee as a single unit
struct employee {
    std::string name;
    int age;
};

// a comparison function to compare two employees by their age
// should return true if the first one is younger than the second one
// this will be used for sorting later
bool is_younger(employee const& l, employee const& r) {
    return l.age < r.age;
}

int main()
{
    // a vector with 5 employees
    std::vector<employee> employees(5);
    for(j=0;j<=5;++j)
    {
        std::cout << "Enter name of Employee: "
        // read the entire name at once 
        getline(std::cin, employees[j].name);

        std::cout << "Enter Employee's age:";
        // read the age
        std::cin >> employees[j].age;
    }

    // sort all the employees using the comparison function written above
    std::sort(employees.begin(), employees.end(), is_younger);

    std::cout<<"Name of Employee \t\t Age \n";
    for(j=0;j<5;++j)
    {
        std::cout << employees[j].name;
        std::cout << "\t\t" << employees[j].age << "\n";
    }
}

答案 2 :(得分:0)

使用std::multimap(符合您需要的键/值存储),默认情况下按升序排序。您的key是年龄,value是名称。要打印值,只需使用迭代器。选择std::multimap是因为可能会有相同年龄的员工。

答案 3 :(得分:-2)

#include <iostream.h>

int main() {
    int a;
    int b;
    int sum;

    std::cout << "Enter two numbers" << std::endl;

    std::cout << "Enter the value of a" << std::endl;
    std::cin >> a;

    std:: cout << "Enter the value of b" << std::endl;
    std::cin >> b;

    sum = a + b;
    std::cout << sum << std::endl;

    return 0;
}