TP n°7 d'informatique  DEUG S1 MIAS+MASS 2000-2001
sous-programmes

EXERCICE 1    Utilisation d'une bibliothèque de sous-programmes

    On veut écrire un programme permettant de résoudre une équation du second degré à coefficients complexes. Les formules sont les mêmes que dans le cas réel mais il faut calculer dans C ce que ne sait pas faire Turbo-Pascal. Il faut donc le lui apprendre en chargeant la bibliothèque de sous-programmes suivante appelée COMPLEXE. Cela s'obtient en rjoutant :

        uses COMPLEXE;

avant les déclarations.

Voilà le contenu de cette unité COMPLEXE :
 
 
unit complexe;

interface

(* saisie d'un nombre complexe *)
         procedure saisir(var a,b:real);

(* ecriture d'un nombre complexe *)
         procedure ecrire(a,b:real);

(* module d'un nombre complexe *)
         function module(a,b:real):real;

(* argument d'un nombre complexe *)
         function arg(a,b:real):real;

(* somme de deux complexes *)
         procedure somme(a1,b1,a2,b2:real;var a3,b3:real);

(* produit de deux complexes *)
         procedure produit(a1,b1,a2,b2:real;var a3,b3:real);

(* inverse d'un nombre complexe non nul *)
         procedure inverse(a,b:real;var c,d:real);

implementation

(* saisie de a+ib *)
         procedure saisir( var a,b:real );
         begin
         write('partie r‚elle : ');readln(a);
         write('partie imaginaire : ');readln(b);
         end;

(* ecriture d'un nombre complexe *)
         procedure ecrire( a,b:real );
            (* ecriture de a+ib *)
         begin
         writeln( a,' + i ',b);
         end;

(* module d'un nombre complexe *)
         function module( a,b:real ):real;
         begin
         module := sqrt( a*a+b*b );
         end;

(* argument d'un nombre complexe *)
         function arg( a,b:real ):real;
         var teta:real;
         begin
         if a=0 then if b >= 0 then teta := pi/2
                               else teta := -pi/2
                else begin
                     teta := arctan( b/a );
                     if a<0 then if b>=0 then teta := teta+pi
                                         else teta := teta-pi;
                     end;
         arg := teta;
         end;

(* somme de deux complexes *)
         procedure somme ( a1,b1,a2,b2:real ;  var a3,b3:real );
            (*    calcule  a3+ib3 = a1+ib1 + a2+ib2    *)
         begin
         a3 := a1 + a2 ;
         b3 := b1 + b2 ;
         end;

(* produit de deux complexes *)
         procedure produit ( a1,b1,a2,b2:real ;  var a3,b3:real );
            (*    calcule  a3+ib3 = (a1+ib1) * (a2+ib2)    *)
         begin
         a3 := a1*a2 - b1*b2 ;
         b3 := a1*b2 + b1*a2 ;
         end;

(* inverse d'un complexe non nul *)
         procedure inverse ( a,b:real ; var c,d:real );
            (*    calcule  c+id = 1/(a+ib)   pour  a+ib  non nul   *)
         var den:real;
         begin
         den := a*a + b*b ;
         c := a/den ;
         d := -b/den ;
         end;

end.

    Ecrire le programme général utilisant ces procédures et permettant la résolution d'une (ou plusieurs) équations avec le coefficient de x au carré non ul.

    Exemple : x*x-(3+2i)*x+(1+3i)=0    ====>    x1=1+i  et  x2=2+i


EXERCICE 2    Ecriture de sous programmes utilisateurs
    On se propose de coder ou de décoder un message secret constitué de mots formés de lettres majuscules. Le code consiste à laisser invariant les blancs entre les mots et à faire agir sur la i ième lettre du message i permutations circulaires.

        Ainsi    BONJOUR    devient    COQNTAY
        et    IL FAIT BEAU    devient    JN JFOA KOLG

    Ecrire un programme qui propose à l'utilisateur de laisser invariant, de coder ou de décoder le message de son choix, ce dernier ne pouvant dépasser 255 caractères qui est la longueur maximale d'une chaîne en Turbo-Pascal.
    Le programme devra utiliser :

 - un type mot=string[255]
- une fonction CIRC(X:char):char; qui associe à la lettre majuscule X sa transformée par permutation circulaire
(A-->B, B-->C, ... Z-->A)
- une fonction CIRCINV réciproque de la précédente
- une procédure CODE(m1:mot;Var m2:mot); qui code lemessage en m1 en m2
- une procédure DECODE(m1:mot;Var m2:mot); qui décode lemessage en m1 en m2
NB1 : La fonction SUCC(c) où c est de type char retourne le caractère qui suit c dans la liste des caractères rangés selon l'ordre ASCII. La fonction PRED(c) retournje le caractère qui précède c.

NB2 : Prévoir la possibilité de changer de message sans sortir du programme.