typestar

number_facts.c en C

Un programa completo: leer números de argv y reportar datos de cada uno.

#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int is_prime(long n) {
    if (n < 2) {
        return 0;
    }
    for (long d = 2; d * d <= n; d++) {
        if (n % d == 0) {
            return 0;
        }
    }
    return 1;
}

static int digit_sum(long n) {
    int total = 0;
    if (n < 0) {
        n = -n;
    }
    while (n > 0) {
        total += (int) (n % 10);
        n /= 10;
    }
    return total;
}

static int parse_long(const char *text, long *out) {
    errno = 0;
    char *end = NULL;
    long value = strtol(text, &end, 10);

    if (end == text || *end != '\0') {
        return 0;
    }
    if (errno == ERANGE || value > INT_MAX || value < INT_MIN) {
        return 0;
    }
    *out = value;
    return 1;
}

int main(int argc, char **argv) {
    if (argc < 2) {
        fprintf(stderr, "usage: %s NUMBER...\n", argv[0]);
        return 1;
    }

    printf("%-12s %6s %5s %9s\n", "value", "prime", "even", "digitsum");

    long total = 0;
    for (int i = 1; i < argc; i++) {
        long value = 0;
        if (!parse_long(argv[i], &value)) {
            fprintf(stderr, "skipping %s: not a number\n", argv[i]);
            continue;
        }
        total += value;
        printf("%-12ld %6s %5s %9d\n", value,
               is_prime(value) ? "yes" : "no",
               value % 2 == 0 ? "yes" : "no",
               digit_sum(value));
    }

    printf("total %ld across %d arguments\n", total, argc - 1);
    return 0;
}

Cómo funciona

  1. argc y argv llevan la línea de comandos, con el nombre del programa primero.
  2. strtol reporta el valor y dónde dejó de parsear.
  3. El programa retorna distinto de cero cuando no le dieron nada que hacer.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
71
Caracteres a escribir
1223
Tokens
407
Ritmo de tres estrellas
100 tpm

Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 244 segundos.

Escribe este fragmento

Paso 3 de 3 en Bis; paso 35 de 35 en Fundamentos del lenguaje.

← Anterior