Programme de l'algorithme naif en C

Fermé
yirachan - 14 oct. 2013 à 11:42
yira Messages postés 34 Date d'inscription lundi 19 avril 2010 Statut Membre Dernière intervention 23 juillet 2015 - 15 oct. 2013 à 22:01
Bonjour,

Je souhaite avoir une aide sur le programme en C de l'algorithme naif avec boucle interne, sans boucle rapide, sans sentinelle !


Merci.

6 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 14/10/2013 à 13:00
La "naïveté" se réfère au caractère évident ou simpliste. On ne sait pas de quel algorithme tu parles. Clarifie, stp (et clarifie aussi quel type d'aide tu attends).
0
Dal, je parle de l'algorithme naif qui permet de faire une recherche exacte d'un mot dans un texte !
J'espère que c'est plus clair comme ça :P
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
14 oct. 2013 à 13:31
Non, c'est toujours le brouillard, car tu n'as répondu qu'à moitié : décris ton algorithme, montre ton code C d'implémentation (copie-colle le entre balises "code" - clique sur le bouton à droite du bouton S), et dis nous là où tu bloques.
0
yira Messages postés 34 Date d'inscription lundi 19 avril 2010 Statut Membre Dernière intervention 23 juillet 2015
14 oct. 2013 à 17:45
Justement Dal c'est ça le souci, je n'ai jamais fais du C en plus pour l'algorithme j'ai juste trouvé qlq truc en internet donc je te montre ce que j'ai fais mais de n'importe quoi car tu risque de ne rien comprendre :/

"code"
/* Algorithme naif, avec boucle interne, sans boucle rapide, sans sentinelle */

#include <stdio.h>


int i; /*compteur*/
int j; /*compteur*/
int n ;
int m; /*longeur d'un mot*/
int calcul_occ (int occ); /*pour le calcul d'une occurance; pour trouver une occurance*/
char *x (int compt) ;
char *y (int comp);

int calcul_occ (int occ){

j = 0;
while (j <= n-m) {
int i = 0;

while ( (i < m) && (x(i) = y(i+j)) ) {
i = i+1;

if (i >= m) {
return occ;
printf ("Signaler une occurance %d\n", occ);
}
j = j+1;

}
}

}
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
15 oct. 2013 à 00:16
Salut yira,

Si l'algorithme n'est pas donné, tu dois le déterminer avant de te lancer dans le codage en C.

Cette page peut certainement t'aider :https://www.irif.fr/~carton//Enseignement/Algorithmique/Programmation/Pattern/MorrisPratt/

Cependant, il te faudra voir ton cours pour valider si cet algorithme comporte une "boucle interne", et ne comporte pas de "boucle rapide" ou de "sentinelle". Ce sont des notions qui ont dû t'être expliquées par la personne ayant rédigé l'énoncé (ton enseignant?).

En ce qui concerne ton code C. Tu devrais sérieusement revoir tes bases.

Je pense que tu confonds la syntaxe de déclaration d'une fonction et celle de déclaration d'un tableau avec tes x et y et le prototype de ta fonction n'a pas de sens pour moi.

Voilà une charpente de code C comportant un prototype raisonnable pour cette fonction, et permettant de tester l'implémentation de ton algorithme.

Je me permets de citer le passage du cours de M. Olivier CARTON, situé à l'adresse précitée, en commentaire de la fonction
int premiere_occurrence(char * motif, char * texte)
.

#include <stdio.h>

/**
* premiere_occurrence - recherche naïve de texte
*
* motif : motif à rechercher
* texte : texte où le motif est recherché
*
* retourne :
* -1 si le motif n'est pas présent
* ou la position de la première occurence
*/
int premiere_occurrence(char * motif, char * texte)
{
/*
* Pour chaque position possible du motif dans le texte,
* on teste si cette position est une occurrence du motif.
* Ce test est effectué en comparant les caractères du
* motif avec les caractères du texte de gauche à droite.
* Si tous les caractères du motif sont égaux aux
* caractères du texte aux positions correspondantes,
* une occurrence a été trouvée et la position de cette
* occurrence est retournée. Sinon, la recherche se poursuit
* en passant à la position suivante.
*/
}

int main(void)
{
char * motif = "Toto";
char * texte = "Le professeur demande à Toto :\n"
"- Toto, 3 et 3 ça fait quoi ?\n"
"- Match nul monsieur !";
int position;

position = premiere_occurrence(motif, texte);

if (position == -1)
{
printf("motif [%s] non trouvé dans le texte\n", motif);
}
else
{
printf("le motif [%s] a été trouvé en position %d\n",
motif, position);
/* le résultat correct est 25 */
}

return 0;
}

A toi de jouer :-)


Dal
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yira Messages postés 34 Date d'inscription lundi 19 avril 2010 Statut Membre Dernière intervention 23 juillet 2015
15 oct. 2013 à 13:39
Bonjour Dal :)

Merci bcp !

Je crois qu'on a pas le même algorithme naif sinon je vais essayer d'adapter ce que tu m'as fais à ce que je posséde moi !

Sinon, je t'avais bien dis que je suis nul en C mais j'essaye de l'apprendre.

Bon je vais un peu abusé mais j'ai encoure une autre question; si au lieu d'écrire l'algorithme naif et trouver un mot dans un texte on te demande d'écrire un analyseur lexical qui compte le nombre d'occurances des motifs : ACAT , ATTA , CGC , CGCAA dans une molécule d'ADN codé sous la forme d'un fichier texte ?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
15 oct. 2013 à 16:24
Si tu veux compter le nombre d'occurrences, en principe, il "suffit" de modifier l'algorithme pour qu'au lieu de retourner la position de la première occurrence, il incrémente un compteur d'occurrences et continue la recherche sur la suite de la chaine de texte, puis retourne le compteur lorsque la fin de la la chaine de texte est atteinte.

Cela dit, je ne m'y connais pas trop en molécules d'ADN.

Si tu as "CGCAACAT", et que tu cherches "ACAT", tu vas le trouver, et si tu recherches "CGCAA" tu vas le trouver aussi, et je ne sais pas si le fait qu'ils partagent un caractère a une importance pour toi, en particulier si ta recherche doit indiquer le nombre d'occurrences de "ACAT" et de "CGCAA".


Dal
0
yira Messages postés 34 Date d'inscription lundi 19 avril 2010 Statut Membre Dernière intervention 23 juillet 2015
15 oct. 2013 à 22:01
En faite Dal, pour dire exacte c'est un analyseur lexical, je ne sais pas si t'as fais de la compilation ou pas mais justement c'est ce qu'il faut faire; un analyseur qui permet d'analyser le nombre d'occurrence dans les 4 mots que je t'avais données sous la forme d'un fichier texte !

Je ne sais pas si je suis clair ou y a qlq chose de bizarre !!!
0