Optimisation et/ou élégance
bonjour,
y a t il une manière plus 'élégante' et/ou plus optimisé pour réaliser ce p'tit programme ; histoire de prendre de bonne habitude dès le début... ;)
Code:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
1 #include <stdio.h>
2 #define SIZEMAXTAB 10
3
4 void affiche(int t[])
5 {
6 int i = 0;
7 for (; i < SIZEMAXTAB; i++) {
8 printf("%d\t", t[i]);
9 }
10 printf("\n");
11 }
12
13 void swap(int *n1, int *n2)
14 {
15 int aux = *n1;
16 *n1 = *n2;
17 *n2 = aux;
18 }
19
20 void trie(int t[])
21 {
22 int i = 0;
23 int *pnum1;
24 int *pnum2;
25 for (; i < SIZEMAXTAB - 1; i++) {
26 pnum1 = &t[i];
27 pnum2 = &t[i + 1];
28 if (*pnum1 > *pnum2) {
29 swap(pnum1, pnum2);
30 trie(t);
31 }
32 }
33 }
34
35 int main(void)
36 {
37 int tab[SIZEMAXTAB] = { 1, 5, 3, 0, 12, -8, 200, 35, 80, 63 };
38 int *ptab;
39 ptab = tab;
40 affiche(tab);
41 trie(ptab);
42 affiche(ptab);
43 return 0;
44 } |
merci d'avance...
Re: Optimisation et/ou élégance
Pour plus d'evolutivite des fonctions, passe plutot la taille des tableaux en paramete:
Code:
1 2 3 4 5 6 7 8 9
| void affiche(int t[], unsigned int taille)
{
int i = 0;
for (; i < taille; i++) {
(...)
}
void trie(int t[], unsigned int taille)
(... correcion idem...) |
De plus, ta fonction trie() est recursive... Si ton tableau est tres grand, et peu trie au depart (style trie dans l'ordre decroissant), alors la recursion va "exploser" et la pile d'appel avec... Le tri a bulle peut se faire en iteratif, c'est pas complique, donc autant le faire, c'est plus sur et meme plus efficace (un appel de fonction fait perdre un peu de temps...).
Re: Optimisation et/ou élégance
Citation:
Envoyé par jacquesh
y a t il une manière plus 'élégante' et/ou plus optimisé pour réaliser ce p'tit programme ; histoire de prendre de bonne habitude dès le début... ;)
Question optimisation, je pense qu'un bon compilateur sera toujours meilleur que toi, par contre pour l'élégance, regarde du côté de IOCCC je trouve ça trés élégant :P sans rire ce qui compte c'est la lisibilite, voici je que j'aurai fait :
Code:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <stdio.h>
/* Parece que je la trouve sympa cette macro! */
#DEFINE SWAP(type, n1, n2) \
({ \
type aux = n1; \
n1 = n2; \
n2 = aux; \
})
#define SIZEMAXTAB 10
void affiche(int t[])
{
int i;
for (i = 0; i < SIZEMAXTAB; i++)
printf("%d\t", t[i]);
printf("\n");
}
void trie(int t[])
{
int i;
for (i = 0; i < SIZEMAXTAB - 1; i++)
{
if (t[i] > t[i+1])
{
SWAP(int, t[i], t[i+1]);
trie(t);
}
}
}
int main(void)
{
int tab[SIZEMAXTAB] = { 1, 5, 3, 0, 12, -8, 200, 35, 80, 63 };
affiche(tab);
trie(tab);
affiche(tab);
return 0;
} |
Voilà ;)
Re: Optimisation et/ou élégance
Citation:
Envoyé par jacquesh
y a t il une manière plus 'élégante' et/ou plus optimisé pour réaliser ce p'tit programme ; histoire de prendre de bonne habitude dès le début... ;)
- Ce code ne compile pas (Le C, c'est pas le BASIC, il n'y a pas de numéros de lignes...)
- Eviter les tailles de tableaux inutiles pouvant être déterminées automatiquement. Passer les tailles aux fonctions qui en ont besoin. Utiliser l'opérateur sizeof qui est fait pour ça.
- Eviter les affichages avec tabulation. L'effet n'est pas portable. Utiliser le formatage (ici, "%5d" suffit)
- Le bubble-sort n'est pas performant. Le langage C fourni qsort() qui est généralement suffisant pour les application courantes. Si on cherche les perfs, utiliser un véritable quick-sort.
Code:
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 26 27 28 29 30 31 32 33 34 35
|
#include <stdio.h>
#include <stdlib.h>
#define NELEM(a) (sizeof(a)/sizeof *(a))
static void affiche (int t[], int size)
{
int i;
for (i = 0; i < size; i++)
{
printf ("%5d", t[i]);
}
printf ("\n");
}
static int compare (void const *p1, void const *p2)
{
int const *n1 = p1;
int const *n2 = p2;
return *n1 - *n2;
}
int main (void)
{
int tab[] =
{1, 5, 3, 0, 12, -8, 200, 35, 80, 63};
affiche (tab, NELEM (tab));
qsort (tab, NELEM (tab), sizeof *tab, compare);
affiche (tab, NELEM (tab));
return 0;
} |
Code:
1 2 3
|
1 5 3 0 12 -8 200 35 80 63
-8 0 1 3 5 12 35 63 80 200 |
Et pour tout le monde, ne pas confondre 'élégance' et 'présentation'...
Re: Optimisation et/ou élégance
Citation:
Envoyé par alveric
De plus, ta fonction trie() est recursive... Si ton tableau est tres grand, et peu trie au depart (style trie dans l'ordre decroissant), alors la recursion va "exploser" et la pile d'appel avec...
Non la taille du tableau n'a rien à voir puisque c'est toujours un pointeur sur celui ci qui est passé. Par contre la pile peu exploser si le nombre d'appel à la fonction est importante, donc si le tableau est particulièrement mal rangé (une simple inversion de deux valeurs peu suffirn tout dépend de l'algo de trie).
Re: Optimisation et/ou élégance
Citation:
Envoyé par gege2061
Citation:
Envoyé par alveric
De plus, ta fonction trie() est recursive... Si ton tableau est tres grand, et peu trie au depart (style trie dans l'ordre decroissant), alors la recursion va "exploser" et la pile d'appel avec...
Non la taille du tableau n'a rien à voir puisque c'est toujours un pointeur sur celui ci qui est passé.
Merci de ne pas essayer de me contredire en me faisant dire ce que je n'ai pas dit. Je sais tres bien que seul le pointeur vers le debut du tableau sera copie; mais la pile ne peut "exploser" qu'au bout d'un grand nombre de recursions, donc il faut un tableau "un peu grand" pour y arriver. C'est vrai que je n'ai pas trop reflechi au cas le plus defavorable pour son implementation, mais un tableau "un peu mal range" de 10 cases ne devrait pas tout faire peter (quoique... nan, je retire. Mais ca depend de l'algo et de son implementation).
Citation:
Envoyé par Dazumba
Pour l'elegance, je n'aime pas du tout tes boucles for avec l'initialisation deportee sur la ligne du dessus. C'est inutile et destabilisant.
Ce sont les mots que je cherchais !
Pour ce qui est du choix du meilleur algo de tri, quicksort est evidemment a preferer, mais j'avais laisse la question de cote, pensant que jaquesh avait eu (aurait du avoir) un cours/bouquin sur les tris qui lui aurait explique tout ca...
Pour ce qui est des remarques sur la tabulation/les espaces, je suis d'accord; ce qui est de mettre les indentations a 3/4/8/2 espaces, la c'est le choix de chacun. Un outil comme indent est tout a fait conseille pour corriger les erreurs de style qu'on aurait laisse passer.
Citation:
Envoyé par Dazumba
Pour une bonne portabilite, la valeur de retour est EXIT_SUCCESS (definit dans stdlib.h)
D'apres ce que m'a fait remarquer Emmanuel il n'y a pas si longtemps dans ces memes colonnes, EXIT_SUCCESS faut toujorus zero, donc c'est une question de lisibilite et non de portabilite que de l'utiliser.
Re: Optimisation et/ou élégance
Citation:
Envoyé par alveric
Citation:
Envoyé par Dazumba
Pour une bonne portabilite, la valeur de retour est EXIT_SUCCESS (definit dans stdlib.h)
D'apres ce que m'a fait remarquer Emmanuel il n'y a pas si longtemps dans ces memes colonnes, EXIT_SUCCESS faut toujorus zero, donc c'est une question de lisibilite et non de portabilite que de l'utiliser.
Je n'ai pas dit ça.
Les valeurs portables retournées par main() ou passées à exit() sont
- 0
- EXIT_SUCCESS
- EXIT_FAILURE
La sémantique de 0 et de EXIT_SUCCESS est la même (OK). Ca ne signifie nullement que EXIT_SUCCESS vaut 0.
Re: Optimisation et/ou élégance
Citation:
Envoyé par alveric
Un outil comme indent est tout a fait conseille pour corriger les erreurs de style qu'on aurait laisse passer.
avant de poster ce code j'avais fair un
Code:
indent -kr monfichier.c
Re: Optimisation et/ou élégance
Citation:
Envoyé par Emmanuel Delahaye
Je n'ai pas dit ça.
Les valeurs portables retournées par main() ou passées à exit() sont
- 0
- EXIT_SUCCESS
- EXIT_FAILURE
La sémantique de 0 et de EXIT_SUCCESS est la même (OK).
Ca ne signifie nullement que EXIT_SUCCESS vaut 0.
J'arrete pas, ces derniers jours... Ce qui m'a eu, c'est que
Citation:
Envoyé par POSIX.1
The <stdlib.h> header shall define the following macros:
EXIT_FAILURE
Unsuccessful termination for exit(); evaluates to a non-zero value.
EXIT_SUCCESS
Successful termination for exit(); evaluates to 0.
Mais c'est une extension, evidemment...
Re: Optimisation et/ou élégance
Citation:
Envoyé par jacquesh
Citation:
Envoyé par alveric
Un outil comme indent est tout a fait conseille pour corriger les erreurs de style qu'on aurait laisse passer.
avant de poster ce code j'avais fair un
Code:
indent -kr monfichier.c
Horrible.
http://emmanuel-delahaye.developpez....tm#indentation