Vous êtes sur la page 1sur 10

Numéro d’anonymat : 1 2010-03-10 23 :54 :31.

000000000

Reportez votre numéro d’anonymat dans le cadre ci-dessous et en haut à gauche de chaque page de
l’énoncé.

A la fin de l’épreuve glissez ce cahier dans la copie double qui vous a été fournie, qui comporte
votre numéro d’anonymat et sur laquelle vous aurez écrit et masqué votre nom en rabattant dessus
et en collant la languette triangulaire. Vous ne devez rien écrire d’autre sur cette copie double.

Numéro d’anonymat :

UNIVERSITE DE PARIS SUD Centre d’Orsay 2009-2010 première session d’examen

L3 et Magistère 1ère année de Physique fondamentale

Examen d’informatique 8 Mars 2010 9h à 11h bât. 337 salle 2

Aucun document n’est autorisé.


Les programmes doivent être écrits en C/C++. Les réponses doivent obligatoirement être écrites sur les feuilles
de l’énoncé, dans l’espace réservé. Il est fortement conseillé de rédiger d’abord le plan des réponses au brouillon.
Respecter les notations de l’énoncé : par exemple la variable notée nt dans l’énoncé devra être écrite nt dans un
programme, n′′ devra être écrite ns.
Ne pas commencer à répondre à un exercice avant de l’avoir entièrement lu.
L’utilisation de fonctions est laissée à l’appréciation de l’étudiant, sauf quelques cas où elle est imposée.
On suppose que tous les #include<stdlib.h> ... using namespace std ; #include<bibli fonctions.h> nécessaires
sont sous-entendus, il n’y a pas à les écrire.
On rappelle qu’on ouvre un fichier en écriture par l’instruction : fstream xxx("nom de fichier.qqc",ios : :out) ;
et en lecture par : fstream yyy("nom de fichier.qqc",ios : :in) ;
Ne pas faire lire les données au clavier ou dans un fichier par un cin >>, ou l’équivalent pour un fichier, sauf si
cela est explicitement demandé. Par défaut, les données seront donc fournies dans le programme lui-même, par
des instructions du type :
dx=0.01;
a=1.7; b=1.1;
etc.
Dans chaque exercice on suppose que le programme principal1 et les fonctions2 sont écrits dans un unique fichier.
Les exercices sont indépendants les uns des autres.
Le nombre d’étoiles (de zéro à trois) donne une indication sur le niveau de l’exercice.
Le nombre de points (sur 40) attribué à chaque exercice est indiqué entre parenthèses après le nom de l’exercice
(c’est un barème indicatif ). Deux points sont réservés à la qualité de la présentation.
A titre indicatif le nombre de lignes du corrigé de chaque exercice est indiqué entre crochets (tout compris, c’est
à dire avec int main(), les accolades, return 0 ;, des commentaires éventuels).
Le corrigé pourra être consulté sur le site du cours.

1 s’il y en a un
2 s’il y en a

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2009-2010 première session
Numéro d’anonymat : 2 2010-03-10 23 :54 :31.000000000

Distance moyenne * (8) [12 lignes]


On considère n points de coordonnées (xi , yi ) répartis de façon quelconque dans un carré de côté 1.
Question : écrire un programme qui calcule la valeur moyenne des distances de ces points pris deux à deux.

Réponse à la question :
int main()
{
const int n=10000;
double x[n],y[n],d;
int i,j,nn;
for(i=0;i<n;i++){x[i]=alea(); y[i]=alea();} // ou n’importe quelle autre façon
// d’initialiser les points
for(d=0,nn=0,i=0;i<n;i++)
{
for(j=0;j<i;j++){d=d+sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); nn++;}
}
cout << "distance moyenne=" << d/nn << endl;
return 0;
}

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2009-2010 première session
Numéro d’anonymat : 3 2010-03-10 23 :54 :31.000000000

Variables ordinaires et pointeurs ** (8)


Indiquer les résultats affichés à l’écran par les huit programmes suivants. Les seules lignes qui diffèrent entre deux
programmes écrits côte à côte sont repérées par //.
Question 1 :
#include<iostream> #include<iostream>
using namespace std; using namespace std;
int main() int main()
{ {
int x,y; int x,y;
x=1; y=x; //
y=x; x=1; //
cout << x << " " << y << endl; cout << x << " " << y << endl;
x=2; x=2;
cout << x << " " << y << endl; cout << x << " " << y << endl;
return 0; return 0;
} }

Réponse : Réponse :
1 1 1 n’importe quoi
2 1 2 n’importe quoi

Question 2 :
#include<iostream> #include<iostream>
using namespace std; using namespace std;
int main() int main()
{ {
int x,*y; int x,*y;
x=1; y=&x; //
y=&x; x=1; //
cout << x << " " << *y << endl; cout << x << " " << *y << endl;
*y=2; *y=2;
cout << x << " " << *y << endl; cout << x << " " << *y << endl;
x=3; x=3;
cout << x << " " << *y << endl; cout << x << " " << *y << endl;
return 0; return 0;
} }

Réponse : Réponse :
1 1 1 1
2 2 2 2
3 3 3 3

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2009-2010 première session
Numéro d’anonymat : 4 2010-03-10 23 :54 :31.000000000

Question 3 :
#include<iostream> #include<iostream>
using namespace std; using namespace std;
int main() int main()
{ {
int w=1,*x,*y; int w=1,*x,*y;
x=&w; y=x; //
y=x; x=&w; //
cout << w << " " << *x << " " << *y << endl; cout << w << " " << *x << " " << *y << endl;
*x=2; *x=2;
cout << w << " " << *x << " " << *y << endl; cout << w << " " << *x << " " << *y << endl;
return 0; return 0;
} }

Réponse : Réponse :
1 1 1 1 1 n’importe quoi
2 2 2 2 2 n’importe quoi

Question 4 :
#include<iostream> #include<iostream>
#include<stdlib.h> #include<stdlib.h>
using namespace std; using namespace std;
int main() int main()
{ {
int i; int i;
const int n=3; int n=3; //
int x[n]; int *x=(int *)malloc(n*sizeof(int)); //
int y[n]; int *y; //
for(i=0;i<n;i++) x[i]=i; for(i=0;i<n;i++) x[i]=i;
y=x; y=x;
for(i=0;i<n;i++) for(i=0;i<n;i++)
{cout << x[i] << " " << y[i] << endl;} {cout << x[i] << " " << y[i] << endl;}
return 0; return 0;
} }

Réponse : Réponse :
erreur à la compilation : 0 0
impossible d’écrire l’égalité 1 1
entre deux tableaux, cela 2 2
revient à écrire qu’une adresse
est égale à une autre adresse

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2009-2010 première session
Numéro d’anonymat : 5 2010-03-10 23 :54 :31.000000000

Dioptres *** (12) [45 lignes]


Remarque : aucune connaissance sur les dioptres n’est nécessaire dans cet exercice, si ce n’est qu’un dioptre est une
surface, supposée ici sphérique, séparant deux milieux d’indices optiques différents.
On considère deux dioptres, de sommets et de centres de courbure respectifs S1 , C1 et S2 , C2 . Le dioptre (1) fait
passer de l’indice n à l’indice n′ , le dioptre (2) de n′ à n′′ . L’image d’un point A par le dioptre (1) est le point A′
dont l’image par le dioptre (2) est le point A′′ .

indice : n n′ n′′

point : A′ A C2 S1 O S2 C1 A′′ x
abscisse : (x′ ) (x) (c2 ) (s1 ) (s2 ) (c1 ) (x′′ )

(1) (2)

Le but de l’exercice est de tracer la courbe de x′′ en fonction de x pour des valeurs données des paramètres s1 , c1 ,
s2 , c2 , n, n′ et n′′ , puis de constituer la distribution statistique de x′′ à partir des erreurs statistiques commises sur
les mesures de x et des paramètres s1 , c1 , s2 , c2 (on suppose négligeables les erreurs sur n, n′ et n′′ ).
On a les relations suivantes entre les abscisses des différents points :
n′ n′′
x′ = s1 + ′ et x′′ = s2 + ′
n n−n n n′ − n′′
− −
x − s1 c1 − s1 x′ − s2 c2 − s2
Question 1 : écrire une fonction à laquelle on fournit cinq valeurs de type double dans des variables nommées u, s,
c, p, q et qui vaut :
q
s+ p p−q

u−s c−s
(on ne traitera pas les cas particuliers ou les dénominateurs sont nuls, ce que l’on devrait faire pour écrire un
programme propre).

Réponse à la question 1 :
double ff(double u,double s,double c,double p, double q)
{
double y;
y=p/(u-s)-(p-q)/(c-s);
return s+q/y;
}

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2009-2010 première session
Numéro d’anonymat : 6 2010-03-10 23 :54 :31.000000000

Question 2 : écrire un programme qui calcule les valeurs de x′′ correspondant à nv valeurs de x régulièrement
réparties de xmin à xmax et écrit ces valeurs dans un fichier en mettant un couple x x′′ par ligne de façon à obtenir
par exemple :
89.78 37.43
91.07 44.22
...
Des valeurs numériques à utiliser sont déjà écrites dans la réponse avec la déclaration des variables qui les contiennent.
Les autres variables devront être déclarées à la suite. On notera nv pour nv , xp pour x′ , xs pour x′′ , np pour n′ , ns
pour n′′ , etc.

Réponse à la question 2 :
int main()
{
double s1=0,c1=100,s2=20,c2=-50,n=1,np=1.4,ns=1,xmin=-500,xmax=500; // valeurs en millimètres
int i,nx=200;
double x,xp,xs,ddx;
ddx=(xmax-xmin)/(nx-1);
fstream res("dioptre_corrige_strict.res",ios::out);
for(i=0;i<nx;i++) // boucle sur les positions de l’objet
{
x=xmin+i*ddx;
xp=ff(x,s1,c1,n,np); xs=ff(xp,s2,c2,np,ns);
res << x << " " << xp << " " << xs << endl;
}
Question 3 : on suppose qu’on mesure un grand nombre de fois les cinq quantités x, s1 , c1 , s2 , c2 , chacune avec une
certaine erreur aléatoire, et qu’on calcule à chaque fois la valeur de x′′ correspondante. La valeur moyenne des valeurs
de x′′ obtenues donnera une bonne estimation de la valeur réelle inconnue de x′′ . On considère les mesures comme
des variables aléatoires distribuées uniformément dans un intervalle centré sur leurs valeurs exactes. Par exemple
le résultat d’une première mesure de x sera x + δ1 x, celui d’une seconde x + δ2 x, etc., les erreurs δi x ayant une
distribution aléatoire uniforme dans un intervalle [−d/2, d/2]. En supposant connues les valeurs exactes de x, s1 ,
c1 , s2 , c2 , compléter le programme écrit à la question 2 pour que, en simulant un grand nombre de mesures de ces
cinq quantités
p entachées d’une erreur aléatoire, il calcule la valeur moyenne et l’écart quadratique moyen de x′′ (qui
vaut < x > − < x′′ >2 , le symbole <> désignant la valeur moyenne) et constitue dans un tableau sa distribution
′′2

statistique dans l’intervalle [x′′min , x′′max ] supposé contenir la quasi-totalité des valeurs possibles de x′′ et découpé en
nt tranches égales.
Des valeurs numériques à utiliser pour x′′min et x′′max sont fournies au début de la réponse. On prend la même valeur
d=1mm pour les cinq quantités. Dans l’écriture du programme on notera nt pour nt , etc.

Réponse à la question 3 :
Ecrire ici la suite du programme commencé à la question 2
double xsmin=245,xsmax=270,d=1; // valeurs en millimètres
int ni=100000;
double dx,ds1,dc1,ds2,dc2,d=1;
double som,som2,xsmoy,sigxs,dxs; const int nt=10; int k,dist[nt];
x=-180;
dxs=(xsmax-xsmin)/nt;
for(i=0;i<nt;i++) dist[i]=0;
for(som=0,som2=0,i=1;i<=ni;i++) // boucle sur les mesures
{
dx=(alea()-0.5)*d; ds1=(alea()-0.5)*d; dc1=(alea()-0.5)*d;
ds2=(alea()-0.5)*d; dc2=(alea()-0.5)*d;
xp=ff(x+dx,s1+ds1,c1+dc1,n,np); xs=ff(xp,s2+ds2,c2+dc2,np,ns);
som+=xs; som2+=xs*xs;

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2009-2010 première session
Numéro d’anonymat : 7 2010-03-10 23 :54 :31.000000000

k=(xs-xsmin)/dxs; if(k<0) k=0; if(k>=nt) k=nt-1;


dist[k]++;
}
xsmoy=som/ni; sigxs=sqrt(som2/ni-xsmoy*xsmoy);
cout << xsmoy << " " << sigxs << endl;
return 0;
}

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2009-2010 première session
Numéro d’anonymat : 8 2010-03-10 23 :54 :31.000000000

Particule dans un champ électrostatique et un champ magnétique *** (12) [42 lignes]
On considère une enceinte carrée, de centre O et de côté 4R à l’intérieur de laquelle on distingue trois régions :

– la région (2), délimitée par le quart de cercle de centre O, de rayon R, situé dans le second cadran (x ≤ 0 et
y ≥ 0), dans laquelle est établi un champ électrostatique E ~ = E0 r0 u~r
r
– la région (3), délimitée par le quart de cercle de centre O, de rayon R, situé dans le premier cadran (x ≥ 0 et
y ≥ 0), dans laquelle est établi un champ magnétique B ~ = B0 r0 ~k
r
– la région (1), qui est la complémentaire des deux précédentes par rapport à l’enceinte et dans laquelle il n’y a
pas de champ.

~
E ~
JB

Région (2) :
~j Région (3) :
secteur électrostatique J secteur magnétique

O ~k ~i R x

v~0 θ0

× „ «
x0
P0 y0

Région (1) : complémentaire des régions (2) et (3) par rapport à l’enceinte

Enceinte carrée de côté 4R

Question 1 : écrire une fonction à laquelle on fournit les coordonnées d’un point dans le repère (O,~i, ~j) ainsi que la
valeur du paramètre R et qui vaut :

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2009-2010 première session
Numéro d’anonymat : 9 2010-03-10 23 :54 :31.000000000

0 si le point est à l’extérieur de l’enceinte


1 s’il est dans la région (1)
2 s’il est dans la région (2)
3 s’il est dans la région (3)

Réponse à la question 1 :
int pos(double x,double y ,double r)
{
double d2,r2=r*r,dr=2*r;
d2=x*x+y*y;
if(d2<=r2)
{
if(x<=0 && y>=0) return 2;
if(x>=0 && y>=0) return 3;
}
if(x>=-dr && x<=dr && y>=-dr && y<=dr) return 1;
return 0;
}
Une particule P , de coordonnées (x, y), de masse m et de charge q, est envoyée depuis un point P0 , de coordonnées
(x0 , y0 )3 , avec une énergie cinétique U0 , sa vitesse faisant un angle θ0 avec la normale à la face d’entrée du secteur
électrostatique. La vitesse initiale de la particule et les forces exercées par les champs E ~ et B ~ appartenant au plan
~ ~
(O, i, j), tout le mouvement s’effectue dans ce plan.
−−→
La relation fondamentale de la dynamique pour la particule s’écrit, en posant ~r = OP :

d2~r
– dans la région (1) : =0
dt2
d2~r q ~
– dans la région (2) : 2 = E
dt m
d2~r q ~
– dans la région (3) : 2 = ~v ∧ B
dt m
r
1 2U0
Le module v0 de la vitesse initiale est mv02 = U0 soit v0 = .
2 m
On choisit les produits E0 r0 et B0 r0 de telle façon que si la particule pénètre dans le secteur électrostatique en
incidence normale au rayon r elle décrit un demi-cercle de rayon r et de centre O.
Dans ces conditions on obtient pour les projections des équations du mouvement sur les axes :

Région (1) Région (2) Région (3)

dx dx dx
= vx = vx = vx
dt dt dt
dy dy dy
= vy = vy = vy
dt dt dt
dvx dvx x dvx vy
=0 = −v02 2 = v0
dt dt r dt r
dvy dvy y dvy vx
=0 = −v02 2 = −v0
dt dt r dt r

3 On suppose −R ≤ x0 ≤ 0 et y0 ≤ 0

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2009-2010 première session
Numéro d’anonymat : 10 2010-03-10 23 :54 :31.000000000

p
avec r = x2 + y 2 .
Question 2 : écrire un programme qui calcule par la méthode d’Euler la trajectoire de la particule jusqu’à ce qu’elle
sorte de l’enceinte. Les résultats seront écrits dans un fichier en mettant un couple x y par ligne de façon à obtenir
par exemple :
-0.5 -1.5
-0.500087 -1.499
-0.500174 -1.49801
...
Des valeurs numériques à utiliser sont déjà écrites dans la réponse avec la déclaration des variables qui les contiennent.
Les autres variables devront être déclarées à la suite.
Le programme peut être écrit avec ou sans tableaux ou fonctions, l’essentiel est qu’il soit bref et clair.

Réponse à la question 2 :
int main()
{
double R=1,x0=-R/2,y0=-3*R/2,U0=3e3*1.6e-19,m=16.e-3/6.023e23,teta0=5*M_PI/180; // unités SI
int i,np=10000,zz;
double dt,x,xx,y,yy,vx,vy,r,alp,v0,r2;
v0=sqrt(2*U0/m); alp=-v0*v0;
fstream res("spectro_corrige_strict.res",ios::out);
dt=R/v0/1000;
x=x0; y=y0;
vx=v0*cos(teta0+M_PI/2); vy=v0*sin(teta0+M_PI/2);
for(i=1;i<=np;i++)
{
res << " " << x << " " << y << endl;
xx=x; yy=y; r2=x*x+y*y;
x=x+vx*dt; y=y+vy*dt;
zz=pos(xx,yy,R);
if(zz==0) break;
if(zz==2)
{
vx=vx+alp*xx/r2*dt; vy=vy+alp*yy/r2*dt;
}
else if(zz==3)
{
r=sqrt(r2);
vx=vx+v0*vy/r*dt; vy=vy-v0*vx/r*dt;
}
}
return 0;
}

Licence et Magistère 1ère année de Physique fondamentale Examen d’informatique 2009-2010 première session

Vous aimerez peut-être aussi