Archives d’Auteur: alain
M3103 – Amphis
Amphi 1 :
- Récursivité
- Adresse mémoire
- Pointeurs en mémoire dynamique
https://ens.casali.me/wp-content/uploads/2017/09/Amphi1.pptx
Amphi 2 :
- Quelques problèmes avec les pointeurs en mémoire dynamique
- Idiome RAII
- Avant propos pour les listes chainées
- On veut faire quoi?
- Structure et fonctionnalités d’un nœud
- Une première liste chainée
- Classe pour liste chainée
- Technique de la sentinelle
https://ens.casali.me/wp-content/uploads/2017/09/Amphi2.pptx
Amphi 3 :
- Structures d’arbres
- Diverses implémentations d’un arbre binaire et n-aire
- Parcours d’arbres
https://ens.casali.me/wp-content/uploads/2017/09/Amphi3.ppt
Amphi 4 :
- Smart Pointers
- Liste chainée avec smart pointers
- Structures de données pour la recherche
https://ens.casali.me/wp-content/uploads/2017/09/Amphi4.pptx
Lien pour amphi 3 (23 / 09 /20) :
- zoom : 954 8259 6058
- pwd : prénom de la personne qui a fait le cours d’algo au début du semestre 1.
M4104C Amphi
M4104C
Compléter le code suivant :
#include <iostream> #include <vector> #include <iomanip> #include <cstdlib> #include <ctime> #include <algorithm> #include <thread> using namespace std; typedef vector <unsigned> CVUint; typedef vector < vector <double>> CMatrix; CMatrix Mat; void SelectSort (CVUint & VUint) { for (unsigned i (0); i < VUint.size(); ++i) { CVUint::iterator Min (min_element (VUint.begin() + i, VUint.end())); swap (VUint[i],VUint [Min - VUint.begin()]); } } void InsertSort (CVUint & VUint) { for (unsigned i (1); i < VUint.size(); ++i) { unsigned Val (VUint [i]); unsigned j (i); for (; j > 0 && VUint[j - 1] > Val; --j) VUint[j] = VUint[j - 1]; VUint[j] = Val; } } void BubbleSort (CVUint & VUint) { for (unsigned i (VUint.size()); i -- > 0; ) { bool TableauTrie = true; for (unsigned j (0); j < i ; ++j) { if (VUint[j + 1] < VUint[j]) { swap (VUint[j + 1], VUint[j]); TableauTrie = false; } } if (TableauTrie) return; } } void LanguageSort (CVUint & VUint) { sort (VUint.begin(), VUint.end()); } void InitMat (unsigned NbColumns) { Mat.resize(4, vector <double> (NbColumns)); } void protoGenericSort(void (*Sort) (CVUint & VUint), const CVUint & VUint, unsigned NbFois, unsigned PosMat, unsigned VectNum) { for (unsigned i (0); i < NbFois; ++i) { CVUint CopyVUint (VUint); /* TODO*/ double elapsed; /* TODO*/ Sort (CopyVUint); /* TODO*/ Mat [PosMat][i + NbFois * VectNum] = elapsed; } } void TraiterResultats (unsigned NbElemAEnlever) { for (vector <double> & UneLigne : Mat) { //tri sort (UneLigne.begin(), UneLigne.end()); //plus petit temps double min (UneLigne[0]); //plus grand temps double max (UneLigne[UneLigne.size()-1]); //temps median double med (UneLigne[UneLigne.size()/2]); //On assigne les valeurs memorisees aux 3 premières cases UneLigne[0] = min; UneLigne[1] = med; UneLigne [2] = max; } //Affichage cout << setw (20) << "Tri" << setw (10) << "Min" << setw (10) << "Med" << setw (10) << "Max" << endl; vector<string> VMetode {"Selection", "Insertion", "Bulles", "Langage"}; for (unsigned i (0); i < VMetode.size(); ++i) cout << setw (20) << VMetode[i] << setw (10) << setprecision(6) << Mat[i][0] << setw (10) << setprecision(6) << Mat[i][1] << setw (10) << setprecision(6) << Mat[i][2] << endl; } int main(int argc, char *argv[]) { if (argc != 4) { cerr << "boulette !\n utilisation : " << argv [0] << " (1) NbElem par vecteur (2) Nb de vecteurs differents (3) Nb itérations par vecteur" << endl; return 1; } unsigned NbElem (stoul(argv[1])); unsigned NbVecteurs (stoul(argv[2])); unsigned NbFois (stoul(argv[3])); srand (time(NULL)); CVUint VUInt (NbElem); InitMat(NbFois * NbVecteurs); for (unsigned i (0); i < NbVecteurs; ++i) { for (auto & Val : VUInt) Val = rand () % (VUInt.size() * 10); thread th1 (/* TODO*/); thread th2 (/* TODO*/); thread th3 (/* TODO*/); thread th4 (/* TODO*/); th1.join(); th2.join(); th3.join(); th4.join(); cout << i << "fini" << endl; } cout << "Taille des vecteurs : " << NbElem << "\nNb de vecteurs : " << NbVecteurs << "\nNb iterations par vecteur : " << NbFois << endl; TraiterResultats (NbFois * NbVecteurs / 10); return 0; }
R1.01 – PROG#13 – Exercice 1
Déclarerez une variable de type map < string, string >
. La première chaine de caractères désigne un nom de famille, le second le prénom d’une personne.
Dans le main ()
:
- déclarer une
map
, - insérer 4 éléments dans cette
map
, - parcourez la
map
pour l’afficher.
R1.01 – PROG#13 – Exercice 2
Ecrire le corps de la fonction insertIntoMapIfNotExists ()
de signature :
void insertIntoMapIfNotExists (map <string, string> & MyMap, const string & Nom, const string & prenom);
Cette fonction doit insérer dans la map
le couple (nom, prenom)
que si le nom n’est pas déjà présent.
Ecrire ensuite le corps de la fonction doublement générique showMap ()
de signature :
template <typename T, typename U> void showMap (const map <T, U>& MyMap);
Quelles sont les spécifications de cette nouvelle fonction ?
Modifier l’exercice 1 en conséquence.
Que se passe-t-il s’il y a plusieurs membres d’une même famille.
Recoder tout!
R1.01 – PROG#13 – Exercice 3 Pacman
Télécharger la correction du projet suivante
Générer la documentation à l’aide de doxygen.
Modifier le fichier type.h en y ajoutant la struct suivante :
struct CMyParamV2{
char tokenP1 = (‘X’);
char tokenP2 = (‘Y’);
char KeyUp = (‘z’);
char KeyDown = (‘s’);
char KeyLeft = (‘q’);
char KeyRight = (‘d’);
std::size_t NbColumn = (10);
std::size_t NbRow = (10);
std::string ColorP1 = KColor.find(“Blue”)->second;
std::string ColorP2 = KColor.find(“Green”)->second;
};
Puis ajouter le code suivant dans params.h :
#include “type.h”
void initParams (CMyParamV2 & param);
Créer le fichier params.cpp dans le répertoire Correct_Prof et insérer le code suivant :
#include <string>
#include “params.h”
#include “game.h”
using namespace std;
void initParams (CMyParamV2 & Param)
{//Move Keys
Param.KeyUp = ‘z’;
Param.KeyDown = ‘s’;
Param.tokenP1 = ‘A’;
Param.tokenP2 = ‘X’;
//Size of grid — suppose to be a rectangle
Param.NbColumn = 10;
//Display Colors
Param.ColorP1 = KColor.find(“KRed”)->second ;
}
Modifier la fonction initParams () de façon à spécifier les touches gauches et droite, ainsi que le nombre de lignes et la couleur du second joueur.
Dans game.cpp :
Ajouter l’appel à la fonction initParams () dans ppal ().
Dans gridmanagement.cpp, modifier les fonction displayGrid () et initGrid () pour prendre en compte la structure de données.
R1.01 – PROG#13 – exercice 4
Le but de cet exercice est de charger un fichier de configuration au format YAML.
Télécharger le fichier config.yaml, et changez l’extension. Modifiez le si besoin.
Ajouter la définition de la fonction
void LoadParams (CMyParamV2 & Param); |
Cette fonction doit lire le fichier config.yaml
de façon à remplir la struct MyParms
, après son initialisation.
Pour ce faire, procéder de la sorte :
- Vérifier que vous arrivez bien à atteindre le fichier
config.yaml
en utilisant un chemin relatif; - Parcourez ce fichier de façon à extraire tous les clés (de types
string
) et toutes les valeurs; - Faites les insertions dans la structure de données de type
CMyParam
, si besoin
M1103-TP5 Exercice 5 – Space Invaders
On souhaite ajouter un peu plus de souplesse à structure du fichier config.yalm
de façon à pouvoir y ajouter des commentaires, permuter des lignes, … Seules les clés autorisées nous intéressent donc.
Ajouter le code suivant :
struct AuthorizedKey { /* List of authorized key for the type char in a struct CMyParam*/ const vector<string> VParamChar {“KeyLeft”, “KeyRight”, “VesselToken”, “InvaderToken”, “KShoot”}; /* List of authorized key for the type string in a struct CMyParam*/ const vector<string> VParamString {“VesselColor”, “InvaderColor”}; /* List of authorized key for the type unsigned in a struct CMyParam*/ const vector<string> VParamUnsigned {“GridSize”}; }; |
Modifier la fonction LoadParams ()
comme cela : après avoir fait une extraction d’une clé fichier config.yalm
, vérifier qu’elle appartient à la structure AuthorizedKey
avant de l’insérer dans la structure CMyParam
.
R1.01 – Prog#11 Exercice1
Ecrire le corps de la fonction affichVInt ()
de signature :
void affichVInt (const vector <int> & VInt);
Rendre générique cette fonction en écrivant le corps de la fonction affichVector ()
de signature :
template <typename T> void affichVector (const vector <T> & V);
Faites des tests avec différents vecteurs.