La manipulation de texte est au cœur des moteurs de recherche, des parsers de fichiers, des compilateurs et de la cryptographie. Cette section met en pratique les concepts de la Partie 6 à travers trois applications réelles et complètes : le détecteur universel de palindromes, l'analyseur statistique de texte et le système de chiffrement historique de César.
Problème 1 : Détecteur universel de Palindromes#
Énoncé#
Un palindrome est un mot ou une phrase qui se lit exactement de la même manière de gauche à droite et de droite à gauche (exemples : "kayak", "radar", "rotor").
Écrivez un programme qui :
1. Lit une chaîne de texte au clavier de manière sécurisée avec fgets().
2. Implémente une fonction bool EstPalindrome(const char *chaine) qui teste si le mot est un palindrome en comparant les caractères symétriques du début et de la fin sans allouer de copie.
flowchart LR
subgraph TestPalindrome ["Test pour 'RADAR'"]
C1["Indice i=0 : 'R'"] <-->|Égalité ? OUI| C5["Indice j=4 : 'R'"]
C2["Indice i=1 : 'A'"] <-->|Égalité ? OUI| C4["Indice j=3 : 'A'"]
C3["Indice i=2 : 'D' (Centre)"]
end
Solution complète en C#
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
bool EstPalindrome(const char *str)
{
if (str == NULL) return false;
int gauche = 0;
int droite = (int)strlen(str) - 1;
while (gauche < droite)
{
// Comparaison insensible à la casse avec tolower()
if (tolower((unsigned char)str[gauche]) != tolower((unsigned char)str[droite]))
{
return false; // Différence détectée : pas un palindrome
}
gauche++;
droite--;
}
return true; // Tous les caractères symétriques correspondent
}
int main(void)
{
char mot[50];
printf("Entrez un mot a verifier : ");
if (fgets(mot, sizeof(mot), stdin) != NULL)
{
// Remplacement du '\n' final
mot[strcspn(mot, "\n")] = '\0';
if (EstPalindrome(mot))
{
printf("Le mot \"%s\" est un PALINDROME parfait !\n", mot);
}
else
{
printf("Le mot \"%s\" N'EST PAS un palindrome.\n", mot);
}
}
return 0;
}
Problème 2 : Analyseur statistique de texte#
Énoncé#
Concevez un outil d'analyse textuelle qui lit une phrase et calcule en un seul passage : - Le nombre total de voyelles (A, E, I, O, U, Y). - Le nombre total de consonnes. - Le nombre total de chiffres numériques (0-9). - Le nombre total de mots (séparés par un ou plusieurs espaces).
Solution complète en C#
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
void AnalyserTexte(const char *texte)
{
int nb_voyelles = 0;
int nb_consonnes = 0;
int nb_chiffres = 0;
int nb_mots = 0;
bool dans_un_mot = false;
for (int i = 0; texte[i] != '\0'; i++)
{
unsigned char c = (unsigned char)texte[i];
// 1. Détection des chiffres
if (isdigit(c))
{
nb_chiffres++;
}
// 2. Détection des lettres
else if (isalpha(c))
{
char minuscule = (char)tolower(c);
if (minuscule == 'a' || minuscule == 'e' || minuscule == 'i' ||
minuscule == 'o' || minuscule == 'u' || minuscule == 'y')
{
nb_voyelles++;
}
else
{
nb_consonnes++;
}
}
// 3. Détection et comptage des mots
if (!isspace(c))
{
if (!dans_un_mot)
{
dans_un_mot = true;
nb_mots++;
}
}
else
{
dans_un_mot = false;
}
}
printf("--- RAPPORT D'ANALYSE TEXTUELLE ---\n");
printf("Nombre de mots : %d\n", nb_mots);
printf("Nombre de voyelles : %d\n", nb_voyelles);
printf("Nombre de consonnes : %d\n", nb_consonnes);
printf("Nombre de chiffres : %d\n", nb_chiffres);
printf("------------------------------------\n");
}
int main(void)
{
char phrase[] = "Le langage C a ete cree en 1972 par Dennis Ritchie.";
printf("Texte analyse :\n\"%s\"\n\n", phrase);
AnalyserTexte(phrase);
return 0;
}
Problème 3 : Le Chiffrement de César#
Énoncé#
Le chiffrement de César est l'une des plus anciennes méthodes de cryptographie symétrique. Il consiste à décaler chaque lettre du message d'un nombre fixe \(K\) de rangs dans l'alphabet (par exemple, pour un décalage de \(K = 3\), 'A' devient 'D', 'B' devient 'E', ..., et 'Z' boucle sur 'C').
Implémentez :
1. void ChiffrerCesar(char *texte, int cle) : décale les lettres majuscules et minuscules en préservant les espaces et ponctuations.
2. void DechiffrerCesar(char *texte, int cle) : applique le décalage inverse.
Solution complète en C#
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void ChiffrerCesar(char *texte, int cle)
{
// Normalisation de la clé entre 0 et 25
cle = (cle % 26 + 26) % 26;
for (int i = 0; texte[i] != '\0'; i++)
{
if (isupper((unsigned char)texte[i]))
{
texte[i] = (texte[i] - 'A' + cle) % 26 + 'A';
}
else if (islower((unsigned char)texte[i]))
{
texte[i] = (texte[i] - 'a' + cle) % 26 + 'a';
}
// Les ponctuations, espaces et chiffres restent inchangés
}
}
void DechiffrerCesar(char *texte, int cle)
{
// Déchiffrer revient à chiffrer avec un décalage de 26 - cle
ChiffrerCesar(texte, 26 - (cle % 26));
}
int main(void)
{
char message[100] = "Rendez-vous a minuit au laboratoire secret !";
int cle = 4;
printf("Message original : %s\n", message);
ChiffrerCesar(message, cle);
printf("Message chiffre (K=%d): %s\n", cle, message);
DechiffrerCesar(message, cle);
printf("Message dechiffre : %s\n", message);
return 0;
}
Message original : Rendez-vous a minuit au laboratoire secret !
Message chiffre (K=4): Virhiv-zsyc e qmrymx ey pefsvexsmvi wigvix !
Message dechiffre : Rendez-vous a minuit au laboratoire secret !
Vous maîtrisez la manipulation des chaînes de caractères. Dans la Partie 7, nous allons aborder la persistance des données sur disque avec la gestion des fichiers.
Commentaires