Vous allez écrire ici un programme qui calcule la compatibilité entre deux prénoms. Suivez les instructions suivantes pour remplacer les TODO du programme ci-dessous.
Algorithme
Vous croyez avoir trouvé votre âme sœur, mais vous voulez en avoir le c♥eur net ? Vous ne serez pas déçu d’être venus aujourd’hui, car vous allez apprendre le secret d’un couple heureux. J’ai nommé, la numérologie des prénoms.
« Parce que vos prénoms en disent long sur vos personnalités, découvrez s’ils sont fait l’un pour l’autre... » (Elle.fr)
L’algorithme infaillible pour calculer la compatibilité de deux prénoms que nous avons sélectionné (issu d’un site de référence) est le suivant :
Étant donné deux prénoms (tristan et yseult), on remplace chaque lettre par un chiffre entre 1 et 9, qui correspond au tableau suivant :
1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z Vous remarquerez donc que la valeur d’une lettre est sa position dans l’alphabet (en commençant à compter à partir de zéro !), modulo
9
, plus1
.Par exemple,
k
est la lettre10
de l’alphabet10 % 9 + 1 = 2
eta
est la lettre0
de l’alphabet0 % 9 + 1 = 1
.tristan ⮕
{2, 9, 9, 1, 2, 1, 5}
yseult ⮕
{7, 1, 5, 3, 3, 2}
On additionne ensuite les chiffres du prénom deux par deux, en laissant le dernier intact s’il y a un nombre impair :
(tristan)
{2, 9, 9, 1, 2, 1, 5}
⮕{11, 10, 3, 5}
(yseult)
{7, 1, 5, 3, 3, 2}
⮕{8, 8, 5}
On transforme chaque nombre au-dessus de 9 en un chiffre de 1 à 9 en additionnant les chiffres qui le composent :
Par exemple,
11
donnera2
.(tristan)
{11, 10, 3, 5}
⮕{2, 1, 3, 5}
(yseult)
{8, 8, 5}
⮕{8, 8, 5}
On additionne deux par deux les chiffres qui restent :
(tristan)
{2, 1, 3, 5}
⮕{3, 8}
(yseult)
{8, 8, 5}
⮕{16, 5}
On transforme à nouveau les nombres supérieurs à 9 en chiffres de 1 à 9 :
(tristan)
{3, 8}
⮕{3, 8}
(yseult)
{16, 5}
⮕{7, 5}
On additionne à nouveau les chiffres deux par deux :
(tristan)
{3, 8}
⮕{11}
(yseult)
{7, 5}
⮕{12}
On transforme les nombres supérieurs à 9 en chiffres :
(tristan)
{11}
⮕{2}
(yseult)
{12}
⮕{3}
Quand on n’a plus qu’un seul chiffre pour chaque prénom, on calcule la compatibilité entre les deux. Plus la différence entre eux est grande, moins il y a de compatibilité :
Différence 0 1 2 3 4 5 6 7 8 Compatibilité 100% 87.5% 75% 62.5% 50% 37.5% 25% 12.5% 0% On peut donc dire avec certitude que la compatibilité amoureuse entre Tristan et Yseult est de
87.5%
.
Décomposition en sous-problèmes
La fonction de plus haut niveau que vous devrez implémenter est la fonction "compatibility
" définie dans le code ci-dessous.
Mais pour ce faire, vous devrez créer d’autres fonctions.
Étapes à suivre
Pour implémenter les fonctions nécessaires, vous devrez suivre les étapes suivantes.
Les spécifications de chaque fonction sont à chaque fois définies dans le code ci-dessous.
Implémentation de la fonction "compatibility
"
En une dizaine de lignes, vous allez :
- Calculer le score du
prenom1
- Calculer le score du
prenom2
- Calculer la différence (en valeur absolue) entre les deux
- Calculer la compatibilité en multipliant la différence par
12.5
et soustraire le total de100
.
Implémentation de la fonction "score
"
Cette fonction, un peu difficile, est déjà implémentée pour vous. Elle utilise toutefois des fonctions que vous devrez implémenter vous-mêmes :
- "
str_length
" - "
add_two_digits
" - "
numbers_to_digits
"
Implémentation de la fonction "str_length
"
Cette fonction permet de calculer la taille d’une chaine de caractères passée en argument.
Comme on l’a vu, on sait une chose sur les chaines de caractères : elles se terminent nécessairement par un ’\0’
.
Donc il vous suffit de la parcourir comme un tableau, jusqu’à tomber sur ce caractère, et vous pouvez obtenir facilement la taille.
Implémentation de la fonction "add_two_digits
"
Cette fonction permet d’additionner deux par deux les chiffres passés en arguments.
Il n’y a pas de type de retour : le résultat est copié au fur et à mesure dans chiffresOut
.
Implémentation de la fonction "numbers_to_digits
"
Cette fonctions transforme tous les nombres d’un tableau en nombres de 1
à 9
.
Testez !
Maintenant que tout est implémenté, n’hésitez pas à tester : entrez votre prénom et le prénom de quelqu’un d’autre, et voyez si ça vaut le coût d’essayer ou si ... next !
J’arrive. J’arrive. Mais qu’est-ce que j’aurais bien aimé Encore une fois prendre un amour Comme on prend le train, pour plus être seul, Pour être ailleurs, pour être bien. J’arrive. J’arrive. Mais qu’est-ce que j’aurais bien aimé Encore une fois remplir d’étoiles Un corps qui tremble et tomber mort, Brûlé d’amour, le cœur en cendres.
Exemple
Par exemple, si l'utilisateur indique les prénoms "tristan"
et "yseult"
, le programme devrait afficher:
Entrez un premier prénom: tristan Entrez un second prénom: yseult La compatibilité de tristan et yseult est de 87.500 %
Et si l'utilisateur indique les prénoms "alice"
et "bob"
, le programme devrait afficher:
Entrez un premier prénom: alice Entrez un second prénom: bob La compatibilité de alice et bob est de 75.000 %
Et si l'utilisateur indique les prénoms "victor"
et "bobette"
, le programme devrait afficher:
Entrez un premier prénom: victor Entrez un second prénom: bobette La compatibilité de victor et bobette est de 100.000 %
Et si l'utilisateur indique les prénoms "meredith"
et "derek"
, le programme devrait afficher:
Entrez un premier prénom: meredith Entrez un second prénom: derek La compatibilité de meredith et derek est de 25.000 %
Autoévaluation
Une fois votre programme écrit, vérifiez et corrigez les points suivants:
- Chaque instruction se termine-t-elle bien par un point virgule ?
- La séquence d'instruction après l'accolade ouvrante est-elle alignée mais légèrement décalée vers la droite par rapport à "
main
" ? - Chaque variable est-elle déclarée ? C'est-à-dire, avez vous déterminé le type de chacune de vos variables ?
- Avez-vous utilisé la fonction de lecture qui correspond au type de la variable dont vous voulez obtenir la valeur ? Par exemple, si vous voulez obtenir un int, avez-vous bien utilisé "
scanf("%d", &votre_variable)
" ?
Une fois votre programme corrigé, exécutez-le ! Si tout semble correct, postez votre réponse sur Webcampus !