Partage
  • Partager sur Facebook
  • Partager sur Twitter

zWc

    4 avril 2010 à 22:51:55

    Plutôt sympa IATGOFF, 2
    une chose m'interpelle!

    #define OPENFAIL "Cannot open the specified file"
    

    Pourquoi un define?

    sinon, tu as évité beaucoup de mes maladresses!...
    Franchement, j'aime bien!
    • Partager sur Facebook
    • Partager sur Twitter
    Zeste de Savoir, le site qui en a dans le citron !
      4 avril 2010 à 22:59:57

      Mouais, perso j'accroche pas la norme EPITECH. :D

      Cette ligne ne sert à rien memset(val, 0, sizeof val); autant initialiser ton tableau direct ça t'évite un memset.
      Un else suffit ici, non ? :)else if (!(*flags & INWORD))
      • Partager sur Facebook
      • Partager sur Twitter
        4 avril 2010 à 23:05:59

        Citation : GurneyH

        IATGOFF, 2


        J'aime.

        Citation : GurneyH

        Pourquoi un define?


        Boarf, j'ai l'habitude d'éviter les trucs en dur dans le code. Quand je code j'écris directement puts(OPENFAIL) et je m'occupe de définir le truc qu'à la fin si je m'en souviens ou si le compilo me le demande.

        Citation : Pouet_forever

        Cette ligne ne sert à rien memset(val, 0, sizeof val); autant initialiser ton tableau direct ça t'évite un memset.


        Norme Epitech.

        Citation : Pouet_forever

        Un else suffit ici, non ? :)else if (!(*flags & INWORD))


        Non, sinon tu comptes un mot pour chaque caractère du mot. Le flag sert à savoir si on est dans un mot ou pas.
        • Partager sur Facebook
        • Partager sur Twitter
          4 avril 2010 à 23:15:16

          Citation : GurneyH


          IATGOFF, 2


          Pourtant j'avais fait un effort, je ne sais pas pourquoi il y a un 2 qui se balade! :-°
          le prochain coup c'est bon! :p
          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !
            4 avril 2010 à 23:47:38

            Citation : Adroneus

            Apres j'ai fais le test, pour un fichier de 2 Go


            En fait, c'est surtout problématique avec stdin de ne pas tout faire à mesure.
            • Partager sur Facebook
            • Partager sur Twitter
              4 avril 2010 à 23:50:01

              Citation

              En fait, c'est surtout problématique avec stdin de ne pas tout faire à mesure.

              Pardonne moi Marc mais je n'ai pas tout a fait compris ce que tu as dit
              • Partager sur Facebook
              • Partager sur Twitter
                5 avril 2010 à 0:17:26

                Citation : Adroneus

                Citation

                En fait, c'est surtout problématique avec stdin de ne pas tout faire à mesure.

                Pardonne moi Marc mais je n'ai pas tout a fait compris ce que tu as dit


                Si j'ai bien compris ce que tu as écrit à propos de ton code, il parcourait 3 fois tout le fichier. Si c'est bien cela, alors tant que les données sont dans un fichier, ça va (lentement). Mais si les données viennent de stdin?
                • Partager sur Facebook
                • Partager sur Twitter
                  5 avril 2010 à 0:19:12

                  Je suis étonné que personne n'ai rien dit pour le realloc de +1 à chaque fois. :lol:
                  Moi je l'ai pombé. :pirate:
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 avril 2010 à 0:21:45

                    Completement, ila ete mechant :'( nan mais de toute facon, quand je dis refaire le code, c'est TOUT refaire... :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 avril 2010 à 0:59:58

                      Citation : Pouet_forever

                      Je suis étonné que personne n'ai rien dit pour le realloc de +1 à chaque fois. :lol:


                      Citation : IATGOF

                      y'a pas grand chose à dire, mis à part le fait de parcourir trois fois le fichier et de récupérer une chaine de caractère en réallouant à chaque tour.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 avril 2010 à 12:03:32

                        @IATGOF : c'est bien dans l'ensemble, juste la norme EPITECH que j'aime pas trop mais bon.
                        Par contre on peut faire beaucoup plus court tout en étant aussi performant. (Pour analyser ton code source mon programme et le tient mettent entre 0.001 et 0.002 ms avec et sans les optimisations (-O2))

                        $ time ./lithrein12 iatgof.c
                                90 ligne(s)     184 mot(s)      1382 caractere(s)
                        
                        real    0m0.001s
                        user    0m0.000s
                        sys     0m0.000s
                        
                        $ time ./iatgof iatgof.c
                                90      184     1382
                        
                        real    0m0.002s
                        user    0m0.000s
                        sys     0m0.000s
                        
                        $ time ./iatgof lithrein12.c
                                47      131     889
                        
                        real    0m0.001s
                        user    0m0.000s
                        sys     0m0.000s
                        
                        $ time ./lithrein12 lithrein12.c
                                47 ligne(s)     131 mot(s)      889 caractere(s)
                        
                        real    0m0.001s
                        user    0m0.000s
                        sys     0m0.000s


                        Les deux programmes ont été compilés avec les options suivantes :
                        $ gcc -std=c89 -pedantic -Werror -W -Wall -O2



                        Une remarque :
                        $ ./iatgof
                        usage: ./zwc file


                        Citation : Enoncé I)2.

                        Si aucun fichier n'est passé en argument vous récupérerez le texte sur l'entrée standard comme pour la première question.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 avril 2010 à 12:53:43

                          Citation : Lithrein

                          juste la norme EPITECH que j'aime pas trop mais bon.


                          Ouais bon, un petit coup d'indentation automatique et c'est réglé, non?

                          Citation : Lithrein

                          Par contre on peut faire beaucoup plus court tout en étant aussi performant.


                          J'ai précisé que c'était une implémentation rapide, je l'ai codé comme ça venait sans me prendre la tête.
                          Mais si je doit faire la même chose en 47 lignes alors je relève le défi :p
                          edit:
                          #include <stdio.h>
                          #include <ctype.h>
                          
                          void proceed(FILE *f, unsigned int *v)
                          {
                            char buf[1024];
                            int i, iw;
                          
                            while ((fgets(buf, 1024, f)))
                              {
                                iw = 0;
                                for (i = 0; buf[i]; i++)
                          	{
                          	  v[2]++;
                          	  if (buf[i] == '\n')
                          	    v[0]++;
                          	  if (isspace((unsigned char)buf[i]))
                          	    iw = 0;
                          	  else if (!iw)
                          	    v[1]++, iw = 1;
                          	}
                              }
                          }
                          
                          int main(int ac, char **av)
                          {
                            unsigned int val[3] = {0};
                            FILE *f;
                          
                            if (ac < 2)
                              {
                                proceed(stdin, val);
                                return printf("\t%u\t%u\t%u\n", val[0], val[1], val[2]) & 0;
                              }
                            if (!(f = fopen(av[1], "r")))
                              return printf("Cannot open %s\n", av[1]) & 0;
                            proceed(f, val);
                            fclose(f);
                            return printf("\t%u\t%u\t%u\n", val[0], val[1], val[2]) & 0;
                          }
                          

                          Citation : Lithrein

                          $ ./iatgof
                          usage: ./zwc file

                          Oui bon :-° J'avais la flemme.
                          #define USAGE "%s file\n"
                          printf(USAGE, av[0]);
                          

                          Citation : Lithrein

                          Si aucun fichier n'est passé en argument vous récupérerez le texte sur l'entrée standard comme pour la première question.


                          Ok, ok. Remplacer le puts(USAGE); par un proceed(f, val), disp(val); . Et faire le memset avant aussi.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 avril 2010 à 14:02:10

                            Vu que tu aime les défis, relèveras-tu celui-ci (si tu veux le code MP car, je n'ai pas le droit de participer puisque je suis l'organisateur) :
                            $ ./shortlithrein12 shortlithrein12.c
                                    27      119     691


                            J'adore tes return, mais je les aurais plus vus comme ça (au cas où printf plante) :
                            return printf(%s, "whatever you want") ^ 1;
                            


                            Autrement, c'est bien, tu peux passer à la partie 2 :p .


                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 avril 2010 à 14:32:15

                              Citation : Lithrein

                              Vu que tu aime les défis, relèveras-tu celui-ci (si tu veux le code MP car, je n'ai pas le droit de participer puisque je suis l'organisateur) :

                              $ ./shortlithrein12 shortlithrein12.c
                                      27      119     691

                              Ouais bon, là ça va vraiment devenir illisible mais pourquoi pas. Le but de mon code précédent était de montrer qu'on pouvait toujours faire plus court mais que c'est pas forcément mieux, mon premier est quand même beaucoup plus lisible.

                              Citation : Lithrein

                              J'adore tes return, mais je les aurais plus vus comme ça (au cas où printf plante) :

                              return printf("%s", "whatever you want") ^ 1;
                              



                              Euh nan, printf renvoie le nombre de caractère écrits. Plutôt !printf() pour renvoyer 1 si printf n'a rien écrit, 0 sinon.

                              edit: Here you go.
                              #include <stdio.h>
                              #include <ctype.h>
                              
                              void proceed(FILE *f, unsigned int *v)
                              {
                                char buf[1024];
                                int i, iw;
                                for (iw = 0; fgets(buf, 1024, f); iw = 0)
                                  for (i = 0; buf[i]; i++, v[2]++)
                                    (void)(((buf[i] == '\n') && (v[0]++ & 0)) || (isspace((unsigned char)buf[i]) && !(iw = 0)) || (!iw && (v[1]++, iw = 1)));
                              }
                              
                              int main(int ac, char **av)
                              {
                                unsigned int val[3] = {0};
                                FILE *f;
                                if (ac < 2)
                                  return proceed(stdin, val), !printf("\t%u\t%u\t%u\n", val[0], val[1], val[2]);
                                if (!(f = fopen(av[1], "r")))
                                  return !printf("Cannot open %s\n", av[1]);
                                return proceed(f, val), fclose(f), !printf("\t%u\t%u\t%u\n", val[0], val[1], val[2]);
                              }
                              

                              14:47:48 05-04 | ./a.out main3.c                                                                                                                                       [~/c/perso/wc] (0)
                                      22      98      659
                              14:47:52 05-04 | wc main3.c                                                                                                                                            [~/c/perso/wc] (0)
                                    22      98     659 main3.c
                              14:48:01 05-04 |

                              Je veux bien le tiens par MP. Bon sinon, je m'arrête là pour les codes horribles.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                7 avril 2010 à 7:31:55

                                bonjour,
                                voici ma tentative pour la partie I, et la partie II :-°
                                #include <stdio.h>
                                #include <stdlib.h>
                                //creation d'un type de variable personnelle
                                typedef struct data data;
                                struct data
                                {
                                    long Ncaractere;
                                    int Nmot;
                                    int Nligne;
                                };
                                //creation de type énuméré
                                typedef enum Caracterespeciaux Caracterespeciaux;
                                enum Caracterespeciaux
                                {
                                    espace = ' ', tabulation = '\t', retLigne = '\n' , retChariot ='\r'
                                };
                                
                                typedef enum booleen booleen;
                                enum booleen
                                {
                                    vrai=1 , faux=0
                                };
                                
                                //fonction declaration
                                data zWc(FILE *fichier);
                                void affiche(data resultat);
                                
                                
                                int main(void)
                                {
                                    data resultat;
                                
                                    printf("Hello world! exo zWc premiere quinzaine d'avril\n");
                                    printf("Compte le nombre de caracteres , mots ,lignes d'un fichier\n");
                                    printf("taper control Z pour finir la saisie \n\n\n");
                                    //debut exo I
                                    resultat=zWc(stdin);
                                    affiche(resultat);
                                
                                    //debut exo II
                                    FILE* fichier = NULL;
                                    fichier = fopen("test.txt", "r");//lecture seulement
                                
                                    if (fichier != NULL)
                                    {
                                        resultat=zWc(fichier);
                                        affiche(resultat);
                                        fclose(fichier);
                                    }
                                    else
                                    {
                                        // On affiche un message d'erreur si on veut
                                        printf("\n Impossible d'ouvrir le fichier test.txt\n");
                                        printf("Compte le nombre de caracteres , mots ,lignes de 'stdin'\n");
                                        printf("taper control Z pour finir la saisie \n\n\n");
                                        resultat=zWc(stdin);
                                        affiche(resultat);
                                    }
                                
                                    return 0;
                                }
                                
                                //fonctions
                                
                                void affiche(data resultat)
                                {
                                    //contrainte gestion du s pour le pluriel
                                    if (resultat.Ncaractere >1)
                                    {
                                        printf("%ld caracteres\n",resultat.Ncaractere);
                                    }
                                    else
                                    {
                                        printf("%ld caractere\n",resultat.Ncaractere);
                                    }
                                
                                    if (resultat.Nmot >1)
                                    {
                                        printf("%d mots\n",resultat.Nmot);
                                    }
                                    else
                                    {
                                        printf("%d mot\n",resultat.Nmot);
                                    }
                                
                                    if (resultat.Nligne >1)
                                    {
                                        printf("%d lignes\n",resultat.Nligne);
                                    }
                                    else
                                    {
                                        printf("%d ligne\n",resultat.Nligne);
                                    }
                                
                                    //attente clavier pour windows
                                    getchar();
                                }
                                
                                data zWc(FILE *fichier)
                                //contrainte perso pas d'entree/sortie du clavier/ecran
                                {
                                    char c;
                                    data resultat;
                                    resultat.Ncaractere=0;
                                    resultat.Nmot=0;
                                    resultat.Nligne=0;
                                
                                    while ((c = fgetc(fichier)) != EOF)
                                    {
                                        //resultat.Ncaractere++;
                                        switch (c)
                                        {
                                            case espace:
                                              resultat.Nmot++;
                                              resultat.Ncaractere++;
                                            break;
                                
                                            case tabulation:
                                              resultat.Nmot++;
                                              resultat.Ncaractere++;
                                            break;
                                
                                            case retLigne :
                                              resultat.Nligne++;
                                              resultat.Nmot++;
                                            break;
                                
                                            case retChariot:
                                              resultat.Nligne++;
                                              resultat.Nmot++;
                                            break;
                                
                                            default :
                                              resultat.Ncaractere++;
                                            break;
                                
                                        }
                                    }
                                    return resultat;
                                }
                                

                                qu'en pensez vous ? :p
                                Pour la partie III vu que j'ai rien compris je vais commencer par decortiquer les codes qui sont dejà posté ici :(:(:(
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  7 avril 2010 à 12:34:54

                                  Citation : darkipod

                                  qu'en pensez vous ? :p


                                  Bonjour,

                                  Dans zWc, la variable c devrait être déclarée en int car fgetc retourne un int.
                                  Le comptage des caractères et des mots est faux.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    7 avril 2010 à 14:41:00

                                    AIE ??voici un exemple d'execution :
                                    Hello world! exo zWc premiere quinzaine d'avril
                                    Compte le nombre de caracteres , mots ,lignes d'un fichier
                                    taper control Z pour finir la saisie
                                    
                                    
                                    AZERTY CLAVIER
                                    EXO DU SITE DU ZERO
                                    MOIS D'AVRIL
                                    ^Z
                                    45 caracteres
                                    9 mots
                                    3 lignes
                                    
                                    
                                     Impossible d'ouvrir le fichier test.txt
                                    Compte le nombre de caracteres , mots ,lignes de 'stdin'
                                    taper control Z pour finir la saisie
                                    
                                    
                                    FIN
                                    ^Z
                                    3 caracteres
                                    1 mot
                                    1 ligne
                                    
                                    
                                    Process returned 0 (0x0)   execution time : 98.514 s
                                    Press any key to continue.

                                    J'ai erreur ou? :(
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      7 avril 2010 à 14:49:06

                                      Citation : darkipod

                                      J'ai erreur ou? :(


                                      Dans votre code, le comptage des mots compte en fait les caractères blancs. Essayez par exemple avec plusieurs espaces entre deux mots.
                                      Dans votre code, le comptage des caractères oublie les caractères de fin de ligne.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        7 avril 2010 à 15:12:18

                                        Citation : Marc Mongenet

                                        Citation : darkipod

                                        J'ai erreur ou? :(


                                        Dans votre code, le comptage des mots compte en fait les caractères blancs. Essayez par exemple avec plusieurs espaces entre deux mots.
                                        Dans votre code, le comptage des caractères oublie les caractères de fin de ligne.


                                        merci pour l'info je revoie ma copie!
                                        par contre le caractere fin de ligne effectivement pour moi c'est pas un caractere!
                                        je corrige
                                        merci
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          9 avril 2010 à 16:12:21

                                          Vu que plus personne ne participe je pense que je vais proposer une correction plus tôt que prévu (ce soir ou demain martin) et je lancerais le nouvel exercice.
                                          Si vous n'êtes pas d'accord merci de me le faire savoir.

                                          PS: Si la correction venez à ne pas être proposé ce soir ou demain, je la proposerais au alentours du 20 car je suis absent à partir de samedi 10 jusqu'au samedi suivant.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            9 avril 2010 à 19:36:08

                                            "syntax">
                                            /home/emmanuel/Programmes en c/wc/main.c||In function ‘main’:|
                                            /home/emmanuel/Programmes en c/wc/main.c|46|warning: suggest parentheses around ‘&&’ within ‘||’|
                                            ||=== Build finished: 0 errors, 1 warnings ===|

                                            Je suis ouvert a toutes critiques sur mon code.
                                            J'aimerais savoir, aussi, pourquoi j'ai le warning et comment y remédier.
                                            Emmflo

                                            EDIT: Merci Lithrein, c'est corrigé.ficher)
                                            #include <stdio.h>
                                            #include <stdlib.h>
                                            
                                            void arguments(FILE** fichier, int* ca, int* mo, int* li, int argc, char ** argv)
                                            {
                                                int i=1,j=1, c=1;
                                                for(i=1;i<argc;i++)
                                                {
                                                    if(argv[i][0]=='-') //Si l'argument est une option
                                                    {
                                                        *mo=1; *ca=1; *li=1;
                                                        while(c!='\0')
                                                        {
                                                            c=argv[i][j];
                                                            if(c=='w')
                                                            *mo=0;
                                                            if(c=='l')
                                                            *li=0;
                                                            if(c=='c')
                                                            *ca=0;
                                                            if(c=='h')
                                                            {
                                                                printf("Usage : wc [-l] [-w] [-c] [FICHIER]\n");
                                                                exit(0);
                                                            }
                                                            j++;
                                                        }
                                                    }
                                                    else //Sinon c'est le fichier
                                                    *fichier = fopen(argv[i], "r");
                                                }
                                            }
                                            int main(int argc, char ** argv)
                                            {
                                                int c = 0, caractere=0, mots=0, precedent=0, ligne=1, ca=0,mo=0,li=0;
                                                FILE* fichier = NULL;
                                                arguments(&fichier, &ca, &mo, &li, argc, argv);
                                                while (c != EOF || c != -1)
                                                {
                                                    if(fichier != NULL)
                                                    c = fgetc(fichier);
                                                    else
                                                    c = getchar();
                                                    if(c == -1 && fichier!=NULL)
                                                    break;
                                                    if((c==' ' || c=='\t' || c=='\n' || c=='\r' || c==EOF) && caractere != 0)
                                                    {
                                                        if(precedent !=' ' && precedent !='\t' && precedent !='\n' && precedent !='\r')
                                                        mots++;
                                                    }
                                                    if(c=='\n')
                                                    {
                                                        ligne++;
                                                    }
                                                    precedent=c;
                                                    caractere++;
                                                    if(fichier != NULL)
                                                    printf("%c",c);
                                                }
                                                if(fichier == NULL && caractere!=0)
                                                caractere--; //on enlève le caractère "EOF"
                                                if(caractere==0)
                                                ligne=0;
                                            
                                                if(mo==0 && mots>1)
                                                printf("\n%d mots.",mots);
                                                else if(mo==0 && mots<=1)
                                                printf("\n%d mot.",mots);
                                            
                                                if(li==0 && ligne>1)
                                                printf("\n%d lignes.",ligne);
                                                else if(li==0 && ligne<=1)
                                                printf("\n%d ligne.",ligne);
                                            
                                                if(ca==0 && caractere>1)
                                                printf("\n%d caractères.",caractere);
                                                else if(ca==0 && caractere<=1)
                                                printf("\n%d caractère.",caractere);
                                            
                                                printf("\n");
                                                if(fichier != NULL)
                                                fclose(fichier);
                                                return 0;
                                            }
                                            

                                            Il me reste un Warning mais je ne sait pas pourquoi il est là:
                                            1
                                            2
                                            3
                                            
                                            </span>
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              9 avril 2010 à 21:32:19

                                              Plutôt d'accord j ai du mal avec cet exo :(
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                9 avril 2010 à 21:48:52

                                                Le problème actuel est de savoir qui proposera un exercice ensuite. :(
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Zeste de Savoir, le site qui en a dans le citron !
                                                  9 avril 2010 à 21:59:44

                                                  J'ai cru comprendre que Lithrein proposera un exo... si ce n'est pas le cas, j'en ai un... Mais il est pas bien prepare... donc c'est vraiment si personne n'en a ;)
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    9 avril 2010 à 22:29:09

                                                    Citation : Adroneus

                                                    J'ai cru comprendre que Lithrein proposera un exo... si ce n'est pas le cas, j'en ai un... Mais il est pas bien prepare... donc c'est vraiment si personne n'en a ;)

                                                    Pour ma part peu importe pourvu qu il y ait un exo qui me fasse progresser...
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      9 avril 2010 à 22:43:35

                                                      Ok, jvais essayer de le mettre un peu en forme :)
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        10 avril 2010 à 8:53:50

                                                        @Adroneus : Je te conseille de proposer ton exercice.
                                                        Pour la correction, je suis désolé, je suis un petit peu pris de court, je ne pourrais donc proposer la correction qu'à partie du 18 avril car je ne vais plus pouvoir venir avant. Je vous prie de m'excuser.

                                                        @GurneyH : Je compte m'occuper encore de proposer les futurs exercices car même s'il y a peu de participants, j'ai vraiment l'impression que ces exercices font plaisir à ceux qui participent et qu'ils souhaitent que cela continu.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          10 avril 2010 à 11:57:14

                                                          @Lithrein : t'as bien raison ^^
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            10 avril 2010 à 14:15:50

                                                            Citation : Lithrein


                                                            Je compte m'occuper encore de proposer les futurs exercices car même s'il y a peu de participants, j'ai vraiment l'impression que ces exercices font plaisir à ceux qui participent et qu'ils souhaitent que cela continu.


                                                            Super. :)
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Zeste de Savoir, le site qui en a dans le citron !

                                                            zWc

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown