C ++程序比较5个人的年龄并打印最年长的人的名字

时间:2014-07-27 07:18:57

标签: c++

我正在尝试编写一个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;
}

我能找到最大年龄。请帮我告诉我如何显示年龄最大的人的姓名

8 个答案:

答案 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;

Live example

答案 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::vectorstd::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;

}

这个程序是完全编译的