grades.rs en Rust
Un libro de calificaciones: structs, un HashMap de resultados y un reporte formateado.
use std::collections::HashMap;
struct Student {
name: String,
marks: Vec<u32>,
}
impl Student {
fn new(name: &str, marks: &[u32]) -> Self {
Student {
name: name.to_string(),
marks: marks.to_vec(),
}
}
fn average(&self) -> f64 {
if self.marks.is_empty() {
return 0.0;
}
self.marks.iter().sum::<u32>() as f64 / self.marks.len() as f64
}
fn grade(&self) -> char {
match self.average() as u32 {
90..=100 => 'A',
80..=89 => 'B',
70..=79 => 'C',
_ => 'D',
}
}
}
fn main() {
let students = vec![
Student::new("ada", &[95, 91, 88]),
Student::new("grace", &[78, 84, 80]),
Student::new("alan", &[65, 72, 70]),
];
println!("{:<8}{:>8}{:>7}", "name", "average", "grade");
for s in &students {
println!("{:<8}{:>8.1}{:>7}", s.name, s.average(), s.grade());
}
let mut by_grade: HashMap<char, Vec<&str>> = HashMap::new();
for s in &students {
by_grade.entry(s.grade()).or_default().push(&s.name);
}
let mut grades: Vec<&char> = by_grade.keys().collect();
grades.sort();
for g in grades {
println!("{g}: {:?}", by_grade[g]);
}
let best = students
.iter()
.max_by(|a, b| a.average().partial_cmp(&b.average()).unwrap());
if let Some(top) = best {
println!("top of the class: {}", top.name);
}
}
Cómo funciona
- Las notas de cada estudiante se juntan en un registro propio.
- Los promedios se calculan con aritmética de iteradores.
- El reporte usa anchos de formato para alinear las columnas.
Palabras clave y builtins usados aquí
SomeStringVecascharf64fnforifimplinletmatchmutreturnselfstrstructu32use
El intento, en números
- Líneas
- 62
- Caracteres a escribir
- 1185
- Tokens
- 430
- Ritmo de tres estrellas
- 100 tpm
Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 258 segundos.
Paso 2 de 2 en Bis; paso 39 de 39 en Fundamentos del lenguaje.