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
CHECK( plus_proche( {0., 100., 200., 300.}, 245.) == 200. );
CHECK( plus_proche( {42., -4.2, 4.2}, 0.) == -4.2 or 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 des if à 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.