【问题标题】:Sort names alphabetically按字母顺序排列名称
【发布时间】:2013-12-08 18:33:46
【问题描述】:

我正在尝试按字母顺序对名称进行排序 例如,如果用户输入姓名和 GPA:

Names          GPA
Peter          2.8
Robert         5.6
David          7.8

输出应该是:-

Names          GPA
David          7.8
Peter          2.8
Robert         5.6

这是我目前的程序(INCOMPLETE):-

#include <iostream>
using namespace std;

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

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

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

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

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

    for (i=0 ; i<5 ; i++)
    {
        for (int j=0 ; j<1 ; j++)
        {
            cout << (int) name [i][j] << endl;



        }
    }

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

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

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

    cout << endl;

    return 0;
}

请记住,只有名称应按字母顺序排序。我在for 循环中间取了输入名称的第一个字符的 ASCII 值,但是:- 1- 's' 的 ASCII 码与 'S' 不同(这对我来说是个问题) 2-我似乎无法创建一个逻辑来比较名称的第一个字母的 ASCII 值,然后对它们进行相应的排序。然后将名称与排序的字母列表链接并显示结果。此外,GPA 应与名称相关联。

任何帮助将不胜感激。

【问题讨论】:

标签: c++ arrays sorting ascii alphabetical


【解决方案1】:

这是使用 std::sort 的答案。我改变了你的一些类似 C 的方法,并且使用 std::sort 实际上迫使我这样做。比较函数(compareStudents)需要对象,所以我必须创建结构。使用 Vector 的原因相同,尽管可以继续使用数组,但这通常是不受欢迎的。

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

using namespace std;

struct Student {
    string name;
    float gpa;

    Student(string name, float gpa) {
        this->name = name;
        this->gpa = gpa;
    }
};

bool compareStudents(Student a, Student b) {
    return a.name.compare(b.name) < 0;
}

int main() {
    const int studentCount = 2;
    vector<Student> studentVector;
    int i;

    for (i = 0 ; i < studentCount ; i++) {
        cout << "Enter name " << i + 1 << "  :   ";
        string name;
        cin >> name;
        cout << "Enter GPA     :   ";
        float gpa;
        cin >> gpa;
        cout << endl;

        studentVector.push_back(Student(name, gpa));
    }

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

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

    vector<Student>::iterator it = studentVector.begin();
    for (; it != studentVector.end(); ++it) {
        Student student = *it;
        cout << "\t" << student.name << "\t\t" << student.gpa;
        cout << endl;
    }

    sort(studentVector.begin(), studentVector.end(), compareStudents);

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

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

    it = studentVector.begin();
    for (; it != studentVector.end(); ++it) {
        Student student = *it;
        cout << "\t" << student.name << "\t\t" << student.gpa;
        cout << endl;
    }

    cout << endl;

    return 0;
}

【讨论】:

  • 抱歉,您能用循环等逻辑算法编辑和替换vectorsorting 部分吗?我还没有研究过这些,我很难理解。
  • @denarced 。不错的作品。你写了........Student student = *it; ......你的意思是......const Student & student = *it; ...?
  • 不,但这可能是正确的 :) 我编写代码时很少注意细节,因为只有基本思想很重要。我最近没有处理 C++。
  • @HamzaUmar,如果你要我基本上重写 std::sort 那么不,我不会那样做。事实上,我从来没有写过任何合适的排序算法,因为快速排序(例如)已经存在,程序员没有必要知道它的复杂细节。我很乐意回答您的任何问题,以澄清您当前的代码。
【解决方案2】:

如果您使用 std::toupper 将名称的字符转换为大写字母,那么您应该能够使用

编辑:如果你不想使用std::sort :-)

【讨论】:

  • 是的,“排序”对我来说很复杂。但是你能提供任何关于我如何使用它的参考吗?
  • 要比较字符串,您可以使用“string1
  • 实际上我使用的是二维字符数组作为名称。所以你的意思是toupper,我可以在内部将小写输入转换为大写?然后我应该比较字母的ASCII值?或者我可以只比较名称的第一个字符吗?
  • 我的意思是你可以通过 name[0] &lt; name[1] 来比较它们。创建几个临时变量 (char n1[5]; char n2[5]) 并从原始数组中 1×1 复制字符,例如nm1[j] = name[i][j],然后n1 &lt; n2 会比较它们。
【解决方案3】:
    #include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
class stu
{
char name[40];
int cgpa;
public:
void assign()
{cin>>name;
cin>>cgpa;
}
void display()
{cout<<name<<endl<<cgpa<<endl;
}
friend void align(stu *s,int v);
};
void align(stu *s,int v)
{for(int j=0;j<v-1;j++)
{for(int i=0;i<v-j-1;i++)
{//buble sort
if(strcmp((s+i)->name,(s+i+1)->name)>0)
{char l[40];
strcpy(l,(s+i)->name);
strcpy((s+i)->name,(s+i+1)->name);
strcpy((s+i+1)->name,l);
//swapping cgpa
int t=(s+i)->cgpa;
(s+i)->cgpa=(s+i+1)->cgpa;
(s+i+1)->cgpa=t;
}
}}}

int main()
{stu s[10];int i;
for(i=0;i<5;i++)
s[i].assign();
align(s,5);
cout<<endl<<endl;
for(i=0;i<5;i++)
s[i].display();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多