Laboratoire 8: Énoncé
Ce laboratoire a pour but de vous faire pratiquer:
- La création de modules et le test de vos modules;
- La manipulation de chaine de caractères déclarées sous forme d'un tableau de caractères;
- L'utilisation de la classe de stockage static (variables locales statiques);
- L'encapsulation en utilisant des fonctions statiques;
- De part la nature même des chaines de caractères, ce laboratoire vous fait réviser les tableaux et les pointeurs.
Fonctionnement du laboratoire:
- Ce laboratoire se compose de 7 exercices. Ceux-ci doivent tous être complétés d’ici la prochaine séance de laboratoire.
- Le laboratoire vise à la création d'un module "strutils" qui offre un ensemble de fonctions de manipulation de chaines de caractères. Chacune des questions, ci-dessous, vous demande de créer une fonction. Cette fonction doit être intégrée à votre module.
- Il vous est fortement conseillé de créer des fonctions de test pour chacune de vos fonctions, pour conserver les tests que vous avez effectués pour vous assurer du fonctionnement de votre fonction.
- Chaque exercice est accompagné d’indices. Il vous est conseillé de ne consulter l'indice qu'en cas de blocage
Énoncés des exercices :
Question 0:
Écrire un programme qui demande à l'usager:
- Son sexe (Masculin ou féminin),
- Son prénom et
- Son nom.
Note Importante: Votre programme doit afficher un résultat correct si la personne s'appelle (ex.) Johanie Dufour Duquette St Germain.
Question 1:
Créez un projet pour le laboratoire et ajoutez à votre projet un module que vous nommerez "strutils". Les fonction des questions subséquentes seront ajoutées à ce module.
Question 2:
Écrivez une fonction "str_taille" qui prend une chaine de caractères en paramètre et renvoie sa taille.
int str_taille(char *chaine);
Note importante: Vous devez pas utiliser la fonction "strlen" dans cet exercice.
Question 3:
Écrivez la fonction str_copie qui lit copie une chaine de caractères source dans une chaine de caractères destination. Votre fonction prends en paramètre un entier taille_max qui représente la taille maximale, en octets, que peut contenir la destination.
Votre fonction doit renvoyer une valeur vraie si la copie s'est effectuée sans dépassement de capacité, et faux sinon.
int str_copie(char *destination, char *source, int taille_max);
Note importante: Vous devez pas utiliser la fonction "strcpy" (ou toute fonction apparentée de la librairie de C) dans cet exercice.
Question 4:
Écrivez la fonction str_comparer qui reçoit deux chaines de caractères str1 et str2, et qui renvoie une valeur nulle si les deux chaines sont identiques, une valeur positive si str1>str2 ou une valeur négative si str1<str2.
int str_comparer(char *str1, char *str2);
Note: La comparaison doit se faire en vous basant sur le code ASCII des caractères.
Note importante: Vous devez pas utiliser la fonction "strcmp" (ou toute fonction apparentée de la librairie de C) dans cet exercice.
Question 5:
Écrivez la fonction str_concatener qui concatène (i.e. colle à la fin) une chaine de caractères str2 à une chaine de caractères str1. Le résultat doit se trouver dans la chaine str1. Un entier taille_max indique le nombre maximal d'octets que peut contenir str1.
int str_concatener(char *str1, char *str2, int taille_max);
Note importante: Vous ne devez pas utiliser la fonction "strcat" (ou toute fonction apparentée de la librairie de C) dans cet exercice.
Question 6:
Écrivez la fonction "generer_pass" qui génère un mot de passe aléatoire utilisant des lettres (majuscules et minuscules), des chiffres et des symboles. Les symboles que vous utiliserez seront ceux ayant un code ASCII entre 33 et 47. Votre fonction reçoit deux arguments: la chaine de caractère ou stocker le mot de passe, et un entier qui indique la taille du mot de passe (en nombre de caractères) que l'on souhaite obtenir.
void generer_pass(char *dest, int nb_caracteres);
Vous devez d'abord créer (au moins) la fonction utilitaire qui vous renvoie une lettre alphabétique aléatoire (Maj ou Min). Cette fonction devrait être réservée au module.
Question 7: Le cryptage de Jules César
Au temps des Romains, Jules César avait une peur bleue que les messages qu'il envoie à ses généraux ne soient interceptés et utilisés à son insu. Il a alors développé un système d'encryptage très simple qui consiste à faire une rotation des lettres alphabétiques. Il devait s'entendre alors avec son correspondant sur le nombre de rotations (qu'on appelle la clé du cryptage).Par exemple, si la clé vaut 5, on doit remplacer chaque lettre du message par la 5ième lettre qui la suit dans l'alphabet. Donc le A devient F, B devient G, c devient h, etc. Si la fin de l'alphabet est atteinte, on doit recommencer au début: donc Y devient D.
Ainsi, le message "Bonjour", avec une clé de cryptage de 5 sera crypté en la chaine de caractères "Gtsotz". Les signes de ponctuation (, . ; ? ! ) ne doivent pas changer.
Vous devez écrire deux fonctions:
- Une fonction cryptage_cesar qui crypte un message_clair et produit un message_crypte:
void cryptage_cesar(char *message_clair, int cle, char *message_crypte);
- Une fonction décryptage_cesar qui décrypte un message_crypte et produit le message_clair correspondant.
void decryptage_cesar(char *message_crypte, int cle, char *message_clair);
Chacune des fonctions reçoit la cle en paramètre.
Question 8:
Écrivez une fonction qui affiche à l'écran 80 caractères d'une chaine de caractères chaine. La première fois qu'une chaine de caractères lui est envoyée, elle doit afficher les 80 premiers caractères. Si on rappelle la fonction avec la même chaine de caractères,
elle doit afficher les 80 caractères suivants, etc.
Lorsqu'on aura affiché les derniers caractères de la chaine, la fonction doit retourner Faux. Sinon, elle retourne Vrai. Si on rappelle la fonction après avoir affiché tous les caractères, on doit reprendre au début de la chaine.
int afficher_80(char *chaine);