Clasificación de estructuras (por reglas múltiples) en C++

Requisito previo: Estructuras en C
Nombre y calificaciones en diferentes materias (física, química y matemáticas) para todos los estudiantes. La tarea es calcular las calificaciones totales y los rangos de todos los estudiantes. Y finalmente mostrar todos los estudiantes ordenados por rango. 

El rango del estudiante se calcula usando las siguientes reglas. 

  1. Si las calificaciones totales son diferentes, los estudiantes con calificaciones más altas obtienen una mejor clasificación.
  2. Si las calificaciones totales son iguales, entonces los estudiantes con calificaciones más altas en Matemáticas obtienen una mejor clasificación.
  3. Si las calificaciones totales son las mismas y las calificaciones en Matemáticas también lo son, entonces los estudiantes con mejores calificaciones en Física obtienen una mejor clasificación.
  4. Si las calificaciones totales son las mismas y las calificaciones en Matemáticas y Física también son las mismas, entonces los estudiantes con mejores calificaciones en Química obtienen una mejor clasificación.
  5. Si todas las calificaciones (total, Matemáticas, Física y Química) son iguales, entonces se puede asignar un mejor rango a cualquier estudiante.

Usamos la siguiente estructura para almacenar detalles de los estudiantes.

struct Student 
{
    string name; // Given
    int math;  // Marks in math (Given)
    int phy;   // Marks in Physics (Given)
    int che;   // Marks in Chemistry (Given)
    int total; // Total marks (To be filled)
    int rank;  // Rank of student (To be filled)
};  

Usamos std::sort() para la clasificación de estructuras . En la clasificación de estructura, todas las propiedades respectivas que posee el objeto de estructura se clasifican en función de una (o más) propiedad del objeto.
En este ejemplo, las calificaciones de los estudiantes en diferentes materias son proporcionadas por el usuario. Estas calificaciones en materias individuales se suman para calcular las calificaciones totales del alumno, que luego se utilizan para clasificar a los diferentes alumnos en función de sus rangos (como se explicó anteriormente).

Implementación:

CPP

// C++ program to demonstrate structure sorting in C++
#include <bits/stdc++.h>
using namespace std;
 
struct Student
{
    string name; // Given
    int math; // Marks in math (Given)
    int phy; // Marks in Physics (Given)
    int che; // Marks in Chemistry (Given)
    int total; // Total marks (To be filled)
    int rank; // Rank of student (To be filled)
};
 
// Function for comparing two students according
// to given rules
bool compareTwoStudents(Student a, Student b)
{
    // If total marks are not same then
    // returns true for higher total
    if (a.total != b.total)
        return a.total > b.total;
 
    // If marks in Maths are same then
    // returns true for higher marks
    if (a.math != b.math)
        return a.math > b.math;
 
    if (a.phy != b.phy)
        return a.phy > b.phy;
 
    return (a.che > b.che);
}
 
// Fills total marks and ranks of all Students
void computeRanks(Student a[], int n)
{
    // To calculate total marks for all Students
    for (int i = 0; i < n; i++)
        a[i].total = a[i].math + a[i].phy + a[i].che;
 
    // Sort structure array using user defined
    // function compareTwoStudents()
    sort(a, a + 5, compareTwoStudents);
 
    // Assigning ranks after sorting
    for (int i = 0; i < n; i++)
        a[i].rank = i + 1;
}
 
// Driver code
int main()
{
    int n = 5;
 
    // array of structure objects
    Student a[n];
 
    // Details of Student 1
    a[0].name = "Bryan";
    a[0].math = 80;
    a[0].phy = 95;
    a[0].che = 85;
 
    // Details of Student 2
    a[1].name = "Kevin";
    a[1].math = 95;
    a[1].phy = 85;
    a[1].che = 99;
 
    // Details of Student 3
    a[2].name = "Nicky";
    a[2].math = 95;
    a[2].phy = 85;
    a[2].che = 80;
 
    // Details of Student 4
    a[3].name = "Steve";
    a[3].math = 80;
    a[3].phy = 70;
    a[3].che = 90;
 
    // Details of Student 5
    a[4].name = "Rohan";
    a[4].math = 80;
    a[4].phy = 80;
    a[4].che = 80;
 
    computeRanks(a, n);
 
    // Column names for displaying data
    cout << "Rank"
         << " "
         << "Name"
         << "     ";
    cout << "Maths"
         << " "
         << "Physics"
         << " "
         << "Chemistry";
    cout << " "
         << "Total\n";
 
    // Display details of Students
    for (int i = 0; i < n; i++) {
        cout << a[i].rank << "    ";
        cout << a[i].name << "      ";
        cout << a[i].math << "     " << a[i].phy << "     "
             << a[i].che << "       ";
        cout << a[i].total << " ";
        cout << "\n";
    }
 
    return 0;
}
Producción

Rank Name     Maths Physics Chemistry Total
1    Kevin      95     85     99       279 
2    Nicky      95     85     80       260 
3    Bryan      80     95     85       260 
4    Rohan      80     80     80       240 
5    Steve      80     70     90       240 

Artículos relacionados: 

Echa un vistazo al curso de autoaprendizaje de DSA

Este artículo es una contribución de Abhinav Tiwari . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *