Polynomes [Résolu/Fermé]

Signaler
Messages postés
50
Date d'inscription
jeudi 10 avril 2014
Statut
Membre
Dernière intervention
25 juillet 2016
-
 jamesleblond -
Bonjour,

J'ai un problème : je vous donne mon .h, mon main.c et mon code.c de suite,

étant donné que c'est un projet pour des cours, je n'ai pas le droit de changer les prototypes. maintenant, l'histoire est que je ne peu pas changer les prototypes, c'est un problème de cours.

Mon problème se trouve dans mon code.c au niveau de la suite de mes monomes " saisie->suivant = saisie;" je ne sais pas quoi réellement mettre.
et je voudrais également savoir si ma façon de lire mon polynome est correct.

Merci de vos réponses.

//Polynome.h

typedef struct monome
{
	double coef;
	int degre;
	 struct monome* suivant;       //différence ?

}monome;

typedef struct polynome
{
	monome* premier;
}polynome;


polynome InsereMonome(polynome P, double coef, int degree);
//insere le monome "coef de degre" dans polynome P 

polynome SaisiePolynome();
//saisi d'un polynome au clavier 

void AffichagePolynome(polynome P);
//affichega d'un polynome P 

void DetruitPolynome(polynome* p_P);
//destruction d'un polynome



//code.c
polynome InsereMonome(polynome Polynome, double coeff, int degree)

{

	monome *nouvel = malloc(sizeof(monome));
	nouvel->coef = coeff;
	nouvel->degre = degree;
	if (nouvel == NULL)
	{
		nouvel->suivant = NULL;
	}
	else {
		nouvel->suivant = Polynome.premier; // -> sur nouvel car c'est un pointeur . car Polynome est une structure 

	}
	return Polynome;
} //à modifier

polynome SaisiePolynome()
{
	monome *saisie = malloc(sizeof(monome));

	

		int fin ;
		int i = 0;
		double A ;
		int B ;
		polynome Polynome;

		do
		{
				
				printf("saisir coefficient \n");		//saisie du coeff et du degrée
				scanf("%lf", (&A));
				printf("saisir degree \n");
				scanf("%d", (&B)); //scanf attend une adresse

				
				if (i == 0)
				{
					(saisie->coef) = A;
					(saisie->degre) = B;
					saisie->suivant = NULL;
					i++;
				}
				else { 
					(saisie->coef) = A;
					(saisie->degre) = B;
					saisie->suivant = saisie;

				}


		printf("result : %lf \n", saisie->coef);
		printf("result : %d \n", B);


		printf("0 : continuer \n");						//continuer à ajouter des monomes
		printf("1 : quitter \n");						// ou  non
		scanf("%d", &fin);


		if (fin != 0 & fin != 1)
		{
			printf("veuillez mettre 0 ou 1 \n");
			printf("0 : continuer \n");						//continuer à ajouter des monomes
			printf("1 : quitter \n");						// ou  non
			scanf("%d", &fin);

		}
			if (fin ==1)
			{
				 Polynome.premier = saisie;
				 return Polynome;
			}
		
		
	}
		while (fin != 1);
	getchar();

}
//ajouter monome monome monome fin prendre dernier monome = premier polynome


void AffichagePolynome(polynome P)
{
	int i = 0;
	while (P.premier->suivant != NULL)
	{
		printf("%lf",P.premier->coef);
		printf("x^");
		printf("%d", P.premier->degre);
		printf(" + ");
		getchar();
	}

}

void DetruitPolynome(polynome p_P)
{
	if ((p_P.premier->suivant != NULL) )
	{
		free(p_P.premier->suivant);
		free(p_P.premier);
	}
}



//main.c 

int main(int argc, char *argv[])
{
	
	polynome P=SaisiePolynome();
	AffichagePolynome(P);
	getchar();

}



dernière question, ma façon de détruire un polynome est elle la bonne ?

1 réponse

Messages postés
254
Date d'inscription
vendredi 29 août 2014
Statut
Membre
Dernière intervention
15 février 2018
22
Dans ta fonction saisiePolynome, l'indentation est un peu catastrophique...
De plus, il y a visiblement quelques erreurs.

Lignes 44-56: Oublie la variable i dont je n'ai pas du tout compris l'utilité. Je pense que le code qui irait pour remplacer ces lignes serait quelque chose comme :
 saisie->coef = A;
 saisie->degre = B;

Et à la fin de la boucle (APRÈS la condition de fin), ne pas oublier de faire :
saisie->suivant = malloc(sizeof(monome));
saisie = saisie->suivant;
(je crois que c'est ça que tu voulais mettre à la place de "saisie->suivant = saisie;")
Vu que on modifie la valeur du pointeur saisie, au début de la fonction (par exemple juste après la ligne 32) il faut faire
Polynome.premier = saisie;
et donc ne PAS le faire ligne 82.

Et comme selon les boucles de la fonction AffichagePolynome, le champ suivant du dernier monome doit contenir NULL, sur la condition de fin ligne 80 il faut faire :
if (fin)
{
 saisie->suivant = NULL;
 return Polynome;
}


Les lignes 63-79, ça ne va pas : il faut plutôt faire une boucle, style:
do {
 printf("veuillez entrer 0 ou 1 \n");
 printf("0 : continuer \n"); //continuer à ajouter des monomes
 printf("1 : quitter \n"); // ou  non
 scanf("%d", &fin);
} while (fin != 0 && fin != 1); // Note : l'opérateur de comparaison est && (& est un opérateur bit à bit, c'est pour ça qu'ici le programme fonctionnait quand même).


Pourquoi faire un getchar() ligne 89 ?
Et dernière chose sur cette fonction : plutôt que de demander d'entrer le degré du monôme, tu peux simplement l'incrémenter à chaque tour de boucle et juste demander le coefficient.


Pour ta fonction AffichagePolynome, je te propose ceci :
void AffichagePolynome(polynome P)
{
 monome *Monome = P.premier;
 while (Monome != NULL)
 {
  printf("%lf", Monome->coef);
  printf("x^");
  printf("%d", Monome->degre);
  printf("+");
  Monome = Monome->suivant;
 }
 printf("\b\n"); // On supprime le dernier + et on ajoute un retour à la ligne.
}


Pour détruire les ponlynômes, ta fonction ne va pas. Il faut faire free sur tous le polynômes un par un en partant du dernier (désolé, je suis un peu fatigué pour te faire la fonction...).

Quant à ta fonction InserePolynome, vu qu'elle est commentée "à modifier", je te laisse le soin de le faire (il faut en effet la changer) :p

paly2

La curiosité est une excellente qualité !
Messages postés
254
Date d'inscription
vendredi 29 août 2014
Statut
Membre
Dernière intervention
15 février 2018
22
En fait, je ne pense pas que ça soit une bonne idée que chaque monôme contienne le monôme suivant, il serait beaucoup mieux que le polynôme contienne un tableau dynamique de monômes et que chaque monôme contienne uniquement son coefficient et son degré, comme ceci :
typedef struct monome
{
	double coef;
	int degre;
} monome;

typedef struct polynome
{
	monome* monomes;
} polynome;


Pour allouer dynamiquement le tableau "monomes" de la structure polynome, il faut utiliser les fonctions malloc (ou calloc), realloc et free, que tu connais sans doute déjà (sinon une petite recherche sur ton moteur de recherche préféré te donnera des explications).
Messages postés
50
Date d'inscription
jeudi 10 avril 2014
Statut
Membre
Dernière intervention
25 juillet 2016
>
Messages postés
254
Date d'inscription
vendredi 29 août 2014
Statut
Membre
Dernière intervention
15 février 2018

le sujet est donné comme ça, je te remercie pour ta réponse bien détaillé, je teste ça de suite

ligne 109, dans l'énoncé, y'a une étoile après polynome :
void DetruitPolynome(polynome* p_P);
cdt...