1. Livres & vidéos
  2. Algorithmique
  3. Énoncé 5 : Les chaînes de caractères
Extrait - Algorithmique Entraînez-vous et améliorez votre pratique de la programmation (exemples en Java et Python) (2e édition)
Extraits du livre
Algorithmique Entraînez-vous et améliorez votre pratique de la programmation (exemples en Java et Python) (2e édition) Revenir à la page d'achat du livre

Énoncé 5 : Les chaînes de caractères

Introduction

Durée

3 heures 30

Mots-clés

chaîne de caractères, indice, longueur, distance, chiffrement, la classe String et la méthode toString (Java), le type str et la méthode _str_ (Python)

Objectif

Dans ce chapitre, vous apprendrez à :

  • déclarer et utiliser les chaînes de caractères  ;

  • utiliser les constantes chaînes de caractères  ;

  • utiliser les indices pour accéder à un caractère d’une chaîne  ;

  • afficher sous forme d’une chaîne les objets d’une classe.

Prérequis

Pour valider les prérequis nécessaires avant d’aborder le TP, répondez aux questions ci-après.

1. Questions Java

1.

Comment est déclarée une variable chaîne de caractères ?

2.

Quelle est la syntaxe d’une constante chaîne de caractères ?

3.

Comment est créée une chaîne de caractères à partir d’une constante chaîne de caractères ?

4.

Quelle est la méthode pour accéder au énième caractère d’une chaîne ?

5.

À quoi sert la méthode indexof(String str) de la classe String ?

6.

Quel est l’opérateur de concaténation des chaînes ?

7.

Comment faut-il procéder pour concaténer une constante ou une variable de type char à une chaîne de caractères ?

8.

Parmi les choix suivants, lequel indique le but de la méthode toString, méthode qui peut être redéfinie au sein d’une classe ?

a.

renvoyer le nom de la classe.

b.

renvoyer le nom de l’objet auquel s’applique la méthode.

c.

renvoyer, sous la forme d’une chaîne de caractères, le contenu de l’objet auquel s’applique la méthode.

d.

renvoyer le nom de la classe, des attributs et des méthodes sous la forme d’une chaîne...

Énoncé 5.1 : Comptage des voyelles et des consonnes dans un mot

Durée estimative : 25 minutes

Écrivez le programme Java/Python qui lit un mot dans une chaîne de caractères et qui compte dans ce mot le nombre de voyelles non accentuées et de consonnes. Ces voyelles et consonnes sont comptées qu’elles soient écrites en minuscules ou en majuscules. Les deux nombres doivent être affichés.

Le comptage des voyelles comme celui des consonnes doit être réalisé dans un sous-programme distinct.

Indice

Pour détecter si une lettre est une voyelle, déclarez une chaîne constante de caractères contenant toutes les voyelles et utilisez la méthode indexOf en Java ou l’opérateur d’inclusion in en Python.

Énoncé 5.2 : Le palindrome

Durée estimative : 25 minutes

Un palindrome est un texte dont la suite des lettres est la même que le texte soit lu de gauche à droite ou de droite à gauche. Les espaces ne sont pas pris en compte.

Écrivez le programme Java/Python qui lit un texte dans une chaîne de caractères et qui vérifie si le texte est un palindrome, avant d’afficher le résultat.

Le test du palindrome est réalisé dans un sous-programme.

Énoncé 5.3 : Conversion d’un entier en chaîne

Durée estimative : 35 minutes

Écrivez la classe Entier Java/Python qui introduit l’attribut valeur de type int. Cet attribut est initialisé dans le constructeur avec la valeur transmise en paramètre. Écrivez d’abord les méthodes getValeur et setValeur (Java)/get_valeur et set_valeur (Python) dont le but est respectivement de renvoyer et de fixer la valeur de cet attribut.

Écrivez ensuite la méthode versChaine (Java)/vers_chaine (Python) qui convertit l’attribut valeur en une chaîne de caractères et la renvoie comme résultat. Dans le résultat, les milliers doivent être séparés par un espace.

Écrivez enfin un programme de test de la classe.

Indices

En Java, n’utilisez pas la méthode valueOf de la classe String ou la méthode toString de la classe Integer mais écrivez vous-même l’algorithme de conversion. Pour convertir un chiffre en un caractère, vous pouvez utiliser le transtypage et écrire (char) (48 + chiffre).

En Python, n’utilisez pas la fonction intégrée str() mais écrivez l’algorithme de conversion en exploitant la fonction intégrée chr() qui retourne le caractère correspondant à une valeur entière valide dans la plage Unicode....

Énoncé 5.4 : Conversion d’une chaîne en entier

Durée estimative : 15 minutes

Ajoutez à la classe Entier Java/Python introduite dans l’énoncé 5.3 la méthode depuisChaine (Java)/depuis_chaine (Python) qui prend en paramètre une chaîne de caractères et la convertit en entier pour le stocker dans l’attribut valeur. Attention, la chaîne peut contenir des espaces (normalement pour séparer les milliers mais le plus simple est de prendre l’hypothèse qu’ils peuvent être placés n’importe où).

En cas d’erreur, c’est-à-dire si la chaîne ne contient pas un entier, la méthode ne modifie pas l’attribut valeur.

Écrivez un programme de test de la nouvelle méthode.

Indice

En Java, n’utilisez pas la méthode valueOf de la classe Integer, mais comme pour l’exercice précédent, écrivez vous-même l’algorithme de conversion. Pour convertir un caractère en un chiffre, vous pouvez utiliser le transtypage et écrire (int) caractere - 48.

En Python, n’utilisez pas la fonction intégrée int() mais écrivez vous-même l’algorithme en utilisant la fonction intégrée ord(). Cette fonction, qui est l’inverse de la fonction chr() mentionnée lors de l’exercice...

Énoncé 5.5 : Chiffrement d’un texte par rotation13

Durée estimative : 30 minutes

Le chiffrement d’un texte par la méthode rotation13 consiste à décaler chaque lettre de 13 rangs dans l’alphabet. Ainsi, la lettre A devient N (N est la 14e lettre), B devient O, M devient Z, N devient A (N étant la 14e lettre, le résultat donne 27, comme il dépasse 26, il faut retrancher 26, ce qui donne le rang 1, c’est-à-dire celui de A), Z devient M.

Pour déchiffrer un texte chiffré par la méthode rotation13, il faut appliquer à nouveau le chiffrement.

Écrivez en Java/Python la classe TexteChiffre qui contient l’attribut texte de type chaîne de caractères. Cet attribut est initialisé dans le constructeur avec la valeur transmise en paramètre.

Écrivez les méthodes suivantes :

  • Les méthodes getTexte et setTexte (Java)/get_texte et set_texte (Python) dont le but est respectivement de renvoyer et de fixer la valeur de l’attribut texte.

  • La méthode chiffre qui effectue le chiffrement du contenu de l’attribut texte basé sur la méthode rotation13. Attention, seules les lettres de A à Z et de a à z sont modifiées.

Écrivez un programme de test de la classe. Après avoir lu une chaîne, il utilise la classe...

Énoncé 5.6 : Représentation lisible d’un objet

Durée estimative : 15 minutes

En Java, la méthode toString peut être introduite dans toutes les classes. Elle renvoie une chaîne qui donne une représentation lisible de l’objet. Cette méthode est appelée de façon implicite pour afficher un objet lorsqu’il est transmis comme paramètre à la méthode System.out.print

En Python, la méthode spéciale __str__ qui peut être introduite dans toutes les classes joue le même rôle en permettant d’obtenir une représentation lisible de l’objet. Cette méthode est automatiquement invoquée lorsqu’un objet est passé en paramètre de la fonction intégrée d’affichage print().

Reprenez la classe Complexe de l’exercice 4.3 et ajoutez dans cette classe une méthode toString (Java)/__str__ (Python) qui renvoie une chaîne contenant la valeur de la partie réelle et de la partie imaginaire.

Modifiez le programme principal de l’exercice 4.3 pour qu’il utilise la méthode toString (Java)/__str__ (Python).

Énoncé 5.7 : Recherche de numéro de téléphone

Durée estimative : 40 minutes

Le but de l’exercice est de rechercher des numéros de téléphone au sein d’un texte. Un numéro de téléphone a le format suivant : nn.nn.nn.nn.nnn est un chiffre compris entre 0 et 9.

Écrivez la fonction rechercheNumTel (Java)/recherche_num_tel (Python) qui recherche le premier numéro de téléphone présent dans une chaîne de caractères transmise en paramètre. Le numéro de téléphone est renvoyé sous la forme d’une chaîne de caractères.

Écrivez ensuite le programme principal qui lit au clavier une chaîne, appelle la fonction rechercheNumTel (Java)/recherche_num_tel (Python) et peut ainsi afficher le premier numéro de téléphone présent dans cette chaîne, s’il existe.

Indice

Avant d’écrire la fonction rechercheNumTel (Java)/recherche_numtel (Python), vous pouvez écrire une première fonction qui vérifie la présence de deux chiffres puis une deuxième fonction qui vérifie la présence de deux chiffres et un point et enfin une dernière fonction qui vérifie la présence d’un numéro de téléphone. Ces trois fonctions effectuent...

Énoncé 5.8 : Distance de Levenshtein

Durée estimative : 25 minutes

La distance de Levenshtein sert à mesurer la similarité entre deux chaînes de caractères s1 et s2, de longueurs respectives t1 et t2 et indicées respectivement de 0 à t1-1 et de 0 à t2-1. Cette distance est nulle si les deux chaînes sont identiques. Si les chaînes sont différentes alors, dans le cadre de cet exercice, la distance est égale au nombre de substitutions, d’ajouts et de suppressions d’un caractère pour aller de s1 à s2.

Le calcul de cette distance passe par l’utilisation d’une matrice M de t1+1 lignes et de t2+1 colonnes. La première ligne est remplie de 0 à t2 et la première colonne est remplie de 0 à t1, c’est-à-dire ainsi (avec t1=3 et t2=5) :

0

1

2

3

4

5

1

2

3

Ensuite, chaque élément restant de la matrice est calculé ainsi :

Pour i variant de 1 à t1  
Pour j variant de 1 à t2 
M[i,j] <- min(M[i-1,j]+l, M[i,j-1]+1, M[i-1,j-1]+diff(i,j)) 
Avec diff(i,j) = 0 si s1[i-1] = s2[j-l]  
     diff(i,j) = 1 si s1[i-1] <> s2[j-l] 

La distance est fournie par M[t1,t2].

Écrivez la fonction distanceLevenshtein (Java)/distance...