Les chaînes de caractères
Une chaine de caractères peut être considéré comme un tableau particulier de caractères .
I.Déclaration :
Var <identificateur> : chaine[taile]
exp :
Var mot : chaine[20]
exp :
Var mot : chaine[20]
II.Opérations sur les chaines
1. Accès à un caractère :
Même chose qu'avec les tableaux , un indice permet de spécifier la position du caractère au quel on veut accéder .
exp :
Var mot : chaine[10]
mot[1] : désigne le 1er caractère de la chaine
mot[3] : désigne le 3ème caractère de la chaine
exp :
Var mot : chaine[10]
mot[1] : désigne le 1er caractère de la chaine
mot[3] : désigne le 3ème caractère de la chaine
2. Affectation d'une chaine constante à une variable :
Il est possible d'affecter une chaine à constante à une variable de même type
exp :
Var mot : chaine[10]
mot←"bonjour"
exp :
Var mot : chaine[10]
mot←"bonjour"
3. Lecture & écriture d'une chaine :
On peut lire ou afficher une chaine de caractère comme une seule entité , contrairement à un tableau d'entier ou de réels où il faut lire et afficher ses composantes une par une .
exp :
Var mot : chaine[10]
Lire(mot)
Ecrire(mot)
exp :
Var mot : chaine[10]
Lire(mot)
Ecrire(mot)
4. Taille d'une chaine :
On peut avoir la taille réelle d'une chaine grace à cette instruction :
Taille(mot) ou bien : Longueur(mot)
exp :
Var l : entier
l←taille(mot)
ou bien : l←longueur(mot)
Taille(mot) ou bien : Longueur(mot)
exp :
Var l : entier
l←taille(mot)
ou bien : l←longueur(mot)
III. Manipulation des chaines de caractères en Language C
- En langage C, une chaîne de caractères est un tableau de char, dont le dernier élément est ‘\0’.
- Le nombre maximum de caractères que peut comporter la chaîne est égal au nombre d'éléments du tableau moins un, car un élément est réservé au ‘\0’.
- Le premier élément d'une chaîne de caractère en language C est ch[0] .
- Le format utilisé pour lire et écrire une chaîne de caractère avec « scanf et printf » est « %s ».
- Des fonctions conçues pour les chaines de caractères existent (comme pour les caractères) : gets(chaine) et puts(chaine).
puts(chaine) : permet d'écrire une chaîne de caractère.
- La bibliothèque string.h contient plusieurs fonctions de manipulation de chaines de caractères. Parmi elles :
- La fonction strcat(ch1,ch2) recopie la seconde chaîne ch2 à la suite de la première ch1.
- La fonction strcmp(ch1, ch2) compare deux chaînes et fournit une valeur entière positive si ch1>ch2, nulle si ch1=ch2 et négative si ch1<ch2.
- La fonction strcpy(destin, source) recopie la chaîne source dans l’emplacement d’adresse destin.
IV. Exercices d'application
Exercice 1 : *
- Ecrire une fonction qui détermine si un mot donnée est un palindrome.
- Ecrire une fonction qui détermine la position d'un caractère donné c dans une chaîne et retourne 0 s'il n'existe pas.
- Soit un tableau de n chaines (n<=100) , écrire un Algorithme qui affiche toutes les chaines qui commencent par 'A'
VOIR LA CORRECTION
1. Fonction Palindrome (E/ch : chaine[20]) :booléen Var i,j : entier Début i←1 j←taille(ch) Tantque (ch{i]=ch[j]) ET (i<=j) Faire i←i+1 j←j-1 Fait Si (i>j) Alors Retourner(Vrai) //Ou bien Palindrome←vrai Sinon Retourner(faux) //Ou bien Palindrome←faux FSi Fin //Language C : #include <stdio.h> #include <stdlib.h> #include <string.h> int Palindrome(char ch[20]) { int i,j; j=strlen(ch)-1; i=0; while ((ch[i]==ch[j])&&(i<=j)) { i++; j--; } if (i>j) {return 1;} else {return 0;} } 2. Fonction pos_car (E/ch : chaine[20] E/c : caractère) :entier Var i,l : entier Début l←taille(ch) Tantque (i<=l) Faire Si (ch[i]=c) Alors Retourner(i) i←i+1 Fait Si (i>l) Alors Retourner(0) FSi Fin //Language C : int Rech_car(char ch[20],char c) { int i,taille ; taille=strlen(ch); i=0; while (i<taille) { if (ch[i]==c) {return i;} i++; } if (i>=l) {return 0;} } 3. Algorithme Affich_A Var i : entier T:Tableau[1..n]:entier Début Lire(n) Pour i:=1 à n faire Lire(T[i]) Fait Pour i:=1 à n faire Si (T[i][1]='A') OU (T[i][1]='a') Alors Ecrire(T[1]) FSi Fait Fin |
Exercice 2 : *
- Ecrire une fonction qui détermine si deux chaines sont identiques .
- Ecrire une fonction qui inverse le contenue d'une chaîne de caractères.
- Ecrire une fonction PlusLongDeb qui retourne le plus long début commun de deux chaines de caractères données S1 et S2.
- Ecrire une fonction qui permet de concater deux chaines ch1 et ch2 (ajouter le contenue de ch2 à la fin de ch1).
VOIR LA CORRECTION
1. Fonction Identique (E/ch1,ch2:chaine[20]) :booléen Var l1,l2,i : entier Début l1←taille(ch1) l2←taille(ch2) Si (l1<>l2) Alors Retourner(faux) Sinon Tantque (i<l1)ET(ch1[i]=ch2[i]) Faire i←i+1 Fait Si (i=l1) Alors Retourner(Vrai) Sinon Retourner(Faux) FSi Fin 2. Fonction inv-ch (E/ch:chaine[20]) :chaine[20] Var i,l :entier c :caractère Début i←1 l←taille'ch) Tantque (i<=j) Faire //On permute entre deux caractères le premier avec le dernier puis le second avec l'avant dernier et ainsi de suite. c←ch[i] ch[i]←ch[j] ch[j]←c i←i+1 j←j-1 Fait Retourner(ch) Fin 3. Fonction PlusLongDeb (E/s1:chaine[20] E/i,n :entier) :chaine[20] Var s : chaine[20] s,i,l1,l2 : entier Début l1←taille(s1) l2←taille(s2) i←1 Tantque (i<=l1)ET(i<=l2)ET(s1[i]=s2[i]) Faire s[i]←s1[i] Fait Retourner(s) Fin 4. Fonction Concater (E/ch1,ch2:chaine[20]) :chaine[20] Var l1,l2,i,j : entier Début l1←taille(ch1) l2←taille(ch2) i←1 j←l1+1 Tantque (i<=l2) Faire ch1[j]←ch2[i] Fait Retourner(ch1) Fin //Language C #include <string.h> char Concater(char ch1[20],char ch2[20]) { strcpy(ch1,ch2); //La fonction strcpy en language C permet de copier la chaine ch2 juste après la fin de ch1. return ch1; }; |
Exercice 3 : **
- Soit S1 et S2 deux chaines de caractères . écrire une fonction EXTRAIT qui extrait à partir d'un indice i de S1 les n caractères de S1 dans S2.
- Ecrire une fonction qui vérifie si deux mots sont Anagrammes.
exp : "chien" et "chine" , "juste" et "sujet".
VOIR LA CORRECTION
1.
Fonction EXTRAIT (E/s1:chaine[20] E/i,n :entier):chaine[20]
Var s2 : chaine[20]
l,k : entier
Début
Si ( (l-i)<n ) Alors Ecrire("Impossible d'extraire")
Sinon
//On extrait n caractères à partir de la position "i" dans la chaine s2
Pour k:=1 à n faire
s2[k]←s1[i+k]
Fait
Retourner(s2)
Fin
Fonction EXTRAIT (E/s1:chaine[20] E/i,n :entier):chaine[20]
Var s2 : chaine[20]
l,k : entier
Début
Si ( (l-i)<n ) Alors Ecrire("Impossible d'extraire")
Sinon
//On extrait n caractères à partir de la position "i" dans la chaine s2
Pour k:=1 à n faire
s2[k]←s1[i+k]
Fait
Retourner(s2)
Fin
Exercice 4 : ***
Soit A et B deux chaines de caractère de taille<=30 .
Ecrire un Algorithme qui permet de déterminer si B est une sous chaîne de A .
exemple : "Alger" est une sous chaîne de "Algerie"
"possible" est une sous chaîne de "impossible"
"format" est une sous chaîne de "informatique"
Ecrire un Algorithme qui permet de déterminer si B est une sous chaîne de A .
exemple : "Alger" est une sous chaîne de "Algerie"
"possible" est une sous chaîne de "impossible"
"format" est une sous chaîne de "informatique"
VOIR LA CORRECTION
Algorithme sous_chaine
Var ch1,ch2 :chaine[30]
i,j,l1,l2 :entier
Sous_chaine :Booléen
Début
Ecrire("saisir ch1 et ch2")
Lire(ch1,ch2)
i←1 j←1
Tantque (i<=l1)ET(j<=l2) Faire
Tantque (i<=l1)ET(ch1[i]<>ch2[i]) Faire //On avance jusqu'à trouver deux caractères identiques
i←i+1
Fait
j←1
Tantque (i<=l1)ET(j<=l2)ET(ch1[i]=ch2[j]) Faire //A chaque fois que deux caractères sont identiques , on avance
i←i+1
j←j+1
Fait
Fait
Si (i>l1)ET(j>l2) Alors Sous_chaine←Vrai
Sinon Si (i<=l1) ET (j>l2) Alors Sous_chaine←Vrai
Sinon Sous_chaine←faux
FSi
FSi
Si (Sous_chaine=vrai) Alors Ecrire("ch2 est une sous chaine de ch1")
Sinon Ecrire("ch2 n'est pas une sous chaine de ch1")
Fin
Var ch1,ch2 :chaine[30]
i,j,l1,l2 :entier
Sous_chaine :Booléen
Début
Ecrire("saisir ch1 et ch2")
Lire(ch1,ch2)
i←1 j←1
Tantque (i<=l1)ET(j<=l2) Faire
Tantque (i<=l1)ET(ch1[i]<>ch2[i]) Faire //On avance jusqu'à trouver deux caractères identiques
i←i+1
Fait
j←1
Tantque (i<=l1)ET(j<=l2)ET(ch1[i]=ch2[j]) Faire //A chaque fois que deux caractères sont identiques , on avance
i←i+1
j←j+1
Fait
Fait
Si (i>l1)ET(j>l2) Alors Sous_chaine←Vrai
Sinon Si (i<=l1) ET (j>l2) Alors Sous_chaine←Vrai
Sinon Sous_chaine←faux
FSi
FSi
Si (Sous_chaine=vrai) Alors Ecrire("ch2 est une sous chaine de ch1")
Sinon Ecrire("ch2 n'est pas une sous chaine de ch1")
Fin
TP sur les chaines de caractères ***
Le cryptage de données est un ensemble de techniques qui permettent de chiffrer un texte (le transformer pour le rendre incompréhensible), utilisé dans le domaine de la communication (envoi de messages ), seule la personne qui saura déchiffrer le texte, pourra le lire correctement.
Pour déchiffrer un texte (i.e retrouver le message en clair), il faudra connaître la technique avec laquelle il a été chiffré, pour pouvoir effectuer l’opération inverse.
Pour déchiffrer un texte (i.e retrouver le message en clair), il faudra connaître la technique avec laquelle il a été chiffré, pour pouvoir effectuer l’opération inverse.
Cryptage de César :
Consiste à remplacer chaque lettre du texte par celle qui se situe à n positions plus loin dans l’alphabet, n étant un paramètre au choix.
Exemple : Si n=3, a sera remplacé par d, b par e,…, z par c.
Travail demandé :
Ecrire un programmes en C qui permet d'implémenter la technique de cryptage et de décryptage de César .
N.B Pour les textes on utilisera des chaînes de caractères (ne pas utiliser de chaîne intermédiaire pour les transformations)
L'algorithme sera un menu à deux choix (switch) pour choisir soit le cryptage soit le décryptage de César
Consiste à remplacer chaque lettre du texte par celle qui se situe à n positions plus loin dans l’alphabet, n étant un paramètre au choix.
Exemple : Si n=3, a sera remplacé par d, b par e,…, z par c.
Travail demandé :
Ecrire un programmes en C qui permet d'implémenter la technique de cryptage et de décryptage de César .
N.B Pour les textes on utilisera des chaînes de caractères (ne pas utiliser de chaîne intermédiaire pour les transformations)
L'algorithme sera un menu à deux choix (switch) pour choisir soit le cryptage soit le décryptage de César
La table ASCII :
Télécharger la solution du TP :
tp_cryptage_décryptage_césar.txt |