IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Liste chainée / polynôme


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 15
    Par défaut Liste chainée / polynôme
    Bonsoir à tous !
    Je débute sur les listes chainées et on nous demande dans un projet de créer un polynôme(sous forme développée) sous forme de liste chainée dont les maillons sont des monomes eux même représentés par leur coefficient et leur degré. Les coefficients doivent de plus être son forme complexe (1-i) par exemple. Etant donné que j'ai pas mal de lacunes (voir beaucoup ) , j'ai juste pu créer les types de strcture pour le monome et le polynome:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <stdio.h>
       #include <stdlib.h>
     
       typedef struct monom monom{
       struct monom
       {
       int degre;
       int coeff;
       };
      typedef monom monome;
     
      typedef struct element element{
      struct element
      {
      monome m;
      struct element *nxt;
      };
      typedef element *PolyDeveloppe;

    Je ne sais pas vrament comment faire ensuite, peut etre créer une fonction pour préparer le monome et une autre pour afficher le polynome en appelant la fonction précédente ... Bref j'aimerai avoir des indices pour m'aider à avancer. En espérant une aide précieuse

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Déjà. je pense que le début est que cela compile non? On dirait que ton code ne compilerait même pas. Ensuite, en effet, une fonction pour créer un monome, une fonction pour l'ajouter à un polynôme, une fonction pour afficher un polynôme, changer un coefficient, etc.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 853
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hellowo Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       
       typedef struct monom monom{
       struct monom
       {
       int degre;
       int coeff;
       };
      typedef monom monome;
      typedef element *PolyDeveloppe;
    Bonjour

    En dehors des erreurs de syntaxe (accolade ouverte inutilement), partir avec des noms comme "monom", "monome" et surtout cacher une étoile derrière un type c'est le meilleur moyen d'aller au mur. Suffit d'un seul endroit où tu auras du &PolyDeveloppe (et ça arrivera fatalement dès que tu devras modifier ton premier élément) et tu ne sauras plus ce que tu manipules.

    Commence par adopter le standard conventionnel. Les structures se nomment s_xxx et les types t_xxx. Ensuite pose de bonnes bases bien solides. Tu as parlé de coefficient complexe mais je n'ai rien vu qui y ressemble. Arrête de penser systématiquement "int" dès que tu as un élément numérique sans réfléchir plus profondément sur la valeur possible de cet élément. Et surtout surtout crée-toi un type dédié à la liste elle-même. J'explique ici pourquoi avec un exemple complet de liste chainée mais le premier avantage de ce type c'est que ça t'évitera d'avoir à cacher ton étoile...

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    typedef struct {
        int reel;
        int img;
    } t_complex;
     
    typedef struct {
        unsigned short degre;
        t_complex coeff;
    } t_monome;
     
    typedef struct s_noeud {
        t_monome monome;
        struct s_noeud* next;
    } t_noeud;
     
    typedef struct {
        t_noeud *first;
    } t_liste;
     
    void liste_init(t_liste *l)
    {
        l->first=NULL;
    }
     
    int main()
    {
        t_liste liste;
        liste_init(&liste);
    }

    Ensuite ben comme l'a dit fearyourself, de petites fonctions dédiées à un travail bien précis que tu pourras appeler quand il faut (va voir l'exemple dont je t'ai parlé)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 15
    Par défaut
    Re,
    J'ai essayé de m'inspirer de l'exemple que tu m'as montré pour commencer à créer des fonctions afin d'afficher le polynome mais c'est un échec total ...
    En gros je sais qu'il y a des fonctions où je n'appelle pas le bon type et du coup forcément tout le code est faussé. De plus je ne pas comment gérer la structure avec les complexes. Néanmoins merci beaucoup de tes conseils sur le standart à adopter, je m'en servirai pour la suite.
    Voici le code(beaucoup inspiré de ton exemple mais que je n'ai pas su exploiter):
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct {
        int reel;
            int img;
    	} t_complex;
     
    typedef struct {
    	unsigned short degre;
    	t_complex coeff;
    }t_monome;
     
    typedef struct s_noeud{
    	t_monome monome;
    	struct s_noeud* next;
    }t_noeud;
     
    typedef struct{
    	t_noeud *first;
    }t_liste;
     
    void liste_init(t_liste *l)
    {
    	l->first = NULL;
    }
     
    t_noeud *noeud_ajout(unsigned short degre, int coeff)
    {
    	t_noeud *monome;
    	//allocation mémoire
    	if((monome = malloc(sizeof(t_noeud))) == NULL)
    	{
    		return NULL;
    	}
    	//remplissage
    	monome->degre = degre;
    	monome->coeff= coeff;
    	return monome;
    }
     
    t_liste *liste_insere(t_liste *liste, t_noeud *monome)
    {
    t_noeud *courant;
    	if(monome == NULL){
    		return NULL;
    	}
    //Quand la liste est vide
    if(liste->first == NULL)
    {
    	liste->first = monome;
    	return liste;
    }
    //pour le premier élément
    if(monome->degre > liste->first->degre) //Ici je cherche à placer un monome de degré supérieur à l'élément premier de la liste
    {
    	monome->suivant = liste->first;
    	liste->first = monome;
    	return liste;
    }
    //J'insère des monomes en remontant la liste tout en cherchant  à trier le polynome en placant les monomes de degré dans l'ordre décroissant
    for (courant = liste->first; courant->next != NULL && courant->next->degre > monome->degre; courant = courant->next){
    	monome->next = courant->next;
    	courant->next = monome;
    	return liste;
    }
    }
     
     
    void liste_affiche(t_liste * liste)
    {
    	if (liste == NULL)
    	{
    		exit(EXIT_FAILURE);
    	}
    	t_noeud *courant = liste;
    	printf("Polynome :");
    	while(courant != NULL)
    	{
    		printf("%dx^%d + ",courant->coeff, courant->degre);
    		courant = courant->next;
    	}
    	printf("\n");
    }
     
    int main()
    {
    	t_liste liste;
    	liste_init(&liste);
    liste_affiche(&liste);
    //insertion de monome
    liste_insere(&liste, noeud_ajout(1,2-i));
    liste_insere(&liste, noeud_ajout(3,3-i));
    liste_insere(&liste, noeud_ajout(4,1-i));
    liste_insere(&liste, noeud_ajout(2,6-i));
    liste_insere(&liste, noeud_ajout(0,3-i));
     
    return 0;
    }

    Bien sur cela ne compile pas ...
    Voilà peut etre que tout est à refaire mais il faudrai que je comprenne vraiment à quel type faire appel pour mes fonctions pour que cela marche.
    Merci d'avance

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Tu devrais utiliser quelques options à la compilation pour que le compilateur t'aide un peu dans le déboggage de ton code. Voila une copie de la compilation de ton code chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    main.c: In function ‘noeud_ajout’:
    main.c:37:8: error: ‘t_noeud’ has no member named ‘degre’
      monome->degre = degre;
            ^
    main.c:38:8: error: ‘t_noeud’ has no member named ‘coeff’
      monome->coeff= coeff;
            ^
    main.c: In function ‘liste_insere’:
    main.c:55:10: error: ‘t_noeud’ has no member named ‘degre’
     if(monome->degre > liste->first->degre) //Ici je cherche à placer un monome de degré supérie
              ^
    main.c:55:32: error: ‘t_noeud’ has no member named ‘degre’
     if(monome->degre > liste->first->degre) //Ici je cherche à placer un monome de degré supérie
                                    ^
    main.c:57:8: error: ‘t_noeud’ has no member named ‘suivant’
      monome->suivant = liste->first;
            ^
    main.c:62:68: error: ‘struct s_noeud’ has no member named ‘degre’
     for (courant = liste->first; courant->next != NULL && courant->next->degre > monome->degre; cou
                                                                        ^
    main.c:62:84: error: ‘t_noeud’ has no member named ‘degre’
     for (courant = liste->first; courant->next != NULL && courant->next->degre > monome->degre; cou
                                                                                        ^
    main.c: In function ‘liste_affiche’:
    main.c:76:21: error: initialization from incompatible pointer type [-Werror]
      t_noeud *courant = liste;
                         ^
    main.c:80:29: error: ‘t_noeud’ has no member named ‘coeff’
       printf("%dx^%d + ",courant->coeff, courant->degre);
                                 ^
    main.c:80:45: error: ‘t_noeud’ has no member named ‘degre’
       printf("%dx^%d + ",courant->coeff, courant->degre);
                                                 ^
    main.c: In function ‘main’:
    main.c:92:38: error: ‘i’ undeclared (first use in this function)
     liste_insere(&liste, noeud_ajout(1,2-i));
                                          ^
    main.c:92:38: note: each undeclared identifier is reported only once for each function it appears in
    main.c: In function ‘liste_insere’:
    main.c:67:1: error: control reaches end of non-void function [-Werror=return-type]
     }
    Les options utilisées ici : -Wunused -Wall -Werror

    Pour te donner une petite aide regarde comment tu as déclarer la structure d'un nœud :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct s_noeud{
    	t_monome monome;
    	struct s_noeud* next;
    }t_noeud;
    Première chose, il me semble que l'on t'a dit s_xxx pour les structures, t_xxx pour les types. Ici tu mélanges les écritures, pire, tu écris un code qui ne prends pas en compte le nom t_nœud (qui n'est donc pas opportun ici).
    La remarque est aussi valable pour t_monome et t_complex...

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 853
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hellowo Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdio.h>
     
    typedef struct {
    	unsigned short degre;
    	t_complex coeff;
    }t_monome;
     
    typedef struct s_noeud{
    	t_monome monome;
    	struct s_noeud* next;
    }t_noeud;
     
    t_noeud *noeud_ajout(unsigned short degre, int coeff)
    {
    	t_noeud *monome;
    	//allocation mémoire
    	if((monome = malloc(sizeof(t_noeud))) == NULL)
    	{
    		return NULL;
    	}
    	//remplissage
    	monome->degre = degre;
    	monome->coeff= coeff;
    	return monome;
    }
    monome est de type "t_noeud" (dans la famille "je me mélange tout" je voudrais le fils...). Et le paramètre reçu doit-être de type t_monome puisque c'est lui que tu veux stocker !!!
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    t_noeud *noeud_ajout(t_monome monome)
    {
    	t_noeud *noeud;
    	//allocation mémoire
    	if((noeud = malloc(sizeof(t_noeud))) == NULL)
    	{
    		return NULL;
    	}
    	//remplissage
    	noeud->next=NULL;
    	noeud->monome.degre=monome.degre;
    	noeud->monome.coeff.reel=monome.coeff.reel;
    	noeud->monome.coeff.img=monome.coeff.img;
    	return noeud;
    }
    Faudrait aussi quand-même étudier les types que je t'ai proposés...

    Citation Envoyé par hellowo Voir le message
    Bien sur cela ne compile pas
    Réellement on se demande pourquoi...???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Dans la foulée un autre exemple de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    s_noeud *noeud_ajout(unsigned short degre, int coeff)
    {
      s_noeud *monome;
      //allocation mémoire
      if((monome = malloc(sizeof(s_noeud))) == NULL)
        {
          return NULL;
        }
      //remplissage
      monome->degre = degre;
      monome->coeff= coeff;
      return monome;
    }
    J'ai déjà pris la liberté de mon côté de remettre de l'ordre dans tes structures. Donc ta fonction alloues un s_noeud mais ensuite tu veux accéder aux éléments de s_monome ! Le compilateur hurle à la mort C'est le bordel chef !

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    J'ajoute mes commentaires :

    Dans l'ensemble, ce n'est pas mal du tout et c'est très encourageant (il y a beaucoup de grincheux sur le forum mais ils ne sont pas méchants ). Un choix malheureux de certains identificateurs a conduit à des erreurs dans le code, mais il n'y a au final que peu d'erreurs ce qui ne demandent pas une refonte importante du code

    1-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
        int reel;
            int img;
    	} t_complex;
    Les champs pris ici comme entiers ne devraient-ils pas être des réels ?

    2- Dans noeud_ajout() :
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	t_noeud *monome;
    ...
    	monome->degre = degre;
    	monome->coeff= coeff;
    degre et coeff ne sont pas un champ de t_noeud. Tout vient d'une appellation fausse où un noeud a été appelé monome, d'où la confusion. Un bon choix des identificateurs est le plus utile des commentaires du code.
    - Si les coefficients sont complexes, il faut passer deux valeurs, l'une pour la partie réelle et l'autre pour la partie imaginaire
    - Le champ next n'a pas été initialisé à NULL. C'est risqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    t_noeud *noeud_ajout(unsigned short degre, int coeffr, int coeffi)
    {
       t_noeud *noeud;
       //allocation mémoire
       if((noeud = malloc(sizeof(t_noeud))) == NULL) return NULL;
       //remplissage
       noeud->monome.degre = degre;
       noeud->monome.coeff.reel = coeffr;
       noeud->monome.coeff.img = coeffi;
       noeud->next = NULL;
       return noeud;
    }
    3- Dans liste_insere()
    - Même remarque pour l'identificateur monome.
    - L'insertion en milieu de liste est fausse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    t_liste *liste_insere(t_liste *liste, t_noeud *noeud)
    {
       t_noeud *courant;
       if(noeud == NULL) return NULL;
       // Quand la liste est vide
       if(liste->first == NULL)
       {
          liste->first = noeud;
          return liste;
       }
       // pour le premier élément
       if(noeud->monome.degre > liste->first->monome.degre)
       // Ici je cherche à placer un monome de degré supérieur à l'élément
       // premier de la liste
       {
          noeud->next = liste->first;
          liste->first = noeud;
          return liste;
       }
       // J'insère des monomes en remontant la liste tout en cherchant à trier
       // le polynome en placant les monomes de degré dans l'ordre décroissant
       for (courant = liste->first; courant->next != NULL && courant->next->monome.degre > noeud->monome.degre; courant = courant->next)
       {  // le bloc est vide
       }
       noeud->next = courant->next;
       courant->next = noeud;
       return liste;
    }
    4- liste_affiche()
    - l'initialisation de courant est fausse
    - L'affichage sera à peaufiner plus tard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void liste_affiche(t_liste * liste)
    {
       t_noeud *courant = liste->first;
       if (liste == NULL)exit(EXIT_FAILURE);
       printf("Polynome :");
       while(courant != NULL)
       {
          printf("(%d+%di)x^%d + ",courant->monome.coeff.reel,courant->monome.coeff.img,
                                   courant->monome.degre);
          courant = courant->next;
       }
       printf("\n");
    }
    5- le main() modifié en conséquence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(void)
    {
       t_liste liste;
       liste_init(&liste);
       liste_affiche(&liste);
    //insertion de monome
       liste_insere(&liste, noeud_ajout(1,2,1));
       liste_insere(&liste, noeud_ajout(3,3,2));
       liste_insere(&liste, noeud_ajout(4,1,3));
       liste_insere(&liste, noeud_ajout(2,6,4));
       liste_insere(&liste, noeud_ajout(0,3,5));
       liste_affiche(&liste);
       return 0;
    }

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 15
    Par défaut
    Merci à tous pour vos réponses, j'ai mieux compris mes erreurs. J'ai une question surement bête mais j'aimerai bien comprendre: Pourquoi on n'écrit pas noeud.monome.coeff.réel par exemple au lieu de noeud->monome.coeff.réel ? Je vois pas vraiment pourquoi on doit utiliser un pointeur alors que monome est un élément du type noeud ..

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 853
    Billets dans le blog
    1
    Par défaut
    Parce que la variable "noeud" n'est pas de type "t_noeud" mais de type "t_noeud étoile". C'est donc un pointeur qui contient l'adresse d'un élément de type "t_noeud". Donc pour accéder aux membres de l'élément pointé, soit on écrit (*noeud).monome, soit on écrit noeud->monome qui signifie la même chose mais écrit avec une écriture simplifiée pour éviter de devoir mettre des parenthèses à chaque fois qu'on veut déréférencer le pointeur "noeud"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 15
    Par défaut
    Merci pour ces explications

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 15
    Par défaut
    Re,
    Pour mon polynôme spécial "liste chainé" je dois réaliser plusieurs opérations comme l'addition, la soustraction, la muliplication, la division (en gros c'est un projet avec pas mal de consignes sur les polynomes et je suis censé faire bonne impression lors du passage oral, un peu comme si je cherchais à "vendre" mon idée . Voici le code pour l'instant sans l'opération :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    typedef struct {
    	int reel;
    	int img;
    } t_complex;
     
    typedef struct {
    	unsigned short degre;
    	t_complex coeff;
    } t_monome;
     
    typedef struct s_noeud {
    	t_monome monome;
    	struct s_noeud* next;
    } t_noeud;
     
    typedef struct {
    	t_noeud *first;
    } t_liste;
     
    void liste_init(t_liste *l)
    {
    	l->first=NULL;
    }
     
     
    t_noeud *noeud_ajout(unsigned short degre, int coeffr, int coeffi)
    {
    	t_noeud *noeud;
    	//allocation mémoire
    	if((noeud = malloc(sizeof(t_noeud))) == NULL) return NULL;
    	//remplissage
    	noeud->monome.degre = degre;
    	noeud->monome.coeff.reel = coeffr;
    	noeud->monome.coeff.img = coeffi;
    	noeud->next = NULL;
    	return noeud;
    }
     
    t_liste *liste_insere(t_liste *liste, t_noeud *noeud)
    {
    	t_noeud *courant;
    	if(noeud == NULL) return NULL;
    	// Quand la liste est vide
    	if(liste->first == NULL)
    	{
    		liste->first = noeud;
    		return liste;
    	}
    	// pour le premier élément
    	if(noeud->monome.degre > liste->first->monome.degre)
    		// Ici je cherche à placer un monome de degré supérieur à l'élément
    		// premier de la liste
    	{
    		noeud->next = liste->first;
    		liste->first = noeud;
    		return liste;
    	}
    	// J'insère des monomes en remontant la liste tout en cherchant à trier
    	// le polynome en placant les monomes de degré dans l'ordre décroissant
    	for (courant = liste->first; courant->next != NULL && courant->next->monome.degre > noeud->monome.degre; courant = courant->next)
    	{  // le bloc est vide
    	}
    	noeud->next = courant->next;
    	courant->next = noeud;
    	return liste;
    }
    void liste_affiche(t_liste *liste)
    {
    	t_noeud *courant = liste->first;
    	if (liste == NULL)exit(EXIT_FAILURE);
    	while(courant != NULL)
    	{
    		printf("%di+%dx^%d",courant->monome.coeff.reel,courant->monome.coeff.img, courant->monome.degre); //Ici la variable n'est pas de type noeud mais de type noeud*. C'est donc un pointeur qui contient l'adresse d'un élément de type noeud. Pour accéder aux membres de l'élément pointé, soit on écrit (*noeud).monome, soit on écrit noeud->monome qui signifie la même chose mais écrit avec une écriture simplifiée.
    		courant = courant->next;
    		if (courant != NULL) {
    			if((rand()%2) == 1){
    				printf(" - ");
    			}
    			else{
    				printf(" + ");
    			}
    		}
    	}
    	printf("\n");
    }
     
     
    		int main()
    		{
    			t_liste liste;
    			liste_init(&liste);
    			liste_affiche(&liste);
    unsigned short i = 0;
    unsigned short degre = 0;
    int nombreDeMonomes = 0;
    int coeffRe = 0;
    int coeffIm = 0;
    			//insertion de monome
    			srand(time(NULL));
    			printf("Combien de monomes voulez vous insérer dans votre polynome: ");
    			printf("\n");
    			scanf("%d",&nombreDeMonomes);
    			for(i = 0; i < nombreDeMonomes; i++)
    			{
    				printf("Rentrer le degré, le coefficient réel et le coefficient imaginaire: ");
    				scanf("%hu",&degre);
    				scanf("%d%d",&coeffRe,&coeffIm);
    				liste_insere(&liste, noeud_ajout(degre, coeffRe, coeffIm));
    			}
    			liste_affiche(&liste);
    			return 0;
    		}

    Pour l'addition voilà ce que je pense faire mais je préfère vous demander conseil avant de coder la fonction.
    Je pensais à créer une fonction
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    void addition(t_liste *liste1, t_liste *liste2)
    Dans cette fonction je demande à l'utilisateur de rentrer le nombre de monomes, le degré, le coeff réel pour le premier et le deuxième polynome que je voudrais additionner ensemble. Du coup j'appelle dans ma fonction la fonction liste_insere et liste_affiche.
    Dès que j'ai mes 2 polynomes de près, je cherche à les additionner et à stocker le résultat dans une troisième liste. J'utilise les conditions suivantes:
    Si
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    courant1->monome.degre < courant2->monome.degre
    alors je stocke le monome de la liste 2 en premier. Sinon je stocke le monome de la liste 1. Par contre si j'ai une égalité alors je fais:
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    courant1->monome.coeff.reel + courant2->monome.coeff.reel
    ainsi que
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    courant1->monome.coeff.img + courant2->monome.coeff.img
    et ainsi de suite en parcourant la liste. Puis dès que tout est stocké dans la liste 3, je fais de nouveau appel a la fonction liste_affiche. Et tout ça dans la fonction addition.

    Voilà dites moi franchement si ça peut passer où si je devrais utiliser une autre méthode

  13. #13
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pour l'addition voilà ce que je pense faire mais je préfère vous demander conseil avant de coder la fonction.
    Je pensais à créer une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void addition(t_liste *liste1, t_liste *liste2)
    Dans cette fonction je demande à l'utilisateur de rentrer le nombre de monomes, le degré, le coeff réel pour le premier et le deuxième polynome que je voudrais additionner ensemble. Du coup j'appelle dans ma fonction la fonction liste_insere et liste_affiche.
    Quel rapport y a t-il entre l'entrée des polynômes, le calcul de leur somme, et l'affichage du résultat ? je dirais aucun : Il s'agit de trois actions différentes et déconnectées. je peux avoir besoin de faire la somme sur deux polynômes qui existent déjà sans vouloir les entrer à nouveau au clavier ou faire la somme et garder le résultat sans avoir besoin de l'afficher.
    Si je mélange les trois actions dans une fonction d'addition, l'usage de la fonction est inutilement très réduit. Par exemple si je veux additionner 3 polynômes, la fonction ne permet pas de le faire facilement : il me faut entrer les deux premiers polynômes, la fonction fait la somme et m'affiche le résultat (ce qui en fait ne m'intéresse pas), ce résultat doit être recopié au clavier et le troisième polynôme entré pour pouvoir faire à nouveau la somme.
    Tout ça pour dire qu'une fonction doit faire une chose et une seule. Si plusieurs choses sont à faire, alors on appellera plusieurs fonctions.

    Quelques idées à envisager pour structurer le programme. C'est maintenant qu'il faut le remanier alors que le code est encore jeune et que tu commences à avoir des idées plus précises. Chaque fonction doit faire UNE chose précise et être testable indépendamment. Le test ne doit dépendre que de fonctions déjà écrites et déjà testées pour avancer en sécurité.

    1- Ecrire une fonction qui va créer un polynôme vide (polynôme nul) :
    t_polynome * creerPolynomeNul(void);.

    2- Ecrire une fonction qui détruit un polynôme et récupère la mémoire allouée :
    void detruirePolynome(t_polynome * polynome);.

    3- Ecrire une fonction qui ajoute un monôme à un polynôme (c'est la plus complexe).
    Si le monôme a un coefficient nul, la fonction l'ignore.
    Si un monôme de même degré existe déjà dans le polynôme, ajouter les coefficients. Si le résultat est nul, le monôme est détruit.Si il n'y a plus aucun monôme , le polynôme obtenu doit être le polynôme nul
    etc.
    void ajoutMonome(t_polynome * polynome, t_monome *monome);.

    4- Ecrire une fonction qui va créer un polynôme à partir des données lues sur un fichier (qui pourra être stdin si je veux lire à partir du clavier ou autre chose si les données sont sur disque). Cette fonction appelle la fonction creerPolynomeNul() et pour chaque monôme lu sur in appelle la fonction ajoutMonome().
    t_polynome * lirePolynome(FILE * in);.

    5-Ecrire une fonction qui sauve le polynôme sur un fichier dans un format lisible par lirePolynome() :
    void sauvePolynome(FILE * out, t_polynome *);.

    6-Ecrire une fonction qui écrit le polynôme sous un format "agréable" à lire :
    void affichePolynome(FILE * out, t_polynome *);.

    7-Ecrire une foncion qui fait la somme de deux polynômes (que la fonction suppose exister déjà) et renvoie un polynôme résultat. La fonction va utiliser creerPolynomeNul() pour créer le polynôme résultat, puis ajoutMonome()
    t_polynome * additionPolynome(t_polynome *polynome1, t_polynome *polynome2);.

    Tout ceci est un exemple sur lequel tu peux naturellement broder.

  14. #14
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 1
    Par défaut
    Quel ESIARQUE ce cache derrière ce poste? J'ai une petite idée de qui c'est, ne serais tu pas un Plagiste invétéré ne sachant toujours pas programmer après un ans de cour d'info? Tu ne veux pas non plus que l'on te le fasse ton projet?

    Sinon concernant le projet d'info tu est bien mal barré pour la suite car pour ton polynôme tu est censé avoir une structure contenant la forme développée (fait a partir d'une liste chaîné) et la forme factorisé (fait aussi également à partir d'une liste chaîné. Donc avant de te lancer dans les fonction arithmétique de base comme l'addition, soustraction... Commence par reprendre tes structure afin de les mettre comme demandé, les fonction de génération de polynôme, celle d'affichage.

    Avis a tous ceux du forum préparez vous au pire avec lui (si c'est bien la personne à laquelle je pense) et à l'aider (ou plutôt lui faire) pour chacune des fonctions du projet. Pour ceux qui voudrait prendre de l'avance et anticipé ses demande, erreur... voici toute ce que doit contenir le projet à la fin. génération polynôme développé, affichage, addition, soustraction, multiplication, divisions euclidienne, conjugaison, isolation partie réel, imaginaire, dérivation, intégration, pgcd, calcul en un point précis, recherche de racine, factorisation, composition, décomposition. Et ceci n'est que les fonction "facile" s'en suit, coefficient F2, interpolation, approximation, fraction rationnelles, Euclide étendu. Bien entendu ceci n'est que les petite choses obligatoire, mais la ou il faut encore travailler, c'est sur le rendu, ihm, la plus valus...

    Sinon devine qui ce cache derrière mon pseudo et mp moi sur Facebook, afin de ne pas dévoiler mon nom sur ce forum. Une éventuelle aide serais peut être envisageable.

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 853
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par anonyme_develop Voir le message
    Avis a tous ceux du forum préparez vous au pire avec lui (si c'est bien la personne à laquelle je pense) et à l'aider (ou plutôt lui faire) pour chacune des fonctions du projet.
    Et si ce n'était pas celui auquel tu penses ??? Tu irais condamner (et nous inciter à condamner d'office) sans qu'il y ait eu faute ? Parce que jusqu'à présent il ne nous a pas tellement harcelés pour qu'on lui fasse son travail...

    Ici on accueille tout le monde sans arrière pensée et sans jugement préalable. Mais t'inquiète pas, on repère vite les faignasses et on sait les renvoyer dans leurs buts quand c'est le cas. Et bien évidemment on ne fait jamais (sauf exception exceptionnelle) le travail des autres...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 15
    Par défaut
    Je m'adresse à anonyme_develop
    Je vais être bref et ne pas envenimer les choses car ce n'est pas le but de ce forum ..
    Si je m'adresse ici, ce n'est pas pour que les autres fassent le projet à ma place mais seulement pour qu'ils me donnent les moyens d'avancer efficacement. De ce fait je tiens à remercier fearyourself, Sve@r, gerald3d et diogene pour leur aide et leur dire que le projet a bien avancé depuis
    Ensuite je tiens à te signaler que je connais parfaitement les consignes de ce projet, donc si j'ai demandé au début de l'aide pour la conception simple d'un polynôme, peut être était-ce tout simplement pour m'aider à me lancer dans le projet et ensuite que je puisse y apporter des modifications pour adapter le programme aux consignes données ..
    Enfin tes propos révèlent une profonde immaturité de ta part et si ton but était de décourager les autres personnes du forum à m'aider je pense que tu fais fausse route. Comme l'a dit Sve@r, je n'ai harcelé personne pour qu'on fasse mon travail et bien que j'ai certaines lacunes en info que j'assume parfaitement, je compte progresser en échangeant sur ces forums.
    En espérant que cela te serve de leçon et qu'à l'avenir tu n'écriras plus des bêtises qui te tourne surtout en ridicule au lieu d'apporter un réel intérêt.

Discussions similaires

  1. Polynômes avec des listes chainées
    Par yahia.ntic dans le forum C
    Réponses: 1
    Dernier message: 25/03/2014, 00h05
  2. Bibliothèque de listes chainées
    Par gege2061 dans le forum C
    Réponses: 29
    Dernier message: 17/12/2004, 20h15
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo