TP 7: Type composite : String

String est une classe qui engendre des objets de type String

"A string is a sequence of characters. The class String includes methods for examining individual characters, comparing strings, searching strings, extracting parts of strings, and for converting an entire string uppercase and lowercase.

Strings are always defined inside double quotes ("Abc"), and characters are always defined inside single quotes ('A').

To compare the contents of two Strings, use the equals() method, as in if (a.equals(b)), instead of if (a == b). A String is an Object, so comparing them with the == operator only compares whether both Strings are stored in the same memory location. Using the equals() method will ensure that the actual contents are compared."(Reference)


void setup(){
  //exemple tiré de la documentation de Processing
String mot1 = "CCCP";
println("le mot1 est : "+mot1);  
println("***********************");

char[] tableauCaracteres = {'C', 'C', 'C', 'P'};
println("le contenu du tableau de caractères est : ");
println(tableauCaracteres); 

println("***********************");

String mot2 = new String(tableauCaracteres);
println("le mot2 est: "+mot2);

}


La documentation de Processing sur la classe String

Pour apprendre à lire une documentation associée à un langage

Voir ici (jusqu'à Displaying text)

Variables et méthodes d'une classe

Retenons pour l'instant qu'une classe C est un prototype avec des variables et des fonctions appelées méthodes

Que cette classe produit des objets de type C par un mécanisme de construction avec le mot réservé new

C unObjet1 = new C();C unObjet2 = new C();....C unObjetn = new C();

Par exemple String une Chaine = new String(); (ou int[] unTableau = new int[10];)

Imaginons que la classe C ait au moins une variable variableDeC , par exemple la classe int[] a pour variable lentgh alors que la classe String n'a pas de variable, alors pour un objet particulier créé unObjetk, pour accéder à la valeur de cette variable on fait :

unObjetk.variableDeC

Par exemple unTableau.lentgh

Par contre la classe C a toujours des méthodes (fonctions) qui facilitent le travail avec les objets construits. Ces fonctions sont soit déjà créées dans le langage de Programmation et dans ce cas il faut prendre connaissance de ces outils (programmeur utilisateur) soit il faut les créer lorsqu'on crée et met au point la classe (programmeur concepteur)

Par exemple la classe String a une méthode qui permet de transformer les lettres majuscules en minuscules toLowerCase(), si on veut mettre une chaîne particulière uneChaine en minuscule on fait :

String chaineMinuscule = uneChaine.toLowerCase();

Attention l'instruction uneChaine.toLowerCase() ne marche pas on dit que l'objet uneChaine est immutable

Par exemple si un tableau représente un polynôme on a intérêt à créer une méthode appelée affichePolynôme() et qui affiche le polynôme sous forme mathématique et on l'appelle ainsi :

unPolynome.affichePolynome();

Attention!!! "Another common source of confusion is the difference between using length to get the size of an array and length() to get the size of a String. Notice the presence of parentheses when working with Strings. (array.length is a variable, while String.length() is a method specific to the String class.) "(Reference)


void setup(){
  //exemple tiré de la documentation de Processing
String mot1 = "CCCP";
println("le mot1 est : "+mot1);  
println("***********************");

char[] tableauCaracteres = {'C', 'C', 'C', 'P'};
println("le contenu du tableau de caractères est : ");
println(tableauCaracteres); 

println("***********************");

String mot2 = new String(tableauCaracteres);
println("le mot2 est: "+mot2);
println("la longueur du mot2 est: "+mot2.length());
println("la longueur du tableau tableauCaracteres est: "+
tableauCaracteres.length");

}


Programmeur utilisateur et Programmeur concepteur

Retenons qu'il faut souvent lire la documentation d'un langage de programmation pour prendre connaissance des outils mis à notre disposition (méthodes d'une classe C) lorsqu'on utilise une classe C déjà existante dans le langage de programmation, pour éviter de réinventer en moins bien et en moins efficace ce qui existe déjà

Voir ici la documentation Java sur la classe String

Il nous arrivera aussi de concevoir des méthodes pour des classes répondant à un problème donné, dans ce cas nous sommes programmeur concepteur

Codage des caractères en machine

"Datatype for characters, typographic symbols such as A, d, and $. A char stores letters and symbols in the Unicode format, a coding system developed to support a variety of world languages.

Voir ici

Each char is two bytes (16 bits) in length and is distinguished by surrounding it with single quotes. Character escapes may also stored as a char. For example, the representation for the "delete" key is 127. "(Reference")

Concrètement pour un ordinateur le caractère a que vous voyez à l'écran est en mémoire :

En binaire sur 2 octets 00000000 01100001 ( 97 en décimal 61 en hexadécimal)

Si vous voulez voir uniquement le caractère à l'écran :

vous faites char x='a';

Si vous voulez récupérer son codage numérique décimal:

vous faites int n = 'a';(dans n il y a 97)

L'instruction n = n + 3; met dans n la valeur 100

Qu'obtient on si on fait println((char)n); ou println(char(n)); ?

Exercices

  1. Créer une fonction qui lit une chaîne de caractères et compte le nombre d'espaces
  2. Créer une fonction qui lit une chaîne de caractères et compte le nombre de voyelles
  3. Créer une fonction qui lit une chaîne de caractères et détermine la lettre la plus fréquente

La notion de fichier

Les programmes que vous avez faits avec Processing sont sauvegardés en mémoire sous la forme d'un fichier .pde. Une image numérique est sauvegardée sous la forme d'un fichier .jpg par exemple.

Une façon de sauvegarder en mémoire des chaînes de caractères qui peuvent d'ailleurs prendre beaucoup de place et dépasser la capacité de stockage d'un objet String, par exemple un génome, et d'utiliser un fichier texte .txt

Dans les exercices qui suivent vous seront donnés des fichiers texte qu'il faudra télécharger et mettre dans le répertoire de votre fichier .pde. Ensuite ce fichier sera transformé en tableau de String par la fonction loadStrings() Par exemple dans l'exercice de programmation collective il s'agit de créer une fonction qui dit si une phrase tirée d'un fichier texte est un palindrome.



boolean estPalindrome(String phrase){
}
void setup(){
  
String[] lignes = loadStrings("palindromes.txt");

for(int i = 0;i < lignes.length;i++){
	print(lignes[i]+" : ");
	println(estPalindrome(lignes[i]));
}


}


Exercices

  1. Est donné un fichier texte qui contient un texte chiffré venant du français sans accent et en majuscules

    Dans le but de le déchiffrer on veut calculer dans un premier temps les effectifs de chacune des 26 lettres de l'alphabet, puis les fréquences dans un second temps les fréquences des lettres

    Télécharger ici le fichier .txt
  2. Est donné un fichier texte qui contient un texte sans accent. Il faut afficher le texte à la console lu à l'envers, de la fin vers le début
  3. Télécharger ici le fichier .txt

Programmation collective

Un palindrome est une phrase que l'on peut lire de la droite vers la gauche ou de la gauche vers la droite et on a les mêmes caractères aux espaces près et aux majuscules près

Par exemple "Esope reste ici et se repose" est un palindrome

Créer une fonction estPalindrome(String Phrase) et qui retourne un boolean.Attention! la chaîne Phrase peut contenir des majuscules et des minuscules mais pas d'accents

Télécharger ici le fichier .txt pour tester la fonction

Conseil: Commencer par écrire un algorithme en français

Mini-projet personnel (avant J+7)

  1. Chiffrement de César (5 points)

    le chiffrement de César consiste à transformer un message en clair en minuscule en un message codé ou crypté en majuscule, en décalant les lettres toujours d'un même nombre

    Par exemple si on décale les lettres de +3 cela signifie que a sera remplacé par D et b par E etc...

    Ainsi java sera codé MDYD

    (3 points) Construire une fonction chiffrementDecalage(String chaineACrypter,int cle) qui retourne une chaine de caractères (String) la chaine cryptée

    (2 points) Créer une fonction testChiffrement() qui appelle chiffrementDecalage() sur un cas simple par exemple String chaine = "java" puis sur le poème suivant où on a remplacé des lettres accentuées par leurs homologues majuscules non accentuées

    On transformera donc le texte en minuscules dans un premier temps

    On se contentera d'afficher en console le message chiffré en majuscules avec println()

    Télécharger ici le poème

  2. Déchiffrement de César (5 points)

    (3 points) Construire une fonction deChiffrementDecalage(String chaineADeCrypter,int cle) qui retourne une chaine de caractères (String) une chaine possible. La chaine en entrée de la fonction est tout en majuscules

    (2points)Construire une fonction testDeChiffrement() qui utilise 25 fois la fonction précédente sur la première ligne d'un texte chiffré par décalage et affiche les résultats en console, avec à chaque fois la clé utilisée.

    Quelle était la clé ?

    Déchiffrer ensuite tout le texte

    Télécharger ici le fichier .txt