====== Validation d'un code ISBN en C ====== [[nsi:tds:isbn|Fiche de l'exercice]] ===== Première proposition ===== #include 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 #include // 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 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