Partage
  • Partager sur Facebook
  • Partager sur Twitter

zIdentificator

Exercice de niveau intermédiaire

    13 juin 2010 à 16:55:24

    Citation

    Ca se lite assez facilement je pense, par contre c'est peut-être un peu naïfe comme procédé non ?

    C'est pas un exercice d'algo, ya vraiment aucun intérêt à optimiser (si ce n'est perdre de la clarté), d'ailleurs tu peux pas optimiser grand chose.
    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2010 à 17:04:30

      Citation : akregator


      Hum... aucun commentaire à ajouter :) Ca se lite assez facilement je pense, par contre c'est peut-être un peu naïfe comme procédé non ?


      Salut, le problème est que c'est faux: ça reconnait comme identificateur plein de chaînes qui n'en sont pas: "to+to" par exemple.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        13 juin 2010 à 17:09:44

        Ah oui, j'ai oublié tous les autres opérateurs et les symboles. C'est trois fois rien à modifier :)
        • Partager sur Facebook
        • Partager sur Twitter
          13 juin 2010 à 17:18:43

          Citation : Marc Mongenet


          Il faut dire que ce test est plus une perte de temps qu'autre chose... En effet, parmi tous les cas possibles d'adresse invalide (adresse de mémoire non allouée, désallouée, allouée pour autre chose...), NULL n'est qu'un cas.



          Tout à fait, la Norme l'explique, d'ailleurs de façon assez sibylline à mon gout :


          Citation : C99


          If an argument to a function has an invalid value (such as a value
          outside the domain of the function, or a pointer outside the address space of the program,
          or a null pointer, or a pointer to non-modifiable storage when the corresponding
          parameter is not const-qualified) or a type (after promotion) not expected by a function
          with variable number of arguments, the behavior is undefined.



          Autrement dit, strlen(NULL) n'a pas à être pas défini, au programmeur de veiller à ce que ce genre d'entrée invalide n'apparaisse pas.
          • Partager sur Facebook
          • Partager sur Twitter
            13 juin 2010 à 22:01:36

            Citation : akregator

            Ah oui, j'ai oublié tous les autres opérateurs et les symboles. C'est trois fois rien à modifier :)


            Pas vraiment. Il faut reconnaître les caractères valides au lieu d'essayer d'éliminer la multitude de caractères invalides.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              13 juin 2010 à 22:10:13

              C'est pas faux étant donné la fragmentation des caractères invalides. J'y aurai pas pensé si tu ne l'avais pas dit :)
              • Partager sur Facebook
              • Partager sur Twitter
                13 juin 2010 à 22:12:15

                Citation : akregator

                C'est pas faux étant donné la fragmentation des caractères invalides. J'y aurai pas pensé si tu ne l'avais pas dit :)


                C'est quoi une «fragmentation de caractères» ?
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  13 juin 2010 à 22:13:23

                  Le placement des caractères dans la table ASCII. Les invalides sont éparpillés partout, un peu comme sur un champ de bataille. (oh le mauvais jeu de mot :-° ) Donc il y a plus de conditions à vérifier.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 juin 2010 à 22:23:07

                    Citation : akregator

                    Le placement des caractères dans la table ASCII.


                    OK. Cela dit, à ma connaissance, rien ne dit qu'un source C doit être codé en ASCII.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      13 juin 2010 à 22:32:34

                      Ben écoute, si on va faire un tour dans les encodages, il me semble que les caractères de la table ASCII sont dans le même ordre partout dans pas mal d'encodages. En tout cas dans les encodages du style ISO, mais vaudrait mieux aller vérifier. En tout cas même avec un fichier texte en UTF8, j'ai jamais eu de problème avec les caractères.

                      Et puis autrechose, c'est que l'ASCII fait partie des premiers standard de communication, donc si on y réfléchit, ça serait louche de tout chambouler et ça ne simplifierai pas les choses.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 juin 2010 à 23:28:32

                        Citation : akregator

                        Ben écoute, si on va faire un tour dans les encodages, il me semble que les caractères de la table ASCII sont dans le même ordre partout. En tout cas dans les encodages du style ISO, mais vaudrait mieux aller vérifier. En tout cas même avec un fichier texte en UTF8, j'ai jamais eu de problème avec les caractères, et heureusement !

                        Et puis autrechose, c'est que l'ASCII fait partie des premiers standard de communication, donc si on y réfléchit, ça serait louche de tout chambouler et ça ne simplifierai pas les choses.


                        Rien n'est garantit...
                        2 solutions
                        • tu nous croit sur parole
                        • tu cherches de ton côté!


                        La seconde solution présente des avantages...
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Zeste de Savoir, le site qui en a dans le citron !
                        Anonyme
                          13 juin 2010 à 23:32:19

                          Heu je n'ai jamais demandé à personne de chercher à ma place. Je ne suis pas en train de me baser sur des suppositions non plus, mais pour le moment, j'ai pas envie d'aller fouiner, donc je vais faire comme si je n'allais avoir que de l'ASCII, et quand j'aurais envie d'aller chercher, là, j'aviserai :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 juin 2010 à 23:53:07

                            Citation : akregator

                            Ben écoute, si on va faire un tour dans les encodages, il me semble que les caractères de la table ASCII sont dans le même ordre partout.



                            J'en suis pas si sûr. Tu prends EBCDIC, l'encodage IBM maison mais qui tourne sur des grosses machines genre super-calculateur, il est pas compatible ASCII.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              14 juin 2010 à 0:00:14

                              Ah ben oui si on commence à parler de ce genre d'encodage assez spécifiques...

                              Enfin bon, après si on veut porter une application sur tel système en connaissance de cause, soit on met en place des convertions, soit on pense autrement notre programme, mais ça n'est peut-être pas toujours possible non ?

                              Edit: je viens de tomber là dessus et on voit que les ISO-qqch sont de base ASCII, c'est donc normal qu'avec, à priori, tous ces encodages, ça soit compatible ASCII.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 juin 2010 à 0:10:40

                                C'est un sujet que je trouve compliqué...
                                ta priorité devrait "normalement", être de proposer un solution au problème posé...

                                Tu t'es vautré, poste ton code actuel! ;)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Zeste de Savoir, le site qui en a dans le citron !
                                Anonyme
                                  14 juin 2010 à 0:12:09

                                  J'ai pas compris ta deuxième phrase.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 juin 2010 à 0:16:50

                                    Citation : akregator

                                    Ah ben oui si on commence à parler de ce genre d'encodage assez spécifiques...



                                    Au-delà de cette histoire de code ASCII, ton code-source est incorrect pour une raison qui n'est pas liée à l'encodage ASCII. Comme il t'a été dit, il est maladroit voire vain de vouloir lister un par un tous les caractères interdits dans un identificateur.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      14 juin 2010 à 0:22:20

                                      Voilà le code modifié qui ne liste pas les éléments interdits:

                                      #include <stdio.h>
                                      #include <stdlib.h>
                                      #include <string.h>
                                      #include <ctype.h>
                                      
                                      int zIdentificator(char *word) {
                                              static const char *keywords[] = {
                                                      "auto", "break", "case", "char", "const", "continue", "default",
                                                      "do", "double", "else", "enum", "extern", "float", "for", "goto",
                                                      "if", "inline", "int", "long", "register", "restrict", "return",
                                                      "short", "signed", "sizeof", "static", "struct", "switch",
                                                      "typedef", "union", "unsigned", "void", "volatile", "while",
                                                      "_Bool", "_Complex", "_Imaginary"
                                              };
                                              int i;
                                              char *id = word;
                                      
                                              if(word == NULL)
                                                      return 0;
                                      
                                              if((*word++ == '_' && (*word == '_' || isupper(*word))) || isdigit(*--word))
                                                      return 0;
                                      
                                              while(*word != '\0')
                                              {
                                                      if(!isalnum(*word) && *word != '_')
                                                              return 0;
                                                      ++word;
                                              }
                                      
                                              for(i = 0 ; i < 36 ; i++)
                                              {
                                                      if(!strcmp(keywords[i], id))
                                                              return 0;
                                              }
                                      
                                              return 1;
                                      }
                                      
                                      int main() {
                                              char *words[] = {"a",
                                                                                "anaconda",
                                                                                "AnAcondA42",
                                                                                "anaConda_42",
                                                                                "_aNacOnda",
                                                                                "AnAc_OnDa",
                                                                                "_42anaconda_",
                                                                                "AnAc OnDa",
                                                                                "42_anaconda",
                                                                                "__anaconda",
                                                                                "Anac-0nda",
                                                                                "_Anaconda",
                                                                                "ana+conda",
                                                                                "break",
                                                                                " ",
                                                                                NULL
                                                                               };
                                              int i;
                                              for(i = 0 ; i < 16 ; i++) {
                                                      if(zIdentificator(words[i]))
                                                              printf("%s \t [valide]\n", words[i]);
                                                      else if(words[i] != NULL)
                                                              printf("%s \t [invalide]\n", words[i]);
                                                      else
                                                              puts("Pointeur NULL");
                                              }
                                              return 0;
                                      }
                                      


                                      Edit: isalpha et isalnum...
                                      Edit2: et hop, on compacte.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 juin 2010 à 1:08:47

                                        Citation : akregator

                                        Voilà le code modifié qui ne liste pas les éléments interdits:



                                        Tu passes mes tests. A première vue, ton code semble correct. Ton word[i] == ' ' je pense ne sert à rien. Comme on te l'a dit tes (word[i] >= 'a' && word[i] <= 'z')
                                        ne sont pas portables et ils sont surtout inutiles puisque tu disposes des fonctions nécessaires qu'il faut dans ctype.h (*). Par contre, (word[i] >= '0' && word[i] <= '9') est portable et finalement peut-être mieux que isdigit() .


                                        (*) EDIT : OK, tu as modifié en utilisant les fonctions qu'il fallait.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          14 juin 2010 à 1:12:12

                                          (word[i] >= '0' && word[i] <= '9') mieux que isdigit() ? pourquoi donc ?
                                          La fonction isdigit() comparerait tous les nombres un a un à la façon de strcmp() qui compare un a un les caractères ?

                                          (oui j'ai modifié, j'avais oublié ce gros détail :-° )
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            14 juin 2010 à 1:45:31

                                            Citation : akregator

                                            (word[i] >= '0' && word[i] <= '9') mieux que isdigit() ? pourquoi donc ?
                                            La fonction isdigit() comparerait tous les nombres un a un à la façon de strcmp() qui compare un a un les caractères ?

                                            (oui j'ai modifié, j'avais oublié ce gros détail :-° )




                                            J'ai pas trop compris ce que tu voulais dire. À mon avis, isdigit(c) est en général implémenté par
                                            return  c >= '0' && c <= '9';
                                            
                                            donc le faire directement évite l'appel de fonction mais bon, c'est peanuts donc finalement isdigit donne un code plus propre.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Anonyme
                                              14 juin 2010 à 1:50:14

                                              Si « In both the source and execution basic character sets, the
                                              value of each character after 0 in the above list of decimal digits shall be one greater than
                                              the value of the previous. » (merci IATGOF) se vérifie partout, ça a sans doute été codé comme ça partout.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                14 juin 2010 à 2:30:15

                                                Citation : akregator

                                                Si « In both the source and execution basic character sets, the
                                                value of each character after 0 in the above list of decimal digits shall be one greater than
                                                the value of the previous. » (merci IATGOF) se vérifie partout, ça a sans doute été codé comme ça partout.



                                                Je suppose que c'est un extrait de la Bible (la Norme du C !). C'est ce que je voulais signifier en te disant que (word[i] >= '0' && word[i] <= '9') est portable. Attention, ça ne marche que pour les chiffres décimaux et pas hexadécimaux. C'est une chose assez classique (utilisée souvent dans le K&R2 par exemple) avec pour conséquence que l'on peut obtenir facilement la valeur entière d'un chiffre décimal c en faisant 'c'-'0'.


                                                Citation : akregator

                                                ça a sans doute été codé comme ça partout.




                                                probable en effet.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Anonyme
                                                  14 juin 2010 à 2:51:06

                                                  Citation : candide

                                                  probable en effet.


                                                  C'est ce que j'aurais, à tout hazard, éventuellement, probablement, compris :-°

                                                  Sinon, cette tirade vient de ce fichier, la norme C99.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    14 juin 2010 à 9:18:12

                                                    Salut,

                                                    Citation : candide

                                                    Tu passes tous mes tests sauf 1.


                                                    Candide, je trouve que ce serait plus simple pour tout le monde si tu le donnais, ce programme de test. Je me demandais aussi si il y a une contrainte sur la taille max d'un cname;

                                                    A+

                                                    Pfeuh
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Anonyme
                                                      14 juin 2010 à 12:43:48

                                                      Ca serait tricher quand même, surtout que les modèles d'identificateurs invalides sont indiqués dans le premier post.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        14 juin 2010 à 13:54:01

                                                        Citation : akregator

                                                        Ca serait tricher quand même


                                                        Ah... Je ne savais pas que c'était un examen! o_O C'est une simple question d'intérêt personnel... Les tests m'intéressent plus que l'algo en lui même. J'ai commencé par écrire les tests. Ce n'est certes pas la façon la plus agréable de développer, mais c'est la plus sûre, c'est mon choix. Il m'est déjà arrivé de devoir faire du code avec des tests fournis, ça ne me choque pas. Ça implique le demandeur et ça tranquilise le codeur, c'est tout bénéfice. Ça me parait en tout cas plus logique que d'écrire du code, le faire valider et débogguer ensuite au lieu de le faire soi-même. Ça m'aurait intéressé de voir les tests de Candide, mais tant pis, pas de souci.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Anonyme
                                                          14 juin 2010 à 14:00:26

                                                          Un débogguer ? J'utilise une liste d'éléments que je sais valides ou invalides et je vérifie si le programme dit vrai... c'est aussi bateau que ça.

                                                          Ou alors, ce que vous appellez des "test" ne correspond pas à ma la définition commune du post 1.

                                                          PS: pas la peine de t'offusquer hein.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            14 juin 2010 à 15:40:32

                                                            candide l'ai a montré un peu plus haut.
                                                            toto       : 1
                                                            toto42     : 1                                                                                                
                                                            Toto       : 1
                                                            c          : 1
                                                            to         : 1                                                                                                
                                                            _          : 1                                                                                                
                                                            _t         : 1
                                                            _toto      : 1                                                                                                
                                                            _bool      : 1                                                                                                
                                                            _4         : 1
                                                            _42_toto   : 1
                                                                       : 0                                                                                                
                                                            4          : 0
                                                            42         : 0
                                                            4_         : 0
                                                            to-to      : 0
                                                            __         : 0
                                                            __toto     : 0                                                                                                
                                                            _Toto      : 0
                                                            _____      : 0
                                                            goto       : 0
                                                            return     : 0
                                                            _Bool      : 0
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Zeste de Savoir, le site qui en a dans le citron !
                                                              14 juin 2010 à 16:37:09

                                                              Ah bon. Ça ressemble plus à un résultat de test qu'à un test.
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              zIdentificator

                                                              × 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