{$N+} {directive de compilation pour le EXTENDED (n‚cessite un coprocesseur math‚matique)}
{************************************************
                 Hugo Eti‚vant
     http://www.multimania.com/cyberzoide/
      e-mail : cyberzoide@multimania.com
      (pour une aide en Turbo Pascal 7.0)
*************************************************

TP 5 EXERCICE 2 }

program montecarlo;    {nom du programme}
uses crt,graph;        {d‚claration des unit‚s}
var r,n,x0,y0,xe,ye,np,VGA,VGAHi:integer;
{d‚claration des variables:
r : rayon R du cercle
n : nombre N de tirages al‚atoires
x0 et y0 : corrdonn‚es du point central
xe et ye : coordonn‚es du point al‚atoire
np : nombre NP de points appartenant au disque
VGA et VGAHi : variables pour carte graphique}

procedure entree;     {proc‚dure "entree"}
begin
clrscr;  {efface l'‚cran}
repeat    {bloc boucle}
 write('Entrez la valeur de N [2000..3000] : '); {‚crit un message}
 readln(n);  {lit la valeur entr‚e par l'utilisateur}
until (n>=2000) and (n<=3000); {fin de bloc boucle si n compris dans [2000..3000]}
repeat {autre bloc boucle}
 write('Entrez la valeur de R [50..200] : ');
 readln(r);
until (r>=50) and (r<=200); {fin de bloc boucle si r compris dans [50..200]}
end;

procedure graphique;
var i:integer;           {d‚claration de variables propres … la proc‚dure}
    distaucentre:extended; {ce choix au lieu de "INTEGER" est pour pouvoir
                           utiliser de plus grand nombres et donc aller plus
                           loin dans l'approximation (en th‚orie...!)}
begin
clrscr;  {efface l'‚cran}
initgraph(VGA,VGAHi,'c:\bp\bgi');  {initialisation du mode graphique}
x0:=round(getmaxx/2); {coordonn‚es de l'origine}
y0:=round(getmaxy/2);
setcolor(15);    {choix de la couleur blanche}
circle(x0,y0,r);   {dessine un cercle}
rectangle(x0-r,y0-r,x0+r,y0+r); {dessine un rectangle}
randomize;    {initalisation du g‚n‚rateur de nombres al‚atoires}
for i:=1 to n do   {bloc boucle non conditionnelle}
begin
 xe:=x0+random(2*r+1)-r; {coordonn‚es du point al‚atoire}
 ye:=y0+random(2*r+1)-r;
 distaucentre:=sqrt(sqr(xe-x0)+sqr(ye-y0)); {d‚termination de l'appartenance au disque}
 if distaucentre<=r then {bloc conditionnel}
 begin
  putpixel(xe,ye,4); {affichage du pixel rouge si Ok}
  inc(np);    {incr‚mentation de 1 … la variable NP}
 end
 else putpixel(xe,ye,14); {sinon affiche un pixel jaune}
{fin du bloc conditionnel par le point-virgule du ELSE}
end;   {fin du bloc boucle}
readln; {pause, attend que <ENTREE> soit press‚e}
closegraph;  {retourne au mode texte}
end;

procedure results;
begin
writeln('N vaut : ',n,'. NP vaut : ',np,'. Et donc pi vaut : ', (4*(np/n)):0:5);
readln;
end;

BEGIN    {programme principal}
entree;
graphique;
results;
END.   {fin du programme}
