Examen Juin 02 Avec Corriges
Examen Juin 02 Avec Corriges
Examen Juin 02 Avec Corriges
Le chiffre à côté du titre de la question indique le nombre de points sur 40, les * le niveau de difficulté.
Plus grand entier int, plus grand et plus petit réel double (1) *
Sur Criens :
Quel est l’ordre de grandeur du plus grand entier de type int positif ?
Quel est l’ordre de grandeur du plus grand réel de type double positif ?
Quel est l’ordre de grandeur du plus petit réel de type double non nul et positif ?
Réponse :
Voir cours.
Voir cours.
Résultats (3) **
Quels résultats donne le programme suivant :
#include<stdio.h>
int main(void)
{
int i=1,j,k;
double x=1.,y,z;
j=x*i/2; k=i/2*x;
y=x*i/2; z=i/2*x;
printf("%d %d %lg %lg\n",j,k,y,z);
return (0);
}
Réponse :
0 0 0.5 0
Pointeurs (3) **
Quel est le résultat fourni par le programme suivant :
#include<stdio.h>
#define N 4
int main(void)
{
double t[N]={1,3,5,7};
double *x;
x=t;
printf("%lg %lg %lg\n",x[2],*x,*(x+1));
printf("%lg %lg\n",x[4],*(x+4));
return (0);
}
Réponse :
5 1 3
4.8543e-270 4.8543e-270
#include<stdio.h>
#define N 7
/* ---------------------------------------------------*/
void extremes(int l[],int n,int *li,int *la)
{ int i;
*li=l[0]; *la=l[0];
for(i=1; i<n; i++)
{
if(l[i] < *li) *li=l[i];
if(l[i] > *la) *la=l[i];
}
}
/* ---------------------------------------------------*/
int main(void)
{
int n,l[N]={23,76,98,1,43,212,11},lmin,lmax;
n=N;
extremes(l,n,&lmin,&lmax);
printf("%d %d\n",lmin,lmax);
return (0);
}
/* ---------------------------------------------------*/
O x
Fig. 1 –
1 X 2
+∞
+ m(m − 2)(m − 4) cos πlx
2 3lπ
l=1
les valeurs possibles de l : l1 , l2 , l3 , ... étant quelconques mais entières, strictement positives, deux à deux distinctes
et en nombre inférieur ou égal à un entier N arbitraire.
s(x) est donc simplement la série de Fourier de la fonction créneaux restreinte aux termes pour lesquels l = l 1 , l2 , l3 , ....
Ecrire un programme qui effectue les tâches suivantes :
#include<stdio.h>
#include<math.h>
#include<fonctions_magistere.h>
#define N 100
int main(void)
{
int i,n,l[N],lmin,lmax;
double x,dx,xmin,xmax,pi=acos(-1.),u,s;
FILE *fich;
fich=fopen("somme_partielle.res","w");
printf("Combien de valeurs de l (<=%d) ? ",N); scanf("%d",&n);
for(i=0; i<n; i++) {printf("l[%d]=? ",i); scanf("%d",&l[i]);}
printf("Valeurs de xmin et xmax ? "); scanf("%lg %lg",&xmin,&xmax);
/* Determination du pas en x : le pas doit etre petit par rapport a la plus petite periode */
lmax=l[0]; for(i=1; i<n; i++) if(l[i]>lmax) lmax=l[i];
dx=2./lmax/100;
x=xmin;
while(x<=xmax+dx)
{
s=0.5;
for(i=0; i<n; i++)
{
u=l[i]*pi/2;
s=s+sin(u)/u*cos(pi*l[i]*x);
}
fprintf(fich,"%lg %lg\n",x,s);
x=x+dx;
}
fclose(fich);
system("gnuplot somme_partielle.gnu");
return (0);
}
Q1
θ1
O θ2 x
Q2
Fig. 2 –
La position d’une charge est définie par l’angle polaire θi = (Ox, OQi ).
1. Ecrire une fonction à laquelle on fournit en argument :
les valeurs q1 et q2 des charges
les angles polaires θ1 et θ2
et dont la valeur est l’énergie potentielle électrostatique du système des deux charges.
1
Les valeurs numériques sont dans le système SI, dans lequel = 9 109 .
4πε0
2. Ecrire une seconde fonction qui fait la même chose que celle du 1. mais pour un système de N charges, N étant
défini par un #define N .... Cette seconde fonction doit utiliser celle du 1. Prendre garde à ne pas faire
calculer deux fois les énergies.
Réponse :
#include<stdio.h>
#include<math.h>
#define N 5
/* ------------------------------------------------------------ */
double e(double q1,double q2,double t1,double t2)
{
static double c=9.e9;
double d;
d=sqrt(2*(1-cos(t2-t1)));
if(d==0.) {printf("Charges confondues\n"); exit(1);}
return(q1*q2*c/d);
}
/* ------------------------------------------------------------ */
double en(double q[],double t[],int n)
{
int i,j;
double s=0;
for(i=0; i<n; i++) for(j=i+1; j<n; j++) s=s+e(q[i],q[j],t[i],t[j]);
return(s);
}
/* ------------------------------------------------------------ */
int main(void)
{
double q1=1,q2=2,t1=1.57,t2=-1.57;
double q[N]={1,3,5,7,9}, t[N]={0,0.2,0.5,0.9,1.4};
printf("Energie (SI) de deux charges=%lg\n",e(q1,q2,t1,t2));
printf("Energie (SI) de N charges=%lg\n",en(q,t,N));
return(0);
}
/* ------------------------------------------------------------ */
#include<stdio.h>
/* ----------------------------------------------------------- */
double racine(double (*f)(double),double a,double b)
{
static double eps=1.e-10;
double xa,xb,xc,u;
xa=a; xb=b;
while(1)
{
xc=(xa+xb)/2.; u=(*f)(xc);
if(u==0.) return(xc);
else
{
if(u*(*f)(xa)>0.) xa=xc;
else xb=xc;
}
if(fabs(xb-xa)<eps) return(xa);
}
}
/* ----------------------------------------------------------- */
double f1(double x)
{
return(x*(x-1)*(x-2));
}
/* ----------------------------------------------------------- */
int main(void)
{
double a,b;
a=0.5; b=1.5;
printf("Entre %lg et %lg racine = %lg\n",a,b,racine(f1,a,b));
a=1.5; b=2.5;
printf("Entre %lg et %lg racine = %lg\n",a,b,racine(f1,a,b));
}
4 qu’on n’a pas à écrire
/* ----------------------------------------------------------- */
partie
commune
Fig. 3 –
#include<stdio.h>
#include<math.h>
#include<fonctions_magistere.h>
#define N 10000
int main(void)
{
int i,n;
double pi=acos(-1.),dpi=2*pi;
double r1,r2,d,d1,d2,x,y,t,u;
r1=1.; r2=0.5; d=0.5;
/*-------------------------------------------------------------------------------------*/
if(d>r1+r2) {printf("Les disques n’ont pas de partie commmune\n"); return (1);}
printf("Les disques ont une partie commmune\n");
/*-------------------------------------------------------------------------------------*/
/* Premiere methode */
n=0;
5 mais ce n’est pas la seule méthode possible