排序输入名称的“年龄”,然后显示结果

时间:2013-12-08 15:08:18

标签: c++ sorting loops

我想按相应输入名称的升序对年龄进行排序,然后根据该列表显示列表。我已经设法对它们进行排序,但我似乎无法正确地显示它们的年龄。

这是我的代码: -

#include <iostream>
using namespace std;

int main()
{
    char name [5][25];
    int age [5];
    int i;

    for (i=0 ; i<5 ; i++)
    {
        cout << "Enter name " << i+1 << "  :   ";
        cin >> name [i];
        cout << "Enter age     :   ";
        cin >> age [i];
        cout << endl;
    }

    cout << "\n********** Your entered data **********\n\n";

    cout << "\tName" << "\t\t" << "Age\n\n";

    for (i=0 ; i<5 ; i++)
    {
        cout << "\t" << name [i] << "\t\t" << age [i];
        cout << endl;
    }

    int hold;

    for (i=0 ; i<5 ; i++)
    {
        for (int j=0 ; j<5 ; j++)
        {
            if (age [j] > age [j+1])
            {
                hold = age [j];
                age [j] = age [j+1];
                age [j+1] = hold;
            }
        }
    }

    cout << "\n\n******* Sorted data (w.r.t age) *******\n\n";

    cout << "\tName" << "\t\t" << "Age\n\n";

    for (i=0 ; i<5 ; i++)
    {
        cout << "\t" << name [i] << "\t\t" << age [i];
        cout << endl;
    }

    return 0;
}

问题在于最后一个for循环。你们中的任何人都可以帮我实现这个逻辑吗?

4 个答案:

答案 0 :(得分:1)

更改交换逻辑。交换名称和年龄。

    char holdstr[25]; ///Temporary string to swap.

if (age [j] > age [j+1] || (age[j] == age[j+1])
{
    //Swap the age and name both.
    hold = age [j];
    strcpy(holdstr, name[j]);

    age [j] = age [j+1];
    strcpy(name[j], name[j+1]);

    age [j+1] = hold;
    strcpy(name[j+1], holdstr);
}

你应该将条件包含在if中,以便你可以轻松地改变你的逻辑。

答案 1 :(得分:1)

当您使用年龄(age)对数组进行排序时,年龄及其名称之间的连接将获得列表:排序之前,名称以及存储在同一索引中的相应年龄。

要解决您可以解决的问题,例如,如果出现这些问题,请执行以下操作:

  1. 在排序期间交换两个年龄时,也要交换这两个名字。
  2. 使用带有指针和索引的辅助数组,指示名称并除了年龄之外交换(类似于第一种方法,但避免交换字符串)。打印时,您可以通过此辅助设备找到相关名称。
  3. 在数组中存储一对名称和年龄并交换这些对,但仅使用年龄部分来确定排序顺序。

答案 2 :(得分:1)

同时将相应的名称换成年龄。

还有一个建议,每当你有这样的链接数据时,最好使用结构,因为将相关数据保持为一个组是有意义的。

而且,如果你交换它们,所有数据都将被交换,因此不会出现这类问题。

答案 3 :(得分:1)

由于年龄通常在1到120之间变化:),我们可以利用这个优势。使用映射技术将年龄映射到数组索引。当您的数据集扩展时,它将大大加快排序速度。我已经为5个人演示了这个,但是可以通过链接链表来轻松修改它以适用于大型数据集。

#include<cstring>
#include <iostream>
using namespace std;

int main()
{
char name [5][25];
int age [5];
int i;

char ary[120][25]; // The array used to map.

for(int i=0;i<120;i++) 
strcpy(ary[i],"");     //initialize to ""

for (i=0 ; i<5 ; i++)
{
    cout << "Enter name " << i+1 << "  :   ";
    cin >> name [i];
    cout << "Enter age     :   ";
    cin >> age [i];
    cout << endl;
}

cout << "\n********** Your entered data **********\n\n";

cout << "\tName" << "\t\t" << "Age\n\n";

for (i=0 ; i<5 ; i++)
{
    cout << "\t" << name [i] << "\t\t" << age [i];
    cout << endl;
}

//The sorting , hashing actually 
for (i=0 ; i<5 ; i++)
{
    strcpy(ary[age[i]],name[i]);
}

cout << "\n\n******* Sorted data (w.r.t age) *******\n\n";

cout << "\tName" << "\t\t" << "Age\n\n";

for (i=0 ; i<120 ; i++)
{
    if(strcmp(ary[i],""))
    cout<<ary[i]<<" "<<i<<"\n";   // The index will be equal to age
}

return 0;
}