Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème chaîne sans pointeur

Sujet résolu
    18 janvier 2021 à 18:50:31

    Bonjour

    Je me suis mis à la programmation sous C depuis quelques semaines seulement, et suis bloqué sur un exercice :

    Sans utiliser de pointeur, Ecrire la fonction partie_presente qui retourne 1 si une chaîne de caractère est présente dans une autre chaine de caractères et 0 sinon. Les deux chaînes seront passées en paramètre de la fonction.

    J'ai beau tourné le problème dans tous les sens, je n'arrive pas, je suis un novice, et c'est ma première de mande sur le forum, espérant ne pas l'avoir déposé dans le mauvais endroit, et espérant une aide de votre part.

    D'avance merci.

    #include<stdio.h>
    #include<string.h>
    /* c'est du langage C */
    int partie_presente(char ch1 [], char ch2[])
    {
        int i=0, j=0, k=0;
        int h=0, ps=0;
    	printf("Entrez une chaîne de caractères: ");
    	fgets(ch1,1000,stdin);
    	printf("Entrez la séquence recherchée: ");
    	fgets(ch2,1000,stdin);
        char tmp[strlen(ch2)];
    
        for(i=0; i<strlen(ch1); i++)
        {
            for(j=i; j<strlen(ch2) ; j++)
            {
                strncpy(tmp, ch1,strlen(ch2));
                 h=strcmp(tmp,ch2);           
            }
            if(h==0)
                {
                    ps=1;
                }
        }
    
        if(ps==1)
            printf("La séquence est présente\n");
        else
            printf("La séquence n'est pas présente\n");
    
        return ps;
    }
    
    int main()
    {
    	 char ch1[1000], ch2[1000];
    	 partie_presente(ch1, ch2);
    	 return 0;
    }
    
    



    • Partager sur Facebook
    • Partager sur Twitter
      18 janvier 2021 à 19:25:52

      VitelAdam a écrit:

      Ecrire la fonction partie_presente qui retourne 1 si une chaîne de caractère est présente dans une autre chaine de caractères et 0 sinon. Les deux chaînes seront passées en paramètre de la fonction. 

      Bon déjà tu ne respectes pas ce qui est demandé, Tu dois envoyer les chaînes de caractère en argument à la fonction et non pas les saisir dans la fonction ! Et la fonction doit juste renvoyer 1 si ch2 et présente dans ch1, c'est tout, elle ne doit rien afficher !
      Met ça en ordre avant de continuer !
      Ensuite, ton procédé me semble mal barré, normalement tu n'as pas besoin de calculer les longueur de chaîne (strlen), ni de faire de copie (strncpy, ni de comparaison de chaîne (strcmp), seulement des comparaisons de caractères.
      Je viens de le faire j'ai utilisé des boucles while car ça me semble plus simple, à toi de voir.


      • Partager sur Facebook
      • Partager sur Twitter
        18 janvier 2021 à 19:58:32

        @rouloude

        Bonsoir

        Tout d'abord, merci pour cette réponse rapide et pour vos indications.

        J' ai saisi la demande et la saisie de la chaine dans la fonction car au fait, ceci est une partie d'un long exercice. Donc j'ai tronqué l'exercice et j'ai ajouté la demande et la saisie de la chaine dans la fonction pour que ceci soit clair.

        Une remarque : la chaine 1 est plus longue que la chaine 2, et la chaine 2 ne contient pas un seul caractère mais une partie ( un mot, une phrase ....)

        J'ai tout essayé (sans pointeur, comme ceci a été demandé) depuis 3 jours sans résultat, et je me suis tourné vers ce forum espérant de l'aide car je ne vois toujours pas mes erreurs.

        Merci

        -
        Edité par VitelAdam 18 janvier 2021 à 20:02:36

        • Partager sur Facebook
        • Partager sur Twitter
          18 janvier 2021 à 20:14:59

          Salut,

          Une seule boucle while contenant 2 lignes (dont un ternaire), 4 ou 5 lignes sinon.

          Rouloude a raison, tu sembles parti dans un truc compliqué pour quelque chose de très très simple. Prend une feuille et un crayon, et demande toi comment savoir si "salut" est dans "54sjtPOsalutOIUehd6"

          Je cherche le 's' de "salut" :

          • '5' n'est pas un 's'
          • '4' n'est pas un 's'
          • 's' est un 's'
          • maintenant je cherche le 'a'
          • 'j' n'est pas un 'a', je cherche de nouveau le 's'
          •  ...

          Bonne continuation.

          Edit : il faut savoir quelle chaîne doit être trouvée dans laquelle, mais la taille des chaînes n'y fait rien si la "contenante" est plus petite que la "contenue", le résultat sera la même que si la contenue n'est pas présente dans la contenante.

          -
          Edité par drx 18 janvier 2021 à 20:18:02

          • Partager sur Facebook
          • Partager sur Twitter

          Bonhomme !! | Jeu de plateforme : Prototype.

            18 janvier 2021 à 20:19:42

            rouloude a écrit:

            Ensuite, ton procédé me semble mal barré, normalement tu n'as pas besoin de calculer les longueur de chaîne (strlen), ni de faire de copie (strncpy, ni de comparaison de chaîne (strcmp), seulement des comparaisons de caractères.

            Je viens de le faire j'ai utilisé des boucles while car ça me semble plus simple, à toi de voir.



            Une remarque : la chaine 1 est plus longue que la chaine 2, et la chaine 2 ne contient pas un seul caractère mais une partie ( un mot, une phrase ....)

            • Partager sur Facebook
            • Partager sur Twitter
              18 janvier 2021 à 20:26:50

              J'ai très bien compris le but de l'exercice. On s'en fou de la longueur des chaînes ! Ça doit fonctionner quelque soit leurs longueur !

              VitelAdam a écrit:

              et la chaine 2 ne contient pas un seul caractère mais une partie ( un mot, une phrase ....)

               Relis toi ! "la chaine 2 ne contient pas un seul caractère" chez moi ça veux dire une chaîne vide !



              • Partager sur Facebook
              • Partager sur Twitter
                18 janvier 2021 à 20:33:01

                rouloude a écrit:

                 Relis toi ! "la chaine 2 ne contient pas un seul caractère" chez moi ça veux dire une chaîne vide !

                Je pense qu'il voulait dire : "la chaine 2 ne contient pas qu'un seul caractère"  ;)
                • Partager sur Facebook
                • Partager sur Twitter

                Bonhomme !! | Jeu de plateforme : Prototype.

                  18 janvier 2021 à 20:33:57

                  Merci @drx et @rouloude

                  je vais encore essayer, mais à un moment j'ai été démoralisé ....

                  rebonsoir

                  J'ai refait comme conseillé par drx et rouloude, mais j'ai l'impression qu'il ne vérifie la présence que d'un seul caractère, pour tester :

                  chaine 1 : une araignée au plafond

                  chaine 2 : fourmi

                  il me répond que chaine2 est dans chaine 1.

                  il est où l'erreur  s'il vous plait.

                  #include<stdio.h>
                  #include<string.h>
                  
                  int partie_presente(char ch1 [], char ch2[])
                  {
                      int i=0, j=0;
                  	printf("Entrez une chaîne de caractères: ");
                  	fgets(ch1,1000,stdin);
                  	printf("Entrez la séquence recherchée: ");
                  	fgets(ch2,1000,stdin);
                      
                      for(i = 0; ch1[i] != '\0'; ++i)
                  	{
                          while (ch1[i] == ch2[i])
                  			{
                  	            i=i+1;
                  	            return 1;
                  			}
                  	}
                  }
                  
                  int main()
                  {
                  	 char ch1[1000], ch2[1000];
                  	 partie_presente(ch1, ch2);
                  	 if (partie_presente)
                  	 printf("La séquence est présente\n");
                  	 return 0;
                  }
                  
                  

                  -
                  Edité par VitelAdam 18 janvier 2021 à 21:09:36

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 janvier 2021 à 22:13:19

                    Hello,

                    J'ai comme l'impression que c'est plus un problème d'algorithmique que de C. Il faut commencer par réfléchir à comment faire, avant de de faire feu de tout bois avec n'importe quoi comme code.

                    • 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

                      18 janvier 2021 à 23:18:20

                      rouloude a écrit:

                      Tu dois envoyer les chaînes de caractère en argument à la fonction et non pas les saisir dans la fonction ! 

                      A quoi servent les paramètres de la fonction si tu fais les saisies dans la fonction !!!

                      Edit :

                      Ligne 26 tu testes quoi ? Je crois que tu n'as pas compris l'utilisation des fonctions. Ce n'est pas de la sorte que l'on récupère le retour d'une fonction !  

                      -
                      Edité par rouloude 18 janvier 2021 à 23:28:08

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 janvier 2021 à 23:19:16

                        Commence petit , je reprends avec "salut" est-il dans "5sOsalOsalut6" ? :

                        je prend la première lettre de "salut", le 's', si je ne trouve même pas la première lettre, aucune chance d'y trouver le mot au complet.

                        Tant que je n'arrive pas à la fin de l'une des 2 chaînes :

                        • la 1ère lettre de "5sOsalOsalut6" est elle égale à la 1ère lettre de "salut" ? non, je continue à chercher le 's'
                        • la 2ième de "5sOsalOsalut6" est elle égale à la 1ère de "salut" ? oui, je passe à la lettre suivante le 'a'
                        • la 3ième de "5sOsalOsalut6" est elle égale à la 2ième de "salut" ? non, je reprend au 's'
                        • la 4ième de "5sOsalOsalut6" est elle égale à la 1ère de "salut" ? oui, je passe à la lettre suivante le 'a'
                        • la 5ième de "5sOsalOsalut6" est elle égale à la 2ième de "salut" ? oui, je passe à la lettre suivante le 'l'
                        • la 6ième de "5sOsalOsalut6" est elle égale à la 3ième de "salut" ? oui, je passe à la lettre suivante le 'u'
                        • la 7ième de "5sOsalOsalut6" est elle égale à la 4ième de "salut" ? non, je reprend au 's'
                        • la 8ième de "5sOsalOsalut6" est elle égale à la 1ère de "salut" ? oui, je passe à la lettre suivante le 'a'
                        • la 9ième de "5sOsalOsalut6" est elle égale à la 2ième de "salut" ? oui, je passe à la lettre suivante le 'l'
                        • la 10ième de "5sOsalOsalut6" est elle égale à la 3ième de "salut" ? oui, je passe à la lettre suivante le 'u'
                        • la 11ième de "5sOsalOsalut6" est elle égale à la 4ème de "salut" ? oui, je passe à la lettre suivante le 't'
                        • la 12ième de "5sOsalOsalut6" est elle égale à la 5ième de "salut" ? oui, je passe à la lettre suivante le '\0'
                        • fin de l'une des deux chaînes trouvée, la boucle s'arrête.
                        • si j'ai atteint le '\0' du mot que je cherche, c'est que j'ai trouvé ce mot, sinon, c'est que je suis arrivé à la fin de "5sOsalOsalut6" sans avoir trouvé toutes les lettres de "salut"

                        Bonne continuation.

                        EDIT : je ne t'ai pas tout dit, il pourrait y avoir 2 's' de suite dans la chaînes "contenante", il y a une ptite astuce ;).

                        -
                        Edité par drx 18 janvier 2021 à 23:25:54

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Bonhomme !! | Jeu de plateforme : Prototype.

                          19 janvier 2021 à 7:14:11

                          rebonsoir

                          J'ai refait comme conseiller par drx et rouloude, mais j'ai l'impression qu'il ne vérifie la présence que d'un seul caractère, pour tester :

                          chaine 1 : une araignée au plafond

                          chaine 2 : fourmi

                          il me répond que chaine2 est dans chaine 1.

                          il est où l'erreur  s'il vous plait.

                          #include<stdio.h>
                          #include<string.h>
                          
                          int partie_presente(char ch1 [], char ch2[])
                          {
                              int i=0, j=0;
                          	printf("Entrez une chaîne de caractères: ");
                          	fgets(ch1,1000,stdin);
                          	printf("Entrez la séquence recherchée: ");
                          	fgets(ch2,1000,stdin);
                              
                              for(i = 0; ch1[i] != '\0'; ++i)
                          	{
                                  while (ch1[i] == ch2[i])
                          			{
                          	            i=i+1;
                          	            return 1;
                          			}
                          	}
                          }
                          
                          int main()
                          {
                          	 char ch1[1000], ch2[1000];
                          	 partie_presente(ch1, ch2);
                          	 if (partie_presente)
                          	 printf("La séquence est présente\n");
                          	 return 0;
                          }
                          
                          



                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 janvier 2021 à 7:31:33

                            Bonjour,

                            l'erreur c'est ta méthode : avant de penser à commencer à coder il faut avoir un algo, ce que tu n'as pas et du coup tu cherches vaguement à tâtonner pour que ton programme tombe presque par hasard en marche.

                            Je te traduis en français ton code :

                                for(i = 0; ch1[i] != '\0'; ++i)
                                {
                                    while (ch1[i] == ch2[i])
                                        {
                                            i=i+1;
                                            return 1;
                                        }
                                }
                            

                            donne

                            pour toutes les positions i de ch1 qui contiennent un caractère faire
                                tant que le caractère en position i dans ch1 est le même que celui en position i dans ch2
                                    incrémenter i
                                    sortir de la fonction en renvoyant 1

                            Ce qui ne veut rien dire.

                            Normalement on fait tout ça dans l'autre sens :

                            On écrit un algo en français que l'on implémente en C ensuite …

                            Toi tu ponds un code et tu essayes d'en comprendre le sens ensuite … c'est forcément voué à l'échec.

                            Donc conseil : arrête tout, respire un grand coup, prend du papier et un crayon et essaye de résoudre le problème à la main, puis de pondre un algo puis ensuite tu seras libre comme le vent pour pisser du code.


                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 janvier 2021 à 10:19:19

                              drx a écrit:

                              Commence petit , je reprends avec "salut" est-il dans "5sOsalOsalut6" ? :

                              je prend la première lettre de "salut", le 's', si je ne trouve même pas la première lettre, aucune chance d'y trouver le mot au complet.

                              Tant que je n'arrive pas à la fin de l'une des 2 chaînes :

                              • la 1ère lettre de "5sOsalOsalut6" est elle égale à la 1ère lettre de "salut" ? non, je continue à chercher le 's'
                              • la 2ième de "5sOsalOsalut6" est elle égale à la 1ère de "salut" ? oui, je passe à la lettre suivante le 'a'
                              • la 3ième de "5sOsalOsalut6" est elle égale à la 2ième de "salut" ? non, je reprend au 's'
                              • la 4ième de "5sOsalOsalut6" est elle égale à la 1ère de "salut" ? oui, je passe à la lettre suivante le 'a'
                              • la 5ième de "5sOsalOsalut6" est elle égale à la 2ième de "salut" ? oui, je passe à la lettre suivante le 'l'
                              • la 6ième de "5sOsalOsalut6" est elle égale à la 3ième de "salut" ? oui, je passe à la lettre suivante le 'u'
                              • la 7ième de "5sOsalOsalut6" est elle égale à la 4ième de "salut" ? non, je reprend au 's'
                              • la 8ième de "5sOsalOsalut6" est elle égale à la 1ère de "salut" ? oui, je passe à la lettre suivante le 'a'
                              • la 9ième de "5sOsalOsalut6" est elle égale à la 2ième de "salut" ? oui, je passe à la lettre suivante le 'l'
                              • la 10ième de "5sOsalOsalut6" est elle égale à la 3ième de "salut" ? oui, je passe à la lettre suivante le 'u'
                              • la 11ième de "5sOsalOsalut6" est elle égale à la 4ème de "salut" ? oui, je passe à la lettre suivante le 't'
                              • la 12ième de "5sOsalOsalut6" est elle égale à la 5ième de "salut" ? oui, je passe à la lettre suivante le '\0'
                              • fin de l'une des deux chaînes trouvée, la boucle s'arrête.
                              • si j'ai atteint le '\0' du mot que je cherche, c'est que j'ai trouvé ce mot, sinon, c'est que je suis arrivé à la fin de "5sOsalOsalut6" sans avoir trouvé toutes les lettres de "salut"

                              Bonne continuation.

                              EDIT : je ne t'ai pas tout dit, il pourrait y avoir 2 's' de suite dans la chaînes "contenante", il y a une ptite astuce ;).

                              -
                              Edité par drx il y a environ 10 heures

                              Merci de votre retour, comme dit dans mon premier poste : je suis un novice et je me suis mis au C que depuis quelques semaines.

                              J'ai encore essayé de suivre vos recommandations , mais je bloque toujours au même endroit :

                              #include<stdio.h>
                              #include<string.h>
                              
                              int partie_presente(char ch1 [], char ch2[])
                              {
                                  int i=0, j=0;
                                  for(i = 0; ch1[i] != '\0'; ++i)
                              	{
                                      for(j=0;ch2[j]!='\0';++j)
                                          if (ch2[j] != ch1[i+j])
                              			{
                              	            i=i+1;
                              			}
                              	}
                                  		return 0;
                              }
                              
                              int main()
                              {
                              	char ch1[1000], ch2[1000];
                              	printf("Entrez une chaîne de caractères: ");
                              	fgets(ch1,1000,stdin);
                              	printf("Entrez la séquence recherchée: ");
                              	fgets(ch2,1000,stdin);
                              	partie_presente(ch1, ch2);
                              	if (partie_presente)
                              	    printf("La séquence n'est pas présente\n");
                              	 else 
                                          printf("La séquence est présente\n");
                              	 return 0;
                              }
                              
                              
                              




                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 janvier 2021 à 10:51:58

                                Salut,

                                Bon, pour commencer, si tu mets un return 0, ta fonction va toujours retourner 0...

                                Voici, ce que j'ai fait :

                                bool strInStr(char str1[], char str2[])
                                {
                                  int lire     = 0,
                                      comparer = 0;
                                
                                  tant que pas fin de str1 et pas fin de str2 :
                                  {
                                   si str1[lire] est égal à str2[comparer]
                                   {
                                      incrémenter lire;
                                   }
                                   sinon si lire>0
                                   {
                                     remettre lire à 0;
                                     reprendre en début de boucle;
                                   }
                                
                                   incrémenter comparer;
                                  }
                                
                                  retourner : str1[lire] est un caractère de fin de chaîne;
                                }
                                

                                Je crois que tu as tout, bonne continuation.

                                -
                                Edité par drx 19 janvier 2021 à 10:52:26

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Bonhomme !! | Jeu de plateforme : Prototype.

                                  19 janvier 2021 à 10:57:26

                                  Pour comprendre un peu comment ça fonctionne tu pourrais simplifier le problème dans un premier temps et essayer d'écrire (puis coder) une fonction qui vérifie si une chaîne commence par une autre, par exemple :

                                  int commence_par(char chaine[], char prefixe[]);


                                  renvoie 1 si chaine commence par prefixe.

                                  Pour te donner des indices :

                                  • toujours commencer à penser aux cas «particuliers»
                                    que se passe-t-il si la longueur des deux chaines est nulle ?
                                    si seulement une des deux chaines est vide ?
                                    si prefixe est plus longue que chaine ?
                                  • une fois que tu as traité/éliminé ces cas tu peux rentrer dans le vif du sujet.

                                  En algo ce serait qqch comme :

                                  algo commence_par( chaine, prefixe ) → entier
                                  
                                  // on peut partir du principe qu'avec un prefixe vide la fonction va toujours renvoyer 1
                                  si longueur(prefix) = 0 alors
                                      renvoyer 1
                                  
                                  // un prefixe doit toujours être plus court que la chaine
                                  sinon si longueur(chaine) < longueur(prefixe) alors
                                      renvoyer 0
                                  
                                  // si on arrive ici c'est que forcément 1 ≤ longueur(prefixe) ≤ longueur(chaine)
                                  sinon
                                      indice ← 0
                                      tant que prefixe[indice] = chaine[indice] et indice<longueur(prefixe) faire
                                          indice ← indice + 1
                                      fin tant que
                                  
                                      // au sortir de la boucle si indice vaut longueur(prefixe) c'est que la chaine commence par prefixe, sinon c'est qu'il y a eu un caractère différent à un moment donné
                                  
                                      si indice = longueur(prefixe) alors
                                          renvoyer 1
                                      sinon 
                                          renvoyer 0
                                      fin si
                                  fin si

                                  C'est un peu comme programmer en français, c'est plus clair et la traduction en C est aisée.

                                  Essaye donc de faire ça et ensuite de le modifier pour revenir au problème initial.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    19 janvier 2021 à 11:13:10

                                    Merci à vous drx et White Crow


                                    Je continuerai à chercher ce soir , mais c'est parfois décourageant ....  

                                    Je ne suis pas dans le domaine informatique du tout, et à 59 ans , je cherchais à ne pas vieillir trop vite ,  je ne suis pas bon jardinier non plus.

                                    Merci encore.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 janvier 2021 à 11:18:52

                                      Bah si tu veux te mettre à l'informatique, il y a peut-être des langages plus facile d'accès aux débutant comme python, ou son challenger qui monte en puissance → Julia.

                                      en revanche pour le jardinage j'ai deux mains gauches pas vertes du tout ✋✋je nepourrais donc pas t'aider 😀

                                      -
                                      Edité par White Crow 19 janvier 2021 à 11:19:35

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        19 janvier 2021 à 11:37:02

                                        rouloude a écrit:

                                        Ce n'est pas de la sorte que l'on récupère le retour d'une fonction !  

                                        Tu va avoir des difficultés à voir si ton code fonctionne : 

                                            partie_presente(ch1, ch2);
                                            if (partie_presente)
                                                printf("La séquence n'est pas présente\n");
                                             else
                                                    printf("La séquence est présente\n");

                                        à cause de ton code de test qui n'exploite pas le retour de la fonction. partie_presente n'est pas la valeur retourné par la fonction mais son adresse.

                                        Tu dois impérativement corriger cela pour pouvoir tester ta fonction !

                                         Pour récupérer le retour d'une fonction on procède ainsi :

                                          valeur = nom_fonction(/*parametre*/);





                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          19 janvier 2021 à 13:35:03

                                          Je trouve l'algorithme de drx un peu compliqué, du coup j'en propose un plus simple mais moins efficace (on va faire plus de comparaisons). De plus ça va me permettre de présenter la méthode que j'aime bien : partir du plus global et, ensuite, détailler. (C'est parce que l'algorithme de drx est d'entrée détaillé que je le trouve plus compliqué.)

                                          Principe : on cherche la petite chaîne en position 0, puis en position 1, puis en position 2 et ainsi de suite. On s'arrête si on la trouve, sinon on continue.

                                          Algorithme général :

                                          - Si ch1 est plus petite que ch2, ch2 ne peut pas être incluse, donc on retourne Faux.

                                          - Sinon, on cherche ch2 à chaque position possible (boucle) et, si on la trouve, on retourne Vrai.

                                          - Si en sortie de boucle on n'a toujours rien trouvé, on retourne Faux.

                                          Donc on peut écrire quelque chose comme :

                                          bool partie_presente(char* ch1, int taille1, char* ch2, int taille2)
                                          // retourne vrai si ch2 est incluse dans ch1
                                          {
                                             if (taille1 < taille2) return false ;
                                             bool trouve = false ;   // pour l'instant on n'a rien trouvé
                                             int debut = 0 ;  //
                                             inf fin = /* à calculer */
                                             for (int i = debut ; i <= fin ; i++)
                                             {
                                                trouve = partie_presente_n(ch1, taille1, ch2, taille 2, i)
                                                if (trouve) break ;
                                             }
                                             return trouve ;
                                          }

                                          où 'partie_presente_n' cherche si ch2 est présente en position n. Son prototype sera donc :

                                          bool partie_presente_n(char* ch1, int taille1, char* ch2, int taille 2, int n)

                                          Que faut la variable 'fin' ? Mettons que ch1 fasse 20 caractères (0 à 19) et ch2 fasse 5 caractères (0 à 4). Si ch2 est tout à la fin de ch1, il est situé dans ch1 aux indices 15 à 19. Donc fin = 15. De façon générale, on aura donc :

                                              fin = taille2 - taille1 ;

                                          Il ne reste plus qu'à écrire la fonction 'partie_presente_n', ce qui n'est pas difficile normalement.

                                          -
                                          Edité par robun 19 janvier 2021 à 13:37:41

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            19 janvier 2021 à 14:10:59

                                            Re,

                                            c'est l'explication qui semble compliquée, le code est relativement simple, comme la soluce a été lachée voici ce que j'avais:

                                            bool strInStr(char str[], char isInStr[])
                                            {//str is somewhere within isInStr ?
                                            
                                                int readIndex = 0,//char read index in str / starts from begin
                                                    compIndex = 0;//char compare index in isInStr / starts from begin
                                            
                                                //while none of strings ends
                                                while(  str[readIndex]      != '\0'
                                                    &&  isInStr[compIndex]  != '\0')
                                                {
                                                    if (str[readIndex] == isInStr[compIndex])   //same char
                                                    {
                                                        readIndex++;    //check next char in str
                                                    }
                                                    else if(readIndex)  //different and not first of str
                                                    {
                                                        readIndex = 0; //start again from 1st char of str
                                                        continue;      //continue without increment : isInStr[compIndex] needs to be compared again to str[0]
                                                    }
                                                    compIndex++;    //next char in isInStr to compare
                                                }
                                            
                                                return str[readIndex] == '\0';//success if end of str is reached
                                            }

                                            Pour tester :

                                            int main(void)
                                            {
                                            
                                                char str1[] = "salut",
                                                     str2[] = "kuFDUssalusalutFH549";
                                            
                                                printf("\"%s\" est-il dans \"%s\" ? : %s", str1, 
                                                                                           str2,
                                                                                           strInStr(str1, str2)? "oui" : "non");
                                            
                                                return 0;
                                            }

                                            Bonne continuation.


                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Bonhomme !! | Jeu de plateforme : Prototype.

                                              19 janvier 2021 à 14:16:04

                                              Robun, je pense que le prototype est imposé ! et passer la taille des chaînes de caractère à des fonctions qui travaille sur ces chaînes de caractères c'est pas top !

                                              Edit, bon ben, je mets la mienne : 

                                              int partie_presente(char ch1[], char ch2[])
                                              {
                                                  int i=0;
                                                  while(ch1[i]!='\0')
                                                  {
                                                      int j=0;
                                                      int k=i;
                                                      while(ch1[k]==ch2[j])
                                                      {
                                                          k++;
                                                          j++;
                                                          if(ch2[j]=='\0') return 1;
                                                      }
                                                      i++;
                                                  }
                                                  return 0;
                                              }

                                              -
                                              Edité par rouloude 19 janvier 2021 à 14:18:52

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                19 janvier 2021 à 15:16:46

                                                Bon je poste la mienne … j'ai essayé de faire clair  et pédagogique (ce qui n'est pas mon fort)

                                                #include <stdio.h>
                                                #include <string.h>
                                                
                                                int partie_presente(char botte_de_foin[], char aiguille[]);
                                                
                                                int main(void)
                                                {
                                                    char str1[] = "salut",
                                                         str2[] = "kuFDUssalusalutFH549";
                                                
                                                    printf("\"%s\" est-il dans \"%s\" ? : %s", str1,
                                                           str2,
                                                           partie_presente(str2, str1) ? "oui" : "non");
                                                
                                                    return 0;
                                                }
                                                
                                                int verifier_partie_presente_position(char botte_de_foin[], size_t a_partir_de, char aiguille[], size_t longueur_aiguille);
                                                
                                                int partie_presente(char botte_de_foin[], char aiguille[])
                                                {
                                                    size_t longueur_botte    = strlen(botte_de_foin);
                                                    size_t longueur_aiguille = strlen(aiguille);
                                                
                                                    // on commence par les cas limites
                                                    if (longueur_aiguille == 0)
                                                        return 1;
                                                    if (longueur_aiguille > longueur_botte)
                                                        return 0;
                                                
                                                    // on cherche un caractère dans botte de foin qui soit le même que le premier de aiguille
                                                    for (size_t i = 0; i <= longueur_botte - longueur_aiguille; i++) {
                                                        if ((botte_de_foin[i] == aiguille[0]) && verifier_partie_presente_position(botte_de_foin, i, aiguille, longueur_aiguille))
                                                            // si on le trouve alors on vérifie la présence d'aiguille à partir de cette position
                                                            return 1;
                                                    }
                                                    return 0;
                                                }
                                                
                                                int verifier_partie_presente_position(char botte_de_foin[], size_t a_partir_de, char aiguille[], size_t longueur_aiguille)
                                                {
                                                    // on compare botte_de_foin à partir de a_partir_de avec aiguille sur une longueur longueur_aiguille
                                                    // si on ne trouve aucune différence → c'est ok, sinon c'est que c'est pas bon
                                                    // ici on a l'assurance de ne faire aucun overflow
                                                    for (size_t i = 0; i < longueur_aiguille; i++)
                                                        if (botte_de_foin[a_partir_de + i] != aiguille[i])
                                                            return 0;
                                                    return 1;
                                                }
                                                



                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  19 janvier 2021 à 17:37:40

                                                  Salut,

                                                  je ne pense pas que la phase strlen() soit utile. strlen() est un scan de chaîne, s'il faut scanner les 2 chaînes en entier pour s'épargner d'avoir à les scanner en partie, il y a paradoxe. On peut à la rigueur vérifier que les arguments sont non NULL.

                                                  De plus, il n'est pas nécessaire de multiplier l'étude des cas d'echecs (ou réussite) possibles, quand une seule formule répond à toutes à la fois. On ne demande pas à la fonction si c'est trop court ou trop long, on demande si c'est dedans. Un argument NULL serait un cas de plantage, donc on peut vérifier, mais si l'algo fonctionne quelues soient les tailles, inutile de s'en inquiétre.

                                                  Après, la logique est la même, on cherche la première lettre, une fois trouvée, on déroule les 2 mots et si on est arrivé au bout de ce qu'on cherche, c'est qu'on l'a trouvé.

                                                  -
                                                  Edité par drx 19 janvier 2021 à 17:43:02

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  Bonhomme !! | Jeu de plateforme : Prototype.

                                                    19 janvier 2021 à 17:53:36

                                                    drx a écrit:

                                                    Salut,

                                                    [...]

                                                    Après, la logique est la même, on cherche la première lettre, une fois trouvée, on déroule les 2 mots et si on est arrivé au bout de ce qu'on cherche, c'est qu'on l'a trouvé.

                                                    -
                                                    Edité par drx il y a 9 minutes


                                                    Perso j'ai plus essayé de faire pédagogique qu'idiomatique.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      19 janvier 2021 à 21:54:40

                                                      Bonsoir

                                                      Merci à tous pour vos interventions et cette interréaction qui m'a semblé bien instructive.

                                                      Pour être honnête : J'ai fini par utiliser la fonction proposée par rouloude qui est courte .

                                                      N'empêche que les autres solutions étaient bonnes aussi.

                                                      Une petite histoire: Depuis mars dernier, on est confiné, déconfiné, couvre feu, présentiel, télétravail ...., j'ai 59 ans , mes enfants sont grands et sont partis (et c'est normal), ... au début on tue le temps par la lecture (je ne suis pas télé, mais du tout) , mais au bout d'un certain temps, la lecture devient imposée car rien d'autre à faire ...

                                                      Puis je me suis rappelé ma jeunesse et les années 80 , le bon vieux temps qu'être étudiant, avec la grande disquette-galette , avec du Basic puis QuickBasic, puis le Pascal et enfin le Turbo-Pascal et surtout les "goto" .... ( et ça s'arrête là pour moi).

                                                      En cherchant sur internet j'ai lu un peu partout que le langage de base est le "C" , et qui a conduit au C++ et même à Python. Je n'ai pas vérifié si c'est vrai, mais j'ai décidé de m'y mettre.

                                                      Ceci va faire fonctionner mes neurones, ne pas vieillir avant l'âge, m'occuper, et surtout trouver du plaisir (quand on arrive, bien sûr) .

                                                      Merci à vous tous.

                                                      (Je ne vois pas la case "cocher résolu" ! )

                                                      -
                                                      Edité par VitelAdam 19 janvier 2021 à 21:57:32

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        19 janvier 2021 à 22:02:02

                                                        VitelAdam a écrit:

                                                        En cherchant sur internet j'ai lu un peu partout que le langage de base est le "C" , et qui a conduit au C++ et même à Python.

                                                        Malheureux ! Tu cherches à déclencher une flamewar ? une guerre de religion ! 🤣

                                                        VitelAdam a écrit:

                                                        Ceci va faire fonctionner mes neurones, ne pas vieillir avant l'âge, m'occuper, et surtout trouver du plaisir (quand on arrive, bien sûr) .

                                                        Merci à vous tous.

                                                        Sérieux, essaye des langages comme python ou julia qui ont un interpréteur, ce qu'on appelle une interface REPL (Read, Eval, Print, Loop). C'est très interactif et ça devient très ludique avec les notebook html …

                                                        Jette un oeil sur jupyter que tu peux installer en local ou essayer online → https://jupyter.org/try 

                                                        Et remet un peu de fun dans tout ça :)

                                                        Bon courage !

                                                        a++ 🖖



                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          19 janvier 2021 à 23:24:43

                                                          Re,

                                                          Que tu choisisses tel ou tel code importe peu, tu aurais eu 100 codes différents si nous avions été 100 à proposer une solution (c'est une image).

                                                          Ce qui est important est que tu comprennes ce que ça fait et l'approche utilisée pour résoudre ce problème. ça ressemblait peut-être à une blague, mais ce n'en était pas une, même au 21ième siècle, un stylo et cahier restent une très bonne solution pour se mettre les idées au clair. J'ai un cahier plein de dessins, de chiffres et de notes dans lequel j’essaie différentes approches et refait mentalement un bout de code ligne par ligne en notant les résultats... Avec l'expérience, les projets se complexifient et les notes ne sont jamais de trop.

                                                          Pour passer en résolu ça se passe tout en haut au niveau du titre de ton post, à droite.

                                                          Bonne continuation.

                                                          PS : Reste sur le C, faire soi-même sa petite cuisine est plus stimulant que de se taper le cheeseburger froid des langages haut niveau ;)

                                                          -
                                                          Edité par drx 19 janvier 2021 à 23:29:48

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Bonhomme !! | Jeu de plateforme : Prototype.

                                                            19 janvier 2021 à 23:37:42

                                                            drx a écrit:

                                                            PS : Reste sur le C, faire soi-même sa petite cuisine est plus stimulant que de se taper le cheeseburger froid des langages haut niveau ;)

                                                            D'un autre côté, éplucher les oignons et pleurer, c'est pas toujours le pied :-) De même que faire une sauce béarnaise: elle est meilleure faite maison, mais quel boulot avant d'y arriver (oui, je cuisine). Alors oui, l'acheter toute faite, c'est pas mal quand on en trouve une bonne.

                                                            -
                                                            Edité par edgarjacobs 19 janvier 2021 à 23:41:44

                                                            • 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

                                                              19 janvier 2021 à 23:57:44

                                                              VitelAdam a écrit:

                                                              En cherchant sur internet j'ai lu un peu partout que le langage de base est le "C" , et qui a conduit au C++ et même à Python. Je n'ai pas vérifié si c'est vrai, mais j'ai décidé de m'y mettre.

                                                              La syntaxe du langage C (les accolades, les points-virgules, les nombreux opérateurs et notamment l'incrémentation par ++ et décrémentation par --, et la façon d'écrire les if, while, for, switch...) est effectivement une origine de la syntaxe de nombreux langages, dont C++, Java, JavaScript, PHP, C#.

                                                              Et le C++ a évolué à partir du C (l'inventeur de C++ travaillait vers 1980 au même endroit que l'inventeur de C) et évite de diverger inutilement de C.

                                                              Pour Python je ne connais pas trop.

                                                              En outre, C reste aussi utilisé pour écrire certains logiciels de base, comme le noyau Linux. C a été conçu pour la programmation système, c'est pour cela qu'il reste fondamental, même si on ne le voit plus guère dans les applications.

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Problème chaîne sans pointeur

                                                              × 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