typestar

grade_report.zig en Zig

Los puntajes de quiz se pliegan en promedios y calificaciones, y luego en un reporte.

// Average quiz scores into letter grades and print the class report.
const std = @import("std");

const Student = struct {
    name: []const u8,
    quizzes: [3]u32,
};

const roster = [_]Student{
    .{ .name = "Imani", .quizzes = .{ 92, 88, 95 } },
    .{ .name = "Theo", .quizzes = .{ 78, 83, 80 } },
    .{ .name = "Sofia", .quizzes = .{ 85, 91, 89 } },
    .{ .name = "Miles", .quizzes = .{ 62, 70, 68 } },
};

fn average(quizzes: [3]u32) f32 {
    var sum: u32 = 0;
    for (quizzes) |q| sum += q;
    return @as(f32, @floatFromInt(sum)) / 3.0;
}

fn letter(avg: f32) []const u8 {
    if (avg >= 90.0) return "A";
    if (avg >= 80.0) return "B";
    if (avg >= 70.0) return "C";
    return "retake";
}

pub fn main() void {
    std.debug.print("student    avg  grade\n", .{});
    std.debug.print("---------------------\n", .{});

    var class_sum: f32 = 0;
    for (roster) |s| {
        const avg = average(s.quizzes);
        class_sum += avg;
        std.debug.print("{s:<8} {d:>5.1}  {s}\n", .{
            s.name, avg, letter(avg),
        });
    }

    std.debug.print("---------------------\n", .{});
    std.debug.print("class avg {d:.1}\n", .{class_sum / roster.len});
    std.debug.print("quizzes graded: {d}\n", .{roster.len * 3});
}

Cómo funciona

  1. La lista es un arreglo de structs armado con sintaxis de literal anónimo.
  2. average suma un [3]u32 y @floatFromInt vuelve honesta la división.
  3. {s:<8} y {d:>5.1} acolchan las columnas; el pie promedia los promedios.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
45
Caracteres a escribir
1127
Tokens
385
Ritmo de tres estrellas
65 tpm

Al ritmo de tres estrellas de 65 tokens por minuto, este intento toma unos 355 segundos.

Escribe este fragmento

Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →