Tracks
/
C++
C++
/
Ejercicios
/
Sacar buenas notas
Sacar buenas notas

Sacar buenas notas

Ejercicio de aprendizaje

Introducción

Arrays y vectores

C++ ofrece distintos contenedores para almacenar elementos del mismo tipo de forma ordenada. Está std::array para contenedores de tamaño fijo y std::vector, que viene con la capacidad de redimensionarse dinámicamente.

Construcción

Cuando declaras un array o un vector, necesitas especificar el tipo de elementos que ese contenedor va a guardar. Los arrays también necesitan un tamaño. Fíjate en estos ejemplos para ver cómo se inicializan los dos tipos de contenedor:

#include <array>
#include <string>

// std::array<element_type, size> variable_name {list of elements}
std::array<std::string, 3> indie_rock {"yeah", "yeah", "yeah"};
// indie_rock contains the elements "yeah" three times

Los vectores normalmente necesitan más espacio, ya que reservan memoria para seguir creciendo. No necesitas especificar un tamaño:

#include <vector>

// std::vector<element_type> variable_name {list of elements}
std::vector<int> countdown {3, 2, 1};
// countdown contains the elements 3, 2 and 1

Nota: Todavía no necesitas saber la mecánica exacta que hay detrás del concepto de template; tendrá su propio concepto más abajo en el árbol del temario.

Acceso a los elementos

Los vectores y los arrays comparten las mismas funciones para acceder a sus elementos. Puedes usar las funciones miembro front y back para obtener el primer y el último elemento del contenedor. También existen at y el operador [] para acceder a elementos específicos.

countdown[0];
// => 3
countdown.at(2);
// => 1
countdown[1] = 4;
// countdown now contains 3, 4 and 1
indie_rock.back() = "yeahs";
// indie_rock is now "yeah", "yeah", "yeahs"

Nota: Si eliges una posición que no está dentro del rango de tu contenedor, [] podría provocar un comportamiento indefinido. La función at lanzaría una excepción, lo que a la larga podría facilitarte las cosas.

Modificadores de vector

Como un vector no tiene un tamaño fijo, es posible agregar o quitar elementos. Dos funciones comunes para eso son emplace_back y pop_back.

std::vector<std::string> witches {"Holly", "Alyssa", "Shannen"};
witches.pop_back();
// Shannen is no longer with the witches
witches.emplace_back("Rose");
// Rose has joined the team

Capacidad

Puedes comprobar si los contenedores están vacíos con la función miembro empty. Si quieres saber el número de elementos, puedes usar size.

Instrucciones

Eres asistente de enseñanza y estás corrigiendo los exámenes de tus estudiantes. Llevar la cuenta de los resultados a mano se está volviendo tedioso y propenso a errores. Decides hacer las cosas un poco más interesantes armando algunas funciones para contar y calcular los resultados de la clase.

1. Redondear puntuaciones

Aunque puedes dar «crédito parcial» en las preguntas del examen, las puntuaciones generales del examen tienen que ser ints. Así que, antes de hacer cualquier otra cosa con las puntuaciones de la clase, tienes que revisar las calificaciones y convertir cualquier puntuación double en ints.

Crea la función round_down_scores() que recibe un vector de student_scores. El redondeo que piden las escuelas es un truncamiento. Por suerte, C++ puede convertir un tipo en otro con static_cast. La conversión de static_cast de double a int corta cualquier dígito después del punto decimal. Esta función debe recibir el vector de entrada y hacer return de un nuevo vector con todas las puntuaciones convertidas a ints.

std::vector<double> student_scores {90.33, 40.5, 55.44, 70.05, 30.55, 25.45, 80.45, 95.3, 38.7, 40.3};
round_down_scores(student_scores)
// => {90, 40, 55, 70, 30, 25, 80, 95, 38, 40}

Hay otros métodos que logran el mismo resultado, pero un cast es algo que se ve con frecuencia.

int new_PI{static_cast<int>(3.14) + static_cast<int>(0.001592653589)};
// new_PI is 3.

2. Estudiantes que no aprueban

Mientras calificabas el examen, notaste que algunos estudiantes no estaban rindiendo tan bien como esperabas. Pero te distrajiste y olvidaste anotar exactamente cuántos estudiantes.

Crea la función count_failed_students() que recibe un vector de student_scores. Esta función debe contar el número de estudiantes que no tienen puntuaciones aprobatorias y devolver ese conteo como un entero. Un estudiante necesita una puntuación mayor que 40 para obtener una calificación aprobatoria en el examen.

count_failed_students({90,40,55,70,30,25,80,95,38,40});
// => 5

3. Calcular calificaciones con letras

A la maestra a la que asistes le gusta asignar calificaciones con letras además de puntuaciones numéricas. Como los estudiantes rara vez obtienen 100 en un examen, los umbrales inferiores de la «calificación con letras» se calculan a partir de la puntuación más alta obtenida y aumentan de forma uniforme entre la puntuación más alta y el umbral de reprobación de <= 40.

Crea la función letter_grades() que recibe la puntuación «más alta» del examen como parámetro y devuelve un array (no un vector) de umbrales inferiores de puntuación para cada intervalo de calificación «al estilo estadounidense»: ["D", "C", "B", "A"].

/*Where the highest score is 100, and failing is <= 40.
       "F" <= 40
 41 <= "D" <= 55
 56 <= "C" <= 70
 71 <= "B" <= 85
 86 <= "A" <= 100
*/

letter_grades(100);
// => {41, 56, 71, 86}


/*Where the highest score is 88, and failing is <= 40.
       "F" <= 40
 41 <= "D" <= 52
 53 <= "C" <= 64
 65 <= "B" <= 76
 77 <= "A" <= 88
*/

letter_grades(88);
// => {41, 53, 65, 77}

4. Asociar nombres con puntuaciones

Tienes las puntuaciones del examen en orden descendente y los nombres correspondientes de los estudiantes (ordenados en el orden de sus puntuaciones del examen). Quieres asociar el nombre de cada estudiante con su puntuación del examen e imprimir una clasificación general de la clase.

Crea la función student_ranking() con los parámetros student_scores y student_names. Asocia cada nombre de estudiante del vector student_names con su puntuación del vector student_scores. Puedes suponer que cada vector de argumentos está ordenado de mayor a menor puntuación. La función debe devolver un vector de strings con el formato <rank>. <student name>: <student score>.

std::vector<int> student_scores {100, 99, 90, 84, 66, 53, 47};
std::vector<std::string> student_names {"Joci", "Sara","Kora","Jan","Indra","Bern", "Fred"};
student_ranking(student_scores, student_names)
// =>
//  {"1. Joci: 100", "2. Sara: 99", "3. Kora: 90", "4. Jan: 84", "5. Indra: 66", "6. Bern: 53", "7. Fred: 47"}

5. Una puntuación «perfecta»

Aunque una puntuación «perfecta» de 100 es rara en un examen, es interesante saber si al menos un estudiante la ha logrado.

Crea la función perfect_score() con los parámetros student_scores y student_names. Las listas son las mismas que en la tarea 4. La función debe hacer return de el primer <name> (como un string) del estudiante que obtuvo 100 en el examen.

Si no se encuentra ninguna puntuación de 100, se debe devolver un string vacío "".

perfect_score({"Nur", "Tony", "Fatima"}, {90, 80, 100});
// => "Fatima"

perfect_score({"Nur", "Tony"}, {90, 80});
// => ""
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
C++ Exercism

¿Todo listo para empezar Sacar buenas notas?

Regístrate en Exercism para aprender y dominar C++ con 19 conceptos100 ejercicios y mentoría humana real, todo gratis.