CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Division euclidienne

Titimathy
Titimathy
Niveau 44
06 juin 2012 à 22:18:23

Bonjour, je dois coder la division euclidienne de polynomes, mais le résultat n'est pas bon. Je pense qu'il y a une erreur dans ma boucle mais je ne trouve pas... Merci pour votre aide :

  1. include "stdafx.h"
  2. include <stdlib.h>

int main()
{
int n, m, j, k;
double* P;
double* B;
double* Q;

// les degrés

printf("Entrez le degré du polynome 1 : \n");
scanf("%d",&n);
fflush(stdin);
printf("Entrez le degré du polynome 2 : \n");
scanf("%d",&m);
fflush(stdin);

// les allocations

P = (double*)malloc((n+1)*sizeof(double));
if(P == NULL) printf("Allocation impossible \n");
B = (double*)malloc((m+1)*sizeof(double));
if(B == NULL) printf("Allocation impossible \n");

// Entrée des coefficients

for(j = 0 ; j <= n ; j++)
{
printf("Entrez le coeff d'ordre %d du premier polynome \n", j);
scanf("%lf",&P[j]);
fflush(stdin);
}
for(j = 0 ; j <= m ; j++)
{
printf("Entrez le coeff d'ordre %d du second polynome \n", j);
scanf("%lf",&B[j]);
fflush(stdin);
}

// Division proprement dite

if(m>n)
{
printf("Le quotient est nul et le reste équivaut au premier polynome");
}
else
{
Q = (double*)malloc((n-m+1)*sizeof(double)); //le degré est la différence des deux
if(Q == NULL) printf("Allocation impossible \n");

for(k = 0 ; k <= n-m ; k++)
{
Q[n-m-k] = P[n-k]/B[m];
for(j = n-k ; j >= n-m-k ; j--)
{
P[j] = P[j] - B[j+m-n+k]*P[n-k]/B[m];
}
}

}
//affichage

for(j=0 ; j<= n-m ; j++)
{
printf("Le coeff numéro %d du quotient vaut %lf : \n",j,Q[j]);
}
for(j=0 ; j<m ; j++)
{
printf("Le coeff numéro %d du reste vaut %lf : \n",j,P[j]);
}
free(P);
free(Q);
free(B);
return 0;
}

Titimathy
Titimathy
Niveau 44
06 juin 2012 à 22:55:00

Problème réglé, il fallait remplacer la ligne :
P[j] = P[j] - B[j+m-n+k]*P[n-k]/B[m];
par
P[j] = P[j] - B[j+m-n+k]*Q[n-m-k]

Après si vous avez des idées pour le rendre optimal...

chris_27
chris_27
Niveau 10
06 juin 2012 à 23:07:54

« P[j] = P[j] - B[j+m-n+k]*P[n-k]/B[m]; » :d) la première fois, tu mets (presque) P[n-k] à 0, donc après ta mise à jour ne fait plus rien.

Je te suggère de commence la boucle à j=n-k-1, puis de mettre P[n-k] à 0. explicitement, après la boucle. Tu pourrais aussi changer le «
P[n-k]/B[m] » en « Q[n-m-k] » dans la boucle.

Dans tous les cas, mets P[n-k] à 0. toi-même afin d'éviter les blagues liées aux erreurs d'arrondi !

Au passage,

« fflush(stdin); » :d) ceci est une abomination suprême. Déjà, le flush n'est PAS DÉFINI sur les flux d'entrées. C'est défini seulement sur les flux de sorties comme stdout ou stderr.

Ensuite, tu te tires un missile nucléaire dans la jambe en faisant ça. Le jour où tu veux tester vraiment ton code, tu n'as pas envie de devoir répondre à des dizaines de questions d'affilée. De fait, tu veux plutôt copier-coller la liste des coefficients d'un seul coup de façon à ne répondre qu'à la première question.
Et je ne parle pas de l'utilisation de ton programme dans un pipe, ce dont tu te prives ici dans le cas où fflush ferait autre chose que rien (et Dieu seul sait ce qu'il fait vraiment sur ta machine dans ce cas).

chris_27
chris_27
Niveau 10
06 juin 2012 à 23:08:33

Hum, j'ai trop lagué à vouloir vérifier mes dires sur fflush. :(

Titimathy
Titimathy
Niveau 44
06 juin 2012 à 23:19:58

Merci pour ta réponse.

Je travaille sur visual studio, notre prof nous a dit que scanf pouvait poser problème si on ne mettait pas fflush(stdin) après chaque utilisation. Mais visiblement c'est du qu'à visual. ^^

chris_27
chris_27
Niveau 10
06 juin 2012 à 23:49:18

Ton prof, il peut aller réapprendre le C. fflush n'est PAS DÉFINI si l'argument est stdin, et donc faire un tel appel est fondamentalement une erreur.

Quant à scanf, s'il pose vraiment problème, c'est qu'il te faut ton propre parseur. Mais bon, ici il ne pose aucun problème. :)

poupstm2
poupstm2
Niveau 29
07 juin 2012 à 14:51:36

perso mon prof aussi préconise l'utilisation de fflush pour vider le buffer (sous windows) afin d'éviter des problèmes (comme quand on utiliser getch() )

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment