2. Rappel: traitement de caractères
Les macros d'analyse de caractères:
Ces macros sont incluses dans la bibliothèque <ctype.h>.
Elles acceptent comme argument un char ou un int et retournent un entier
différent de 0 si l'argument est compris dans les limites indiquées ci-dessous:
macros condition
isalpha(c) A-Z, a-z
isupper(c) A-Z
islower(c) a-z
isdigit(c) 0-9
isxdigit(c) 0-9, A-F, a-f
isspace(c) blanc
isalnum(c) 0-9, A-Z, a-z
2
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
3. Saisie d'une chaine de caractères avec cin.get()
Si on utilise cin tout seul, on a 2
problèmes:
- on risque d'écrire au delà des
limites du tableau,
- un espace serait compris comme
fin de chaine.
- Il vaut mieux utiliser cin.get();
#include <iostream>
using namespace std;
int main() {
char chaine[7];
cout<<"Entrez une chaine de 6 car"<<endl;
// la 7 ème sera le '0'
cin.get(chaine,7);
cout<<"contenu de la chaine:"<<chaine<<endl;
cout<<endl;
return 0;
}
3
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
4. Utilisation du type string
Créer un objet string :
Soit après les "includes" on met :
using namespace std ;
Soit on précise le namespace de la
classe :
std::string Ville ;
Avec string :
getline(cin, maChaine);
// string 1
#include <iostream>
#include <string> // Pour utiliser les objets string
using namespace std;
int main(){
string maChaine;
//Création d'un objet 'maChaine' de type string
....
return 0;
}
4
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
5. Série 1: TP généralités
Exercice 1: Ecrire un programme qui vérifie que les
parenthèses d’une chaîne, saisie au clavier, sont
bien équilibrées.
Le programme doit afficher l'un des 3 messages:
Les parenthèses sont bien équilibrées
Il manque, 'n' parenthèses ouvrantes
il manque, 'n' parenthèses fermantes
5
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
6. Exercice1(Solution) : TP1_Exo1.cpp
#include<stdio.h>
#include<conio.h> // pour getch()
#include<string.h>
int main() {
int i, // indice pour parcourir la chaine
j=0; //entier qui s'incrémente s'il rencontre '('
// et se decremente si ')'
char ch[30]; //la chaine lue au clavier
printf("Donnez votre chaine a analyser:t");
gets(ch);
i=0;
while(i<strlen(ch)){//boucle qui teste la fin de la chaine
if (ch[i]=='(') ++j;
else if (ch[i]==')') --j;
i++;
}
if(!j) printf("les parenthses sont bien equilibrees");
else if(j<0)
printf("il manque %d parenthese ouvrante",-j);
else printf("il manque %d parenthese fermante",j);
getch();
return 0;
}
6
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
7. Exercice1(Solution) : TP1_Exo1.cpp
#include<stdio.h>
#include<conio.h> // pour getch()
#include<string.h>
int main() {
int i, // indice pour parcourir la chaine
j=0; //entier qui s'incrémente s'il rencontre '('
// et se decremente si ')'
char ch[30]; //la chaine lue au clavier
printf("Donnez votre chaine a analyser:t");
gets(ch);
for(i=0; i<strlen(ch); i++){
if (ch[i]=='(') ++j;
else if (ch[i]==')') --j;
}
if(!j) printf("les parenthses sont bien equilibrees");
else if(j<0)
printf("il manque %d parenthese ouvrante",-j);
else printf("il manque %d parenthese fermante",j);
getch();
return 0;
}
7
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
8. Série1: TP généralités
Exercice 2:
Ecrire un programme qui implante un automate qui indique si une chaîne
de ‘a’ est constitué d'un nombre paire ou impaire de ‘a’.
a
début
paire a impaire
8
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
0 1
9. Exercice2(Solution) : TP1_Exo2.cpp
Solution : exo3.cpp
include <stdio.h>
#include <string.h> // pour strlen
#include <stdlib.h> // pour pause et exit()
#include <conio.h> // pour getch()
int main() {
char chaine[20];
int i=0, etat=0, longueur;
printf("donnez une chaine constituee d'une suite de 'a'n");
gets(chaine);
longueur = strlen(chaine);
while(i<=longueur) {
switch(etat)
{
case 0: {
if (i==longueur) {printf("t Nombre paire de 'a'");
exit(0);
}
else if (chaine[i] =='a')
{etat=1; i++;}
else {printf("!!! Erreur la chaine n'est pas une suite de 'a'");
exit(1);
}
break;
}
9
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
10. Exercice2(Solution) : TP1_Exo2.cpp
case 1: {
if (i==longueur) {
printf("tt Nombre impaire de 'a'");
exit(0);
}
else if (chaine[i] =='a') {
etat=0; i++;
}
else {
printf("!!! Erreur la chaine n'est pas une suite de ‘a'");
exit(1);
}
break;
}
}
}
//system("pause");
//getch();
return 0;
}
10
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
11. Série1: TP généralités
Exercice 3:
1. Proposer un automate à états finis déterministe qui
reconnait les mots sur l’alphabet {a, b} qui contiennent
au moins 2 ‘b’.
2. Ecrire un programme pour cet automate et qui donne
le nombre de ‘b’ dans la chaine.
11
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
12. Exercice3(Solution) :
Exercice 3:
1- Proposer un automate à états finis déterministe qui reconnait les mots sur
l’alphabet {a, b} qui contiennent au moins 2 ‘b’.
a a a|b
début b b
Exemple:"aabaaabbab"
12
0 1 2
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
13. Série1: TP généralités
Exercice 3:
2- Ecrire un programme qui implante cet automate et donne le nombre de
‘b’ dans la chaine.
13
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
14. Exercice3(Solution) : TP1_Exo3.cpp
Solution : exo4.cpp
#include <stdio.h>
#include <string.h> // pour strlen
#include <stdlib.h> // pour exit()
int main() {
char chaine[20];
int i=0, etat=0, nb=0;
printf("Donnez une chaine sur l'alphabet {a, b} avec au moins 2 'b'n");
gets(chaine);
while(1) {
switch(etat) {
case 0: {
if (chaine[i]=='a') {i++;}
else if (chaine[i]=='b') {nb++; etat=1; i++;}
else {
printf("!!! Erreur la chaine n'est pas une suite de 'a' et ‘b’");
exit(1);
}
}
break;
}
case 1: {
if (chaine[i]=='a') {i++;}
else if (chaine[i]=='b') {nb++; etat=2; i++;}
else {printf("!! Erreur la chaine n'est pas une suite de 'a' et 'b’"); exit(1);}}
break;
}
case 2: {
if (i==strlen(chaine)) {printf("t Chaine valide avec %d 'b’", nb); exit(0);}
else {if (chaine[i]=='a') {i++;}
else if (chaine[i]=='b') {nb++; i++;}
else {printf("!! Erreur la chaine n'est pas une suite de 'a' et 'b’"); exit(1);}}
break;
}
}
}
return 0;
}
14
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
15. Analyse lexicale : AFD
Exercice 4: On veut reconnaitre un horaire sous la forme :
12:15 pour midi et 15 minutes.
1. Proposer un automate à états finis déterministe qui
reconnait ces formes.
2. Ecrire un programme qui implante cet automate.
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
15
16. Analyse lexicale : AFD
On veut reconnaitre un horaire sous la forme : 12:15 pour midi et 15 minutes.
1- Proposer un automate à états finis déterministe qui reconnait ces formes.
Solution:
E.R: ((0|1)[0-9]|2[0-3]):[0-5][0-9]
début 0-1 0-9 : 0-5 0-9
2 0-3
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
6
0 1 3 4 5
2
16
18. Analyse lexicale : AFD
Exercice 5: On veut reconnaitre une date sous la forme :
03/02 pour le 3 février en se limitant à l'année en cours.
On considère pour simplifier que chaque mois est
constitué de 30 jours.
1. Proposer un automate à états finis déterministe qui
reconnait ces formes.
2. Ecrire un programme qui implante cet automate.
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
18
19. Analyse lexicale : AFD
On veut reconnaitre une date sous la forme : 03/02 pour le 3 février en se limitant à l'année en
cours.
On considère pour simplifier que chaque mois est constitué de 30 jours.
1- Proposer un automate à états finis déterministe qui reconnait ces formes.
E.R: (0[1-9])|([1-2][0-9])|(30)) / (0[1-9] | 1[0-2])
0 [1-9]
début [1-2] [0-9] / 0 [1-9]
3 0 1 [0-2]
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
0 1
2
4 5
7
8
6
3
19
21. Analyse lexicale : AFD
Exercice 6:
1. Proposer un automate à états finis déterministe qui
reconnait les mots validés par l’ER: a(b)*a|a
2. Ecrire un programme qui implante cet automate et donne
le nombre de ‘b’ dans la chaine.
Exemples de mots valides: "aa", "aba", "a"
Mots non valides : "abb", "ab"
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
21
22. Analyse lexicale : AFD
Exercice 6:
1- Proposer un automate à états finis déterministe qui
reconnait les mots validés par l’ER: a(b)*a|a
début a a Exemples valides : "a", "aa", "abbba",
Exemple non valide: "abb"
b a
b
Profs. M.D. RAHMANI, F.Z. TIJANE BADRI & R.FILALI Compilation EMSI 4ème année IIR 2023/24
0
2
3
1
22