Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1523 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Auteur Sujet :

concours de code

n°476056
*syl*
--> []
Posté le 02-08-2003 à 23:56:50  profilanswer
 

Reprise du message précédent :

burgergold a écrit :

alors maitre taz, jvois bien que ton code est clair et quand meme très simple
 
tu peux m'expliquer l'utilisation du qsort, comment ca fonctionne et pk c'est plus rapide comme tri que le tri à bulle (voir meme me le montrer en mathématique)

[:google]  
http://www.cs.princeton.edu/~ah/al [...] kSort.html

mood
Publicité
Posté le 02-08-2003 à 23:56:50  profilanswer
 

n°476058
burgergold
5$? va chez l'diable!
Posté le 03-08-2003 à 00:01:25  profilanswer
 

et le qsort on trouve des équivalents en perl et en php? ca pourrait m'etre plutot utile au boulot


---------------
http://www.boincstats.com/signature/user_664861.gif
n°476059
Taz
bisounours-codeur
Posté le 03-08-2003 à 00:02:07  profilanswer
 

tu peux dire à ton pote d'arrêter de tenter d'ecrire des tris... ça fait des siècles que ça a été fait. Utiliser qsort est de loin la meilleur des solutions tant en termes de performances qu'en temps de développement. ton pote est carrément hors du coup.
 
c'est OK pour le qsort burger?

n°476061
Taz
bisounours-codeur
Posté le 03-08-2003 à 00:05:51  profilanswer
 

burgergold a écrit :

et le qsort on trouve des équivalents en perl et en php? ca pourrait m'etre plutot utile au boulot

aucune idée. vu les connaissances que j'ai du php, il doit être sous le nom de qsort. en perl, chez po. la règle à suivre, c'est: utiliser toujours le tri que vous propose la bibliothèque standard de votre application, sauf si c'est dans un but didactique ou qu'il y a une contrainte (mémoire: certains tris sont plus economes que d'autres, données: certaines données sont plus faciles à trier que d'autres (algo trieuse par exemple), et processeur: une implémentation multi-threadée (j'avais fait, avec un mélange de tri fusion et de qsort par exemple))
 
voilà

n°476062
burgergold
5$? va chez l'diable!
Posté le 03-08-2003 à 00:06:20  profilanswer
 

Taz a écrit :

tu peux dire à ton pote d'arrêter de tenter d'ecrire des tris... ça fait des siècles que ça a été fait. Utiliser qsort est de loin la meilleur des solutions tant en termes de performances qu'en temps de développement. ton pote est carrément hors du coup.
 
c'est OK pour le qsort burger?


 
mouep, jme rends compte que j'me l'étais deja fait expliquer par un pote au travail qui termine son génie info
 
jsavais juste pas que ca se nommait qsort :D
 
en php finalement jai trouvé quelques fonctions de sort, mais de savoir pour perl ca pourrait bien m'aider si jamais vous connaissez
 
en gros, pk réinventer la roue :D


---------------
http://www.boincstats.com/signature/user_664861.gif
n°476063
Taz
bisounours-codeur
Posté le 03-08-2003 à 00:08:59  profilanswer
 

en C la généricité passe par du void*.
voir aussi bsearch

n°476065
*syl*
--> []
Posté le 03-08-2003 à 00:09:54  profilanswer
 

burgergold a écrit :


mais de savoir pour perl ca pourrait bien m'aider si jamais vous connaissez

Va lire ça :  
http://articles.mongueurs.net/trad [...] osler.html

n°476236
*syl*
--> []
Posté le 03-08-2003 à 15:40:25  profilanswer
 

Test #2 (anagrammes)
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define SIZE_BUF 100
  4. int main(int argc, char *argv[])
  5. {
  6.     if(argc == 3){
  7.         FILE *fIn = fopen(argv[1], "r" ) ;
  8.         if(fIn){
  9.             char buf[SIZE_BUF],
  10.                  buf2[SIZE_BUF] ;
  11.             int len,
  12.                 good,
  13.                 i,
  14.                 j ;
  15.             while(!feof(fIn)){
  16.                 if(fgets(buf, SIZE_BUF, fIn)){
  17.                     if(ferror(fIn)){
  18.                         printf("Erreur de lecture !\n" ) ;
  19.                         break ;
  20.                     }else{
  21.                         // On vire 0xA & 0xD s'ils sont dans le buffer
  22.                         len = strlen(buf) ;
  23.                         if(len){
  24.                             for(i = len - 1; i > 0; --i){
  25.                                 if(buf[i] == 0xA || buf[i] == 0xD) buf[i] = 0 ;
  26.                                 else break ;
  27.                             }
  28.                         }
  29.                         // strlen + memcpy en 1 fois
  30.                         for(len = 0; (buf2[len] = buf[len]); ++len) ;
  31.                        
  32.                         // On vérifie si le buffer peut-être un anagramme
  33.                         if(len == strlen(argv[2])){
  34.                             good = 0 ;
  35.                             for(i = 0; i < len; ++i){
  36.                                 for(j = 0; j < len; ++j){
  37.                                     if(argv[2][i] == buf[j]){
  38.                                         ++good ;
  39.                                         buf[j] = 0 ;
  40.                                         break ;
  41.                                     }
  42.                                 }
  43.                             }
  44.                             if(good == len) printf("%s\n", buf2) ;
  45.                         }
  46.                     }
  47.                 }
  48.             }
  49.             fclose(fIn) ;
  50.         }else{
  51.             printf("Erreur à l'ouverture du fichier %s !\n", argv[1]) ;
  52.         }
  53.     }else{
  54.         printf("Manque le dico en param et le mot à chercher..\n" ) ;
  55.     }
  56. }
Citation :

C:\Concours C HFR\2>Concours2 french ecran
ancre
caner
cerna
encra
nacre
rance

n°476237
Taz
bisounours-codeur
Posté le 03-08-2003 à 15:44:40  profilanswer
 

ignoble, bogué, nombre magique, non-portable, réinvention de la roue...
 
edit: et surtout illisible
 
edit2: deux ans de travail pour rien, et on me sort encore des feof... je désespère
 
edit3: on va dire que pour la version C du programme, il n'y a pas d'interactivité, c'est à dire que le mot rechercher est passé en ligne de commande
 
edit4: pour gagner du temps avec des conneries, on pourrait considérer les fonctions getline et strdup comme connues (pas standards, mais faciles à implémenter) non?


Message édité par Taz le 03-08-2003 à 15:59:08
n°476243
red factio​n
Posté le 03-08-2003 à 16:03:11  profilanswer
 

Taz a écrit :

ignoble, bogué, nombre magique, non-portable, réinvention de la roue...
 
edit: et surtout illisible
 
edit2: deux ans de travail pour rien, et on me sort encore des feof... je désespère
 
edit3: on va dire que pour la version C du programme, il n'y a pas d'interactivité, c'est à dire que le mot rechercher est passé en ligne de commande
 
edit4: pour gagner du temps avec des conneries, on pourrait considérer les fonctions getline et strdup comme connues (pas standards, mais faciles à implémenter) non?


 
 
pour le feof tu le remplace comment ?????
 

Code :
  1. #define EOF ??????
  2. while(fgetc()!= EOF){
  3. ...
  4. }


 
edit : petite mise a jour  :D


Message édité par red faction le 03-08-2003 à 16:05:02
mood
Publicité
Posté le 03-08-2003 à 16:03:11  profilanswer
 

n°476244
*syl*
--&gt; []
Posté le 03-08-2003 à 16:04:00  profilanswer
 

red faction a écrit :


 
 
pour le feof tu le remplace comment ?????
 

Code :
  1. #define EOF ??????
  2. while(fgetc!= EOF){
  3. ...
  4. }



http://forum.hardware.fr/forum2.ph [...] h=&subcat=

n°476248
*syl*
--&gt; []
Posté le 03-08-2003 à 16:13:27  profilanswer
 

Citation :

nombre magique

Tu parles du 0xD & 0xA :??:  
 

Citation :

réinvention de la roue

Et encore j'ai été gentil, j'ai pas réinventer le strlen(), je l'avais fais au départ mais comme je l'utilisais 2x j'ai qd même décidé d'inclure <string.h> :D
 

Citation :

edit: et surtout illisible


Wé bof, ça va encore mais c'est vrai que j'aurais pu le découper en p'tites parties :D
 

Citation :

edit2: deux ans de travail pour rien, et on me sort encore des feof... je désespère

Sur le coup j'y ai pensé mais j'me suis dis "d'la merde, j'ai pas envie de le faire caractère par caractère"..
 

Citation :

edit4: pour gagner du temps avec des conneries, on pourrait considérer les fonctions getline et strdup comme connues (pas standards, mais faciles à implémenter) non?

On en reviens au edit #2..


Message édité par *syl* le 03-08-2003 à 16:14:03
n°476249
Taz
bisounours-codeur
Posté le 03-08-2003 à 16:14:35  profilanswer
 

bon, en supposant getline et strdup connues... (on les a déjà ecrites dans de nombreux topics, moi j'en profite, mon système le les propose)
 
bon évidemment, on fait du C, le traitement d'erreur faut en faire, mais y a un moment ça soule (comme plus de mémoire par exemple...)
 

Code :
  1. // et pi finalement, je rends pas copie maintenant

n°476252
Taz
bisounours-codeur
Posté le 03-08-2003 à 16:16:38  profilanswer
 

et j'aimerais qu'on fasse des défis différents entre les deux topics, pour clarifier les esprits et varier

n°476253
red factio​n
Posté le 03-08-2003 à 16:19:54  profilanswer
 

c une tres bonne idee ce topic on apprend pleins de trucs

n°476254
*syl*
--&gt; []
Posté le 03-08-2003 à 16:20:07  profilanswer
 

J'avais pensé à essayer de faire un triangle équilatéral en ASCII qui tournerait autour de son centre de gravité ?

n°476257
Taz
bisounours-codeur
Posté le 03-08-2003 à 16:21:35  profilanswer
 

*Syl* a écrit :

J'avais pensé à essayer de faire un triangle équilatéral en ASCII qui tournerait autour de son centre de gravité ?

c'est pas possible en standard...

n°476259
*syl*
--&gt; []
Posté le 03-08-2003 à 16:22:21  profilanswer
 

Taz a écrit :

c'est pas possible en standard...

Et pkoi ? Pour l'effacement de l'écran ?

n°476262
Taz
bisounours-codeur
Posté le 03-08-2003 à 16:23:45  profilanswer
 

*Syl* a écrit :

Et pkoi ? Pour l'effacement de l'écran ?

entre autres

n°476263
*syl*
--&gt; []
Posté le 03-08-2003 à 16:23:56  profilanswer
 

On déroge à la règle, c'est pas très grave.. Et tu pensais à quoi d'autre ?

n°476264
red factio​n
Posté le 03-08-2003 à 16:24:57  profilanswer
 

Taz a écrit :

c'est pas possible en standard...


 
heu a coup de putch pour chanque ligne puis tu balance un certain nombre de retours a la ligne pour effacer...
 
bon bien sur se sera moins performant que de balancer un buffer dun coup mais bon...

n°476265
Taz
bisounours-codeur
Posté le 03-08-2003 à 16:25:12  profilanswer
 

bon je vous donne ma solution avec utilisation de getline et strdup (j'en ai déjà parler)
 
C99 pour un peu plus de lisibilité. (pour la peine, la version C est plus lente que la version C++ il me semble)
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. inline int charcmp(const void *a, const void *b)
  5. {
  6.   return *(char*)a - *(char*)b;
  7. }
  8. int main(int argc, char *argv[])
  9. {
  10.   if(argc!=3)
  11.     {
  12.       fprintf(stderr, "Usage : %s dictionnaire mot\n", argv[0]);
  13.       return EXIT_FAILURE;
  14.     }
  15.   FILE *f=fopen(argv[1], "r" );
  16.   if(f==NULL)
  17.     {
  18.       perror("fopen" );
  19.       return EXIT_FAILURE;
  20.     }
  21.   char *word= strdup(argv[2]);
  22.   qsort(word, strlen(word), 1, charcmp);
  23.   printf("%s [%s] : ", argv[2], word);
  24.  
  25.   char *str=NULL;
  26.   size_t len=0;
  27.   while(getline(&str, &len, f)!=-1)
  28.     {     
  29.       *strrchr(str, '\n')='\0';
  30.       char *sstr= strdup(str);
  31.      
  32.       qsort(sstr, strlen(sstr), 1, charcmp);
  33.      
  34.       if(strcmp(sstr, word)==0)
  35. {
  36.   printf("%s, ", str);
  37. }
  38.       free(sstr);
  39.     }
  40.   putchar('\n');
  41.   fclose(f);
  42.   free(str);
  43.   free(word);
  44. }

n°476266
*syl*
--&gt; []
Posté le 03-08-2003 à 16:25:44  profilanswer
 

red faction a écrit :


 
heu a coup de putch pour chanque ligne puis tu balance un certain nombre de retours a la ligne pour effacer...
 
bon bien sur se sera moins performant que de balancer un buffer dun coup mais bon...

Et combien de retours à la ligne tu envoies ? T'en sais rien.. :p

n°476268
red factio​n
Posté le 03-08-2003 à 16:30:34  profilanswer
 

*Syl* a écrit :

Et combien de retours à la ligne tu envoies ? T'en sais rien.. :p


 
heu ou sinon on balance tout dans un fichier genre 20-30 frames ca doit pas prendre des masses puis apres on peu analyser lanim
 
 
par exemple tu ouvre sous notepad tu met la taille de la fenetre a la celle de lanim puis tu fait page down
 
 
ca reste standard comme ca...


Message édité par red faction le 03-08-2003 à 16:34:39
n°476270
Taz
bisounours-codeur
Posté le 03-08-2003 à 16:35:40  profilanswer
 

non, par ce que de toutes façons, la notion d'écran existe pas... puis je trouve pas ça interessant, et vu le code que vous m'avez montrer y a encore des progres à faire sur des trucs moins cons

n°476650
nraynaud
lol
Posté le 04-08-2003 à 06:08:11  profilanswer
 

Taz a écrit :


Code :
  1. inline int charcmp(const void *a, const void *b)
  2. {...}
  3. int main(int argc, char *argv[])
  4. {
  5. ...
  6.   qsort(word, strlen(word), 1, charcmp);
  7. ....     
  8.       qsort(sstr, strlen(sstr), 1, charcmp);
  9. ...
  10. }



Puis-je émettre un léger doute sur la sémantique de ça (bien qu'à tous les coups le compilo fera les choses bien) ?
Il existe encore ce mot-clef inutile ?

n°476651
Taz
bisounours-codeur
Posté le 04-08-2003 à 06:37:54  profilanswer
 

:heink: je suis d'accord qu'ici il ne sert à rien puis que l'appel de fonction est réalisé par indirection: je veux parler du inline. c'est quoi ton problème?

n°476667
nraynaud
lol
Posté le 04-08-2003 à 08:35:53  profilanswer
 

Taz a écrit :

:heink: je suis d'accord qu'ici il ne sert à rien puis que l'appel de fonction est réalisé par indirection: je veux parler du inline. c'est quoi ton problème?

rien, juste que je crois que ce mot-clef n'a rien à faire dans ce langage. Quand-bien même il aurait une quelconque utilité, il en a sûrement pas dans ce programme.

n°477413
Taz
bisounours-codeur
Posté le 04-08-2003 à 19:41:59  profilanswer
 

nraynaud a écrit :

rien, juste que je crois que ce mot-clef n'a rien à faire dans ce langage. Quand-bien même il aurait une quelconque utilité, il en a sûrement pas dans ce programme.

je vois pas le problème de ce mot-clef au langage. ici il n'est pas nécessaire, c'est entendu. maintenant ose me dire que les macros c'est bien mieux...

n°477415
kadreg
profil: Utilisateur
Posté le 04-08-2003 à 19:44:00  profilanswer
 

Taz a écrit :

je vois pas le problème de ce mot-clef au langage. ici il n'est pas nécessaire, c'est entendu. maintenant ose me dire que les macros c'est bien mieux...


 
Ce que veux dire nicolas, c'est que l'inlining est une notion d'optimisation de code, et que c'est quelque chose qui doit être réalisé par le compilateur, ce n'est pas à l'auteur de programme de s'occuper de ce genre de chose.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°477422
Taz
bisounours-codeur
Posté le 04-08-2003 à 19:49:16  profilanswer
 

kadreg a écrit :


 
Ce que veux dire nicolas, c'est que l'inlining est une notion d'optimisation de code, et que c'est quelque chose qui doit être réalisé par le compilateur, ce n'est pas à l'auteur de programme de s'occuper de ce genre de chose.

et depuis quand la philosophie du C c'est le "compilo le fera lui-même" ?
moi je trouve que ça permet un bon contrôle de ce genre d'optimisation. note que le mot clef inline exprime un désir et non une obligation (se référer à la doc de son compilateur pour vérifier ce qui est inliner). et il y a de nombreuses fois ou tu souhaite inliner un certain code, code que ton compilo n'aurait jamais élu.
la vérité c'est que ça a été introduit pour parrer aux dingues des macros, t'en sais quelque chose kadreg

n°477493
nraynaud
lol
Posté le 04-08-2003 à 21:01:28  profilanswer
 

Taz a écrit :

1)et depuis quand la philosophie du C c'est le "compilo le fera lui-même" ?
 
2) et il y a de nombreuses fois ou tu souhaite inliner un certain code, code que ton compilo n'aurait jamais élu.


1) depuis que les compilos sont un bordel sans nom qui font de la réecriture dans tout les sens et qu'il est impossible de prévoir ce qu'il va faire tellement les critères et les re`gles sont nombreuses (et les détails à la con, cf. les règle de preuves au niveau de l'aliasing). Dans ce contexte, on écrit un code aussi simple et prévisible que possible et on laisse le compilo faire.
 
2) s'il n'a pas élu le code, il y a une raison, qui peut parfois être super-tordue, et il ne le fera pas plus avec le mot-clef.
 
Le seul point où je vois une raison d'aider le compilo à inliner est un cas assez space de récursion mutuelle (donc déjà on est loin du C là). Sauf qu'il n'existe pas de critère formel donc un humain ne fera pas mieux que le compilo (qui choisi au hazard).
 
À mon avis, il vaut mieux pas penser qu'on peut prévoir l'optimiseur, mais regarder ce qu'il a fait et utiliser les optimisations sur profil autant que possible.


---------------
trainoo.com, c'est fini
n°477504
Taz
bisounours-codeur
Posté le 04-08-2003 à 21:12:55  profilanswer
 

fo voir... je suis d'accord que quand il s'agit d'optimiser par inlining des appels de la même unité de traduction, le compilateur fait aussi bien le boulot que le inline. le problème, c'est quand c'est quand tu as plusieurs unités de traduction, là ça devient beaucoup moins vrai. la solution c'est donc de fournir le code à chaque unité: le mot clef inline le permet

n°477524
nraynaud
lol
Posté le 04-08-2003 à 21:26:16  profilanswer
 

Taz a écrit :

le problème, c'est quand c'est quand tu as plusieurs unités de traduction

Je ne sais pas pour gcc, mais intel C++ fourni un flag pour ça (inter-file optimisation) qui compile les  .o en code intermédiaire (en RTL et non en code cible) et compile tout le bordel en une seule fois (au moment du link, en réalité il rappelle le compilo). Si tu a mis les infos de profil avec, tu gagnes le cocotier en général.


---------------
trainoo.com, c'est fini
n°477525
Taz
bisounours-codeur
Posté le 04-08-2003 à 21:27:24  profilanswer
 

nraynaud a écrit :

Je ne sais pas pour gcc, mais intel C++ fourni un flag pour ça (inter-file optimisation) qui compile les  .o en code intermédiaire (en RTL et non en code cible) et compile tout le bordel en une seule fois (au moment du link, en réalité il rappelle le compilo). Si tu a mis les infos de profil avec, tu gagnes le cocotier en général.

CQFD. inline est la seule manière portable d'indiquer ce genre de chose à son compilateur
edit: et ce genre de technique n'est pas compatible avec des outils traditionnels comme make il me semble


Message édité par Taz le 04-08-2003 à 21:36:56
n°477531
nraynaud
lol
Posté le 04-08-2003 à 21:37:06  profilanswer
 

Taz a écrit :

CQFD. inline est la seule manière portable d'indiquer ce genre de chose à son compilateur

J'ai pas compris ce que ça démontrait.


---------------
trainoo.com, c'est fini
n°477534
Taz
bisounours-codeur
Posté le 04-08-2003 à 21:39:17  profilanswer
 

nraynaud a écrit :

J'ai pas compris ce que ça démontrait.

ben que si tu veux avoir ce genre de contrôle sur ton code de manière portable, il te faut passer par le mécanisme de inline

n°477542
nraynaud
lol
Posté le 04-08-2003 à 21:43:07  profilanswer
 

Taz a écrit :

ben que si tu veux avoir ce genre de contrôle sur ton code de manière portable, il te faut passer par le mécanisme de inline

"portable" ça veut dire passer les .o d'un compilateur à l'autre ? T'as pas plus mauvaise fois comme idée ?
D'autre part, je me demande comment sont exportées ses fonction déclarée "inline" dans les .o mais je supçonne qu'elle sont inlinées le vent en dehors de leur unité d'origine.


---------------
trainoo.com, c'est fini
n°477544
kadreg
profil: Utilisateur
Posté le 04-08-2003 à 21:44:43  profilanswer
 

nraynaud a écrit :


D'autre part, je me demande comment sont exportées ses fonction déclarée "inline" dans les .o


 
Elle le sont pas, pour qu'une fonction inline soit inliné, il faut que son code soit dans le .h, donc on se retape sa compilation à chaque fois.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°477546
Taz
bisounours-codeur
Posté le 04-08-2003 à 21:45:19  profilanswer
 

nraynaud a écrit :

"portable" ça veut dire passer les .o d'un compilateur à l'autre ? T'as pas plus mauvaise fois comme idée ?
D'autre part, je me demande comment sont exportées ses fonction déclarée "inline" dans les .o mais je supçonne qu'elle sont inlinées le vent en dehors de leur unité d'origine.  

ben nom je parle au niveau du code  :heink:  
les fonctions déclarées inline ne sont pas exportées. le code source est forunie à chaque unité de compilation. si tu vires le inline, tu tombes sur un problème de multi-définition

n°477549
schnapsman​n
Zaford Beeblefect
Posté le 04-08-2003 à 21:46:07  profilanswer
 

nraynaud a écrit :

"portable" ça veut dire passer les .o d'un compilateur à l'autre ? T'as pas plus mauvaise fois comme idée ?
D'autre part, je me demande comment sont exportées ses fonction déclarée "inline" dans les .o mais je supçonne qu'elle sont inlinées le vent en dehors de leur unité d'origine.  


 
il me semble qu'il parlait de la différence qu'il y a entre utiliser l'opton machin du compilateur c++ lambda et d'utiliser le mot clef standard "inline"  [:calin]

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
Code perl non interprété sur apache.[C++] Concours de code : new test en cours, proposez votre solution !
un code qui marche sous ie5.5 mais pas sous ie6[VB6] Datagrid et ajout d'enregistrement via code
[HTML] Comment éviter de copier-coller du code sur chaque page ?Prob important ! Mon code ne s'exécute plus !
[C] Peut-on conscidèrer ce bout de code correct ?[ASP + VB.net] Séparer HTML et code
Recuperer le code PHP 
Plus de sujets relatifs à : concours de code


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)