Univ. Paris-Sud 11 - Licence MPI L1 Informatique, 2i`eme sem. 2018-2019
TD n
o4
S´emantique des passages de param`etres
Exercice 1.
void ajouter (int a, int b, int c) { c = a + b;
}
int main () { int x, y, z;
x = 2;
y = 8;
z = 7;
cout << "avant, x =" << x << "y =" << y << "z =" << z << endl;
ajouter(x, y, z);
cout << "apres, x =" << x << "y =" << y << "z =" << z << endl;
return 0;
}
1. Donnez lestableaux d’activationdes proc´edure et fonction ci-dessus puis les ´etats successifs de la m´emoire, pour les principales ´etapes du programme. Pr´ecisez les affichages `a l’´ecran lorsqu’il y en a.
2. Que remarquez vous ? Comment s’appelle le passage du param`etre c ?
3. Modifiez la proc´edureajouterpour que z soit modifi `a la sortie de la proc´edure. Comment le param`etre c est-il pass´e ?
Exercice 2.
1. R´ealisez la proc´edureretrancherqui modifie la valeur de son premier param`etre en retran- chant de celui-ci la valeur de son deuxi`eme param`etre.
2. R´ealisez la fonctionmoduloqui utilise la proc´edureretrancherpour calculer puis renvoyer le reste de la division enti`ere de son premier param`etre par son deuxi`eme.
3. R´ealiser le programme principal qui lit deux nombres entiers positifs et calcule le modulo du premier nombre par le deuxime et l’affiche.
4. Donnez les tableaux d’activation et les ´etats successifs de la m´emoire pour les principales
´etapes du programme. Pr´ecisez les affichages `a l’´ecran lorsqu’il y en a. On supposera que les nombres lus sont 13 et 4.
Exercice 3.
1. Etant donn´ee la fonctionsqrtqui calcule la racine d’un nombre, r´ealisez une fonction pqui prend en donn´ee un r´eel x, puis qui renvoie un bool´een et transmet en r´esultat un r´eel. Si la racine carr´ee de (x-1)*(2-x) est d´efinie au pointx, le r´eel sera cette racine et le bool´een vaudra true, sinon le r´eel sera nul et le bool´een vaudrafalse.
2. R´ealisez le programme principal qui, par deux fois, appelle la fonctionpavec un param`etre r´eel dont la valeur est demand´ee `a l’utilisateur et qui, si le bool´een transmis esttrue, affiche le r´eel transmis.
1
3. Donnez les tableaux d’activation et les ´etats successifs de la m´emoire pour les principales
´etapes du programme. Pr´ecisez les affichages `a l’´ecran lorsqu’il y en a. On supposera que l’utilisateur rentre successivement pourxles valeurs 1.1 puis 2.5.
Partie sur les structures
Exercice 4. Consid´erons la d´efinition ci-dessous du type structur´e “Point”, qui utilise deux champs xety, qui sont les coordonn´ees d’un point dans le plan.
struct Point { float x, y ; };
On va utiliser la proc´edure suivante qui permet de cr´eer et de transmettre en r´esultat une variable de typePoint, `a partir de ses coordonn´ees lues aupr`es de l’utilisateur. Notez qu’au lieu de transmettre desfloat, ou desint, on renvoie un . . . . Point!!.
void litPoint (Point &p) {
cout << "abscisse ? "; cin >> p.x ; cout << "ordonnee ? "; cin >> p.y ; }
La notation point´ee permet d’´ecrire dans les champs d’une structure, mais ´egalement d’acc´eder `a ces champs, comme le montre la fonction suivante :
float abscisse (Point p) { return p.x ;
}
1. Ecrivez une fonction qui renvoie l’ordonn´ee d’un point.
2. Ecrivez une proc´edure qui affiche les coordonn´ees d’un point puis r´ealisez un programme prin- cipal utilisant cette proc´edure.
3. R´ealisez une fonctiondistance qui renvoie la distance entre deux points donn´es. Rappel : distAB =q(xB−xA)2+ (yB−yA)2
4. Ecrivez une fonction qui ´etant donn´es deux pointsA etB, renvoietruesi les deux points ne sont pas confondus, et transmet en r´esultat le point situ´e au milieu du segmentAB.
5. Utilisez la fonctionEgalApproch´edonn´ee ci-dessous pour v´erifier que le milieu calcul´e dans la fonction pr´ec´edente est bien `a ´egale distance des deux extr´emit´es du segment.
const float e = 1e-6 ;
bool EgalApproche( float x, float y){
return (fabs(x-y) < e * fabs(x)) and (fabs(x-y) < e * fabs(y) );
}
o`ufabs()est la fonction valeur absolue pour les r´eels.
2