Tom's Guide > Forum > Programmation > [RESOLU] probleme de log en C .[Merci a Coca25]
Mot :    Pseudo :           
 

Hello,

je savais pas trop ou poster ceci ... lol


Donc voila j'ai un travail a rendre pour demain a mon cour de c mais ca fait 2-3 jours que je suis bloquer sur un probleme ... et je ne vois pas ce que j'ai oublier ...

Quelqu'un pourrait m'aider ? SVP

Je met tout le programme(si on peut appeler ca un programme xD ) pour que vous aillez plus facile a m'aider a trouver la soluce ...

voici le programme

Mon logiciel plante au case D a la recherche dichotomique ... o_O

Code :
  1. [code]#include<stdlib.h>
  2. #include<stdio.h>
  3. #include<conio.h>
  4. #include<string.h>
  5. #define MAX 20
  6. #define maxcol 30
  7. void verifmenu (int);
  8. void IntroduirePrenom(char *,int);
  9. void Ajout(char *, int);
  10. void Trier(char **, int);
  11. void Permuter(char **, char **);
  12. void Afficher(char *, int);
  13. void Affichertri(char **, int);
  14. void main ()
  15. /***************************************/
  16. /*INPUT:
  17. /*PROCESS:
  18. /*OUTPUT:
  19. /***************************************/
  20. {
  21.         char tab[MAX][MAX],
  22.                 *ptab[MAX],
  23.         //      *pre,
  24.         //      *pre2,
  25.                 cible[maxcol],
  26.                 *pcible,
  27.                 recherche,
  28.                 choix,
  29.                 choix1;
  30.         int nbr = 0,
  31.                 pos = 0,
  32.                 cpt,
  33.                 inf,
  34.                 m,
  35.                 i,
  36.                 sup,
  37.                 rech;
  38.         
  39.         do
  40.         {
  41.                 
  42.                 do
  43.                 {     
  44.                         system("cls" );
  45.         
  46.                         printf("Ajouter un prenom                  [A]\n" );
  47.                         printf("Afficher les prenoms non tries     [B]\n" );
  48.                         printf("Afficher les prenoms tries         [C]\n" );
  49.                         printf("Rechercher un prenom dans la liste [D]\n" );
  50.                         printf("Quitter le programme              [E]\n" );
  51.                         printf("\n Votre choix ? : " );
  52.                         fflush(stdin);
  53.                         choix = getchar ();
  54.                         choix = toupper(choix);
  55.                         
  56.                         verifmenu (choix);
  57.                 }
  58.                 while(choix!='A' && choix!='B' && choix !='C' && choix!='D' && choix!='E');
  59.         
  60.                 system("cls" );
  61.                 switch(choix)
  62.                 {
  63.                         case 'A': printf("------- Ajout de prenom -------\n" );
  64.                                         
  65.                                         ptab[pos]=&tab[pos][0];
  66.                                         Ajout(&tab[0][0], nbr);
  67.                                         Trier(&ptab[0], nbr);
  68.                                         nbr++;
  69.                                         pos++;
  70.                                         break;
  71.                         case 'B': printf("------- Affichage des prenoms non tries -------\n\n" );
  72.                                         
  73.                                         Afficher(&tab[0][0], nbr);
  74.                                         getch();
  75.                                         break;
  76.                         case 'C': printf("------- Affichage des prenoms tries -------\n\n" );
  77.                                         
  78.                                         Affichertri(&ptab[0], nbr);
  79.                                         getch();
  80.                                         break;
  81.                         case 'D': printf("------- Recherche d'un prenom -------\n\n" );
  82.                                         
  83.                                         do
  84.                                         {
  85.                                                 pcible=&cible[0];
  86.                                                 cpt=0;
  87.                                                 
  88.                                                 printf("Veuillez introduire les lettre du prenom que vous recherchez: " );
  89.                                                 
  90.                                                 fflush(stdin);
  91.                                                 recherche=getchar();
  92.                                                 recherche=toupper(recherche);
  93.                                                 while((cpt<maxcol-1) && (recherche!='\n'))
  94.                                                         {
  95.                                                                 if(recherche=='-')
  96.                                                                         {
  97.                                                                                 *pcible=recherche;
  98.                                                                                 pcible++;
  99.                                                                                 recherche=getchar();
  100.                                                                                 recherche=toupper(recherche);
  101.                                                                         }
  102.                                                                 else
  103.                                                                         {
  104.                                                                                 *pcible=recherche;
  105.                                                                                 pcible++;
  106.                                                                                 recherche=getchar();
  107.                                                                                 recherche=tolower(recherche);
  108.                                                                         }
  109.                                                                         cpt++;
  110.                                                         }
  111.                         
  112.                                                         *pcible='\0';
  113.                                                         pcible=&cible[0];
  114.                                                         //pre=ptab[0];
  115.                                                         //pre2=pre;
  116.                                                         inf=0;
  117.                                                         sup=cpt;
  118.                                                         i=0;
  119.                                                         printf("%d",cpt);
  120.                                                         while(inf<sup && *pcible!='\n')
  121.                                                         {
  122.                                                                 m=(inf+sup)/2;
  123.                                                                 rech=strcmp(&cible[0],*(&ptab[m]));
  124.                                                                 printf("TEST" );
  125.                                                                 if(rech == 0)
  126.                                                                 {
  127.                                                                         inf = sup+1;
  128.                                                                         printf("TEST1" );
  129.                                                                 }
  130.                                                                 else
  131.                                                                 {
  132.                                         
  133.                                                                         inf=m+1;
  134.                                                                         printf("TEST2" );
  135.                                                                 }
  136.                                                         }
  137.                                                         rech=strcmp(&cible[0],*(&ptab[m]));
  138.                                                         if(rech == 0)
  139.                                                         {     
  140.                                                                 printf("Resultat: " );
  141.                                                                 puts(*(&ptab[m]));
  142.                                                         }
  143.                                                         else
  144.                                                         {
  145.                                                                 
  146.                                                                 puts(&tab[0][0]);
  147.                                                         
  148.                                                         }
  149.                                                         printf("\n\nSouhaitez vous rechercher un autre prenom? [O/N]" );
  150.                                                         printf("=> " );
  151.                                                         fflush(stdin);
  152.                                                         choix1 = getchar();
  153.                                                         choix1 = toupper(choix1);
  154.                                         }while(choix1 == 'O');
  155.                                         break;
  156.                 }
  157.         }
  158.         while(choix!='E');
  159. }
  160. //Fonction affichant un message d'erreur si l'utilisateur effectue un mauvais choix
  161. void verifmenu (int verif)
  162. {
  163.         system("cls" );
  164.         if(verif < 65 || verif > 69)
  165.         {     
  166.                 printf("//!\\ Vous devez entrer un lettre entre A et E !!!" );
  167.                 printf("\n\nPour revenir au menu, appuyez sur n'importe quelle touche." );
  168.                 
  169.                 getch();
  170.         }
  171. }
  172. //Fonction introduisant l'ajout du prenom
  173. void Ajout(char *pp, int nbr)
  174. {     
  175.         pp = pp + (nbr * MAX);
  176.         printf("\nVeuillez entrer un prenom : " );
  177.         IntroduirePrenom(pp, MAX);
  178. }
  179. //Fonction pour introduire le prenom
  180. void IntroduirePrenom (char *pp, int max)
  181. {
  182.         char c;
  183.         int i = 0;
  184.         fflush(stdin);
  185.         c = getchar();
  186.         while((i<max-1) && (c != '\n'))
  187.         {
  188.                 if(i == 0)
  189.                 {
  190.                         *pp = toupper(c);
  191.                 }
  192.                 else    if(*(pp-1)==' ' || *(pp-1)=='-')
  193.                                 {
  194.                                         *pp = toupper(c);
  195.                                 }
  196.                                 else
  197.                                 {
  198.                                         *pp = tolower(c);
  199.                                 }
  200.                 pp++;
  201.                 i++;
  202.                 c = getchar();
  203.         }
  204.         *pp='\0';
  205. }
  206. //Fonction permettant le tri des prenoms lors de leurs ajouts
  207. void Trier(char **ppos, int nbr)
  208. {
  209.         char **pp;
  210.         for(pp=ppos+nbr;pp>ppos;pp--)
  211.         {
  212.                 if((strcmp(*pp,*(pp-1)))<0)
  213.                 {
  214.                         Permuter(pp,(pp-1));
  215.                 }
  216.         }
  217. }
  218. //Fonction permettant la permutation
  219. void Permuter(char **pa, char **pb)
  220. {
  221.         char *ptemp;
  222.         ptemp=*pa;
  223.         *pa=*pb;
  224.         *pb=ptemp;
  225. }
  226. //Fonction permettant l'affichage des prenoms non triés
  227. void Afficher(char *pp, int nbr)
  228. {
  229.         int cpt = 0;
  230.         int nbrLettre = 0;
  231.         while(cpt < nbr)
  232.         {
  233.                 if(*pp == '\0')
  234.                 {
  235.                         printf("\n" );
  236.                         cpt++;
  237.                         pp = pp + (MAX - nbrLettre);
  238.                         nbrLettre = 0;
  239.                 }
  240.                 else
  241.                 {
  242.                         printf("%c", *pp);
  243.                         pp++;
  244.                         nbrLettre++;
  245.                 }
  246.         }
  247. }
  248. //Fonction permettant l'affichage des prenom triés
  249. void Affichertri(char **pp, int max)
  250. {
  251.         char *ptemp, **pi;
  252.         for(pi=pp; pi<(pp+max); pi++)
  253.         {
  254.                 for(ptemp=*pi; *ptemp!='\0'; ptemp++)
  255.                 {
  256.                         printf("%c", *ptemp);
  257.                 }
  258.                 printf("\n" );
  259.         }
  260. }[/code]






Aidez moi svp


Message édité par royalwear le 28-02-2008 à 22:35:19
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

salut, tu joues trop avec les pointeurs (sans rien commenter) pour ne pas se tromper...
j'ai pas tout vu mais ptab est un tableau de pointeurs dont tu assignes les cases au fur et à mesure que tu ajoutes des noms.
supposons que tu en ajoutes 2
dans la partie recherche (que je n'ai pas bien saisi), le m est calculé avec le nombre de caractère tapés et utilisé comme indice pour ptab
supposons qu'on tapes 10 caractères, tu te retrouves à demander ptab[5], ce qui produit une erreur de segmentation.


Message édité par coca25 le 28-02-2008 à 21:54:34
------------------------------ Ne pas oublier le [resolu] pour finir le sujet.
Penser à voir les tutos, ca peut aider!
Répondre à coca25

EN faite le m me permet de faire la recherche dichotomique ...

Aussi non j'ai pas trop saisi mais ca doit etre moi qui doit etre fatiguer lol ...

Répondre à royalwear

pour faire de la recherche dichotomique, tu te fixes un intervalle et tu le divises par 2 à chaque fois.
le souci, c'est ton intervalle, tu prends comme borne supérieur le nombre de caractères tapés (cpt) et non le nombre de mots.

------------------------------ Ne pas oublier le [resolu] pour finir le sujet.
Penser à voir les tutos, ca peut aider!
Répondre à coca25

nn c'est le nombre de mot ... vu que je dois comparer dabord la 1ere lettre avec les mot en divisant a chaque fois par deux pas le mot mais le nombre de mot ...

Tu voic ce que je veux dire ?

Répondre à royalwear

je vois ce que tu veux dire mais c'est pas ce que tu programmes, après si tu prends meme pas la peine de relire ton code...

Citation :

sup=cpt;
i=0;
printf("%d",cpt);

 

while(inf<sup && *pcible!='\n')
{
m=(inf+sup)/2;
rech=strcmp(&cible[0],*(&ptab[m]));


je te laisse chercher où tu renseignes cpt


Message édité par coca25 le 28-02-2008 à 22:20:40
------------------------------ Ne pas oublier le [resolu] pour finir le sujet.
Penser à voir les tutos, ca peut aider!
Répondre à coca25

Le probleme est resolu ...

Merci a toi ...

le probleme ne venait pas de la .... mais je vais verifier ce que tu me dis car cela pourrait etre une autre erreur ...

Merci ...

Répondre à royalwear

et il venait d'où alors?

------------------------------ Ne pas oublier le [resolu] pour finir le sujet.
Penser à voir les tutos, ca peut aider!
Répondre à coca25

Le probleme venait de mon 1er if je ne faisais pas tout les cas ...

Par contre je ne comprend toujours pas ou tu vois une erreur ....

sup=cpt; => je met le nbr de mot dans sup


while(inf<sup && *pcible!='\n')
{
m=(inf+sup)/2; => Je met le resultat dans m (Je me trouve au mot du milieu 'on va dire')

rech=strcmp(&cible[0],*(&ptab[m])); => je compare le mot rechercher au mot du milieu ...


Message édité par royalwear le 28-02-2008 à 23:41:47
Répondre à royalwear

quel 1er if?? et si tu développais, ca serait pas plus mal.

Citation :


fflush(stdin);
recherche=getchar();
recherche=toupper(recherche);
while((cpt<maxcol-1) && (recherche!='\n'))
{
if(recherche=='-')
{
*pcible=recherche;
pcible++;
recherche=getchar();
recherche=toupper(recherche);
}
else
{
*pcible=recherche;
pcible++;
recherche=getchar();
recherche=tolower(recherche);
}
cpt++;
}


à la fin de la boucle, cpt ne correspond pas du tout au nombre de mot!!


Message édité par coca25 le 28-02-2008 à 23:52:56
------------------------------ Ne pas oublier le [resolu] pour finir le sujet.
Penser à voir les tutos, ca peut aider!
Répondre à coca25

J'ai enfin compris ce que tu essaye de m'expliquer depuis houla je ne sais meme plus combien de temps ... xD

En effet j'ai confondu le "cpt" que j'utilise pour connaitre le nbr de lettre du mot ...
et le "nbr" qui lui compte le nombre de mot ....

Code :
  1. [b]sup=[strike]cpt;[/strike]  nbr;[/b]
  2. while(inf<sup && *pcible!='\n')
  3. {
  4.   m=(inf+sup)/2;
  5.   rech=strcmp(&cible[0],*(&ptab[m]));
  6. }



Un grand merci ...

Répondre à royalwear
Tom's Guide > Forum > Programmation > [RESOLU] probleme de log en C .[Merci a Coca25]
Aller à :

Il y a 2438 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens