Chapitre 1 • outils, flux, chaînes
Installation de l’environnement, premier programme en C+, flux, chaînes de caractères
Cartouche
| Champ | Valeur |
|---|---|
| Auteur·e | Élise |
| Édition | 2023-09-14 |
| Durée | deux jours |
| Taille des équipes | 1 personne |
| Rendu | via git, dépôt 2023_cpp_c1, droits en lecture à delivery_collector |
Barème
| Critère | Points |
|---|---|
| Configuration éditeur de code | 8 |
| Hello world | 1 |
| Read and write | 1 |
| Translate | 2 |
| TR delete | 2 |
| Conversion de températures | 3 |
| Découpage de chaînes | 3 |
| Total des critères | 20 |
| Note maximale | 20 |
Règlement
La réalisation de cet exercice est assujettie aux règles en vigueur dans l’école en matière de triche et de normalisation. Tricher vous expose à de graves sanctions.
Vous devez être seul·e auteur·e de votre rendu mais vous êtes autorisés et encouragés à communiquer dans le cadre de ce sujet.
Dépôt de référence et norme
Dépôt de référence avec règles clang format.
Tâches
1. Environnements et outils
Pour ce module, vous êtes responsable de l’installation de vos outils pour réaliser vos travaux de C++.
Ce dont vous avez besoin :
- un environnement Linux avec
ssh,gitetg++d’installé- soit Linux directement installé sur votre machine
- soit une VM
- soit WSL
- un éditeur de code avec un moteur de suggestion pour le C++
VS Code
Le plus simple, vous l’avez probablement déjà sous la main, c’est d’utiliser vs-code et d’installer clangd ou vscode-cpptools.
Pour les curieux : neovim et emacs
Mais vous n’êtes pas limité à cela. Si vous aimez les outils hyper rapides et qui peuvent tourner sur une patate, vous avez peut-être envie d’utiliser quelque chose comme neovim ou emacs.
Si vous voulez vous lancer sur neovim il faut que vous appreniez les bases de vim (les modes, les déplacements, les commandes de base pour ouvrir des fichier et naviguer). Pour ce faire, vous pouvez me demander conseil et chercher des vidéos youtube qui vous expliquent tout ça.
Il faut que vous le configuriez pour gérer la complétion automatique, le linting, le refactoring, le debug : tout le genre de fonctionnalités qui peuvent vous aider à coder. Si vous n’avez jamais encore touché à neovim, vous pouvez commencer par installer AstoNvim. C’est une configuration toute faite pour toutes les fonctionnalités que je viens de mentionner, et plus encore.
Si vous voulez faire la même chose avec emacs, vous serez surement intéressé par doom emacs avec lsp-mode.
2. Hello world
Fichier à rendre : hello_world.cpp
Écrivez un programme qui affiche “Hello world!” sur sa sortie standard en utilisant les opérateurs de flux et le header iostream.
3. Read and write
Fichier à rendre : text_cat.cpp
Écrivez un programme qui écrit chaque ligne lue depuis l’entrée standard sur la sortie standard, en utilisant les opérateurs de flux.
Le contenu à lire et écrire sera du texte.
4. Translate
Fichier à rendre : tr.cpp
Écrivez un programme qui se comporte comme tr sans argument.
$ g++ -Wall -Wextra -Werror tr.cpp -o tr
$ cat > stdin.txt << EOF
toto
EOF
$ ./tr ot if < stdin.txt
fifi
5. TR delete
Fichier à rendre : trd.cpp
Écrivez un programme qui se comporte comme tr avec l’option -d avec les mêmes contraintes que l’exercice précédent.
$ g++ -Wall -Wextra -Werror trd.cpp -o trd
$ cat > stdin.txt << EOF
toto
tata
riri
EOF
$ ./trd oi < stdin.txt
tt
tata
rr
6. Conversions de températures
Fichier à rendre : temp_conv.cpp
Écrivez une fonction temp_read_convert qui prend en paramètre une référence sur un std::istream et une référence sur un std::ostream.
Elle doit lire sur le flux en entrée les choses suivantes :
- un nombre à virgule qui représente la température ;
- une lettre F, C ou K qui correspond à l’unité dans laquelle la température est exprimée.
Le nombre et l’unité peuvent être séparé d’un espace, mais ça n’est pas garanti.
La fonction doit écrire sur le flux en sortie la température en Celsius, Fahrenheit et Kelvin.
#include <iostream>
void temp_read_convert(std::istream &, std::ostream &);
int main(void)
{
temp_read_convert(std::cin, std::cout);
}
$ g++ -Wall -Wextra -Werror temp_conv.cpp main.cpp
$ cat > stdin.txt << EOF
44.44C
EOF
$ ./a.out < stdin.txt
44.44 C
112 F
317.6 K
7. Découpage de chaînes
Fichier à rendre split.cpp
Écrivez une fonction split qui prend deux paramètre :
- une chaîne de caractère ;
- un token avec lequel découper la chaîne.
Le token peut très bien être un caractère ou une autre chaîne (pensez polymorphisme).
Votre fonction doit renvoyer un conteneur de la bibliothèque standard de sorte que l’exemple si dessous fonctionne. Les éléments du conteneurs doivent être des std::string.
#include <iostream>
#include <algorithm>
int main(void) {
auto cb{[](std::string &s) { std::cout << s << std::endl; }};
{
auto result{split("electric;dragon", ';')};
std::for_each(result.begin(), result.end(), cb);
}
{
auto result{split(";fire;;;flying", ';')};
std::for_each(result.begin(), result.end(), cb);
}
{
auto result{split("grass-->poison;", "-->")};
std::for_each(result.begin(), result.end(), cb);
}
}
En cas de difficulté
TR
Position dans la chaîne
Implémentez la fonction suivante :
unsigned long pos_in_str(char needle, std::string haystack);
Si needle existe dans la chaîne haystack, renvoyez sa position. Autrement renvoyez std::string::npos.
Exemple de main :
void print_result(unsigned long result)
{
if (result == std::string::npos) {
std::cout << "not found\n";
}
}
int main(void)
{
print_result(pos_in_str('a', "a"));
print_result(pos_in_str('b', "a"));
print_result(pos_in_str('b', "ab"));
print_result(pos_in_str('c', "abc"));
}
Sortie attendue :
0
not found
1
2
Toutes les positions dans la chaîne
Écrivez la fonction suivante :
void print_all_pos_in_str(std::string needles, std::string haystack);
Pour chaque caractère dans needles elle doit afficher :
- s’il se trouve dans
haystack: sa position danshaystack; - s’il ne se trouve pas dans
haystack: “not found”.
Exemple d’appel :
int main(void)
{
print_all_pos_in_str("hello", "ohe");
}
Sortie attendue :
pos 1
pos 2
not found
not found
pos 0