logo

turbo pascal


logicielsturbo pascal

#msg2786689 Posté le 27-12-09 à 10:51
Posté par Profillouchas louchas

bonjour à vous, j'ai un certain nbr ede problèmes concernant l'écriture d'1 fonction en pascal
1) Je dosi écrrie 1 procedure decoupe qui à partir d'1 polynome P renvoie les polynomes P1 et P2 définis par P = P1 + X[sup][/sup]n P2. Je pnse qu'il faut utiliser div et mod mais je ne vois pas comment
2) J'ai également à créer une procédure qui à partir de P renvoie le polynome R défini par R = X^n P (avce n<=N)
Mon essai :
begin
R:=1
For n=0 to N do
P := X^n * R
end;
est-ce cela merci?
re : turbo pascal#msg2787146 Posté le 27-12-09 à 14:47
Posté par Profilpatrice rabiller patrice rabiller

Bonjour,

Çà s'apprend encore le turbo pascal ?

Comment sont définis les polynômes dans ton exercice ? S'agit-il d'une structure comme celle-ci :

Type Poly = array[0..200] of real;

où le tableau contient les coefficients (ici le degré étant limité à 200) ?

Sinon, ta fonction peut retourner plusieurs résultats possibles, non ?
re : turbo pascal#msg2787302 Posté le 27-12-09 à 15:48
Posté par Profillouchas louchas

P est représenté par 1 tableau [a0, ... a(2n-1)]
re : turbo pascal#msg2787869 Posté le 27-12-09 à 18:36
Posté par Profilpatrice rabiller patrice rabiller

OK, mais, il y a quand même une difficulté car, si on prend p(x)=1+x+x2

Alors on peut choisir p1(x)=1+x  et p2(x)=1. Ainsi, on a bien p1(x)+x2p2(x)=p(x)
Mais on peut aussi choisir p1(x)=1+x+2x2  et p2(x)=-1 et on a encore p1(x)+x2p2(x)=p(x).

N'y-a-t'il pas une condition supplémentaire pour permettre de définir les polynômes p1 et p2 de façon unique ?

Par ailleurs, dans ton message initial, que signifie n et N ? Je crois me souvenir que, dans turbo pascal, le nom donné aux variables est insensible à la casse ...
re : turbo pascal#msg2788178 Posté le 27-12-09 à 20:58
Posté par Profillouchas louchas

je pensais assimiler la procedure decoupe à une simple division euclidienne, mais on me demande juste d'écrire une procédure pour trouver P1 et P2.
N est le degré de P, n l'integer pour incrémenter
re : turbo pascal#msg2788494 Posté le 28-12-09 à 06:19
Posté par Profilpatrice rabiller patrice rabiller

OK : s'il s'agit d'une division euclidienne alors, effectivement, il n'y a qu'une seule solution pour P1 et P2.

Voici comment je ferais :

Type TPolynomes = Record
                   Degre : integer;           //degré du polynome
                   Coef : array of real;     //tableau "ouvert" des coefficients du polynôme
                  end;

Procedure Decoupe(P : TPolynomes; var P1,P2 : TPolynomes);
var n : integer;
begin
   P1.Degre:=1;
   P1.Coef[0]:=P.Coef[0];
   P1.Coef[1]:=P.Coef[1];
   P2.Degre:=P.Degre-2;
   For n:=2 to P.Degre do P2.Coef[n-2]:=P.Coef[n];
end;

Bon, je n'ai pas essayé, mais ça devrait marcher... sous réserve qu'il ne faille pas utiliser SetLength pour préciser la taille des variables P1 et P2. Je n'utilise plus turbo pascal depuis 12 ans mais Delphi qui est son successeur sous windows. Il est possible que ce qui marche avec Delphi ne fonctionne pas avec turbo pascal
re : turbo pascal#msg2788544 Posté le 28-12-09 à 09:48
Posté par Profillouchas louchas

ta boucle c'est prendre le (n-2)e coeff de P2 égal au nième de P. Parce que si c'est ça, je tenterai sous pascal, mais on n'a pas l'habitude d'écrire "P2.Coef(n-2)". Si ça veut dire autre chose, dis le merci
re : turbo pascal#msg2788794 Posté le 28-12-09 à 11:58
Posté par Profilpatrice rabiller patrice rabiller

L'écriture P2.Coef[n-2] s'utilise lorsqu'on a une variable de type Record. Dans le type TPolynomes, j'ai mis deux champs : le degré et le tableau Coef. Donc P2.Degre désigne le degré du polynome P2 et P2.Coef[3] représente le coefficient a3 de ce même polynôme.

Maintenant on peut utiliser d'autres structures si tu n'as pas vu les structures "Record".

Attention aussi de ne pas confondre les parenthèses (qui s'utilisent par exemple pour les arguments des procédures et des fonctions) et les crochets (qui s'utilisent pour les ensembles ou pour les tableaux)...
re : turbo pascal#msg2789788 Posté le 28-12-09 à 17:20
Posté par Profillouchas louchas

tu n'aurais pas une autre manière qu'avec record, car je ne l'ai pas vu!
re : turbo pascal#msg2789837 Posté le 28-12-09 à 17:31
Posté par Profilpatrice rabiller patrice rabiller

On peut toujours contourner la difficulté en prenant uniquement un tableau. Cependant, comme le degré d'un polynôme est variable, il faut utiliser un tableau sans préciser sa dimension :

Procedure Decoupe(P : array of real; N:integer; var P1,P2 : array of real);
var k : integer;
Begin
   SetLength(P1,2);
   SetLength(P2,N-2);
   P1[0]:=P[0];
   P1[1]:=P[1];
   For k:=2 to N-2 do
      P2[k-2]:=P[k];
End;

Par contre, j'ai un doute sur l'utilisation de SetLength en Turbo Pascal. De même, je ne suis pas certains qu'on puisse utiliser des paramètres tableaux ouverts (sans préciser leur dimension) dans une procédure ...
re : turbo pascal#msg2790871 Posté le 29-12-09 à 10:03
Posté par Profillouchas louchas

par contre, expliques moi pourquoi tu poses "P2[k-2] := P [k]" ?
re : turbo pascal#msg2790980 Posté le 29-12-09 à 11:23
Posté par Profilpatrice rabiller patrice rabiller

Si j'ai bien compris, le polynôme P, de degré N, doit être découpé en 2 parties :

P1 de degré 1 (fonction affine) contenant les coefficients a0 et a1, stockés dans le tableau P aux indices 0 et 1 : P[0] et P[1],
P2 de degré N-2, contenant les coefficients a2...aN, stockés dans le tableau P aux indices 2 à N : P[2]...P[N]. Donc l'affectation des coefficients de P2 se fait comme j'ai écrit.

Ainsi, on a bien P(x)=P1(x)+x2P2(x).
re : turbo pascal#msg2791058 Posté le 29-12-09 à 11:50
Posté par Profillouchas louchas

Decoupe à partir d'1 polynome P appartenant à R (2n-1)[X], renvoie les polynomes P1 et P2 de R(n-1)[X] définis par P = P1 + X^n * P2. Je ne pense pas que c'est ce que tu as effectué : P1 n'est pas de degré 1, et c'est X^n * P2 : pour l'affectation des coeffs de P2 à partir ce que tu as fait, je vois pas trop
re : turbo pascal#msg2791179 Posté le 29-12-09 à 12:37
Posté par Profilpatrice rabiller patrice rabiller

En effet, c'est très différent de ce que j'avais cru comprendre... J'y réfléchirai demain matin.
re : turbo pascal#msg2791488 Posté le 29-12-09 à 14:32
Posté par Profillouchas louchas

merci en tout cas!
re : turbo pascal#msg2793426 Posté le 30-12-09 à 07:46
Posté par Profilpatrice rabiller patrice rabiller

Bon, en relisant plus attentivement je crois comprendre que :

P(x)=a0+a1x+a2x2+...+an-1xn-1+anxn+...+a2n-1x2n-1

et on veut écrire :

P(x)=a0+a1x+a2x2+...+an-1xn-1+xn(an+an+1x+...+a2n-1xn-1)

Le problème est aussi simple : il s'agit juste d'un décalage de coefficients :

P est représenté par le tableau [a0,a1,...an-1,an,...a2n-1]
P1 est représenté par le tableau [a0,a1,...an-1]
P2 est représenté par le tableau [an,an+1,...a2n-1]

Donc la procédure qui convient est la suivante :

Procedure Decoupe(P : array of real; N:integer; var P1,P2 : array of real);
var k : integer;
Begin
   SetLength(P1,N-1);
   SetLength(P2,N-1);
   For k:=0 to N-1 do
   begin
      P1[k]:=P[k];
      P2[k]:=P[n+k];
   end;
End;

Les paramètres P1 et P2 sont transmis par variable et non par valeur (présence du mot-clé var dans la liste des paramètres de la procédure), car il n'est pas possible d'écrire une fonction qui retourne 2 variables ...

Voila : j'espère que c'est mieux comme ça
re : turbo pascal#msg2793555 Posté le 30-12-09 à 10:54
Posté par Profillouchas louchas

je comprends beaucoup mieux en effet. par contre, je n'ai pas vu en cours ce qu'est Setlength : tu pêux m'expliquer ce que c'est ?
re : turbo pascal#msg2793710 Posté le 30-12-09 à 12:09
Posté par Profilpatrice rabiller patrice rabiller

Je crois bien que setLength n'exsite pas en Turbo Pascal, mais seulement en Delphi. Ça correspond à l'instruction dim des calculatrices lorqu'on veut préciser la dimension d'une liste...

Si ça ne marche pas, alors il faut définir un type Polynome pouvant contenir tout polynôme de degré inférieur ou égal à 200 (par exemple)comme ceci :

Type TPolynome = Array[0..200] of real;

Le degré du polynôme peut être alors calculé en parcourant le tableau à partir de la fin (indice 200) jusqu'à ce qu'un coefficient soit non nul.

Du coup, il faut obligatoirement initialiser tous les coefficients au moment de l'affectation, en complétant au besoin par des coefficients nuls.

L'intérêt de définir un type est de permettre le passage en paramètre de n'import quel polynome.

Du coup la procédure sera différente :

Type TPolynome = array[0..200] of real;

Procedure Decoupe(P : TPolynome; var P1,P2 : TPolynome);
var k,N : integer;
Begin
   k:=200;
   While P[k]<>0 do dec(k);   //recherche du degré de P
   N:=k;
   For k:=0 to N-1 do
   begin
      P1[k]:=P[k];
      P2[k]:=P[n+k];
   end;
   For k:=N to 200 do  // initalisation des coefficients
   begin
      P1[k]:=0;
      P2[k]:=0;
   end;
End;

Maintenant, si je me souviens bien, il faut déclarer l'unité CRT, et rédiger un programme qui fera appel à la procédure decoupe avec un polynôme P donné.
re : turbo pascal#msg2793901 Posté le 30-12-09 à 13:47
Posté par Profillouchas louchas

"While P[k]<>0 do dec(k)" : qu'est ce que dec (k) ??
re : turbo pascal#msg2794357 Posté le 30-12-09 à 15:49
Posté par Profilpatrice rabiller patrice rabiller

"dec(k)" équivaut à "k:=k-1". "inc(k) équivaut à "k:=k+1". dec et inc sont des fonctions de base en Pascal.

Répondre à ce sujet

réservé Seuls les membres peuvent poster sur le forum !

Vous devez être connecté pour poster
attention Un modérateur est susceptible de supprimer toute contribution qui ne serait pas en relation avec le thème de discussion abordé, la ligne éditoriale du site, ou qui serait contraire à la loi.

  • Ce topic

    imprimer Imprimer
    réduire la tailleRéduire   /   agrandir la tailleAgrandir

    Pour plus d'options, connection connectez vous !
  • Fiches de maths



maths haut de pagehaut Retrouvez cette page sur ilemaths l'île des mathématiques
© Tom_Pascal & Océane 2012