我正在尝试编写一个c ++程序,我需要接受5人的姓名,年龄和地址,并显示最年长的人的姓名。我能够找到最年长的人的年龄,但对如何打印与该年龄相对应的名称感到困惑。请查看我的代码,并帮助我如何做到这一点。
我的C ++代码是:
#include <iostream>
using namespace std;
struct student{
char name[20];
int age;
char add[40];
};
int main()
{
student stu[5];
int i, max;
for (i = 0; i <=4; i++)
{
cout << "\n Enter name";
cin >>stu[i].name;
cout << "\n Enter age";
cin >>stu[i].age;
cout << "\n Enter address";
cin >>stu[i].add;
}
max = stu[0].age;
for ( i = 0; i <=4; i++)
{
if (stu[i].age > max)
max = stu[i].age;
}
cout << "Max age is: " <<max;
return 0;
}
我能找到最大年龄。请帮我告诉我如何显示年龄最大的人的姓名
答案 0 :(得分:3)
不是存储遇到的最大年龄,而是尝试存储指向具有最大年龄的记录的指针。像这样:
student* max = &stu[0];
for ( i = 0; i <=4; i++)
{
if (stu[i].age > max->age)
max = &stu[i];
}
std::cout << "Student with max age is " << max->name << std::endl;
答案 1 :(得分:3)
您可以使用std::max_element
中的<algorithm>
来检索指向max元素的迭代器:
auto it = std::max_element(std::begin(stu), std::end(stu),
[](const student& lhs, const student& rhs) {
return lhs.age < rhs.age;
});
std::cout << "Oldest is " << it->name << " with " << it->age << std::endl;
答案 2 :(得分:2)
你几乎就在那里。当你找到年龄时,请保持最年长:
student eldest;
for ( i = 0; i <=4; i++)
{
if (stu[i].age > max)
{
max = stu[i].age;
eldest = stu[i];
}
}
cout << "Max age is: " <<max << " named " << eldest.name;
return 0;
}
答案 3 :(得分:2)
您可以保留达到最大值的索引,这样您就可以访问该条目中的所有信息。
int maxi = 0;
for ( i = 1; i <=4; i++)
{
if (stu[i].age > stu[maxi].age)
{
maxi = i;
}
}
cout << "max age is " << stu[maxi].age << " and name is " << stu[maxi].name;
答案 4 :(得分:1)
添加另一个类型为student的变量maxStudent,只要if语句为true,就设置它。然后最后你应该有正确的学生,你可以打印出每个领域。
答案 5 :(得分:1)
只需更改&#34; max&#34;从int到学生 -
student max;
max.age = stu[0].age;
strcpy( stu[0].name, max.name );
strcpy( stu[0].add, max.add );
for ( i = 0; i <=4; i++)
{
if (stu[i].age > max)
max.age = stu[i].age;
strcpy( stu[i].name, max.name );
strcpy( stu[i].add, max.add );
}
答案 6 :(得分:0)
您的代码通常会因缺少std::vector
和std::string
而受到影响。除非您有充分的理由使用它们,否则不应使用数组。
因此,您的结构student
应为:
struct student{
std::string name;
int age;
std::string add;
};
同样,main
中的数组应该变为:
std::vector<student> stu;
请注意您不再需要考虑尺寸。
接下来就是寻找最年长的人。 C ++已经有了在中找到最好的东西的工具。在<algorithm>
标题中,有一个名为std::max_element
的函数就是这样做的。它适用于任何具有“小于”的指定含义的东西。例如,两个int
变量具有“小于”关系,例如“4小于5”。
您的student
结构没有这种自然关系,但您可以通过提供operator<
来添加它:
struct student{
std::string name;
int age;
std::string add;
bool operator<(student const &other) const
{
return age < other.age;
}
};
这将有效:
std::vector<student>::const_iterator eldest_student_iter = std::max_element(stu.begin(), stu.end());
int max_age = eldest_student_iter->age;
现在有人可能会说这会在student
结构本身中添加太多功能,并且它使age
比其他两个成员更重要,这可能在逻辑上不合理。
幸运的是,std::max_element
有第二个版本接受第三个参数;一个所谓的仿函数,它告诉函数如何比较两个元素。这是一个例子:
struct StudentComparison
{
bool operator()(student const &lhs, student const &rhs) const
{
return lhs.age < rhs.age;
}
};
std::vector<student>::const_iterator eldest_student_iter = std::max_element(stu.begin(), stu.end(), StudentComparison());
int max_age = eldest_student_iter->age;
这应该很好地包装在它自己的函数中:
int GetHighestAge(std::vector<student> const &stu)
{
std::vector<student>::const_iterator eldest_student_iter = std::max_element(stu.begin(), stu.end(), StudentComparison());
int max_age = eldest_student_iter->age;
return max_age;
}
在实际代码中,您还必须决定在没有最大元素时应该发生什么,因为学生的向量是空的。
int GetHighestAge(std::vector<student> const &stu)
{
if (stu.empty())
{
// error...
}
std::vector<student>::const_iterator eldest_student_iter = std::max_element(stu.begin(), stu.end(), StudentComparison());
int max_age = eldest_student_iter->age;
return max_age;
}
如果使用C ++ 11,则可以更简洁地编写代码。您不再需要在其他地方定义StudentComparison
仿函数,但可以使用所谓的 lambda 直接在呼叫站点定义比较。并且您可以使用auto
使您免于过度冗长的std::vector<student>::const_iterator
。
auto eldest_student_iter = std::max_element(stu.begin(), stu.end(), [](student const &lhs, student const &rhs) { return lhs.age < rhs.age; });
最后,这是一个完整的玩具示例:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
struct student{
std::string name;
int age;
std::string add;
};
int GetHighestAge(std::vector<student> const &stu)
{
if (stu.empty())
{
return -1;
}
auto eldest_student_iter = std::max_element(stu.begin(), stu.end(), [](student const &lhs, student const &rhs) { return lhs.age < rhs.age; });
int max_age = eldest_student_iter->age;
return max_age;
}
int main()
{
std::vector<student> stu;
// some test data:
student s1;
s1.name = "One";
s1.age = 18;
s1.add = "Somewhere";
student s2;
s2.name = "Two";
s2.age = 21;
s2.add = "Somewhere Else";
student s3;
s3.name = "Three";
s3.age = 20;
s3.add = "Yet Somewhere Else";
stu.push_back(s1);
stu.push_back(s2);
stu.push_back(s3);
std::cout << "Max age: " << GetHighestAge(stu) << "\n";
}
最后一个提示:存储出生日期而不是年龄。出生日期永远保持不变,年龄变得过时。
答案 7 :(得分:-1)
这是您的程序的编辑版本,希望您喜欢它。它显示了最年长的人的所有细节
//找出学生所有细节中的最高年龄
#include < iostream >
using namespace std;
struct student
{
char name[20];
int age;
char add[40];
};
int main()
{
student stu[5];
int i, n, max;
cout << "\nenter the no. of record you want to enter : ";
cin >> n;
for (i = 0; i < n; i++)
{
cout << "\n Enter name : ";
cin >> stu[i].name;
cout << "\n Enter age : ";
cin >> stu[i].age;
cout << "\n Enter roll : ";
cin >> stu[i].add;
}
max = stu[0].age;
for (i = 0; i < n; i++)
{
if (stu[i].age > max)
max = stu[i].age;
}
cout << "\nHighest age report detail -----";
for (i = 0; i < n; i++)
{
if (stu[i].age == max)
{
cout << "\n your name : " << stu[i].name;
cout << "\n your age : " << stu[i].age;
cout << "\n your roll : " << stu[i].add;
}
}
return 0;
}
这个程序是完全编译的