Examen d'informatique

ISFATES Metz-Saarbrucken

mars 1989

Le sujet porte sur des problèmes de graphisme. On suppose posséder sur notre ordinateur un écran graphique monochrome, dont on peut soit allumer soit éteindre chaque point (appelé pixel). On fonctionne en multi-fenêtre, c'est à dire que chaque programme n'utilise qu'une partie (rectangulaire) de l'écran. On suppose déjà définies les procédures : On va créer un ensemble de sous-programmes permettant de faire du graphique.

QUESTION 1 : écrire la procédure EFFACE qui éteint toute la fenêtre.

QUESTION 2 : écrire la procédure DROITE_HORIZ(xa,xb,y:integer) qui trace une droite horizontale entre les points (xa,y) et (xb,y). On ne doit tracer QUE la partie visible (dans le fenêtre). Faites tous les tests nécessaires.

QUESTION 3 : écrire une procédure traçant une droite inclinée, dans le cas où l'angle de la droite à tracer avec l'horizontale compris entre -45° et +45°.Pour simplifier le problème, on suppose les droites à tracer totalement visibles.

QUESTION 4 : en supposant déjà écrite la procédure traitant les droites entre45° et 135°, écrire la procédure DROITE traçant n'importe quelle droite reliant(xa,ya) à (xb,yb), à condition que les extrémités soient visibles. On ne calculera pas d'angle mais on comparera xa-xb à ya-yb.

QUESTION 5 : Ce programme est (ou devrait être) un mini programme de dessin. Trouvez ses possibilités ainsi que les erreurs de programmation.

Program Dessin(input,output);
var ax,bx,ay,by:real;

procedure prepare;
var x0,x1,y0,y1:real;
begin
  get_window;
  write('les X varieront entre ? );readln(x0);
  write('et ? ');readln(x1);
  write('les Y varieront entre ? );readln(y0);
  write('et ? ');readln(y1);
  ax:=(xmax-xmin)/(x1-x0);  bx:=xmin-ax*x0;
  ay:=(ymax-ymin)/(y1-y0);  by:=ymin-ay*y0;
  efface
end;

procedure echelle(x,y:real;var xp,yp:integer);
begin
  xp:=ax*x + bx;  yp:=ay*y + by
end;

procédure droite(xa,ya,xb,yb:real);
var ixa,ixb,iya,iyb:real;
begin
  echelle(xa,ya,ixa,iya);  echelle(ya,ya,iya,iya);
  droite(ixa,iya,ixb,iyb)
end;

procedure dessin;
var x,y,xavant,yavant:real;
    c:char;
begin
  repeat
    writeln('entrer Premier point ou Autre point d'une ligne brisée');
    write('ou Quitter le programme (P/A/Q) ?');
    readln(c);
    case c of
      'P':entre(xavant,yavant);
      'A':entre(x,y);
          droite(xavant,yavant,x,y);
          xavant:=x;yavant:=y
  until c='Q' 
end

begin prepare;dessin end

retour retour au sommaire des sujets

P. TRAU