Exercices supplémentaires: tableaux, chaînes de caractères, switch

#include <vector>
using namespace std;

Exercice (tableaux)

  • ♣ Implanter 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. Commencer 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);
  • ♣ Implanter 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 (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 "--..";
    default:
        return "???";
    }
}
  • Implanter 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.
    Indication: 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++) {
        resultat += morseCaractere(texte[i]);
    }
    return resultat;
    /// END SOLUTION
}
  • Compléter les tests ci-dessous et vérifier que la fonction les passe:

CHECK( morseString("HELLO") == "......-...-..---" );
CHECK( morseString("GOOD LUCK") == "--.-------..???.-....--.-.-.-" );

Bilan

Si vous êtes arrivés jusqu’ici, bravo ! Vous pouvez reprendre le TP, en Python cette fois-ci :)