Outils pour utilisateurs

Outils du site


nsi:langages:c:solutions:isbn

Validation d'un code ISBN en C

Première proposition

#include <stdio.h>

int is_valid(unsigned long long isbn){
    int total_pair = 0;
    int total_impair = 0;
    for (int i=0; i<13; i++){
        int digit = isbn % 10;
        if (i%2 != 0){ // quand i=0, c'est la colonne 13
            total_pair += digit;
        } else {
            total_impair += digit;
        }
        isbn = isbn / 10;
    }
    int total = total_impair + 3*total_pair;
    if (total%10 == 0){
        return 1;
    } else {
        return 0;
    }
}

int main(void) {
    unsigned long long isbn;
    printf("Entrez l'isbn : ");
    scanf("%llu", &isbn);
    if (is_valid(isbn)){
        printf("L'isbn %llu est valide.\n", isbn);    
    } else {
        printf("L'isbn %llu est invalide.\n", isbn);    
    }
    return 0;
}

// exemple code invalide : 9783161484103
// exemple code valide :   9782123456803

Deuxième proposition

On aura tendance à donner le code ISBN en incluant des caractères non numériques, par exemple 9-782123-456803. On souhaite pouvoir gérer ce cas.

#include <stdio.h>
#include <string.h> // pour strlen

int is_valid(char* isbn){
    int n = strlen(isbn);
    int total_pair = 0;
    int total_impair = 0;
    int colonne = 1;
    for (int i=0; i<n; i++){
        int digit = isbn[i] - '0';
        // En C, '0' désigne le char '0'
        // qui est compris comme l'octet
        // codant '0' en ASCII
        // Donc en faisant par exemple '5' - '0'
        // On fait la différence des codes ASCII
        // ce qui donne justement 5
        if ((digit > 9) || (digit < 0)){
            continue;
        }

        if (colonne%2 == 0){
            total_pair += digit;
        } else {
            total_impair += digit;
        }
        colonne++;
    }
    // Dans un cas normal, partant de la colonne 1,
    // on aura rencontré exactement 13 digits
    // et on en sera donc à la colonne 14 à la fin
    if (colonne != 14){
        // trop de chiffres
        return 0;
    }
    int total = total_impair + 3*total_pair;
    if (total%10 == 0){
        return 1;
    } else {
        return 0;
    }
}

int main(int argc, char *argv[]) {
    // Plutôt qu'un input, on va utiliser la ligne
    // de commande
    if (argc != 2) {
        printf("Vous devez préciser l'isbn en argument.\nExemple : %s 9-782123-456803\n", argv[0]);
        return 1;
    }
    // argv[0] contient le nom de l'exécutable
    // argv[1] devrait contenir l'isbn
    char* isbn = argv[1];
    if (is_valid(isbn)){
        printf("L'isbn %s est valide.\n", isbn);
    } else {
        printf("L'isbn %s est invalide.\n", isbn);
    }
    return 0;
}

// invalide : 9-783161-484103
// valide :   9-782123-456803
nsi/langages/c/solutions/isbn.txt · Dernière modification : de goupillwiki