Skip to content

Commit 3bcd939

Browse files
authored
Merge pull request #4017 from hectorio23/hectorio23
#22 - C++
2 parents 132ca3f + c39cdbc commit 3bcd939

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// Autor: Héctor Adán
2+
// GitHub: https://github.com/hectorio23
3+
#include <algorithm> // Libreria con un conjunto de algoritmos
4+
#include <iostream>
5+
#include <vector>
6+
#include <string>
7+
#include <numeric>
8+
#include <iomanip> // Para setprecision
9+
#include <ctime> // Para manejo de fechas
10+
11+
/*
12+
* EJERCICIO:
13+
* Explora el concepto de funciones de orden superior en tu lenguaje
14+
* creando ejemplos simples (a tu elección) que muestren su funcionamiento.
15+
*
16+
* DIFICULTAD EXTRA (opcional):
17+
* Dada una lista de estudiantes (con sus nombres, fecha de nacimiento y
18+
* lista de calificaciones), utiliza funciones de orden superior para
19+
* realizar las siguientes operaciones de procesamiento y análisis:
20+
* - Promedio calificaciones: Obtiene una lista de estudiantes por nombre
21+
* y promedio de sus calificaciones.
22+
* - Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes
23+
* que tienen calificaciones con un 9 o más de promedio.
24+
* - Nacimiento: Obtiene una lista de estudiantes ordenada desde el más joven.
25+
* - Mayor calificación: Obtiene la calificación más alta de entre todas las
26+
* de los alumnos.
27+
* - Una calificación debe estar comprendida entre 0 y 10 (admite decimales).
28+
*/
29+
30+
// Definimos una estructura para representar a un estudiante
31+
struct Student {
32+
std::string name;
33+
std::string birthdate;
34+
std::vector<double> grades;
35+
};
36+
37+
// Función para calcular el promedio de una lista de calificaciones
38+
double average(const std::vector<double>& grades) {
39+
if (grades.empty()) return 0.0;
40+
double sum = std::accumulate(grades.begin(), grades.end(), 0.0);
41+
return sum / grades.size();
42+
}
43+
44+
// Función para convertir una fecha en formato string a time_t
45+
time_t stringToDate(const std::string& date) {
46+
struct tm tm{};
47+
strptime(date.c_str(), "%Y-%m-%d", &tm);
48+
return mktime(&tm);
49+
}
50+
51+
int main() {
52+
// Lista de estudiantes
53+
std::vector<Student> students = {
54+
{"Adán", "2004-06-28", {9.7, 10.0, 9.9}},
55+
{"Andy", "2006-07-17", {9.5, 9.0, 9.0}},
56+
{"Mauricer", "2004-03-15", {6.0, 7.5, 8.0}},
57+
{"David", "2005-06-30", {10.0, 9.5, 9.5}}
58+
};
59+
60+
// Promedio de calificaciones
61+
std::cout << "Promedio de calificaciones:" << std::endl;
62+
for (const auto& student : students) {
63+
double avg = average(student.grades);
64+
std::cout << student.name << ": " << std::fixed << std::setprecision(2) << avg << std::endl;
65+
}
66+
67+
// Mejores estudiantes
68+
std::cout << "\nMejores estudiantes (promedio >= 9):" << std::endl;
69+
for (const auto& student : students) {
70+
if (average(student.grades) >= 9.0) {
71+
std::cout << student.name << std::endl;
72+
}
73+
}
74+
75+
// Ordenar estudiantes por fecha de nacimiento, de más joven a más viejo
76+
// Funcion de orden superior
77+
std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) {
78+
return stringToDate(a.birthdate) > stringToDate(b.birthdate);
79+
});
80+
81+
std::cout << "\nEstudiantes ordenados por nacimiento (de más joven a más viejo):" << std::endl;
82+
for (const auto& student : students) {
83+
std::cout << student.name << ": " << student.birthdate << std::endl;
84+
}
85+
86+
// Mayor calificación entre todos los estudiantes
87+
double highest_grade = 0.0;
88+
for (const auto& student : students) {
89+
for (double grade : student.grades) {
90+
if (grade > highest_grade) {
91+
highest_grade = grade;
92+
}
93+
}
94+
}
95+
96+
std::cout << "\nMayor calificación entre todos los estudiantes: " << highest_grade << std::endl;
97+
98+
return 0;
99+
}

0 commit comments

Comments
 (0)