typestar

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

  1. Las notas de cada estudiante se juntan en un registro propio.
  2. Los promedios se calculan con aritmética de iteradores.
  3. El reporte usa anchos de formato para alinear las columnas.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 2 en Bis; paso 39 de 39 en Fundamentos del lenguaje.

← Anterior