Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trouver un mot correspondant à son acronyme .

chaines de caractères.

Sujet résolu
    4 mai 2021 à 11:11:09

    Bonjour,

    Alors voilà mon problème, j'ai un exercice où dans la consigne on nous donne un acronyme par exemple "PP", on nous donne ensuite une liste de titre par exemple : "Pere Et Fils" "La Condition Humaine" "Petit Prince" et je dois trouver les titres correspondant à l'acronyme donné (ici PP correspond à Petit Prince).

    J'ai fait un début de code mais ça donne rien, c'est comme si j'avais rien fait. J'arrive pas à comparer les lettres de l'acronyme(sachant que là j'ai fais au plus simple mais il y a des acronyme à 3 ou 4 lettres) avec les initiales de chaque mots.

    J'imagine que pour les mots on peut faire une condition du genre "si mot[i] = 'espace' alors mot[i+1] l'initiale d'un mot mais même ça, ça ne donne pas grand chose si vous avez une idée sur comment je pourrais aborder ce problème.

    Voilà mon début de code :

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char acronyme[] = "PP";
        char titre[] = "Petit Prince";
        char copie[201];
        
        int longueurAcro = strlen(acronyme);
        int longueurTitre = strlen(titre);
        
        for(int i = 0; i < longueurTitre; i++)
        {
            for(int j = 0; i < longueurAcro; j++)
            {
                if(
                   
                   
                   
                   )
            }
        }
        
        
        return 0;
    }



    -
    Edité par IyasJ. 4 mai 2021 à 11:13:47

    • Partager sur Facebook
    • Partager sur Twitter
      4 mai 2021 à 11:38:07

      Bonjour,

      Je pense qu'il faudrait que tu commences à réfléchir sur comment transformer "Pere Et Fils" en "PEF" …

      Si tu as une fonction getAcro tout se simplifie, non ?

      • Partager sur Facebook
      • Partager sur Twitter
        4 mai 2021 à 13:38:29

        Non on a pas le droit d'utiliser gets enfin comme on nous l'a pas appris on doit se débrouiller autrement (franceIOI).

        Sinon pour transformer "Pere Et Fils" en "PEF" j'ai pensé à ça :

        #include <stdio.h>
        #include <stdlib.h>
        
        int main()
        {
            
            char titre[] = "Pere Et Fils";
           
            int longueurTitre = strlen(titre);
        
            for(int i = 0; i < longueurTitre; i++)
            {
                if(titre[i] == titre[0])
                {
                    printf("%c", titre[i]);
                }
                if(titre[i] == ' ')
                {
                    printf("%c", titre[i+1]);
                }
            }
        
        
            return 0;
        }
        

        j'imagine qu'une fois le titre transformé en acronyme je créé un autre tableau, j'utilise la fonction strcpy pour copier l'acronyme et je le compare à celui que j'ai déjà. mmmh c'est pas bête du tout merci, je vais essayer ça voir ce que ça donne.

        J'ai juste un soucis c'est quand je teste avec Petit Prince, ça me renvoie PPP au lieu de PP.

        -
        Edité par IyasJ. 4 mai 2021 à 13:40:56

        • Partager sur Facebook
        • Partager sur Twitter
          4 mai 2021 à 14:06:51

          IyasJ. a écrit:

          Non on a pas le droit d'utiliser gets enfin comme on nous l'a pas appris on doit se débrouiller autrement (franceIOI).

          >_< lis bien mon message … je ne parle pas de gets …

          Rapidement : gets a été dépréciée et retirée du standard C ⇒ il ne faut plus du tout l'utiliser.

          À ma connaissance, france IOI n'interdit rien, tu peux utiliser ce que tu veux … enfin bref revenons à nos moutons :

          IyasJ. a écrit:

          Non on a pas le droit d'utiliser gets enfin comme on nous l'a pas appris on doit se débrouiller autrement (franceIOI).

          Sinon pour transformer "Pere Et Fils" en "PEF" j'ai pensé à ça :


          Tu penses en C ? o_O 

          Avant de vouloir commencer à écrire du code en C, il faut avant tout être capable de simplement expliquer en français ce que tu cherches à faire. Par exemple ici tu aurais dû commencer par dire : «je parcours le titre et je ne garde que les lettres majuscules».

          Est-ce ce que tu fais ? non →

          Tu parcours bien le tire en ligne 11 avec la boucle for, mais ensuite tu dis : «si le caractère courant est égal au premier caractère alors j'imprime le caractère courant» ⇒ ça n'[a rien à voir.

          Avand de coder il faut faire un algo.

          • Partager sur Facebook
          • Partager sur Twitter
            4 mai 2021 à 14:56:28

            j'ai vu mon erreur il aurait fallu que je mette plutôt 

            if(i == 0)
            {
              printf("%c", titre[i];
            }

            j'ai du mal avec les algo (pseudo code) je vais essayer d'en écrire un:

            je crée un tableau de chaine de caractere <-acro

            Je crée un tableau de chaine de caractere <- titre

            Je crée un tableau de chaine de caractere <- acroTemp

            Je calcule la longueur de titre <- longueurTitre

            Je parcours longueurTitre i de ma chaîne de caractere <- titre

                   Si i est égal à 0:

                         J'affiche le caractere i.

                         Je copie le caractere i dans le tableau acroTemp.

                   Si i est égal au caractere 'espace':

                         J'affiche la caractere après l'espace  i+1.

                         Je concatene le caractere i dans le tableau acroTemp.

            Je compare les tableaux acroTemp et acro, si ils sont pareil:

                         J'affiche le titre.

            EDIT: et ça marche pas, parce qu'on ne peut pas concatener ou copier juste un caractere.

            -
            Edité par IyasJ. 4 mai 2021 à 15:10:14

            • Partager sur Facebook
            • Partager sur Twitter
              4 mai 2021 à 15:58:15

              Arrête de vouloir penser en C ou en code …

              Si je te donne donne «The Art Of Computer Programming» comment fais-tu toi à la main pour me dire que l'acronyme est TAOCP ?

              • Partager sur Facebook
              • Partager sur Twitter
                4 mai 2021 à 16:49:29

                IyasJ. a écrit:

                       EDIT: et ça marche pas, parce qu'on ne peut pas concatener ou copier juste un caractere.

                On peut tout à fait concaténer des caractères après une chaine. Il faut juste utiliser la bonne méthode. Par exemple:

                 chaine[strlen(chaine)+1] = '\0';              // on met deux '\0' à la fin de la chaine
                 chaine[strlen(chaine)] = caractere_a_ajouter; // on remplace le 1er '\0' par le caractère
                

                Ou plus simple : on a pris soin de préremplir le tableau de '\0', ensuite il suffit d'ajouter chaque caractère à la fin.

                Et en effet, tu te compliques la vie en algo. Comme l'a écrit WhiteCrow, dis ce qu'il faut faire, ça peut se dire en une phrase.

                Il y a peut-être un piège. Comme ton énoncé est un exemple, je vois plusieurs moyens de trouver l'acronyme:
                - s'intéresser au 1er caractère et à tous ceux qui suivent une espace (ou peut-être une apostrophe)
                - s'intéresser au majuscules.
                Quel est l'acronyme de : "S'Intéresser aux Majuscules" (SIM ou SIAM ou SAM)?

                • Partager sur Facebook
                • Partager sur Twitter
                Bjarne Stroustrup : "C++ has become too expert friendly"
                  4 mai 2021 à 17:04:26

                  Du coup je vais me substituer au PO pour donner l'énoncé

                  Acronymes

                  Comme dans tout lieu de travail, les employés de la bibliothèque ont pris l’habitude d’utiliser des acronymes (exemples d’acronymes : IOI, RATP, BEPC, LOL...) pour les titres de livres les plus utilisés, ce qui leur permet de parler plus vite !

                  Seulement vous ne connaissez pas encore tous les acronymes, aussi lorsqu’on vous demande d’aller chercher un livre sans vous donner le titre complet, vous êtes bien embêté(e) !

                  Étant donné un acronyme, vous devez trouver tous les titres qui correspondent et les afficher "joliment".

                  Limites de temps et de mémoire (C)

                  • Temps : 0,1 s sur une machine à 1 GHz.
                  • Mémoire : 8 000 ko.

                  Contraintes

                  Tous les titres de livres ainsi que les acronymes contiennent au plus 200 caractères.

                  Entrée

                  Sur la première ligne, un acronyme, uniquement constitué de lettres majuscules.

                  Sur la seconde ligne, un entier nbLivres, le nombre de titres de livres.

                  Sur les nbLivres lignes suivantes les titres de livres, uniquement constitués de lettres ou d’espaces, sans accents.

                  Les mots de chaque titre sont toujours séparés par un seul espace.

                  Sortie

                  Vous devez afficher chaque titre de livre qui correspond à l’acronyme, en mettant toutes ses lettres en minuscules sauf la première lettre de chaque mot, qui doit être en majuscule.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 mai 2021 à 17:48:20

                    L'acronyme de "The Art Of Computer Programming" est Knuth?
                    Première question à se poser: comment je ferais pour trouver le premier caractère de chaque mot dans le titre?
                    Ensuite je les écris quelque part à la suite. Où ça?
                    Comment je sais que j'ai fini de parcourir le titre?
                    Comment je compare cette suite avec l'acronyme qu'on me donne?
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Le Tout est souvent plus grand que la somme de ses parties.

                      4 mai 2021 à 18:21:35

                      Pour trouver le premier caractère de chaque mot dans le titre je prend le premier et ceux après un espace.

                      Je les écris à la suite dans un tableau secondaire.

                      Je sais que j'ai fini de parcourir le titre quand il n'y a plus d'espace ou quand on arrive au caractère de fin \0.

                      Je compare les deux tableaux avec strcmp. S'ils sont égaux c'est que c'est le bon acronyme donc le bon titre.

                      Mais mon problème se situe à la phase deux je vois pas comment je pourrais attraper chaque caractère du titre pour les coller à la suite dans un tableau.

                      La solution de Dalfab a l'air compliquée....

                      -
                      Edité par IyasJ. 4 mai 2021 à 18:23:59

                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 mai 2021 à 18:37:12

                        IyasJ. a écrit:

                        [...]

                        La solution de Dalfab a l'air compliquée....

                        -
                        Edité par IyasJ. il y a 7 minutes


                        Bienvenu dans le monde merveilleux de la programmation (surtout en C). Il faut aussi penser au cas limites comme … un titre de livre qui serait «123 !» par exemple. Mais bon, ils ne sont pas méchants sur France IOI au départ.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 mai 2021 à 18:48:33

                          Un pas devant l'autre je baisse pas les bras.

                          J'ai essayé la technique de Dalfab mais ça fonctionne pas :

                          #include <stdio.h>
                          
                          #include <stdlib.h>
                          
                          #include <ctype.h>
                          
                          #include <string.h>
                          
                          int main()
                          
                          {
                          
                             char acronyme[201];
                          
                             scanf("%s\n", acronyme);
                          
                             char acroTemp[201] = "";
                          
                             char titreTemp[201] = "";
                          
                             int nbLivres;
                          
                             scanf("%d\n", &nbLivres);
                          
                             char titreLivre[201];
                          
                             for(int i = 0; i < nbLivres; i++)
                          
                             {
                          
                                scanf("%[^\n]", titreLivre);
                          
                             }
                          
                             int longueurTitre = strlen(titreLivre);
                          
                             for(int i = 0; i < longueurTitre; i++)
                          
                             {
                          
                                if(i == 0)
                          
                                {
                          
                                   acroTemp[i] = titreLivre[i];
                          
                                }
                          
                                else if( i == ' ')
                          
                                {
                          
                                   acroTemp[strlen(acroTemp)+1] = '\0' ;
                          
                                   acroTemp[strlen(acroTemp)] = titreLivre[i];
                          
                                }
                          
                             }
                          
                             printf("%s", acroTemp);
                          
                          }



                          Si il y avait 123 j'aurais rajouté j'aurais demandé au programme seulement les caractère de type lettre après un espace. Et la première lettre de type lettre. Chacun ses débuts ils ne sont pas méchants de ton point de vue du mien ils sont sacrément agressifs. Mais je crois qu'un jour un certain WhiteCrow m'a dit on devient forgeron en forgeant, comme on devient programmeur en programmant, la pratique la pratique la pratique seul moyen pour avancer, alors je pratique du mieux que je peux, bien que je sois un peu lent à la détente.

                          -
                          Edité par IyasJ. 4 mai 2021 à 18:57:22

                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 mai 2021 à 19:10:20

                            Comme tu ne sais pas à l'avance le nombre de caractères dans l'acronyme, tu suppose que France IOI n'est pas méchant. :)
                            Tu te fais un tableau disons de 20 caractères et une variable qui compte le nombre de caractères déjà présents. Ça pourrait avoir l'air de ceci:
                            int longueur = 0;
                            char tstacro[20]; // ou 21 si tu veux ...
                            Pour ajouter:
                            tstacro[longueur++] = nouveau_caractere;
                            À la fin:
                            tstacro[longueur] = '\0';
                            et longueur te donne la longueur de la chaîne.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Le Tout est souvent plus grand que la somme de ses parties.

                              4 mai 2021 à 19:34:37

                              Comment expliques-tu en français ce que tu fais entre les lignes 37 et 57 ?

                              Explique moi les if en particulier stp.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 mai 2021 à 20:02:46

                                Une petite remarque pour pinailler... En français (contrairement à ce que certains croient) on ne met pas systématiquement des majuscules au début de chaque mot d'un titre, c'est plus compliqué. Voir paragraphe 7 ici : https://www.dictionnaire-academie.fr/article/QDL047

                                Si on veut suivre les règles du français, il faut chercher les premières lettres de chaque mot sans s'intéresser forcément aux majuscules. Il faudra donc penser à mettre en majuscules toutes les lettres trouvées dans le titre.

                                -
                                Edité par robun 4 mai 2021 à 20:06:53

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 mai 2021 à 20:04:52

                                  Hello,

                                  Il y a une autre manière de faire que créer l'acronyme du titre, et de le comparer à celui donné: c'est de vérifier si les lettres de l'acronyme donné se présentent dans l'odre du titre fourni. C'est juste l'inverse, et ce n'est pas plus compliqué. Je donne le code à titre d'exemple, tout en conseillant de continuer la discussion sur la voie proposée par WhiteCrow

                                  #include <stdio.h>
                                  #include <string.h>
                                  #include <stdbool.h>
                                  
                                  int main(void) {
                                  	char *acronym="TAOCP";
                                  	char *titles[]={
                                  		"The Art Of Computer Programming In Fortran",
                                  		"The Art Of Computer Programming",
                                  		"The Art Of Balancing Tree",
                                  		"The Art Of Computer Paradigm",
                                  		"Brol",
                                  		"The Ange"
                                  	};
                                  	int nelem=sizeof(titles)/sizeof(titles[0]);
                                  	
                                  	for(int i=0;i<nelem;i++) {
                                  		bool acro=false;
                                  		printf("%s ",titles[i]);
                                  		if(*titles[i]==*acronym) {
                                  			char *ac=acronym+1;
                                  			char *pt=strchr(titles[i],' ');
                                  			while(pt && *(pt+1)==*ac) {
                                  				ac++;
                                  				pt=strchr(pt+1,' ');
                                  			}
                                  			acro= pt==NULL && !*ac;
                                  		}
                                  		printf("--> %s acronyme\n",acro ? "" : "pas");
                                  	}
                                  	
                                  	return(0);
                                  }


                                  Je n'ai pas écrit le code avec une fonction, ne sachant pas si le po les connait

                                  -
                                  Edité par edgarjacobs 4 mai 2021 à 20:32:19

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    5 mai 2021 à 9:21:23

                                    Pour répondre à WhiteCrow, je prend les initiales d'un titre et je les mets dans un tableau:

                                     for(int i = 0; i < longueurTitre; i++)
                                     
                                       {
                                     
                                          if(i == 0)
                                     
                                          {
                                     
                                             acroTemp[i] = titreLivre[i];
                                     
                                          }
                                     
                                          else if( titreLivre[i] == ' ')
                                     
                                          {
                                     
                                             acroTemp[strlen(acroTemp)+1] = '\0' ;
                                     
                                             acroTemp[strlen(acroTemp)] = titreLivre[i];
                                     
                                          }
                                     
                                       }



                                    -
                                    Edité par IyasJ. 5 mai 2021 à 9:49:37

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      5 mai 2021 à 10:13:00

                                      C'est tordu (en général on utilise un deuxième indice lorsqu'on manipule un deuxième tableau) mais ça m'a l'air correct, à un détail près :

                                      else if( titreLivre[i-1] == ' ')
                                                          ^^^
                                                      i-1, pas i !

                                      C'est si le caractère précédent est égal à un espace que le caractère courant est l'initial d'un mot.

                                      Après, on peut simplifier la boucle :

                                      acroTemp[0] = titreLivre[0];            // remplace le if (i == 0)
                                      for(int i = 1; i < longueurTitre; i++)  // du coup on commence à 1
                                      {
                                          if( titreLivre[i-1] == ' ')
                                          {
                                              acroTemp[strlen(acroTemp)+1] = '\0' ;
                                              acroTemp[strlen(acroTemp)] = titreLivre[i];
                                          }
                                      }

                                      -
                                      Edité par robun 5 mai 2021 à 10:13:36

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        5 mai 2021 à 10:43:36

                                        Oui c'est vrai mais de toute façon comme tu as dit mon code est bancal même comme ça, ça fonctionne pas pourtant j'étais sûr d'avoir le bon filon !

                                        EDIT: je viens de remarquer que pour pouvoir le faire pour chaque titre il aurait fallu que je mette la boucle for dans l'autre boucle for et même comme ça, ça fonctionne pas, j'ai plus tellement d'idée, là je sèche complètement !

                                        Cette technique elle marche si je l'utilise pour un titre prédéfini mais dès que ça se corse pour plusieurs qu'on ne connaît pas à l'avance ça plante. Si je veux l'utiliser dans une boucle qui boucle dans une autre boucle, ça me fait une pyramide de lettre.

                                        -
                                        Edité par IyasJ. 5 mai 2021 à 13:52:39

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          5 mai 2021 à 15:11:05

                                          Pour simplifier un peu, si tu pouvais écrire une fonction qui ne vérifierais qu'une seule phrase, ça te paraîtrait moins compliqué.
                                          Je trouve la méthode de construire un acronyme avec le texte plus simple. Ça se fait en une seule boucle.
                                          J'utiliserais une variable booléenne du genre espaceAvant qui dirait si le caractère précédent était un espace.
                                          On le mettrait à true au départ.
                                          Il me semble qu'il y avait des posts de ce genre, mais je n'ai pas ttrouvé.
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Le Tout est souvent plus grand que la somme de ses parties.

                                            5 mai 2021 à 20:47:13

                                            La fonction qui vérifie une seule phrase je l'ai réussie, c'est celle pour vérifier plusieurs phrase qui marche pas.

                                            La fonction qui vérifie une phrase, elle marche 

                                            #include <stdio.h>
                                            #include <stdlib.h>
                                            #include <string.h>
                                            int main()
                                            {
                                            
                                                char titre[201] = "Pere Et Fils";
                                                char copie[201];
                                            
                                                 int longueur=strlen(titre);   
                                                        
                                            
                                                        for(int i = 0; i < longueur; i++)
                                                        {
                                                            if(i == 0)
                                                            {
                                                                copie[i] = titre[i];
                                                            }
                                                            if(titre[i-1] == ' ')
                                                            {
                                                                copie[strlen(copie)+1] = '\0';
                                                                copie[strlen(copie)] = titre[i];
                                                            }
                                                        }
                                                        printf("%s\n", copie);
                                            
                                            
                                            
                                            
                                                return 0;
                                            }
                                             
                                            
                                            

                                            -
                                            Edité par IyasJ. 5 mai 2021 à 22:10:50

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              5 mai 2021 à 21:08:47

                                              Manque un point virgule ligne 7 et l'include <string.h> pour la fonction strlen !

                                              Sachant que tu parcours le tableau de caractère élément par élément et que les chaîne de caractères se termine par '\0', tu pourrais te passer de strlen  !

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                5 mai 2021 à 22:10:12

                                                Je les ai oublié faute d'inattention à force de trop chercher la réponse, mais le code fonctionne. En postant j'ai fais des fautes de frappes j'ai rajouté le point virgule et le <string.h> .
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  5 mai 2021 à 22:39:30

                                                  Le code fonctionne.... pour l'instant. Ligne 16, tu testes quelle position de titre lorsque i vaut 0 ?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    6 mai 2021 à 4:24:02

                                                    @edgarjacobs:
                                                    Le code que tu proposais avait un avantage et un inconvénient.
                                                    L'avantage est qu'on n'a pas besoin de mémoire pour stocker le paradigme associé à un titre.
                                                    L'inconvénient est que tu utilises des pointeurs, ce qui peut embêter royalement un débutant ...
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Le Tout est souvent plus grand que la somme de ses parties.

                                                      6 mai 2021 à 9:32:48

                                                      Ligne 16 je teste une initiale juste après un espace.

                                                      Vous auriez pas une piste sur ce que je pourrais entreprendre ?

                                                      Edit: laissez tomber j'ai eu accès à la correction, j'ai regardé la correction je vais essayer de le refaire si ça match je posterai mon code ici mais en clair pierrot avec raison il fallait faire une condition bool qu'on initialise a true.

                                                      -
                                                      Edité par IyasJ. 6 mai 2021 à 9:48:18

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        6 mai 2021 à 9:52:43

                                                        IyasJ. a écrit:

                                                        Ligne 16 je teste une initiale juste après un espace.

                                                        Ce n'est pas correct car la boucle commence à zéro.

                                                        Soit tu fais :

                                                                        if(i == 0)
                                                                        {
                                                                            copie[i] = titre[i];
                                                                        }
                                                                        else // i ne peut pas être égal à 0 dans la suite
                                                                        {
                                                                            if(titre[i-1] == ' ') // donc i-1 existe
                                                                            {
                                                                                copie[strlen(copie)+1] = '\0';
                                                                                copie[strlen(copie)] = titre[i];
                                                                            }
                                                                        }

                                                        comme tu faisais au début, soit tu fais comme je t'avais montré dans mon message précédent (qui évite des tests inutiles).

                                                        -
                                                        Edité par robun 6 mai 2021 à 9:54:44

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        Trouver un mot correspondant à son acronyme .

                                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                        • Editeur
                                                        • Markdown