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

Annexe 1 • Norme C++

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, git et g++ 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 dans haystack ;
  • 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