Polynômes et fonctions

Résolu/Fermé
Arnaud3198 Messages postés 6 Date d'inscription samedi 17 janvier 2015 Statut Membre Dernière intervention 4 avril 2015 - Modifié par KX le 4/04/2015 à 21:13
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 7 avril 2015 à 22:06
salut la communauté,
j'ai un soucis avec mon programme qui fait la somme et le produit de deux polynômes. Même ma boucle "pour" ne donne pas!!
Voici le code:

#include <stdio.h>
#include <stdlib.h>
#define N 15
typedef polynome int v[N];
void LirePolynome(polynome p,int n)
{
    int i;
    for(i=0;i<n;i++);
    {
        printf("entrez le coefficient de degre %d \t",i);
        scanf("%d",&p[i]);
    }
    return;
}
void AffichePoly(polynome p,int tp)
{
    int i;
    printf("le polynome est");
    for(i=0;i<=tp;i++)
    {
        printf("+%dX^%d",p[i],i);
    }
}
void SommePolynome(polynome p,polynome q,polynome s,int tp,int tq,int ts)
{
    int d,i;
    if(tp>tq)
    {
        d=tq;
        ts=tp;
        for(i=d+1;i<tp;i++)
        {
            s[i]=p[i];
        }
    }
    else if(tq>tp)
    {
        d=tp;
        ts=tq;
        for(i=d+1;i<tq;i++)
        {
            s[i]=p[i];
        }
    }
    else
    {
        d=tp;
        ts=tp;
    }
    for(i=0;i<d;i++)
    {
        s[i]=p[i]+q[i];
    }
    return;
}
ProduitP_M(polynome p,polynome r,int tp,int tr,int a,int d)
{
    int i;
    for(i=0;i<d;i++)
    {
        r[i]=0;
    }
    for(i=0;i<tp;i++)
    {
        r[i+d]=p[i];
    }
    return;
}
void ProduitPolynome(polynome p,polynome q,polynome R,int tp,int tq,int tR)
{
    int i,tr;
    polynome r;
    tR=tp+tq-1;
    for(i=0;i<tR;i++)
    {
        R[i]=0;
    }
    for(i=0;i<tq;i++)
    {
        ProduitP_M(p,r,tp,tr,q[i],i);
        SommePolynome(R,r,R,tp,tq,tR);
    }
}
int main()
{
    int i,k,tp,tq,ts,tr;
    polynome p,q,s,r;
    printf("salut, vous voulez faire le produit de deux polynomes? Ou la somme? Ou bien les 2?");
    while((k!=1)&&(k!=2)&&(k!=3))
    {
        printf("entrez (1) pour le produit, (2) pour la somme et (3) pour les deux");
        scanf("%d",&k);
    };
    printf("entrez la taille du premier polynome\t");
    scanf("%d",&tp);
    LirePolynome(p,tp);
    printf("entrez la taille du deuxième polynome\t");
    scanf("%d",&tq);
    LirePolynome(q,tq);
    if(k==1)
    {
        ProduitPolynome(p,q,s,tp,tq,ts);
        printf("le produit des deux polynomes donne");
        AffichePoly(s,ts);
    }
    if(k==2)
    {
        SommePolynome(p,q,r,tp,tq,tr);
        printf("la somme des deux polynomes donne");
        AffichePoly(r,tr);
    }
    if(k==3)
    {
        SommePolynome(p,q,r,tp,tq,tr);
        ProduitPolynome(p,q,s,tp,tq,ts);
        printf("le produit des deux polynomes donne");
        AffichePoly(s,ts);
        printf("la somme des deux polynomes donne");
        AffichePoly(r,tr);
    }
    return 0;
}

2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
4 avril 2015 à 23:05
Bonjour,

typedef polynome int v[N];
Mauvaise utilisation de typedef => typedef int polynome [N];
Je te conseille de revoir son utilisation.

return;
Pourquoi mettre des return; ? Ils ne servent à rien ici.
Si tu y tiens vraiment, alors met le aussi pour ProduitPolynome() sinon ce n'est pas cohérent...

Dans LirePolynome()
for(i=0;i<n;i++);
Surtout pas de ';' en fin de for. Sinon cela revient à faire : i=n+1; et à jouer les instructions d'après 1 seule fois.

Je ne vois pas à quoi sert ta variable d ? Autant remplacer 'd' par sa valeur. Ca sera beaucoup plus lisible.

Dans AffichePoly()
for(i=0;i<=tp;i++)
Pourquoi tu mets '<=' alors que dans les autres fonctions, c'est une inégalité stricte ?
printf("+%dX^%d",p[i],i);
Pour info, ça ne sera pas propre car le 1er monôme aura un '+' devant...

Dans SommePolynome()
Tu te compliques la vie. Je te conseille d'initialiser au début tous tes monômes à '0'. Ainsi tu pourras te contenter d'une seule boucle for et de simplifier les conditions.

Dans ProduitP_M()
Tu as oublié de mettre le type devant le nom de la fonction.

Dans ProduitPolynome()
for(i=0;i<tR;i++)
{
R[i]=0;
}

Autant initialiser les monômes de R à '0' dans la fonction ProduitP_M(). En plus, tu peux faire : polynome P={0}; pour remplacer ta boucle for.

Dans main()
while() {
...
};

Pas besoin de ';' après une accolade.

Plutôt que d'enchaîner des if, tu devrais utiliser des else if. Ou mieux : switch(k).

return 0;
N'oublie pas d'afficher juste avant un saut de ligne : putchar('\n'); car tu n'en as pas mis dans ton dernier printf().

Déjà, corrige tous ces points et reteste. S'il reste des problèmes, reposte ton programme corrigé en pensant à utiliser la balise "code".
Exemple :
<code c>ici tu mets ton code</code>
Cdlt,
0
j'ai essayer ce que tu as dit
le dernier problème c'est l'éxécution. D'après mes différents tests, je vois que c'est ma somme qui dérange:
#include <stdio.h>
#include <stdlib.h>
#define N 15
typedef int polynome [N];
void LirePolynome(polynome p,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("entrez le coefficient de degre %d \t",i);
scanf("%d",&p[i]);
}
return;
}
void AffichePoly(polynome p,int tp)
{
int i;
printf("le polynome est");
if(p[0]==1)
{
printf("%d",p[0]);
}
else if(p[0]==0)
{}
else
{
printf("%d",p[0]);
}
for(i=1;i<tp;i++)
{
if(p[i]==1)
{
printf("+X^%d",i);
}
else if(p[i]==0)
{}
else
{
printf("+%dX^%d",p[i],i);
}
}
return;
}
void SommePolynome(polynome p,polynome q,polynome s,int tp,int tq,int ts)
{
int i;
if(tp<=tq)
{
ts=tq;
}
else
{
ts=tp;
}
for(i=0;i<tq;i++)
{
s[i]=q[i];
}
for(i=0;i<tp;i++)
{
s[i]=s[i]+p[i];
}
return;
}
void ProduitP_M(polynome p,polynome r,int tp,int tr,int a,int d)
{
int i;
for(i=0;i<d;i++)
{
r[i]=0;
}
for(i=0;i<tp;i++)
{
r[i+d]=a*p[i];
}
tr=tp+d;
return;
}
void ProduitPolynome(polynome p,polynome q,polynome R,int tp,int tq,int tR)
{
int i,tr;
polynome r;
tR=tp+tq-1;
for(i=0;i<tR;i++)
{
R[i]=0;
}
for(i=0;i<tq;i++)
{
ProduitP_M(p,r,tp,tr,q[i],i);
SommePolynome(R,r,R,tR,tr,tR);
}
return;
}
int main()
{
int i,k,tp,tq,ts,tr;
polynome p,q,s,r;
printf("entrez la taille du premier polynome\t");
scanf("%d",&tp);
LirePolynome(p,tp);
printf("entrez la taille du deuxieme polynome\t");
scanf("%d",&tq);
LirePolynome(q,tq);
printf("salut, vous voulez faire le produit de deux polynomes? Ou la somme? Ou bien les 2?");
printf("entrez (1) pour le produit, (2) pour la somme et (3) pour les deux");
scanf("%d",&k);
switch (k)
{
case 1:
ProduitPolynome(p,q,s,tp,tq,ts);
printf("le produit des deux polynomes donne");
AffichePoly(s,ts);
break;
case 2:
SommePolynome(p,q,r,tp,tq,tr);
printf("la somme des deux polynomes donne");
AffichePoly(r,tr);
break;
default:
printf("entrez (1) pour le produit, (2) pour la somme et (3) pour les deux");
break;
}
return 0;
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
7 avril 2015 à 22:06
Tu déclares la fonction i dans ton main() mais tu ne l'utilises pas.

Dans ProduitP_M(),
tu modifies tr, mais cela n'aura pas de répercutions sur la variable tr dans la fonction ProduitPolynome(). Il faut passer par un pointeur...
Idem lorsque tu appelles ProduitPolynome() dans main().

D'une manière générale, je te conseille de revoir tous les paramètres dans tes fonctions et de faire le ménage. Grosso modo, plusieurs cas :
Soit tu transmets une variable valorisée et tu t'en sers : passage par copie
Soit tu transmets une variable que tu souhaites modifier : passage par pointeur
Soit tu n'en as pas besoin, à supprimer.

Note : c'est <code c> avec un c et non <code> pour les balises.
0