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 :

Structure Polynome( probleme d'affichage) en C


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Structure Polynome( probleme d'affichage) en C
    Bonjour,

    Je suis debutant et actuellement , je voudrais faire un e fonction qui calcule une somme de 2 polynomes (et ensuite le produit de 2 polynomes!!). J'ai crée une structure du type "polynome", j'ai crée ma fonction poly_pt.h,poly_pt.c ,mon Makefile et ma fonction "main_pt.c", dont les voici:

    pour le "Makefile"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     exe	:main_pt.o poly_pt.o
    	gcc -o exe main_pt.o poly_pt.o -Wall -lm 
     
     
    poly_pt.o:poly_pt.c
    	gcc -c poly_pt.c
     
     
    main.o	:main_pt.c poly_pt.h
    	gcc -c main_pt.c
     
    clean:
    	rm *.o exe
    Pour la fonction "poly_pt.h" :
    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
     #ifndef poly_pt_h
    #define poly_pt_h
    #include <stdlib.h>
     
     
    #define max(a,b) (a>=b)?(a):(b)
    #define min(a,b) (a<=b)?(a):(b)
    typedef struct{
    	int deg;
    	float *tab;
    }polynome;
     
    polynome *init_poly(int n);
     
    polynome  *sum_poly(polynome *U,polynome *V);
     
     
    void affiche(polynome *U); // Pour afficher
    #endif

    Pour la fonction "poly_pt.c"
    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
    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
     #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    #include<string.h>
    # include "poly_pt.h"
     
    polynome *init_poly(int n) // La table U doit etre de taille (n+1)!!
    {
    	int j; // qui va servir  dans la boucle for
    	polynome *V=(polynome *)malloc(n*sizeof(polynome));// Le tableau que je veux le faire retourné
    	 V->tab = (float *)malloc(n*sizeof(float));
    	 (*V).deg=n; // equivalent à V->deg=n
     
     
     
    	for(j=0;j<=n;j++)// JE VAIS JUSQU'A V.deg(donc (V.ded+1)elts!!) , car ,comme le polynome est de
    												// degre V.deg, alors on aura V.deg+1 elements!!
    	{
     
    		 printf("V[%d]=\n",j);
    		 scanf("%f",&(V->tab[j]));
     
    	 }
    	return (V);
    }
     
    void affiche(polynome *U) // 
    {
    	int j;
     
    	 printf("%fx^%d",(U->tab[0]),U->deg);  // Rappellons que U->tab equivaut à (*U).tab
    	for(j=1;j<=(U->deg)-1;j++)
    	{
     
     
    		if(U->tab[j]!=0)
    		{
    			if(j!=U->deg-1) 
    			{
    				printf("+%fx^%d",U->tab[j],U->deg-j);
    			}
    			else    
    			{
    				 printf("+%fx",U->tab[j]);	
    			}			
     
    		}
    	}
    	if(U->tab[U->deg]!=0) printf("+%f",U->tab[U->deg]);
    }
     
    polynome  *sum_poly(polynome *U,polynome *V)
    {
    	int s,q,i,j;
    	s=min(U->deg,V->deg);
    	q=max(U->deg,V->deg);
    	// Declaration et allocation des tableau ,polynome *W,W->tab et W->deg !!
    	polynome *W=(polynome *)malloc((q+1)*sizeof(polynome));// Le tableau que je veux le faire retourné
    	W->tab=(float *)malloc((q+1)*sizeof(float));
    	 W->deg=q;
     
     
    	for(i=q;i>=0;i--)
    	{
    		if((i>=s+1)&(i<=q))  // Il faut comprendre que si le polynome est de taille n, alors le tableau des coefficient
    								// est de taille (n+1)
    		{
    			if(q==U->deg) W->tab[q-i]=U->tab[q-i];
    			else         W->tab[q-i]=V->tab[q-i];
    		}
    		else      W->tab[q-i]=U->tab[q-i]+V->tab[q-i];
    	}
     
    	return (W);
    }
    Et pour la fonction "main_pt.c"
    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
     #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    #include<string.h>
    #include "poly_pt.h"
     
    int main()
    {
    	int q;
    	printf("donner le degré du polynome est ensuite le polynome souhaité\n");
    	scanf("%d",&q);
    	polynome *U;//=(polynome *)malloc(q*sizeof(polynome));
    	polynome *Z;
    	U= init_poly(q);
    //printf("V[%d]=%f\n",U->deg,U->tab[U->deg]);  // Pour verification de mon //proramme
    	Z=sum_poly(U,U);
    	//printf("Z[%d]=%f\n",Z->deg,Z->tab[Z->deg]);// Pour verification de mon //proramme
    	affiche(Z);
    	return(0);
    }
    Quand je compile (avec mon executant ./exe sur le terminal , il m'affiche pas d'erreur et ça s'execte!

    Quand je prend , un polynome de taille 2, 4,6 (en gros de degre paire il me semble, MAIS je ne suis pas sur ),il m'affiche le bon resultat que je recherchiais (à savoir sommer les 2 polynomes!!
    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
      donner le degré du polynome est ensuite le polynome souhaité
    6
    V[0]=
    4
    V[1]=
    9
    V[2]=
    0
    V[3]=
    6
    V[4]=
    4
    V[5]=
    2
    V[6]=
    1
     
    8.000000x^6+18.000000x^5+12.000000x^3+8.000000x^2+4.000000x+2.000000
    Mais là ou il y'a probleme, c'est que quand je prend le polynime de degre 3,5,7( donc de degre impair ,il me semble) que ça se complique vu que la derniere valeur s'affiche tjrs 0. Par exemple, un polynome de degre 3 qui a comme coef(1,3,3,1) ( ranger suivant les puissances decroissantes du polynome) , Le terminal ,ne me donne pas le bon resultat (il devait me donner (2,6,6,2)), mais il me donne donne ça!:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     donner le degré du polynome est ensuite le polynome souhaité
    3
    V[0]=
    1
    V[1]=
    3
    V[2]=
    3
    V[3]=
    1
     
    2.000000x^3+6.000000x^2+6.000000x+0.000000
    Pire encore , quand je prend le polynome (3,2,1,0) (toujours rangé suivant les puissances decroissantes!), il m'affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      donner le degré du polynome est ensuite le polynome souhaité
    3
    V[0]=
    3
    V[1]=
    2
    V[2]=
    1
    V[3]=
    0
    V[3]=0.000000
    exe: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
    Abandon (core dumped)
    Et je ne vois pas où est l'erreur, ni comment faire, je suis vraiment scotché!!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Un tableau en C de taille N a ses indices qui varient de 0 à N-1.

    Or ici, tu alloues un tableau de taille n :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    V->tab = (float *)malloc(n*sizeof(float));
    mais rentres n+1 valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(j=0;j<=n;j++)	{
     
        printf("V[%d]=\n",j);
        scanf("%f",&(V->tab[j]));
     
    }

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2005
    Messages : 249
    Points : 349
    Points
    349
    Par défaut
    poly_pt.c, ligne 65 : if((i>=s+1)&(i<=q)) // Il faut comprendre que si le polynome est de taille n, alors le tableau des coefficient

    => attention tu utilises "&" au lieu de "&&" il me semble!

Discussions similaires

  1. [VB.NET] Probleme d'affichage de controle
    Par mic56 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/06/2004, 15h03
  2. xml-xsl-fo : probleme d'affichage d'un tableau
    Par clindoeil dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 12/12/2003, 12h46
  3. [langage] Problème d'affichage
    Par marcoss dans le forum Langage
    Réponses: 3
    Dernier message: 29/08/2003, 13h05
  4. IE [Applet] Plug-in problème d'affichage
    Par Tonton Luc dans le forum JBuilder
    Réponses: 4
    Dernier message: 19/06/2003, 08h28

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