Outils pour utilisateurs

Outils du site


nsi:langages:c:solutions:code_cb

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Validation d'un code CB en C

Première proposition

#include <stdio.h>

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

int main(void) {
    unsigned long long cb;
    printf("Entrez le code cb : ");
    scanf("%llu", &cb);
    if (is_valid(cb)){
        printf("Le code cb %llu est valide.\n", cb);    
    } else {
        printf("Le code cb %llu est invalide.\n", cb);    
    }
    return 0;
}

// exemple code invalide : 4024007109022143
// exemple code valide :   4556737586899855

Deuxième proposition

On aura tendance à donner le code CBen incluant des caractères non numériques, par exemple 4024-0071-0902-2143. On souhaite pouvoir gérer ce cas.

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

int is_valid(char* cb){
    int n = strlen(cb);
    int total_pair = 0;
    int total_impair = 0;
    int colonne = 0;
    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){
            digit = digit * 2;
            if (digit >= 10) {
                digit = digit - 9;
            }
            total_pair += digit;
        } else {
            total_impair += digit;
        }
        colonne++;
    }
    if (colonne != 16){
        // pas le bon nombre de chiffres
        return 0;
    }
    int total = total_impair + 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 le code cb en argument.\nExemple : %s 4024-0071-0902-2143\n", argv[0]);
        return 1;
    }
    // argv[0] contient le nom de l'exécutable
    // argv[1] devrait contenir l'isbn
    char* cb = argv[1];
    if (is_valid(cb)){
        printf("Le code cb %s est valide.\n", cb);
    } else {
        printf("Le code cb %s est invalide.\n", cb);
    }
    return 0;
}

// exemple code invalide : 4024-0071-0902-2143
// exemple code valide :   4556-7375-8689-9855
nsi/langages/c/solutions/code_cb.txt · Dernière modification : de goupillwiki