Défi n°3 : le carnet d'adresse
Venez relever les défis MATLAB.

Le , 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 : Sélectionner tout
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.


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de duf42 duf42 - Expert confirmé https://www.developpez.com
le 17/06/2012 à 11:06
Bonjour,

Code : Sélectionner tout
1
2
3
nom_recherche = Odile;
mon_carnet(strcmp({mon_carnet.nom}, nom_recherche)).adresse
Duf
Avatar de le fab le fab - Modérateur https://www.developpez.com
le 18/06/2012 à 15:43
ça marche, mais ça devrait plutôt être :
Code : Sélectionner tout
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
Avatar de oodbae_adriano oodbae_adriano - Membre régulier https://www.developpez.com
le 08/01/2013 à 15:40
Bonjour,

voici ma petite fonction. J'y compare le code proposé par dut et le mien (le deuxième)
Code : Sélectionner tout
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
Avatar de tug83 tug83 - Expert confirmé https://www.developpez.com
le 22/01/2013 à 10:57
En utilsant les containers:

Code : Sélectionner tout
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 : Sélectionner tout
mapObj('Odile')
Contacter le responsable de la rubrique MATLAB