所述问题是“编写一个程序,将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;
}
}
}
}
答案 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>
然后你应该为你的变量赋予有意义的名字。在a
和b
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;
}