Fundamentos de Programacion C++

Ejercicio 1

Ejercicio 1 (35pts). Considere el struct {int dni; vector notas;} para organizar la información de un grupo de N alumnos de una carrera de ingeniería de 36 materias, donde dni representa el documento de identidad, y notas un vector con las calificaciones de las materias rendidas por el estudiante. a) Lea los datos de cada uno de los N alumnos (N es dato inicial) para organizar un vector A de tipo alumno. Por cada alumno se debe leer el dni y luego por cada rendida: cod_materia y nota obtenida. Finaliza con el código de materia ­1. b) Programe una función dos_max(...) que obtenga los 2 alumnos con mayor cantidad de materias aprobadas (nota igual o mayor a 6). c) Defina una función desempenio_materia que, dado el dni del alumno y el código de materia retorne la cantidad de veces que rindió la materia y la última nota lograda. d) Haga uso de ambas funciones desde el programa principal y muestre la salida por pantalla.



#include <iostream>

#include <vector>

#include <tuple>

using namespace std;

struct Materias{
    
    int cod_mat, nota;
};

struct Persona{

    int dni;

    vector <Materias> nota;
};

vector <Persona> cargarDatos(vector <Persona> );

tuple <int,int> dos_max(vector <Persona> );

tuple <int,int> desempenio_materia(vector <Persona> , int , int );

int main(){
    
    vector <Persona> carrera;
    
    carrera = cargarDatos(carrera);

//--------------------------------------------------------    
    int dni1,dni2;
    
    tie(dni1,dni2) = dos_max(carrera);
    
    cout <<"\nAlumno N° 1: "<<dni1<<endl;    
    

    cout <<"Alumno N° 2: "<<dni2<<endl;

//--------------------------------------------------------

    int r_veces, nota, dni, cod_mat;
    
    cout <<"\nDNI Alumnos a buscar: "; cin>>dni;
    
    cout <<"Cod_Mat ";cin>>cod_mat;
    
    tie(r_veces ,nota) = desempenio_materia(carrera , dni, cod_mat);
    
    cout <<"\nRindio: "<<r_veces<<" y su ultima nota fue: "<<nota<<endl;
    
    return 0;

}

vector <Persona> cargarDatos(vector <Persona> carrera){
    
    Materias nuevo;

    int n;
    
    cout <<"Cuantos Alumnos hay en la carrera: ";cin>>n;
    
    carrera.resize(n);
    
    for (size_t i = 0; i < carrera.size(); i++){
        
        cout<<"******Alumno N° "<<i+1<<endl;
        
        cout <<"DNI: ";cin>> n;
        
        cout<<"Cod_Mat: ";cin>>nuevo.cod_mat;

        while(nuevo.cod_mat >= 0){

            cout<<"Nota (0 al 10): ";cin>>nuevo.nota;
            
            carrera[i].dni = n;
            
            carrera[i].nota.push_back(nuevo);
    
            cout<<"Cod_Mat: ";cin>>nuevo.cod_mat;
    
        }

    }

    return carrera;

}

tuple <int,int> dos_max(vector <Persona> carrera){
    
    int dni1, dni2 ,puntos1 = 0, puntos2 = 0;
    
    dni1 = carrera[0].dni;
    
    for(int i = 0; i < carrera[0].nota.size();i++){
        
        for(int e = 0; e < carrera[0].nota.size();e++){
            
            if(i + 1 == carrera[0].nota[e].cod_mat and carrera[0].nota[e].nota >= 6){
                
                puntos1++;
            
                break;
 
        
            }
    
        }
    
    }

    for(size_t i = 1; i < carrera.size(); i++){
        
        int suma = 0;
        
        for(size_t e = 0; e < carrera[i].nota.size();e++){
            
            for(size_t j = 0; j < carrera[i].nota.size();j++){
                
                if(carrera[i].nota[j].cod_mat == e+1 and carrera[i].nota[j].nota >=6){
                    
                    suma++;
            
                    break;
                    }
                }
            }

        if(suma > puntos1){
            
            puntos2 = puntos1;
            
            puntos1 = suma;
            
            dni2 = dni1;
        
            dni1 = carrera[i].dni;

        }
        
        else{
            
            if(suma < puntos1 and suma > puntos2){
                
                puntos2 = suma;
            
                dni2= carrera[i].dni;
        
            }
    
        }
    
    }
    
    return make_tuple(dni1, dni2);
}

tuple <int,int> desempenio_materia(vector <Persona> carrera, int dni, int cod_mat){
    
    int r_veces = 0, nota;

    auto i = begin(carrera);
    
    do{
    
        i++;    
    
    }while((*i).dni != dni);
    
    for(size_t e = 0; e < (*i).nota.size(); e++){
    
        if((*i).nota[e].cod_mat == cod_mat){
        
            r_veces++;
            
            nota = (*i).nota[e].nota;    
        
        }
    
    }
    
    return make_tuple(r_veces, nota);

}