je donne :
#define LONGUEUR 80 typedef char texte[LONGUEUR]; void main(void) { texte ch,sch; printf("entrez votre chaine"); scanf("%s",ch); //pas de & car déjà inclus dans &(ch[0]) printf("entrez votre sous-chaine"); scanf("%s",sch); cherche(sch,ch); }
cherche est une fonction qui doit dire où et combien de fois on trouve la souschaine dans la chaine.
Exemple : chaine="FONCTION", souschaine="ON", on trouve deux fois la souschaine, enposition 1 et 6.
void cherche(texte souschaine,texte chaine) { int i,nb=0; for(i=0;chaine[i];i++) { for(j=0;souchaine[j]&&chaine[i+j];j++) //tant que pas à la fin de l'1 des 2 if(souschaine[j]!=chaine[i+j])break; //dès différence, sortie anticipée de la boucle if(!souschaine[j]) printf("%dième position : %d\n",++nb,i); //si arrivé au bout de souschaine, c'est trouvé } }
on se limite à 20 lignes maxi, mais 1 seule sous-chaîne. Pour chaque ligne indiquer où et combien de fois, puis faire le total.
changements par rapport à la sol précédente :
dans main :
texte ch; devient : texte ch[20];
ainsi que
printf("entrez votre chaine"); scanf("%s",ch); devient int nb=0,i=0,cpt=0; do { printf("entrez votre chaine, ligne vide pour finir"); gets(ch[nb]); if(*(ch[nb])nb++; else break; //sortir de la boucle si chaîne vide } while (nb<20);
ainsi que
cherche(sch,ch); devient for(i=0;i<nb;i++) { printf("pour la ligne %d :\n",i+1); cpt+=cherche(sch,ch[i]); } printf("sur toutes les lignes, trouvé en tout %d fois.\n",cpt);
cherche est également modifié : ne retourne plus void mais int, et return(nb); en dernière ligne
je reste limité à 20 lignes, mais je ne veux occuper, pour chaque ligne, que la place nécessaire (je n'ai pas prévu d'allonger une ligne en cours de programme).
correction : rajouter la déclaration de type globale :
typedef char textev[]; ou typedef char *textev;
(type texte à longueur variable, les deux écritures sont (presque) équivalentes)
dans main, je déclare :
texte tmp, sch; textev ch[20]; gets(ch[nb]); if(*(ch[nb])nb++; else break; devient gets(tmp); if(*tmp) { ch[nb]=malloc((strlen(tmp)+1)*sizeof(char)); //prévoir le \0 strcpy(ch[nb],tmp); nb++; } else break;
rien d'autre ne change.
#define LONGUEUR 80 typedef char texte[LONGUEUR]; typedef char *textev; int cherche(textev souschaine,textev chaine) //texte allait aussi mais cherche marche pour toute longueur de chaîne, même >80 { int i,nb=0; for(i=0;chaine[i];i++) { for(j=0;souchaine[j]&&chaine[i+j];j++) //tant que pas à la fin de l'1 des 2 if(souschaine[j]!=chaine[i+j])break; //dès différence, sortie anticipée de la boucle if(!souschaine[j]) printf("%dième position : %d\n",++nb,i); //si arrivé au bout de souschaine, c'est trouvé } return(nb); } void main(void) { texte tmp,sch; textev ch[20]; int nb=0,i=0,cpt=0; do { printf("entrez votre chaine, ligne vide pour finir"); gets(tmp); if(*tmp) { ch[nb]=malloc((strlen(tmp)+1)*sizeof(char)); //prévoir le \0 strcpy(ch[nb],tmp); nb++; } else break; } while (nb<20); printf("entrez votre sous-chaine"); scanf("%s",sch); for(i=0;i<nb;i++) { printf("pour la ligne %d :\n",i+1); cpt+=cherche(sch,ch[i]); } printf("sur toutes les lignes, trouvé en tout %d fois.\n",cpt); }
retour au sommaire des travaux pratiques d'informatique.