Que fait ce programme ? (seule indication donnée : on utilise la méthode dite de Monte-Carlo).
Procédures et fonctions non standard utilisées:
Program Atrouver(Input,Output);
VAR truc1,truc2:real;
z,zz,zzz,zzzz:integer;
(*$I c:graph2d.inc *)
Function F1(X2,X1:real):boolean;
var i:real;
begin
i:=sqr(X1)+sqr(X2);
f1:=i<=1
end;
begin
zzzz:=0;
zz:=0;
ginit(1);
gechelleort(0,1,0,1);
repeat
write('?');
read(zzz);
for z:=1 to zzz do begin
zz:=zz+1;
truc1:=Random;
truc2:=Random;
if F1(truc1,truc2) then begin
zzzz:=zzzz+1;
gotoxy(1,25);
write(zz:4,' -> ',4*(zzzz/zz):12:10);
gcouleur(3);
gpoint(truc1,truc2)
end else begin
gcouleur(2);
gpoint(truc1,truc2)
end
end
until zzz=0;
gfin
end.
Ce programme devrait rechercher les nombres premiers (divisibles par aucun entier excepté 1 et lui-même). Pour cela on utilise un tableau dans lequel pour chaque entier on indique s'il est premier ou non. Au départ on les suppose tous possibles. On commence à éliminer les nombres pairs (sauf 2 qui est premier). Puis pour chaque nombre impair inférieur à NB on exclut tous les multiples (un sur deux car les pairs sont déjà éliminés). Il ne reste plus à la fin qu'à imprimer les nombres non éliminés.
Programme Nombres Premiers (Input,Output);
CONST Maximum:=32 000;
TYPE Tableau = array[1..Maximum]of boulean;
VAR Premier:tableau,
nb,fin,pas,multiple:integer;
BEGIN
Print('Tester jusqu'où ? ');
readln(nb);
for i=1 to nb do premier(i):=(i/2)=o;
premier[2]:=0;
i: =3;
fin:=int(sqr(nb);
while i=<fin do begin
if premier[i] do begin
pas:=ix2;
multiple:=i*i;
while multiple<=nb do
premier[i]:=false
multiple:=multiple+pas
end
end;
i=i+2
end
writeln('la liste des nombres premiers trouvés, de 1 à ';nb;' est : );
for i:=1 to nb do if premier[i] then write(i,' ')
end
On cherche à intégrer dans un programme existant la procédure INTERSEC qui permet de traiter les intersections de droites et cercles. Soient les déclarations globales suivantes :
TYPE tsorte=(segment,cercle);
tcoor=record x,y:real end;
tseg=record
pt1,pt2:tcoor;
case sorte:tsorte of
segment:();
cercle:(centre:tcoor)
end;
La procédure INTERSEC, que vous devez écrire, comporte deux arguments d'entrée de type TSEG, et doit rendre comme arguments de sortie un entier (entre 0 et 3) qui donnera le nombre de points d'intersection (3=infinité) et deux de type TCOOR qui donnent (si ils existent) les coordonnées des points d'intersection.
Une droite passant par xd,yd et xf,yf a pour équation générale :
(Y-YD)*(XF-YF) = (X-XD)*(YF-YD)
un cercle de centre xc,yc et de rayon r a pour équation
(X-XC)2 + (Y-YC)2 = R2
Cas droite-droite :
a X + b Y = c
a'X + b'Y = c'
|a b | D=|a' b'|=ab'-a'b.
Si D=0 pas de solution sinon une solution :
|c b | |a c | x= |c' b'|/D et y=|a' c'|/D
Cas droite-cercle :
à résoudre par la méthode du déterminant, puis trouver Y par l'équation de la droite
Cas cercle-cercle : on développe les 2 équations de cercles :
en soustrayant les 2 équations on obtient
que l'on peut mettre sous la forme Y=aX+b (sauf yc=yc'), on se ramène au cas droite-droite
Remarque : j'ai prévu de noter les questions 1 et 2 sur 6, la 3 sur 8
| P. TRAU |