nsi:langages:c:solutions:isbn
Table des matières
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
