【问题标题】:Create multiple structs then sort by elements创建多个结构然后按元素排序
【发布时间】:2016-09-26 04:31:25
【问题描述】:

所以我必须允许用户使用 5 种不同类型的信息创建一定数量的结构,然后根据其中一种类型进行排序。例如,他们会输入所有数据,然后按年级或姓名排序。我将如何在不同的结构中创建一个仅包含不同名称或等级的数组?

#include <iostream>
#include <string>

struct student
{
    std::string studentName;
    std::string studentIDNumber;
    int currentExamGrade;
    int priorExamGrade;
    double GPA;
};

void createStudent()
{
    int numStudents;
    std::cout << "Enter number of students\n";
    std::cin >> numStudents;

    while (numStudents > 0)
    {
        student name;

        std::cout << "Enter the student's name\n";
        std::cin >> name.studentName;

        std::cout << "Enter the student's ID number\n";
        std::cin >> name.studentIDNumber;

        std::cout << "Enter the student's current exam grade\n";
        std::cin >> name.currentExamGrade;

        std::cout << "Enter the student's prior exam grade\n";
        std::cin >> name.priorExamGrade;

        std::cout << "Enter the student's GPA\n";
        std::cin >> name.GPA;

        numStudents -= 1;
    }
}

int main()
{
    createStudent();

    int choice;
    std::cout << "How do you want to sort the list?\n (Enter 1 for name, 2     for ID number, 3 for current exam grade, 4 for prior exam grade, 5 for GPA\n";
    std::cin >> choice; 

    return 0;

}     

【问题讨论】:

  • 那么,Captn,你要排序的数组在哪里?你读学生没问题,但读完一个后,你丢弃数据并读另一个。
  • 这是我的问题的一部分
  • 好的。是时候阅读有关 std::vector 的信息了 - 也可以查看示例。
  • 一步一步。首先让输入工作,然后担心排序。垃圾进垃圾出。垃圾进,你把垃圾分类。为什么要调试垃圾分类?

标签: c++ arrays sorting struct


【解决方案1】:

好的。我假设你不知道 C++ 中的内置排序函数。看看std::sort()

输入:

input values into struct array + printing out

现在制作一个结构数组:

How do you make an array of structs in C?

Creating an array of structs in C++

现在对这些数组进行排序:

Sorting a vector of custom objects

如何解决这个问题:

std::sort() 允许您根据非tivial 对象的可比性提供自定义函数。一个这样的功能的例子是:

bool gpa_comparision_function (student s1,student s2)
{
    return s1.GPA < s2.GPA;
}

它以2个学生为参数,需要通过排序函数进行比较,并根据GPA返回学生s1和s2的排序。

这就是声明s1.GPA &lt; s2.GPA 很重要的原因。

因此,如果学生 s1 的 GPA = 5.0 并且 s2 的 GPA = 4.0 我们希望顺序是 s2,s1(升序)所以这个 函数返回 false,说明 s2 应该在 s1 之前。

所以在排序函数的调用中:

sort (arr_of_students,arr_of_students+N,gpa_comparision_function);

注意第三个参数gpa_comparision_function,这是告诉内置函数使用我们的比较函数。

谈话很便宜,给我看代码:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct student
{
    std::string studentName;
    std::string studentIDNumber;
    int currentExamGrade;
    int priorExamGrade;
    double GPA;
};
bool gpa_comparision_function (student s1,student s2)
{
    return s1.GPA < s2.GPA;
}
bool currentExamGrade_comparision_function (student s1,student s2)
{
    return s1.currentExamGrade < s2.currentExamGrade;
}
int main ()
{
    // Create an array of structs
    student arr_of_students[100]; // A better way will be vector<student>

    // Take input
    // ...

    // Now lets sort, assuming number of students is N
    // Based on GPA
    sort (arr_of_students,arr_of_students+N,gpa_comparision_function);

    // Based on currentExamGrade
    sort (arr_of_students,arr_of_students+N,currentExamGrade_comparision_function);

    return 0;
}

【讨论】:

  • 如果您踩到提供代码路径,至少要一路走下去 - 向他展示如何阅读这些结构并向他解释发生了什么。否则,这充其量是一种虚荣心的练习,或者最坏的情况是名誉——这与帮助他学习毫无关系。
  • @AdrianColomichi 我已经添加了使用自定义比较功能的说明。我不打算解释如何输入。我会找到一个链接并提供答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
相关资源
最近更新 更多