Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

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

Le , par ol9245

43PARTAGES

0  0 
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.

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de 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
0  0 
Avatar de 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
0  0 
Avatar de 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
0  0 
Avatar de 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')
0  0