Avant de commencer…
Consultez les corrections du TD02.
Qu’est-ce qu’on apprend
- Encodage des chaînes de caractères.
- Travailler avec les chaînes de caractères.
- Les chaînes servent comme une entrée dans le monde merveilleux des tableaux.
Attention: La bibliothèque string.h
fournit un tas de fonctions pour travailler avec les chaînes. Le but de ce TD est de faire ces fonctions à la main, pour comprendre comment ça marche sous le capot. Donc, merci de ne pas utiliser les fonctions de string.h
(strstr
,strcmp
,…), puisque sinon les exercices perdraient leur intérêt.
Lecture…
Chaînes de caractères:
Au boulot…
D’ailleurs : Pas de quizz pour le TD03.
IMPORTANT: Donnez votre prénom et nom au début du fichier de réponse, sous forme de commentaire. Ajoutez également les réponses aux questions dans votre programme, sous forme de commentaires. Exemple:
/* Jeanne LAGAFFE */
#include <stdio.h>
int main () {
printf("Hello World !!\n");
}
/*
Q1: Ceci est la réponse à la question 1.
Q2: Voilà la réponse à la question 2.
*/
Q1:
Ecrivez un programme qui stocke la chaîne suissesse
dans une variable M, puis affiche le contenu de M avec printf
.
Astuce: Utilisez le format %s
de printf
.
Q2:
Ecrivez une fonction
void affichage(char* ch)
qui affiche la chaîne ch
suivi par un retour à la ligne. L’affichage doit être codé sans utilser le format %s
de printf
. Vous pouvez afficher les caractères uniquement en utilisant printf
avec le format %c
.
Testez la fonction en l’appelant depuis main()
pour afficher M.
Astuce: Pour parcourir la chaîne, utiliser une boucle while
qui augmente un compteur i et qui s’arrête quand ch[i]==0
.
Q3:
Ecrivez une fonction
int compter_lettre(char* ch, char x)
qui prend en entrée une chaîne de caractères ch et une lettre x et qui donne le nombre d’occurences de la lettre dans la chaîne. Testez la fonction en l’appelant depuis main() selon les exemples suivants:
compter_lettre("suissesse",'s')
donne 5compter_lettre("suissesse",'x')
donne 0compter_lettre("suissesse",'e')
donne 2
Q4:
Ecrivez une fonction
int position(char* ch, char x)
qui parcourt la chaîne et donne la position (en partant de 0) de la première occurrence de la lettre dans x. Si il n’y a pas cette lettre, la fonction donne -1. Testez la fonction en l’appelant depuis main() selon les exemples suivants:
position("suissesse",'s')
donne 0position("suissesse",'x')
donne -1position("suissesse",'e')
donne 5
Q5:
Attention, ça chauffe. Ecrivez une fonction
int position_chaine(char* ch, char* m)
qui parcourt la chaîne et donne la position (en partant de 0) de la première occurrence de la chaîne dans m. Si il n’y a pas cette chaîne, la fonction donne -1. Testez la fonction en l’appelant depuis main() selon les exemples suivants:
position_chaine("suissesse","ss")
donne 3position_chaine("suissesse","ee")
donne -1position_chaine("suissesse","suissesse")
donne 0position_chaine("suissesse","suissesses")
donne -1
Anecdote: Le problème ci-dessus est connu sous le nom de l’algorithme de recherche de sous-chaîne. La plupart des algorithmes (même les bons) prennent dans le pire cas un temps qui est proportiennel à
\[\text{longeur de ch}*\text{longeur de m}.\]Mais, en 1991, Maxime Crochemore et Dominique Perrin de l’université Paris 7 ont découvert un algorithme qui ne prend pas plus que
\[\text{longeur de ch}+\text{longeur de m}.\]Pour des longues chaînes, ça fait une sacrée différence!
Validez:
Nommez le fichier T03a.c
et envoyez-le à votre chargé de TD