Developpez.com - Rubrique MATLAB

Le Club des Développeurs et IT Pro

Défi n°3 : le carnet d'adresse

Venez relever les défis MATLAB.

Le 2012-06-15 17:26:41, par ol9245, Membre éprouvé
J'ai un carnet d'adresse, sous forme d'un tableau de struct. Chaque struct contient les champs 'nom' et 'adresse'. Voila un exemple d'un tel carnet :
Code :
1
mon_carnet = [struct('nom', 'Alain', 'adresse', '2 rue des carmélites')
struct('nom', 'Cécile', 'adresse', '7 avenue quejespère')
struct('nom', 'Odile', 'adresse', '9 rue pasdanslesbrancards')
struct('nom', 'Bernard', 'adresse', '6 place kezicinoirketimiparlkomsa?')]
le défi est le suivant :
Ecrire le code le plus compact(*) possible pour trouver, dans le carnet, l'adresse d'une personne dont on connait le nom.

------------------------------------------------------
(*) un code est compact quand il a :
  • moins de boucles (for-end, while-end, ...)
  • moins de lignes de code
  • moins d'affectations (signe =)
  • moins de variables déclarées


Pas besoin de hiérarchiser ces critères car toute amélioration de l'un impacte les autres.
  Discussion forum
4 commentaires
  • duf42
    Expert confirmé
    Bonjour,

    Code :
    1
    2
    3
    nom_recherche = Odile;
    mon_carnet(strcmp({mon_carnet.nom}, nom_recherche)).adresse
    Duf
  • le fab
    Modérateur
    ça marche, mais ça devrait plutôt être :
    Code :
    mon_carnet(strcmp(nom_recherche,{mon_carnet.nom})).adresse
    d'après la doc

    je sais plus pourquoi mais ca m'est arrivé de me faire jeter en mettant le cellarray en premier sur strcmp
  • oodbae_adriano
    Membre régulier
    Bonjour,

    voici ma petite fonction. J'y compare le code proposé par dut et le mien (le deuxième)
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    function defi02(nom);
    mon_carnet = [struct('nom', 'Alain', 'adresse', '2 rue des carmélites');
    struct('nom', 'Cécile', 'adresse', '7 avenue quejespère');
    struct('nom', 'Odile', 'adresse', '9 rue pasdanslesbrancards');
    struct('nom', 'Bernard', 'adresse', '6 place kezicinoirketimiparlkomsa?');
    struct('nom', 'fabien', 'adresse', '4 place henridunod');
    struct('nom', 'gerard', 'adresse', '6 avenue lenine');
    struct('nom', 'sandrine', 'adresse', '6 place mentfinancier');
    struct('nom', 'aila', 'adresse', '6 rue édanslesbrancards')];
    
    
    if ~isempty(nom)
    nom_recherche=nom;
    end
    tic
    locAddress=mon_carnet(strcmp(nom_recherche,{mon_carnet.nom})).adresse;
    firstTry=toc
    tic
    index=strcmp(nom_recherche,{mon_carnet(:).nom});
    locAddress=mon_carnet(find(index)).adresse;
    secTry=toc
    
    disp(locAddress);
    end

    quand le nom recherché est au début de l'annuaire, la fonction de dut est plus rapide, mais plus le nom est loin dans l'annuaire, plus rapide est la mienne.


    defi02('Cécile')
    firstTry =
    4.3413e-004
    secTry =
    4.8721e-004
    7 avenue quejespère
    >> defi02('Cécile')
    firstTry =
    2.2489e-004
    secTry =
    2.7713e-004
    7 avenue quejespère
    >> defi02('fabien')
    firstTry =
    2.4025e-005
    secTry =
    2.3746e-005
    4 place henridunod
    >> defi02('aila')
    firstTry =
    2.4305e-005
    secTry =
    2.3467e-005
    6 rue édanslesbrancards
    >> defi02('Alain')
    firstTry =
    2.3187e-005
    secTry =
    2.3746e-005
    2 rue des carmélites

    on pourrait rajouter du code pour vérifier que le nom recherché est présent dans l'annuaire pour éviter les erreurs, mais comme la concurrence ne l'a pas joint, j'ai voulu surcharger le code.

    A bientôt
  • tug83
    Expert confirmé
    En utilsant les containers:

    Code :
    1
    2
    3
    [keySet{1:length(mon_carnet ),1}] = deal(mon_carnet.nom);
    [valueSet{1:length(mon_carnet ),1}] = deal(mon_carnet.adresse);
    mapObj = containers.Map(keySet,valueSet)
    Pour connaitre l'adresse d'Odile:

    Code :
    mapObj('Odile')