TP : exercices supplémentaires : tableaux, chaînes de caractères, switch
#
#include <vector>
using namespace std;
Exercice 1 : tableaux#
♣ Implantez une fonction
plus_proche
qui prend en arguments un tableau de réels et un réel, puis renvoie l’élement du tableau le plus proche de ce réel. S’il y en a plusieurs, n’importe lequel convient. Commencez par en écrire la documentation.
/// BEGIN SOLUTION
/** Recherche de l élément le plus proche d un réel dans un tableau
* @param t un tableau de réels non vide
* @param x un réel
* @return un élément de t tel qu aucun autre n est plus proche de x
**/
/// END SOLUTION
/// BEGIN SOLUTION
double plus_proche(vector<double> t, double x) {
double resultat = t[0];
for ( int i = 1 ; i < t.size() ; i++ ) {
if( abs(t[i] - x) < abs(resultat - x) ) {
resultat = t[i];
}
}
return resultat;
}
/// END SOLUTION
bool egal(double x, double y) {
return abs(x-y) < 0.01;
}
CHECK( egal( plus_proche( {0., 100., 200., 300.}, 245.), 200 ) );
CHECK( egal( abs(plus_proche( {42., -4.2, 4.2}, 0.)), 4.2) );
♣ Implantez une fonction
est_dense
qui prend en arguments un tableau de réels et une valeur d’espacement réelle, et renvoie vrai si le tableau est dense et faux sinon. Un tableau est dense si deux valeurs consécutives du tableau n’ont jamais une différence supérieure à la valeur d’espacement.
/** Tester si un tableau est dense
* @param t un tableau de réels
* @param espacement un réel
* @return vrai deux valeurs consécutives de t ont une différence d au plus espacement
**/
bool est_dense(vector<double> t, double espacement) {
/// BEGIN SOLUTION
for (int i = 1 ; i < t.size() ; i++ ) {
if ( abs(t[i] - t[i - 1]) > espacement ) {
return false;
}
}
return true;
/// END SOLUTION
}
CHECK( not est_dense( {100., 200., 300.}, 10. ));
CHECK( est_dense( {0.7, 1.5, 2.4, 3.2}, 1. ));
CHECK( not est_dense( {0.7, 1.5, 2.1, 3.2}, 1. ));
Exercice 2 : code Morse ♣#
Voici une fonction qui traduit une lettre en code Morse. Elle contient une instruction
switch
que nous n’avons pas encore vue. À quoi ressemblerait la fonction avec desif
à la place?
/** Traduction d une lettre en Morse
* @param a un caractère
* @return une chaîne de caractère représentant le code Morse du caractère
**/
string morseCaractere(char a) {
switch(a) {
case 'A':
return ".-";
case 'B':
return "-...";
case 'C':
return "-.-.";
case 'D':
return "-..";
case 'E':
return ".";
case 'F':
return "..-.";
case 'G':
return "--.";
case 'H':
return "....";
case 'I':
return "..";
case 'J':
return ".---";
case 'K':
return "-.-";
case 'L':
return ".-..";
case 'M':
return "--";
case 'N':
return "-.";
case 'O':
return "---";
case 'P':
return ".--.";
case 'Q':
return "--.-";
case 'R':
return ".-.";
case 'S':
return "...";
case 'T':
return "-";
case 'U':
return "..-";
case 'V':
return "...-";
case 'W':
return ".--";
case 'X':
return "-..-";
case 'Y':
return "-.--";
case 'Z':
return "--..";
case ' ':
return " ";
default:
return "???";
}
}
Quel est le code morse pour «ZUT»? Pour «GSM»? Que se passerait-il si l’on ne mettait pas de séparation entre les lettres?
/// BEGIN SOLUTION
Code morse pour «GSM»: «–. … –» Code morse pour «ZUT»: «–.. ..- -»
Sans séparateurs, on obtiendrait dans les deux cas: «–….–», ce qui serait ambigu.
/// END SOLUTION
Implantez une fonction
morseString
qui prend en entrée une chaîne de caractères de longueur arbitraire et qui la traduit entièrement en code Morse.Astuce
Astuce
Les chaînes de caractères (
string
) se comportent essentiellement comme des tableaux de caractères (char
).
/** Traduction d un texte en Morse
* @param chaine une chaîne de caractères
* @return une chaîne de caractère contenant la traduction en Morse de la chaîne de caractère
**/
string morseString(string texte) {
/// BEGIN SOLUTION
string resultat = "";
for ( int i = 0; i < texte.size(); i++ ) {
if ( resultat != "" )
resultat = resultat + " ";
resultat += morseCaractere(texte[i]);
}
return resultat;
/// END SOLUTION
}
Complétez les tests ci-dessous et vérifiez que la fonction les passe :
CHECK( morseString("HELLO") == ".... . .-.. .-.. ---" );
CHECK( morseString("GOOD LUCK") == "--. --- --- -.. .-.. ..- -.-. -.-" );
/// BEGIN SOLUTION
CHECK( morseString("ABC") == ".- -... -.-." );
/// END SOLUTION
Bilan#
Si vous êtes arrivés jusqu’ici, bravo! Votre prochain défi est de résoudre le projet Euler 26.