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
Table des matières
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
