Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Problème avec un programme en C

  1. #1
    kati

    Problème avec un programme en C

    Salut, j’ai un sujet de programmation devant moi c'est la première foi que je dois programmer un programme assez grand comme celui la on faite j'ai trouver des problème en première parti suivante :
    Sachant que les préconisions des opérations qui s'appelle iemesucc, iemperd et supa sont :
    Soient g du type graphe s, s1, s2 du type sommet et i du type entier.
    a) pré(iemesucc(g,s,i))=exs(g,s)^ 1<=i<=de(g,s).
    b) pré(iemepred(g,s,i))=exs(g,s)^ 1<=i<=di(g,s);
    c) pré(supa(g,s1,s2))=exa(g,s1,s2 )ce qu'est demander c'est de programmer en C les trois opération .
    Pouvez vous m’aider par quoi je dois commencer ce projet et merci??

    -----


  2. Publicité
  3. #2
    PA5CAL

    Re : Problème avec un programme en C

    Bonjour

    Même si on arrive à entrevoir de quoi il s'agit, tu pourrais commencer par nous expliquer un peu ton formalisme.

    pré( ) de( ) di( ) exa( ) exs( ) ... qu'ès aco ?

  4. #3
    kati

    Re : Problème avec un programme en C

    préd ça veut dire prédécesseur du graphe et: succ son successeur
    moi j'ai essayé de faire les précondition de ses fonctions/
    par exemple iemesucc(g,s,i): il suffit de se positionner sur la cellule de la liste d'adjacence du sommet s et de renvoyer le champ succ de cette cellule
    iempered(g,s,i): il faut parcourir les sommets s de graphe à la recherche du ieme prédcesseur de S .
    supa(g,s,i):il suffit de supprimer le sommet S2 de la liste d'djacence du sommets S1 la thechnique de suooression consiste à utiliser deux pointeur
    un pointeur pls qu'il faut positionner sur la cellule à suprimer un autre pointeur plp qu'il faut positioner sur la cellule pointé ,il ya deux cas
    1ére cas supprission au début de la liste .
    2éme cas cas génerale :suppression au milieu ou à la fin de la liste.

    aprés que je donne ses précondition je dois donc les programmer ?? si vous vouler plus d'explication sur mon prob je suis là et merci pour votre réponce ça me fait un grand plaisir merci encore une fois .

  5. #4
    kati

    Re : Problème avec un programme en C

    bonjour
    vraiment vous avez raison et je suis désolé car j'ai pas bien expliquer. exs():ca veux dire l' exestance d'un sommet parceque on ne peut pas calculer le iemesuccésseur d'un graphe sans avoire l'existance d'un sommet tout d'abort ,
    et de meme pour le iemprédecesseur,
    exa(): c a d existance d'un arc de graphe.
    de : demi_degré extérieure ,
    di :demi_intérieur;
    bon jai commencer la traduction de l'algorithme que j'ai donner à mon prog dans lequel je dois ajouter le iemesuccesseur iempréd etc .....et tous ce que jai demander dans ma premiere question ...vraiment je sais pas comment ajouter ces opperation??.




    #include <stdio.h>
    #include <stdlib.h>

    #define MAXSOM 100 /* Nombre maximal de sommets dans un graphe. */

    typedef int sommet; /* Les sommets sont des entiers positifs ou nuls. */

    typedef enum {false, true} boolean; /* Déclaration d'un type booléen. */

    typedef struct ladj
    {
    sommet suc; /* Successeur d'un sommet. */
    float v; /* Valuation d'un arc. */
    struct ladj *suiv; /* Successeur suivant dans la liste d'adjacence. */
    } ladj; /* liste d'adjacence (ou de successeurs) d'un sommet. */

    typedef struct unsommet
    {
    int de; /* Demi-degré extérieur (ou nombre de successeurs) d'un sommet. */
    int di; /* Demi-degré intérieur (ou nombre de prédécesseurs) d'un sommet. */
    ladj *la; /* Pointeur sur la liste d'adjacence de ce sommet. */
    } unsommet;

    typedef struct graphe
    {
    unsommet gr[MAXSOM]; /* Tableau de pointeurs sur les listes d'adjacence. */
    int n; /* Nombre de sommets dans un graphe. */
    } graphe; /* Définition du type de données graphe. */

    void grnouv(graphe *g)
    {
    g->n = 0;
    }

    void adjs(graphe *g)
    {
    /* Insertiondu sommet s = nbsom(g) + 1 à la position nbsom(g)
    (ou g->n). */

    /* Insertion d'un sommet isolé. */
    g->gr[g->n].de = g->gr[g->n].di = 0;
    g->gr[g->n].la = NULL;
    ++g->n;
    }

    void adja(graphe *g, sommet s1, sommet s2, float v)
    {
    /* Il est plus simple d'inserer s2 au début de la liste. */

    ladj *ptr = (ladj *) malloc(sizeof(ladj));
    ptr->suc = s2;
    ptr->v = v;
    ptr->suiv = g->gr[s1-1].la;
    g->gr[s1-1].la = ptr;
    ++g->gr[s1-1].de; /* Un successeur de s1 a été ajouté. */
    ++g->gr[s2-1].di; /* Un prédécesseur de s2 a été ajouté. */
    }

    void sups(graphe *g)
    {
    /* On ne peut supprimer que le dernier sommet s'il existe et s'il est isolé. */
    --g->n;
    }

    void supa(graphe *g, sommet s1, sommet s2)
    /* On suppose que l'arc (s1, s2) existe. */

    {

    }

    int de(graphe *g, sommet s)
    {
    return g->gr[s-1].de;
    }

    int di(graphe *g, sommet s)
    {
    return g->gr[s-1].di;
    }

    sommet iemesucc(graphe *g, sommet s, int i)
    {
    /* On suppose que la précondition est vérifiée, c-à-d, le sommet
    s existe et 1 <= i <= de(g,s). */

    }

    sommet iemepred(graphe *g, sommet s, int i)
    {
    /* On suppose que la précondition est vérifiée, c-à-d,, le sommet s
    existe et 1 <= i <= di(g,s). */

    }

    boolean exs(graphe *g, sommet s)
    {
    return (1 <= s) && (s <= g->n);
    }

    boolean exa(graphe *g, sommet s1, sommet s2)
    {
    if((1 <= s1) && (s1 <= g->n))
    {
    ladj *ptr = g->gr[s1-1].la;

    while ((ptr != NULL) && (ptr->suc != s2))
    ptr = ptr->suiv;

    if(ptr != NULL) /* On forcément ptr->suc == s2. */
    return true;
    else return false;
    }
    else return false;
    }

    float va(graphe *g, sommet s1, sommet s2)
    {
    /* On suppose que l'arc (s1,s2) existe. */

    ladj *ptr;

    for(ptr = g->gr[s1-1].la; (ptr != NULL) && (ptr->suc != s2); ptr = ptr->suiv);

    return ptr->v;
    }

    int nbsom(graphe *g)
    {
    return g->n;
    }

    void creegr(graphe *g)
    {
    int n; /* Nombre de sommets dans un graphe. */
    int i;
    do
    {
    printf("Entrer le nombre de sommets du graphe : ");
    scanf("%d",&n);
    }
    while(n < 0);

    /* Adjonction des sommets isolés au graphe. */
    for(i = 1; i <= n; ++i)
    adjs(g);
    }
    void affichegr(graphe *g)
    {
    sommet i;
    ladj *ptr;

    printf("\n-------------AFFICHAGE DU GRAPHE---------------\n\n");
    for (i = 1; i <= g->n; ++i)
    {
    printf("Sommet %d (de:%d,di:%d) : ",i,g->gr[i-1].de,g->gr[i-1].di);
    ptr = g->gr[i-1].la;
    while( ptr != NULL)
    {
    printf("%d ( %f ) ",ptr->suc,ptr->v);
    ptr = ptr->suiv;
    }
    printf("\n");
    }
    }

    void Message(void)
    {
    printf("Taper une touche pour continuer");
    fflush(stdin);
    getchar();
    }

    void clrscr()
    {
    int i;
    for(i = 0; i <= 45; ++i)
    printf("\n");
    }

    main() /* Programme principal. */
    {
    graphe g;
    int choix;
    sommet s, s1, s2;
    float val;

    grnouv(&g); /* Initialisation du grapge g. */

    do
    {
    clrscr();

    printf(" MENU : TRAITEMENT DES GRAPHES ORIENTES\n\n");

    printf("====================== ============================== =====================\n");
    printf(" 1 : Creation d'un graphe ne contenant que des sommets isoles.\n");
    printf(" 2 : Adjonction d'un arc et de sa valuation entre deux sommets du graphe.\n");
    printf(" 3 : Affichage d'un graphe.\n");
    printf(" 4 : Suppression d'un arc.\n");
    printf(" 5 : Nombre de successeurs d'un sommet.\n");
    printf(" 6 : Nombre de prédécesseurs d'un sommet.\n");
    printf(" 7 : Afficher les successeurs d'un sommet.\n");
    printf(" 8 : Afficher les predecesseurs d'un sommet.\n");
    printf(" 9 : Fin de la session.\n");
    printf("====================== ============================== =====================\n");

    printf("\nVotre choix : ");
    scanf("%d",&choix);

    switch(choix)
    {
    case 1 : creegr(&g);
    printf("\nLa creation d'un graphe ne contenant que des sommets isoles est effectuee.\n\n");
    break;
    case 2: printf("Entrer le sommet origine de l'arc (>= 1 et <= %d): ",nbsom(&g));
    scanf("%d",&s1);
    if(!exs(&g,s1)) printf("\n\nAttention, le sommet %d origine de l'arc n'existe pas.\n",s1);
    else
    {
    printf("\nEntrer le sommet extremité l'arc (>= 1 et <= %d): ",nbsom(&g));
    scanf("%d",&s2);
    if(exa(&g,s1,s2)) printf("\n\nAttention, l'arc (%d,%d) existe deja.\n",s1,s2);
    else
    {
    printf("\nEntrer la valuation de l'arc (%d,%d) : ",s1,s2);
    scanf("%f",&val);
    adja(&g,s1,s2,val);
    printf("\nL'arc (%d,%d) est ajoute au graphe.\n",s1,s2);
    }
    }
    break;
    case 3 : affichegr(&g); break;
    case 4 : printf("Entrter le sommet origine de l'arc a supprimer (>= 1 et <= %d: ",nbsom(&g));
    scanf("%d",&s1);
    if (!exs(&g,s1))
    printf("\n\nAttention, le sommet %d n'existe pas.\n",s1);
    else
    {
    printf("Entrter le sommet extremite de l'arc a supprimer (>= 1 et <= %d): ",nbsom(&g));
    scanf("%d",&s2);
    if (!exs(&g,s2))
    printf("\n\nAttention, le sommet %d n'existe pas.\n",s2);
    else
    if (!exa(&g,s1,s2))
    printf("\n\nAttention, l'arc (%d,%d) n'existe pas.\n",s1,s2);
    else
    {
    supa(&g,s1,s2);
    printf("\nSuppression de l'arc (%d,%d) effectuée",s1,s2);
    }
    }

    break;
    case 5 : printf("Entrer un sommet (>= 1 et <= %d) : ",nbsom(&g));
    scanf("%d",&s);
    if (!exs(&g,s))
    printf("Le sommet %d n'existe pas",s);
    else
    {
    int i;
    printf("Les successeur du sommet : %d : \n",s);
    for (i = 1; i <= de(&g,s); ++i)
    printf("%d\t",iemesucc(&g,s,i) );
    printf("\n");
    }

    break;
    case 6 :
    case 7 : printf("Entrer un sommet (>= 1 et <= %d) : ",g.n); scanf("%d",&s);
    if (!exs(&g,s))
    printf("Le sommet %d n'existe pas",s);
    else
    {
    int i;
    printf("Les successeur du sommet : %d : \n",s);
    for (i = 1; i <= de(&g,s); ++i)
    printf("%d\t",iemesucc(&g,s,i) );
    printf("\n");
    }

    break;
    case 8 : printf("Entrer un sommet : "); scanf("%d",&s);
    if ( !exs(&g,s))
    printf("Le sommet %d n'existe pas.\n",s);
    else
    {
    int i;
    printf("Les predecesseurs du sommet : %d : \n",s);
    for (i = 1; i <= di(&g,s); ++i)
    printf("%d\t",iemepred(&g,s,i) );
    printf("\n");
    }

    break;
    } /* Fin de switch. */
    if(choix != 9) Message();
    }
    while(choix != 9);

    printf(" FIN DE LA SESSION\n\n");

    printf("Tapez une touche pour terminer.");
    getchar();

    }



    maintenant jai commencer le iéme successeur de maniere suivante :
    ptr.suc=g->gr[s-1].la
    mais je sais pas comment se incrémenter le ptr jusqu'a arriver au ieme successeur en sachant que tous les précondition son vérifier comme vous voyer sur ce programe ????merci encore une fois

  6. #5
    JPL

    Re : Problème avec un programme en C

    Petite remarque : si tu mettais ton code dans la balise Code , tu pourrais garder les indentations qui sont si utiles pour la lecture.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  7. #6
    kati

    Re : Problème avec un programme en C

    merci pr la remarque : est ce que ça marche la lécture mnt??

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXSOM 100 /* Nombre maximal de sommets dans un graphe. */
    
    typedef int sommet; /* Les sommets sont des entiers positifs ou nuls. */
    
    typedef enum {false, true} boolean; /* Déclaration d'un type booléen. */
    
    typedef struct ladj
    {
    sommet suc; /* Successeur d'un sommet. */
    float v; /* Valuation d'un arc. */
    struct ladj *suiv; /* Successeur suivant dans la liste d'adjacence. */
    } ladj; /* liste d'adjacence (ou de successeurs) d'un sommet. */
    
    typedef struct unsommet
    {
    int de; /* Demi-degré extérieur (ou nombre de successeurs) d'un sommet. */
    int di; /* Demi-degré intérieur (ou nombre de prédécesseurs) d'un sommet. */
    ladj *la; /* Pointeur sur la liste d'adjacence de ce sommet. */
    } unsommet;
    
    typedef struct graphe
    {
    unsommet gr[MAXSOM]; /* Tableau de pointeurs sur les listes d'adjacence. */
    int n; /* Nombre de sommets dans un graphe. */
    } graphe; /* Définition du type de données graphe. */
    
    void grnouv(graphe *g)
    {
    g->n = 0;
    }
    
    void adjs(graphe *g)
    {
    /* Insertiondu sommet s = nbsom(g) + 1 à la position nbsom(g)
    (ou g->n). */
    
    /* Insertion d'un sommet isolé. */ 
    g->gr[g->n].de = g->gr[g->n].di = 0;
    g->gr[g->n].la = NULL; 
    ++g->n;
    }
    
    void adja(graphe *g, sommet s1, sommet s2, float v)
    {
    /* Il est plus simple d'inserer s2 au début de la liste. */
    
    ladj *ptr = (ladj *) malloc(sizeof(ladj));
    ptr->suc = s2;
    ptr->v = v;
    ptr->suiv = g->gr[s1-1].la;
    g->gr[s1-1].la = ptr;
    ++g->gr[s1-1].de; /* Un successeur de s1 a été ajouté. */
    ++g->gr[s2-1].di; /* Un prédécesseur de s2 a été ajouté. */
    }
    
    void sups(graphe *g)
    {
    /* On ne peut supprimer que le dernier sommet s'il existe et s'il est isolé. */ 
    --g->n;
    }
    
    void supa(graphe *g, sommet s1, sommet s2)
    /* On suppose que l'arc (s1, s2) existe. */
    
    {
    
    }
    
    int de(graphe *g, sommet s)
    {
    return g->gr[s-1].de;
    }
    
    int di(graphe *g, sommet s)
    {
    return g->gr[s-1].di;
    }
    
    sommet iemesucc(graphe *g, sommet s, int i)
    {
    /* On suppose que la précondition est vérifiée, c-à-d, le sommet
    s existe et 1 <= i <= de(g,s). */
    
    }
    
    sommet iemepred(graphe *g, sommet s, int i)
    {
    /* On suppose que la précondition est vérifiée, c-à-d,, le sommet s
    existe et 1 <= i <= di(g,s). */
    
    }
    
    boolean exs(graphe *g, sommet s)
    {
    return (1 <= s) && (s <= g->n);
    }
    
    boolean exa(graphe *g, sommet s1, sommet s2)
    {
    if((1 <= s1) && (s1 <= g->n))
    {
    ladj *ptr = g->gr[s1-1].la;
    
    while ((ptr != NULL) && (ptr->suc != s2))
    ptr = ptr->suiv;
    
    if(ptr != NULL) /* On forcément ptr->suc == s2. */
    return true;
    else return false; 
    }
    else return false;
    }
    
    float va(graphe *g, sommet s1, sommet s2)
    {
    /* On suppose que l'arc (s1,s2) existe. */
    
    ladj *ptr;
    
    for(ptr = g->gr[s1-1].la; (ptr != NULL) && (ptr->suc != s2); ptr = ptr->suiv);
    
    return ptr->v; 
    }
    
    int nbsom(graphe *g)
    {
    return g->n;
    }
    
    void creegr(graphe *g)
    {
    int n; /* Nombre de sommets dans un graphe. */
    int i;
    do
    {
    printf("Entrer le nombre de sommets du graphe : ");
    scanf("%d",&n);
    }
    while(n < 0);
    
    /* Adjonction des sommets isolés au graphe. */
    for(i = 1; i <= n; ++i)
    adjs(g);
    }
    void affichegr(graphe *g)
    {
    sommet i;
    ladj *ptr;
    
    printf("\n-------------AFFICHAGE DU GRAPHE---------------\n\n");
    for (i = 1; i <= g->n; ++i)
    {
    printf("Sommet %d (de:%d,di:%d) : ",i,g->gr[i-1].de,g->gr[i-1].di);
    ptr = g->gr[i-1].la;
    while( ptr != NULL)
    {
    printf("%d ( %f ) ",ptr->suc,ptr->v);
    ptr = ptr->suiv;
    }
    printf("\n");
    }
    }
    
    void Message(void)
    {
    printf("Taper une touche pour continuer");
    fflush(stdin);
    getchar();
    }
    
    void clrscr()
    {
    int i;
    for(i = 0; i <= 45; ++i)
    printf("\n"); 
    }
    
    main() /* Programme principal. */
    {
    graphe g;
    int choix;
    sommet s, s1, s2;
    float val;
    
    grnouv(&g); /* Initialisation du grapge g. */
    
    do
    {
    clrscr();
    
    printf(" MENU : TRAITEMENT DES GRAPHES ORIENTES\n\n");
    
    printf("====================== ============================== =====================\n");
    printf(" 1 : Creation d'un graphe ne contenant que des sommets isoles.\n");
    printf(" 2 : Adjonction d'un arc et de sa valuation entre deux sommets du graphe.\n"); 
    printf(" 3 : Affichage d'un graphe.\n");
    printf(" 4 : Suppression d'un arc.\n");
    printf(" 5 : Nombre de successeurs d'un sommet.\n");
    printf(" 6 : Nombre de prédécesseurs d'un sommet.\n");
    printf(" 7 : Afficher les successeurs d'un sommet.\n");
    printf(" 8 : Afficher les predecesseurs d'un sommet.\n");
    printf(" 9 : Fin de la session.\n");
    printf("====================== ============================== =====================\n");
    
    printf("\nVotre choix : ");
    scanf("%d",&choix);
    
    switch(choix)
    {
    case 1 : creegr(&g);
    printf("\nLa creation d'un graphe ne contenant que des sommets isoles est effectuee.\n\n");
    break;
    case 2: printf("Entrer le sommet origine de l'arc (>= 1 et <= %d): ",nbsom(&g));
    scanf("%d",&s1);
    if(!exs(&g,s1)) printf("\n\nAttention, le sommet %d origine de l'arc n'existe pas.\n",s1);
    else
    {
    printf("\nEntrer le sommet extremité l'arc (>= 1 et <= %d): ",nbsom(&g));
    scanf("%d",&s2);
    if(exa(&g,s1,s2)) printf("\n\nAttention, l'arc (%d,%d) existe deja.\n",s1,s2);
    else
    {
    printf("\nEntrer la valuation de l'arc (%d,%d) : ",s1,s2);
    scanf("%f",&val);
    adja(&g,s1,s2,val);
    printf("\nL'arc (%d,%d) est ajoute au graphe.\n",s1,s2);
    } 
    }
    break;
    case 3 : affichegr(&g); break;
    case 4 : printf("Entrter le sommet origine de l'arc a supprimer (>= 1 et <= %d: ",nbsom(&g));
    scanf("%d",&s1);
    if (!exs(&g,s1))
    printf("\n\nAttention, le sommet %d n'existe pas.\n",s1);
    else
    {
    printf("Entrter le sommet extremite de l'arc a supprimer (>= 1 et <= %d): ",nbsom(&g));
    scanf("%d",&s2);
    if (!exs(&g,s2)) 
    printf("\n\nAttention, le sommet %d n'existe pas.\n",s2);
    else
    if (!exa(&g,s1,s2))
    printf("\n\nAttention, l'arc (%d,%d) n'existe pas.\n",s1,s2);
    else
    {
    supa(&g,s1,s2);
    printf("\nSuppression de l'arc (%d,%d) effectuée",s1,s2);
    }
    }
    
    break;
    case 5 : printf("Entrer un sommet (>= 1 et <= %d) : ",nbsom(&g));
    scanf("%d",&s);
    if (!exs(&g,s))
    printf("Le sommet %d n'existe pas",s);
    else
    {
    int i;
    printf("Les successeur du sommet : %d : \n",s);
    for (i = 1; i <= de(&g,s); ++i)
    printf("%d\t",iemesucc(&g,s,i) );
    printf("\n");
    }
    
    break; 
    case 6 :
    case 7 : printf("Entrer un sommet (>= 1 et <= %d) : ",g.n); scanf("%d",&s);
    if (!exs(&g,s))
    printf("Le sommet %d n'existe pas",s);
    else
    {
    int i;
    printf("Les successeur du sommet : %d : \n",s);
    for (i = 1; i <= de(&g,s); ++i)
    printf("%d\t",iemesucc(&g,s,i) );
    printf("\n");
    }
    
    break;
    case 8 : printf("Entrer un sommet : "); scanf("%d",&s);
    if ( !exs(&g,s))
    printf("Le sommet %d n'existe pas.\n",s);
    else
    {
    int i;
    printf("Les predecesseurs du sommet : %d : \n",s);
    for (i = 1; i <= di(&g,s); ++i)
    printf("%d\t",iemepred(&g,s,i) );
    printf("\n");
    }
    
    break;
    } /* Fin de switch. */
    if(choix != 9) Message();
    }
    while(choix != 9);
    
    printf(" FIN DE LA SESSION\n\n");
    
    printf("Tapez une touche pour terminer.");
    getchar();
    
    }

  8. #7
    Gre

    Re : Problème avec un programme en C

    Citation Envoyé par kati Voir le message
    merci pr la remarque : est ce que ça marche la lécture mnt??

    Code:
    boolean exa(graphe *g, sommet s1, sommet s2)
    {
    if((1 <= s1) && (s1 <= g->n))
    {
    ladj *ptr = g->gr[s1-1].la;
    
    while ((ptr != NULL) && (ptr->suc != s2))
    ptr = ptr->suiv;
    
    if(ptr != NULL) /* On forcément ptr->suc == s2. */
    return true;
    else return false; 
    }
    Quel horreur
    Désolé... mais c'est illisible.
    Les noms de variables ne sont pas significatifs (par exemple ptr, g et s2 ne donnent aucune indication sur ce qu'ils représentent).
    Il n'y a aucune indentation.
    Les commentaires ne sont absents ou ne sont pas pertinents: on ne met pas
    /* On forcément ptr->suc == s2. */ mais on explique le sens de la condition et ce que c'est censé représenté.
    Tu ne fais pas du code portable (le clrscr par exemple).
    Il est donc normal qu'à la moindre erreur tu sois paumée et incapable de t'y retrouver. En plus je t'assure que quand tu auras fini ton logiciel, personne n'osera plus jamais remettre le nez dans ce code. Conclusion il ne sera jamais maintenu. Même toi après qqs mois tu ne seras plus capable de le lire.

    Difficile de t'aider en plus.
    War does not decide who's right, but who's left. (Bertrand Russell)

  9. #8
    kati

    Re : Problème avec un programme en C

    ptr: c'est un pinteur
    g: c'est un graphe
    s2 :sommet num 2 du graphe
    pour les commentaire je vais les reformuler d'une maniere plus claire pour vous
    mais qu'est ce que vous avez pas compris exactement ??
    je veux ajouter que ce projet porte sur L'algorithme de Dijkstra
    ya pas d'autre reponse ????!!!!!

  10. #9
    invite7863222222222
    Invité

    Re : Problème avec un programme en C

    L'algorithme de Dijkstra
    T'aurais pu le dire avant, quand même.

    Un conseil met ici ton code de manière dépouillée de tout ce qui n'est pas important (du genre l'aide, ou l'interaction avec l'utilisateur).

    En gros, déjà écrit l'implémentation de l'algorithme (il devrait faire une trentaine de lignes) à proprement parler, commente-le pour que n'importe qui connaissant un peu l'algorithme puisse comprendre ce que tu as fait.
    Dernière modification par invite7863222222222 ; 12/05/2007 à 18h25.

  11. #10
    manu_mars

    Re : Problème avec un programme en C

    Simple curiosité: es-tu allé voir ce lien?
    lui: "le vide, ca creuse"
    elle: "A table!"

  12. #11
    Gre

    Re : Problème avec un programme en C

    Citation Envoyé par kati Voir le message
    ptr: c'est un pinteur
    g: c'est un graphe
    s2 :sommet num 2 du graphe
    pour les commentaire je vais les reformuler d'une maniere plus claire pour vous
    mais qu'est ce que vous avez pas compris exactement ??
    je veux ajouter que ce projet porte sur L'algorithme de Dijkstra
    ya pas d'autre reponse ????!!!!!
    J'avais compris que ptr était un pointeur et g un graphe.
    Mais le problème n'est pas là.

    Code:
    boolean exa(graphe *g, sommet s1, sommet s2)
    {
    if((1 <= s1) && (s1 <= g->n))
    {
    ladj *ptr = g->gr[s1-1].la;
    
    while ((ptr != NULL) && (ptr->suc != s2))
    ptr = ptr->suiv;
    
    if(ptr != NULL) /* On forcément ptr->suc == s2. */
    return true;
    else return false; 
    }
    1. g n'est pas un nom correct, alors que unGraphe en est un: dès que tu le rencontres tu sais que tu as affaire à un graphe. Mieux unGraphe_p ou p_graphe ou un truc illustrant que c'est un pointeur est plus précis. Le top serait pointeur_vers_un_graphe... Mais on peut partir du principe que tu ne manipulerais que des pointeurs de graphes auquel cas ceci pourrait être oublié si c'est expliqué dans de la documentation. Cependant, il n'y a pas de documentation pour ta fonction. Et exa ne m'inspire aucune idée de ce que fait cette fonction. Pas de doc et un nom qui n'est pas significatif => bonne chance de bug.
    2. ptr me dit que c'est un pointeur car c'est une abréviation courante... cependant je n'ai aucune idée en voyant ptr si tu pointes vers un nombre entier, un graphe, un sommet, une cacahuète ou un tableau de caractères... juste avant tu utilises g pour un pointeur. Donc d'une part ta variable n'est pas clair sur ce qu'elle représente (outre un pointeur) mais en plus ta notation n'est pas homogène car la nomenclature des pointeurs n'existe pas.
    3. Il y a un type ladj qu'est ce ? « limite adjacente » ? encore un nom qui n'est pas significatif.
    4. ton commentaire /* On forcément ptr->suc == s2. */ n'aide en rien... le but d'un commentaire est de renseigné celui qui lit ton code et de t'aider à valider ta conception. Ici tu écris du code. Un commentaire doit être le plus littéral possible. Il peut recopier une partie de l'algorithme de conception en pseudo-code. Ainsi si tu as une erreur, tu compares ce que tu voulais faire (ton commentaire) avec ce que tu as fait (le code de ta condition)... Si ici tu as une erreur, rien n'est clair (voir les autres remarques).
      [i] si suc est censé être un successeur, sâches que classiquement c'est succ l'abréviation de successeur. On utilise des abréviations que lorsque c'est une convention reconnue... sinon on mêle le lecteur plus qu'autre chose.
    Je n'ai pas parlé de l'indentation. L'indentation sert aussi à aider la validation. Tu peux être certaine qu'avec de telles habitudes tu souffriras régulièrement de bug (enfin ton code... pas toi :P) qui seront très difficile à retrouver. C'est pour cela qu'il faut savoir prendre le temps d'écrire des noms significatifs et de la documentation.

    Dis toi que tout le temps supplémentaire que tu passes à faire un effort de documentation, sera épargné en débuggage... très souvent avec un facteur 2 ou 3 même, quand ce n'est pas plus. Et je ne parle pas de la maintenance dans tout ça (qui représente 70% des coûts d'un logiciel). Les commentaires ne sont pas pour toi. Si tu as le besoin de les reformuler pour nous alors ce sont de très mauvais commentaires. Regardes ça g->gr[s1-1].la !! Il n'y a que toi qui le comprennes a priori. Mais le pire c'est que dans deux mois, si tu essayais de te relire tu ne te comprendrais probablement pas.

    Si tu fais attention à ça, ce qui demande un apprentissage qui est relativement ennuyeux au début, tu verras que beaucoup d'erreurs seront évitées ou seront évidentes (d'après Boehm 80% des erreurs logiciels sont vites trouvées et sont contenus dans 20% des modules, le reste étant beaucoup plus difficile à détecter). Sinon... bonne chance. Et je parle par expérience de celui qui a souffert pour corriger les erreurs de 10 ans d'informatique à programmer comme un ado hacker
    War does not decide who's right, but who's left. (Bertrand Russell)

  13. #12
    kati

    Re : Problème avec un programme en C

    Ok ok j'accepte tous ce que vous me dites à propos de mon programme mnt si vous pouvez : j’ai besoin de votre aide sur les étapes de la solution plus qu'au critique que je le considère constrictive et aussi très intéressant pour moi comme une débutante je suis tout à fait d'accort merci.

  14. #13
    Gre

    Re : Problème avec un programme en C

    Citation Envoyé par kati Voir le message
    Ok ok j'accepte tous ce que vous me dites à propos de mon programme mnt si vous pouvez : j’ai besoin de votre aide sur les étapes de la solution plus qu'au critique que je le considère constrictive et aussi très intéressant pour moi comme une débutante je suis tout à fait d'accort merci.
    Le truc c'est que je n'ai pas le courage de lire un tel programme et de chercher à t'aider. Je le fais parce que je suis payé pour corriger mes étudiantes et mes étudiants. Mais je ne le fais pas juste pour le plaisir de m'arracher les cheveux.
    Là c'est super abusé quand même. Si ton prof ne t'a jamais dit ça, alors il manque de sérieux -_-

    En réécrivant tes variables et en écrivant des commentaires appropriés (qui je le répète doivent commenter ce que tu veux faire et non ce que tu fais) tu as de bonne chance de retrouver qqs fautes.

    PS certains de mes collègues vont donner des cours dans une école au Maroc... on a un entente actuellement ^_^
    War does not decide who's right, but who's left. (Bertrand Russell)

  15. #14
    kati

    Re : Problème avec un programme en C

    Citation Envoyé par Gre Voir le message
    Le truc c'est que je n'ai pas le courage de lire un tel programme et de chercher à t'aider. Je le fais parce que je suis payé pour corriger mes étudiantes et mes étudiants. Mais je ne le fais pas juste pour le plaisir de m'arracher les cheveux.
    Là c'est super abusé quand même. Si ton prof ne t'a jamais dit ça, alors il manque de sérieux -_-

    En réécrivant tes variables et en écrivant des commentaires appropriés (qui je le répète doivent commenter ce que tu veux faire et non ce que tu fais) tu as de bonne chance de retrouver qqs fautes.

    PS certains de mes collègues vont donner des cours dans une école au Maroc... on a un entente actuellement ^_^
    Mon prof me le dit pas mais c’est parce que je dois comprendre cela .
    Pour l’école marocaine on a le plaisir alors d'avoir cette bonne qualité des rapports.

    Revenons à nous mouton j’ai presque compléter ces opération mais après, je trouve toujours des erreur d'exécution ? Je veux les détectés?

    par exemple :
    a) iemesuccesseur

    Code:
    sommet iemesucc(graphe *g, sommet s, int i)
    {
        /* On suppose que la précondition est vérifiée, c-à-d, le sommet
           s existe et 1 <= i <= de(g,s). */
           int     j;
           ladj *ptr = g->gr[s-1].la;
           for (j=1;j<i;++j)
           ptr=ptr->suiv;
           return ptr->suc;     
    }
    merci

  16. #15
    Gre

    Re : Problème avec un programme en C

    Citation Envoyé par kati Voir le message
    Mon prof me le dit pas mais c’est parce que je dois comprendre cela .
    Pour l’école marocaine on a le plaisir alors d'avoir cette bonne qualité des rapports.[...]
    J'ai trois étudiants de maîtrise qui viennent du Maroc... ils font du code bien commentés et de bonne qualité. Le pays n'est donc pas en cause ^_^

    Prenons ton exemple
    Code:
    sommet iemesucc(graphe *g, sommet s, int i)
    {
        /* On suppose que la précondition est vérifiée, c-à-d, le sommet
           s existe et 1 <= i <= de(g,s). */
           int     j;
           ladj *ptr = g->gr[s-1].la;
           for (j=1;j<i;++j)
           ptr=ptr->suiv;
           return ptr->suc;     
    }
    1. Qu'est censé faire exactement ta fonction ? Je me doute que c'est qqchose du genre trouver le ieme successeur. Mais qu'est-il censé se passer s'il n'y en a pas tant par exemple ?
    2. qu'est ce que la fonction de ?
    3. ton pointeur ptr représente quoi ? que représente ladj ?
    4. qu'est ce que gr ? et la ?
    5. quel sens à la soustration pour un sommet ? Est-ce qu'un sommet est un entier ? Ça paraît bizarre de faire [s-1]
    6. ton code pour ta boucle est mal indenté. Ça devrait ressembler à ça
      Code:
             for (j=1;j<i;++j)
                 ptr=ptr->suiv;
    7. qu'est censé faire cette boucle ? (commentaire)
    8. quel est la différence entre le suivant suivet le successeur suc?

    Je veux bien essayer de t'aider. Mais soit tu fais un effort... soit je laisse tomber
    War does not decide who's right, but who's left. (Bertrand Russell)

Discussions similaires

  1. compiler un programme assembleur avec le DOS
    Par pracede2005 dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 05/09/2006, 10h47
  2. programme html problème de taille avec fieldset
    Par mac44 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 0
    Dernier message: 28/04/2006, 08h52
  3. Problème avec un programme "injecteur de code"
    Par jozog47 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 3
    Dernier message: 18/04/2006, 09h05
  4. Execution d'un programme avec python
    Par Chrysander dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 06/09/2004, 16h47
  5. probleme d'UART sur uC Atmel 8515 programme avec IccAvr
    Par Thorhck dans le forum Électronique
    Réponses: 23
    Dernier message: 06/02/2004, 21h43