Partage
  • Partager sur Facebook
  • Partager sur Twitter

indice minimum d'un caractere

    25 octobre 2021 à 15:22:39

    Bonjour la communauté ! 

    SVP j'essaie de trouver l'indice minimum d'un caractère qui existe deux fois dans ma chaine mais je n'y arrive pas, voici mon code (indiceMin me retourne toujours 0). Dans mon code je cherche l'indice du caractère "m" il y a 14 et 15 mais moi je souhaite qu'il me retourne l'indice le plus petit ==> 14.

    j’apprécie tout aide et merci d'avance.

    int main() {
        char chaine[100]= "quel sinistre mmot!";
        int i, indice1, indice2;
        int n=strlen(chaine);
        int indiceMin=0;
        for (i=0; i<n; i++){
            if (chaine[i]=='m'){
                indice1=i;
            //printf("%d", indice1);
            }
            if (indice1<=indiceMin){
                indiceMin=indice1;
            }
        }
        printf("%d", indiceMin);
    }



    -
    Edité par ZakAad 25 octobre 2021 à 15:23:57

    • Partager sur Facebook
    • Partager sur Twitter
      25 octobre 2021 à 15:35:37

      Salut, ligne 11 ta condition ne sera jamais vraie car indice1 prend des valeurs supérieures à 0 et indiceMin est initialisée à 0
      • Partager sur Facebook
      • Partager sur Twitter
        25 octobre 2021 à 15:45:18

        KevinGL a écrit:

        Salut, ligne 11 ta condition ne sera jamais vraie car indice1 prend des valeurs supérieures à 0 et indiceMin est initialisée à 0

        Merci pour votre réponse ...même si je mets une valeur de 1000 par exemple ça ne change rien avez vous une solutions svp?

        • Partager sur Facebook
        • Partager sur Twitter
          25 octobre 2021 à 16:23:14

          Avec 4 variables i, indice1, indice2, indiceMin qui peuvent servir d'indice dans le tableau, tu as fait ce qu'il fallait pour arriver à t'y perdre tout seul.

          Admettons que ça soit indiceMin que tu cherches. Comme i va en grandissant, dès que chaine[i] contient ce que tu cherches, c'est bon tu l'as, tu peux poser indiceMin = i et arrêter la boucle.

          Il y a des cas où le caractère cherché n'est pas dans la chaîne.  Et ce n'est pas la même chose que d'avoir l'indiceMin égal à 0 (qui est indice du premier caractère).

          La solution traditionnelle est de choisi, dans ce cas, une "valeur impossible" (out of band) comme -1 pour indiquer, par convention, qu'on n'a pas trouvé.

          -
          Edité par michelbillaud 25 octobre 2021 à 16:25:15

          • Partager sur Facebook
          • Partager sur Twitter
            25 octobre 2021 à 16:25:03

            #include <stdio.h>
            #include <string.h>
            
            int main(void)
            {
                char chaine[100]= "quel sinistre mmot!";
                int n=strlen(chaine);
                int i=0;
                for (i=0; i<n; i++) if (chaine[i]=='m') break;
                printf("%d", i);
            
                return 0;
            }

            -
            Edité par Zero.c 25 octobre 2021 à 16:25:58

            • Partager sur Facebook
            • Partager sur Twitter
              25 octobre 2021 à 16:34:17

              @zero.c: ton code n'est pas correct, il va afficher la longueur du mot si la lettre n'est pas trouvée.

              -
              Edité par edgarjacobs 25 octobre 2021 à 16:36:06

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                25 octobre 2021 à 16:39:31

                oui

                -
                Edité par rouIoude 25 octobre 2021 à 16:40:50

                • Partager sur Facebook
                • Partager sur Twitter
                ...
                  25 octobre 2021 à 16:43:43

                  Voilà qui devrait aller mieux.

                  #include <stdio.h>
                  #include <string.h>
                  
                  int main(void)
                  {
                      char chaine[100]= "quel sinistre mmot!";
                      int n=strlen(chaine);
                      int i=0;
                      for (i=0; i<n; i++) if (chaine[i]=='m') break;
                      if(i==n) printf("Caractere absent.");
                      else printf("caractere à la position %d", i);
                      
                      return 0;
                  }



                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 octobre 2021 à 17:02:13

                    En se passant de strlen()

                    #include <stdio.h>
                    
                    int main(void) {
                        char str[]="quel sinistre mmot!";
                    	char *p=str;
                    
                    	while(*p)
                    		if(*p=='m')
                    			break;
                    		else
                    			p++;
                    	if(*p)
                    		printf("trouve en %d\n",(int)(p-str));
                    	else
                    		puts("pas trouve");
                    
                        return 0;
                    }



                    -
                    Edité par edgarjacobs 25 octobre 2021 à 17:02:53

                    • Partager sur Facebook
                    • Partager sur Twitter

                    On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                      25 octobre 2021 à 17:24:59

                      J'abonde dans le sens de michelbillaud:
                      int indiceMinimum = -1;
                      for(int i=0; tableau[i]; i++) {
                          if(tableau[i] == valeur) {
                              indiceMinimum = i;
                              break;
                          }
                      }
                      if(indiceMinimum < 0)
                          printf("Pas trouvé\n"0);
                      else
                          printf("l'indice minimum est %d\n", indiceMinimum);

                      -
                      Edité par PierrotLeFou 25 octobre 2021 à 17:26:45

                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        25 octobre 2021 à 17:47:10

                        Comme le PO utilise strlen() dans son code initial, j'imagine qu'il pourrait utiliser strchr() de la bibliothèque standard, pour trouver le pointeur vers la première occurrence et, si elle existe, faire une soustraction pour obtenir l'information recherchée (comme le propose edgarjacobs).

                        #include <stdio.h>
                        #include <string.h>
                        
                        int main(void) {
                            char str[] = "quel sinistre mmot!";
                            char * p = strchr(str,'m');
                        
                            if(p)
                                printf("trouve en %d\n",(int)(p-str));
                            else
                                puts("pas trouve");
                        
                            return 0;
                        }

                        https://www.cplusplus.com/reference/cstring/strchr/

                        A moins qu'il ne s'agisse d'un exercice, bien sûr.

                        -
                        Edité par Dlks 25 octobre 2021 à 17:48:06

                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 octobre 2021 à 17:51:41

                          Ou, si on tombe sur des sectaires qui refusent les breaks à cause des Saintes Ecritures de Dijkstra dont ils n'ont en réalité jamais lu un traître mot :

                          int indiceMinimum = -1;
                          for (int i=0; indiceMinimum < 0 && tableau[i]; i++) {
                              if(tableau[i] == valeur) {
                                  indiceMinimum = i;
                              }
                          }
                          if (indiceMinimum < 0)
                              printf("Pas trouvé\n"0);
                          else
                              printf("l'indice minimum est %d\n", indiceMinimum);
                          }
                          


                          Autre solution, utilisation conjointe d'un booléen qui indique si indiceMinimum a un sens ou pas. Il passe à vrai quand on a trouvé, alors on l'appelle trouvé, pas bête, hein :

                          bool trouve = false;
                          int indiceMinimum = -1;
                          
                          for (int i=0; ! trouve && tableau[i]; i++) {
                              if (tableau[i] == valeur) {
                                  indiceMinimum = i;
                                  trouve = true;
                              }
                          }
                          
                          if (trouve) {
                              printf("l'indice minimum est %d\n", indiceMinimum);
                          } else {
                              printf("Pas trouvé\n");
                          }



                          -
                          Edité par michelbillaud 25 octobre 2021 à 17:59:14

                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 octobre 2021 à 18:08:14

                            @michelbillaud:
                            J'aime! Surtout la première version (je n'ai rien contre les bool, la première est plus courte, c'est tout ...)

                            La paresse est la mère de tous les vices ...
                            bool trouve = false;
                            int indiceMinimum;
                            for(indiceMinimum=0; !trouve && tableau[indiceMinimum]; indiceMinimum++) {
                                if (tableau[indiceMinimum] == valeur)   trouve = true;
                            }
                            if(trouve)
                                printf("L'indice minimum est %d\n", indiceMinimum - 1);
                            else
                                printf("Pas trouvé\n");

                            Ou bien:
                            int indiceMinimum = 0;
                            while(tableau[indiceMinimum] && tableau[indiceMinimum] != valeur)   indiceMinimum++;
                            if(tableau[indiceMinimum])
                                printf("L'indice minimum est %d\n" indiceMinimum);
                            else
                                printf("Pas trouvé\n");

                            Et si on paie 20 euros la ligne ...
                                int indiceMinimum = 0;
                                while(tableau[indiceMinimum] && tableau[indiceMinimum] != valeur)   indiceMinimum++;
                                printf((tableau[indiceMinimum]) ? "L'indice minimum est %d\n" : "Pas trouvé", indiceMinimum);

                            -
                            Edité par PierrotLeFou 25 octobre 2021 à 19:13:41

                            • Partager sur Facebook
                            • Partager sur Twitter

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

                              25 octobre 2021 à 20:57:27

                              Et les fonctions, personnes n'y a pensé ?

                              #include <stdio.h>
                              #include <stdbool.h>
                              
                              bool getCharPos(const char *str, char c, int *pos)
                              {
                                  for(int i=0; str[i]!='\0'; i++)
                                  {
                                      if(str[i]==c)
                                      {
                                          *pos=i;
                                          return true;
                                      }
                                      i++;
                                  }
                                  return false;
                              }
                              
                              int main(void)
                              {
                                  char chaine[100]= "quel sinistre mmot!";
                                  int indice;
                                  if(getCharPos(chaine, 'm', &indice)) printf("position %d", indice);
                                  else printf("pas trouve");
                              
                                  return 0;
                              }



                              • Partager sur Facebook
                              • Partager sur Twitter
                              ...
                                26 octobre 2021 à 19:18:54

                                @rouloude: petit problème dans ton code: la ligne 13 est en trop.

                                Et j'avais pensé à une fonction,  mais je ne sais pas si le po les connait:

                                #include <stdio.h>
                                 
                                int getCharPos(char *str, char c) {
                                	char *s=str;
                                	while(*s && *s!=c)
                                		s++;
                                	return *s==0 ? -1 : (int)(s-str);
                                }
                                 
                                int main(void) {
                                	char chaine[100]= "quel sinistre mmot!";
                                	int indice;
                                	if((indice=getCharPos(chaine, 'm'))>=0)
                                		printf("position %d", indice);
                                	else
                                		printf("pas trouve");
                                
                                	return 0;
                                }
                                • Partager sur Facebook
                                • Partager sur Twitter

                                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                  26 octobre 2021 à 20:35:12

                                  Effectivement, j'avais commencé par un while et j'ai changé d'idée en cours de route et le i++ est resté.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  ...
                                    27 octobre 2021 à 9:29:51

                                    Merci à tous pour votre intervention mais je n'ai pas le droit d'utiliser aucune fonction appartient au langage c
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      27 octobre 2021 à 9:42:25

                                      Dans ce cas, tu ne dois pas non plus utiliser strlen() que tu utilisais dans ton code d'origine.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        27 octobre 2021 à 15:05:40

                                        On t'a montré que c'était possible de faire autrement.
                                        • Partager sur Facebook
                                        • Partager sur Twitter

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

                                        indice minimum d'un caractere

                                        × 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