Numéro d`anonymat :

Transcription

Numéro d`anonymat :
Numéro d’anonymat :
1
2007-03-13 15 :17 :54.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
2006-2007 première session d’examen
L3 et Magistère 1ère année de Physique fondamentale
Examen d’informatique Mardi 6 Mars 2007
14h à 16h
bât. 337
salle 2
Aucun document n’est autorisé.
Les programmes doivent être écrits en 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 les réponses au brouillon.
Respecter les notations de l’énoncé.
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.
Ne pas faire lire les données au clavier ou dans un fichier par un scanf ou un fscanf, 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 principal 1 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.
Les corrigés pourront être consultés sur le site du cours.
1 s’il
2 s’il
y en a un
y en a
Licence et Magistère 1ère année de Physique fondamentale
Examen d’informatique 2006-2007 première session
Numéro d’anonymat :
2
2007-03-13 15 :17 :54.000000000
Pointeur ()
Qu’est-ce qu’un pointeur ? Comment le déclare-t-on ?
Réponse (courte) :
Un pointeur est une variable susceptible de contenir une adresse. Par exemple, on déclare un pointeur nommé
p pouvant contenir l’adresse d’une variable ordinaire de type double, et on y place l’adresse d’une telle variable
nommée x, par :
double *p;
double x;
p=&x;
Allocation dynamique de mémoire ()
Qu’est-ce qu’une allocation dynamique de mémoire ? Donner un exemple le plus simple possible.
Réponse (courte) :
L’allocation dynamique de mémoire permet d’obtenir une adresse et n octets consécutifs réservés à partir de cette
adresse, qui est la valeur de la fonction malloc(n).
Résultats ()
Quels sont les résultats affichés à l’écran par les deux programmes suivants ?
#include<stdio.h>
int main(void)
{
#include<stdio.h>
int main(void)
{
}
}
Réponse :
11
21
Réponse :
11
22
int x,y ;
x=1 ;
y=x ;
printf("%d %d\n",x,y) ;
x=2 ;
printf("%d %d\n",x,y) ;
return 0 ;
int x ; int *y ;
x=1 ;
y=&x ;
printf("%d %d\n",x,*y) ;
x=2 ;
printf("%d %d\n",x,*y) ;
return 0 ;
Fonction Γ ()
Soit une fonction mathématique Γ vérifiant la relation de récurrence
√
1
1
1
1
= k−
Γ k−
pour k entier ≥ 1, et Γ
= π
Γ k+
2
2
2
2
1
Ecrire une fonction d’argument n entier ≥ 0, et de valeur Γ n +
. Ne pas écrire une fonction récursive. Ne pas
2
écrire d’appel de cette fonction, mais seulement la fonction elle-même.
Réponse :
double gamma(int n)
{
static const double sqpi=sqrt(acos(-1.));
double gam; int k;
gam=sqpi;
Licence et Magistère 1ère année de Physique fondamentale
Examen d’informatique 2006-2007 première session
Numéro d’anonymat :
3
2007-03-13 15 :17 :54.000000000
for(k=1;k<=n;k++) gam=(k-0.5)*gam;
return gam;
}
Suite ()
1
Ecrire un programme qui calcule et affiche à l’écran tous les termes de la suite u n = (n entier ≥ 1) supérieurs ou
n
égaux à une valeur ε arbitraire. La valeur de ε doit être demandée à l’utilisateur et lue au clavier par un scanf.
Réponse :
#include<stdio.h>
#include<math.h>
int main(void)
{
int n; double x,eps;
printf("Valeur de epsilon ? = ");
scanf("%lg",&eps);
n=1;
while(1)
{
x=1./n;
if(x<eps) break;
printf("n=%d 1/n=%lg\n",n,x); n++;
}
printf("\n");
// --------------- Variante --------------n=1;
while((x=1./n)>=eps) {printf("n=%d 1/n=%lg\n",n,x); n++;}
return(0);
}
Minimum ()
On considère la fonction mathématique
sin x
, dont le graphe est tracé sur la figure suivante :
x
1
0.8
0.6
sin(x)/x
0.4
0.2
0
-0.2
-0.4
0
2
4
6
8
10
x (radians)
Fig. 1 –
Licence et Magistère 1ère année de Physique fondamentale
Examen d’informatique 2006-2007 première session
Numéro d’anonymat :
4
2007-03-13 15 :17 :54.000000000
Ecrire un programme qui la calcule aux points régulièrement espacés x = 0, x = dx, x = 2dx, ... jusqu’à trouver la
première valeur strictement supérieure à la précédente, dx étant un nombre réel positif quelconque inférieur ou égal
à 0.01. Le programme affichera à l’écran les deux dernières valeurs calculées et les valeurs de x correspondantes (on
aura donc obtenu un encadrement de largeur dx de la position du premier minimum).
Réponse :
#include<stdio.h>
#include<math.h>
double sinc(double x)
{
if(x==0.) return(1);
else return (sin(x)/x);
}
int main(void)
{
double x,dx,y;
x=0; dx=1.e-2;
do
{
y=sinc(x);
x+=dx;
}
while(sinc(x)-y<=0.);
printf("%lg %lg %lg %lg\n",x-dx,y,x,sinc(x));
return (0);
}
Centre de gravité ()
Dans un plan on place un ensemble de n masses mi aux points Pi de coordonnées xi , yi . Le centre de gravité G de
ces n masses est défini par
n
X
−−→
mi OPi
−−→
OG = i=1n
X
mi
i=1
O étant un point origine quelconque.
Ecrire une fonction à laquelle on fournit le nombre n de masses, leurs valeurs mi , les coordonnées xi , yi , et qui renvoie
les coordonnées de G. Cette fonction doit pouvoir être utilisée pour des valeurs quelconques de n (supposées ≥ 1),
comme dans l’exemple du programme suivant qu’il faut compléter :
#include<stdio.h>
#include<math.h>
#define NA 3
#define NB 5
------------------|
|
|
|
| FONCTION A ECRIRE |
|
|
|
|
------------------int main(void)
{
double xa[NA]={1.2,4.7,-3.5},ya[NA]={8.3,-6.2,7.7},ma[NA]={3.5,6.7,5.1};
double xb[NB]={3.9,7.5,-8.4,4.2,3.4},yb[NB]={-6.5,0.1,4.3,6.2,-4.0},mb[NB]={0.6,7.4,6.3,5.9,3.2};
Licence et Magistère 1ère année de Physique fondamentale
Examen d’informatique 2006-2007 première session
Numéro d’anonymat :
5
2007-03-13 15 :17 :54.000000000
------------------------------------------|
|
|
|
| PARTIE DU PROGRAMME PRINCIPAL A COMPLETER |
|
|
|
|
------------------------------------------return 0;
}
Le programme principal doit afficher à l’écran les coordonnées du centre de gravité pour un premier ensemble de
NA masses ma[i], de coordonnées xa[i], ya[i], puis pour un second ensemble de NB masses mb[i], de coordonnées
xb[i], yb[i]. Ne pas recopier dans les réponses ce qui est déjà écrit dans le canevas ci-dessus, ajouter uniquement
ce qui doit figurer à l’emplacement des deux rectangles bordés de tirets.
Réponse pour la fonction à écrire :
void cg(double m[],double x[],double y[],double *gx,double *gy,int n)
{
int i; double sm;
for(*gx=0.,*gy=0.,sm=0.,i=0;i<n;i++) {*gx+=m[i]*x[i]; *gy+=m[i]*y[i]; sm+=m[i];}
*gx/=sm; *gy/=sm;
}
Réponse pour le programme principal à compléter :
double u,v;
cg(ma,xa,ya,&u,&v,NA); printf("xga=%lg yga=%lg\n",u,v);
cg(mb,xb,yb,&u,&v,NB); printf("xgb=%lg ygb=%lg\n",u,v);
Calcul d’aire ()
a et b étant deux nombres réels positifs tels que a ≥ b, on considère deux arcs d’ellipse d’équations
r
x2
y = a 1 − 2 avec 0 ≤ x ≤ b
b
et
y=b
r
1−
x2
a2
avec
0≤x≤a
représentés sur la figure
Licence et Magistère 1ère année de Physique fondamentale
Examen d’informatique 2006-2007 première session
Numéro d’anonymat :
6
2007-03-13 15 :17 :54.000000000
1.8
1.6
1.4
1.2
y
1
0.8
0.6
0.4
0.2
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
x
Fig. 2 – Dans l’exemple de cette figure a=1.7 et b=1.1
1. Ecrire une fonction à trois arguments réels x, u, v dont la valeur est v
r
1−
x2
.
u2
Réponse :
double se(double x,double u,double v)
{
return v*sqrt(1.-x*x/u/u);
}
2. Chacun de ces arcs délimite un secteur elliptique dans le premier quadrant des axes Ox et Oy.
1.8
1.6
1.4
1.2
y
1
0.8
0.6
0.4
0.2
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
x
Fig. 3 –
Ecrire un programme qui calcule et affiche à l’écran la valeur de l’aire de l’intersection de ces deux secteurs
elliptiques3 par une méthode simple de tirages aléatoires, en utilisant la fonction alea().
Réponse :
3 région
couverte de pointillés sur la figure 3
Licence et Magistère 1ère année de Physique fondamentale
Examen d’informatique 2006-2007 première session
Numéro d’anonymat :
7
2007-03-13 15 :17 :54.000000000
#include<stdio.h>
#include<math.h>
#include<fonctions_magistere.h>
int main(void)
{
int i,imax=100000,s;
double a=1.7,b=1.1,x,y;
for(s=0,i=1;i<=imax;i++)
{
x=b*alea(); y=b*alea();
if(y<=se(x,a,b) && y<=se(x,b,a)) s++;
}
printf("s=%lg\n",(double)s/imax*b*b);
return(0);
}
3. Indiquer une ou deux conditions nécessaires simples que le programme doit vérifier pour être juste.
Réponse :
Si a = b on doit retrouver l’aire d’un quart de cercle. Si a >> b on doit retrouver l’aire d’un carré de côté b.
Mouvement d’une charge ()
Soit Ox un axe portant deux charges électriques positives q1 et q2 fixes, situées en des points d’abscisses respectives
x1 et x2 . Une charge positive q, de masse m, mobile, d’abscisse x, ne peut se déplacer que sur l’axe Ox et n’est
soumise qu’aux deux forces électrostatiques exercées sur elle par q 1 et q2 (il n’y a donc ni pesanteur ni frottement).
Fig. 4 –
La force exercée par q1 , par exemple, sur q, s’écrit, en valeur algébrique
qq1 x − x1
4πε0 |x − x1 |3
avec
1
= 9 109 SI
4πε0
Par définition de la vitesse de q, notée v, et suivant le principe fondamental de la dynamique appliqué à la charge q,
on a le système de deux équations différentielles du premier ordre couplées
dx
=v
dt
dv
x − x1
q
x − x2
q1
=
+ q2
dt
4πε0 m
|x − x1 |3
|x − x2 |3
et dans l’approximation d’Euler
dx
dt
dv
v(t + dt) = v(t) + dt
dt
x(t + dt) = x(t) + dt
Licence et Magistère 1ère année de Physique fondamentale
Examen d’informatique 2006-2007 première session
Numéro d’anonymat :
8
2007-03-13 15 :17 :54.000000000
A l’instant t=0 la charge q est lâchée sans vitesse initiale à une abscisse quelconque mais comprise strictement entre x 1
et x2 . L’abscisse et la vitesse initiales devront être lues dans un fichier supposé pré-existant et nommé mouvement.dat
dans le système de fichiers Linux. Elles y sont écrites, par exemple, de la façon suivante :
0.9 0.
1. Ecrire un programme qui calcule x et v en fonction du temps par la méthode d’Euler, aux instants t = 0,
dt, 2dt, ..., ndt. Les résultats devront être stockés dans un fichier, nommé mouvement.res dans le système de
fichiers Linux, sous la forme d’un triplet de nombres t x(t) v(t) par ligne, soit, par exemple :
0 0.9 0
1e-06 0.9 -0.000596296
2e-06 0.9 -0.00119259
...
1 0.174347 8.81586
Partir du canevas suivant, en mettant dans la réponse uniquement ce qui doit figurer à l’emplacement des deux
rectangles bordés de tirets :
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
const double g_cc=9.e9;
----------------------|
|
|
|
| FONCTIONS EVENTUELLES |
|
|
|
|
----------------------int main(void)
{
int i,n; double q,m,x,v,q1,x1,q2,x2,t,dt;
FILE *fd=fopen("mouvement.dat","r");
FILE *fr=fopen("mouvement.res","w");
q=1.e-5; m=0.3; q1=1.e-5; x1=0; q2=2.e-5; x2=1;
t=0; n=1000000; dt=1.e-6;
------------------------------------------|
|
|
|
| PARTIE DU PROGRAMME PRINCIPAL A COMPLETER |
|
|
|
|
------------------------------------------return 0;
}
Réponse :
Fonction à ajouter :
double ff(double q,double x,double qcf,double xcf)
{
double u;
u=x-xcf;
return g_cc*q*qcf*u/pow(fabs(u),3);
}
A ajouter dans le programme principal :
fscanf(fd,"%lg%lg",&x,&v);
Licence et Magistère 1ère année de Physique fondamentale
Examen d’informatique 2006-2007 première session
Numéro d’anonymat :
9
2007-03-13 15 :17 :54.000000000
for(i=0;i<=n;i++)
{
fprintf(fr,"%lg %lg %lg\n",t,x,v);
x=x+dt*v;
v=v+dt*(ff(q,x,q1,x1)+ff(q,x,q2,x2))/m;
t=t+dt;
}
2. Indiquer ce qu’il faut ajouter au programme précédent pour calculer et imprimer l’énergie totale de la particule
à chaque instant, en plus de t x(t) v(t), en vue de vérifier sa constance.
Réponse :
Fonction à ajouter :
double epot(double q,double x,double qcf,double xcf)
{
return g_cc*q*qcf/fabs(x-xcf);
}
Et, dans le programme principal, remplacer :
fprintf(fr,"%lg %lg %lg\n",t,x,v);
par :
fprintf(fr,"%lg %lg %lg %lg\n",t,x,v,m*v*v/2+epot(q,x,q1,x1)+epot(q,x,q2,x2));
Licence et Magistère 1ère année de Physique fondamentale
Examen d’informatique 2006-2007 première session