+ Répondre à la discussion Actualité déjà publiée
  1. #1
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    avril 2007
    Messages
    983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : avril 2007
    Messages : 983
    Points : 1 153
    Points
    1 153
    Billets dans le blog
    1

    Par défaut [Défis][3] le carnet d'adresse

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    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.
    "True greatness is measured by how much freedom you give to others, not by how much you can coerce others to do what you want." Larry Wall.
    Matlab (R2014a), Ubuntu 14.04 64bits. <<<Je ne réponds pas aux messages privés techniques. Merci de poster les questions techniques sur les forums, comme c'est recommandé ICI>>>

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2007
    Messages : 3 111
    Points : 4 659
    Points
    4 659

    Par défaut

    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nom_recherche = Odile;
    mon_carnet(strcmp({mon_carnet.nom}, nom_recherche)).adresse
    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    1 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2005
    Messages : 1 628
    Points : 2 936
    Points
    2 936

    Par défaut

    ça marche, mais ça devrait plutôt être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre régulier
    Inscrit en
    novembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 94
    Points : 86
    Points
    86

    Par défaut reponse

    Bonjour,


    voici ma petite fonction. J'y compare le code proposé par dut et le mien (le deuxième)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    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

  5. #5
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039

    Par défaut

    En utilsant les containers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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:

    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/11/2005, 10h00
  2. Server 2003 et partage de carnet d'adresse
    Par Yepazix dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 23/10/2005, 22h47
  3. Carnet d'adresses d'Outlook
    Par vciofolo dans le forum Access
    Réponses: 2
    Dernier message: 14/10/2005, 11h34
  4. Récupérer le carnet d'adresses de Outlook
    Par pc75 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/02/2005, 12h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo