M3103 – TP3 Exercice 3

L’ordre des éléments dans une liste LRU ne dépend que de l’ancienneté du dernier accès à chaque élément, ce qui implique deux conséquences :

    1. même si la liste est triée à un instant donné, chaque insertion ou recherche a probablement pour effet de modifier l’ordre de la liste (sauf si ce ne sont que de accès en tête). L’algorithme de recherche à utiliser est donc celui d’une recherche séquentielle dans un ensemble non trié.
    2. l’utilisateur ne peut plus choisir la position à laquelle un élément doit être inséré dans la liste : la propriété “LRU” impose qu’elle soit toujours effectuée en tête.

Travail à effectuer
Modifier la classe CList pour qu’elle réponde au propriété “LRU”.

Nb: on considère que l’affichage ne modifie pas l’ordre des éléments de la liste.

M3103 – TP4 Exercice 4

  1. Faites en sorte de pouvoir afficher votre arbre sans utiliser de fonction d’aide dite “locale”.
  2. Afficher la vue arborescente de l’arbre : chaque fils est décalé d’une indentation par rapport à son père.

M3103 – Amphis

Amphi 1 :

  1. Récursivité
  2. Adresse mémoire
  3. Pointeurs en mémoire dynamique

https://casali.site/wp-content/uploads/2017/09/Amphi1.pptx

Amphi 2 :

  1. Quelques problèmes avec les pointeurs en mémoire dynamique
  2. Idiome RAII
  3. Avant propos pour les listes chainées
  4. On veut faire quoi?
  5. Structure et fonctionnalités d’un nœud
  6. Une première liste chainée
  7. Classe pour liste chainée
  8. Technique de la sentinelle

https://casali.site/wp-content/uploads/2017/09/Amphi2.pptx

Amphi 3 :

  1. Structures d’arbres
  2. Diverses implémentations d’un arbre binaire et n-aire
  3. Parcours d’arbres

https://casali.site/wp-content/uploads/2017/09/Amphi3.ppt

Amphi 4 :

  1. Smart Pointers
  2. Liste chainée avec smart pointers
  3. Structures de données pour la recherche

https://casali.site/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

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 () :

  1. déclarer une map,
  2. insérer 4 éléments dans cette map,
  3. 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.