UNIVERSITE BLAISE PASCAL                      10 JANVIER 2002
U.F.R. Sciences Exactes et Naturelles
 
D.E.U.G. MIAS-MASS - S1 - Examen Terminal d'Informatique

Documents et calculateurs interdits.                                                                           DUREE : 2 heures
L'emploi des instructions EXIT, HALT, GOTOXY et GOTO n'est pas autorisé.

EXERCICE

Quel affichage à l'écran provoque l'exécution du programme suivant ?  Justifier brièvement vos réponses.

PROGRAM exercice;
VAR h, i, k : integer;
PROCEDURE bizarre(var x, y : integer ; n : integer);
Var p : integer ;
Begin
  x:=n+1 ;
  p:=x+1 ;
  n:=p+1 ;
  y:=n+1 ;
End;
BEGIN
  writeln('     h     i     k') ; writeln ;
  h:=1 ; i:=3 ; k:=5 ; bizarre(k, i, h) ; writeln(h:6, i:6, k:6) ;
  h:=1 ; i:=3 ; k:=5 ; bizarre(h, i, k) ; writeln(h:6, i:6, k:6) ;
END.

PROBLEME

    On considère dans un plan, des figures géométriques composées de plusieurs points de coordonnées entières. Pour chaque figure, le nombre n (1<n<1000) de points est donné par l'utilisateur. On souhaite afficher les points d'une figure à l'écran dans un repère orthonormé avec les seules instructions write et writeln.

    On utilisera impérativement dans le programme les types suivants :

                POINT = array[1..2] of integer
                FIGURE = array[1..999] of POINT

Première partie : Construire les sous-programmes suivants.

Remarque : en cas de difficulté pour écrire un sous-programme, on se contentera d'en écrire l'en-tête avec ses paramètres.

1.1) CREER : remplit une figure F à m points de coordonnées aléatoirement choisies entre -20 et 20.

Remarque : Pour simplifier, on supposera par la suite que tous les points de la figure sont différents.

1.2) LISTER : affiche les coordonnées des points d'une figure F (un point par ligne).
 
T.S.V.P.
 
 
1.3) AVANT : teste si un point P devra être affiché (voir le dessin de la question 1.8) avant un point Q, c'est-à-dire :

                    - si P est au dessus de Q, autrement dit : si ordonnée(P)>ordonnée(Q),

                    - ou bien si P et Q sont sur le même niveau et si P est à gauche de Q,
                               autrement dit : si ordonnée(P)=ordonnée(Q) et abscisse(P)<abscisse(Q).

Exemple : P=(2,6) est avant Q=(5,1) car 6>1 ; Q est avant R=(7,1) car 1=1 mais 5<7.

1.4) ECHANGE : échange les points d'indices respectifs i et j dans une figure F.

1.5) CLASSER : trie les points d'une figure F selon l'ordre défini par le sous-programme AVANT.

Remarque : ce sous-programme pourra aussi utiliser ECHANGE et AVANT.

1.6) HAUTGAUCHE : donne les coordonnées du début de l'affichage (angle supérieur gauche), c'est-à-dire l'abscisse minimale et l'ordonnée maximale des points d'une figure F.

1.7) BASDROITE : sur le même principe, donne les coordonnées de la fin de l'affichage (angle inférieur droit), c'est-à-dire l'abscisse maximale et l'ordonnée minimale des points d'une figure F.

1.8) AFFICHER : affiche une figure F classée dans un repère sur le modèle de l'exemple suivant.
 
Exemple avec n=5 : 

Après création,  
F={(-2,-1),(2,6)(-4,4),(5,1),(7,1)}  

Après tri,  
F={(2,6),(-4,4),(5,1),(7,1),(-2,-1)}  

L'affichage souhaité est dessiné  
dans le cadre ci-contre 
Les caractères '#' correspondent  
à la présence d'un point (les axes 
sont matérialisés dans ce dessin 
par des caractères en gras, mais 
ne devront pas être tracés).  
 
 
 
haut-gauche --> 
   (-4,-6) 
 
 

 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 

<-- bas-droite 
            (7,-2) 
Deuxième partie :
    Construire le programme principal qui, à l'aide des types et des sous-programmes précédents,