14
Licence STPI Semestre 3 - Examen de Validation de Module - Janvier 2006 ULSI301 - LANGAGE C Durée : 2h. - Documents et Calculatrices autorisés. Toutes les réponses doivent être justifiées - Les exercices sont indépendants Dès le moment où une fonction est décrite dans une question, vous pouvez supposer qu’elle est correcte pour toute la suite de l’exercice, que vous ayez su l’écrire ou non. - Exercice I : Matrices 2x2 de Nombres Complexes - I.1 - Nombres Complexes 1 - Ecrivez la structure cplx qui permet de représenter correctement un nombre complexe. 2 - Ecrivez maintenant le type complexe qui permet de représenter correctement un nombre complexe. Vous pourrez vous baser ou pas sur la structure cplx définie précédemment (au choix). Attention : A partir de maintenant, nous n’utiliserons plus que le type complexe et plus la structure cplx. 3 - Ecrivez la fonction complexe saisieComplexe1(void); qui permet la saisie au clavier d’un nombre complexe. 4 - Ecrivez une fonction nommée saisieComplexe2 qui fait le même travail en passage par adresse. 5 - Ecrivez une fonction nommée afficheComplexe qui permet d’afficher un nombre complexe a l’écran. Vous passerez le nombre complexe à afficher par adresse. 6 - Ecrivez une fonction nommée produitComplexe qui permet d’effectuer le produit de deux matrices de nombres complexes fournies en paramètre. Ces deux matrices seront passées par valeur, alors que le résultat sera passé par adresse. I.2 - Matrices 2x2 On souhaite gérer des matrices 2 × 2 de nombres complexes. On considère à partir de main- tenant que toutes les fonctions, structures et types écrits lors de la question précédente sont déjà définies. Dans cette partie du problème, on choisira systématiquement de faire appel aux fonc- tions et types déjà définis plutôt que de réécrire des morceaux de programme qui auraient le même but. 1 - Ecrivez la structure puis le type mat22cplx qui permet de gérer une matrice 2 × 2 de nombres complexes. La nouvelle structure et le nouveau type devront ré-utiliser le type complexe . 2 - En faisant appel aux fonctions déjà écrites pour les nombres complexes, écrivez la fonction saisieMatriceComplexe qui permet de faire la saisie au clavier d’une matrice 2 × 2 de nombres complexes. 3 - En faisant appel aux fonctions déjà écrites pour les nombres complexes, écrivez la fonc- tion afficheMatriceComplexe qui permet de faire l’affichage d’une matrice 2x2 de nombres complexes. 4 - Toujours en faisant appel aux fonctions déjà écrites pour les nombres complexes, écrivez la fonction produitMatriceComplexe qui permet de calculer le produit de deux matrices de nombres complexes. Le résultat devra être renvoyé via le mécanisme classique de retour et non en passage par adresse. 5 - Application En réutilisant tout ce qui a été écrit plus haut, écrivez un programme qui : Licence STPI Semestre 3 - Examen de Validation de Module - ULSI301 - Langage C - p. 1/2

Licence STPI Semestre 3 - Examen de Validation de … · Licence STPI Semestre 3 - Examen de Validation de Module - Janvier 2006 ULSI301 - LANGAGE C Durée : 2h. - Documents et Calculatrices

Embed Size (px)

Citation preview

Licence STPI Semestre 3 - Examen de Validation de Module - Janvier 2006

ULSI301 - LANGAGE CDurée : 2h. - Documents et Calculatrices autorisés.

Toutes les réponses doivent être justifiées - Les exercices sont indépendantsDès le moment où une fonction est décrite dans une question, vous pouvez supposerqu’elle est correcte pour toute la suite de l’exercice, que vous ayez su l’écrire ou non.

- Exercice I : Matrices 2x2 de Nombres Complexes -

I.1 - Nombres Complexes1 - Ecrivez la structure cplx qui permet de représenter correctement un nombre complexe.2 - Ecrivez maintenant le type complexe qui permet de représenter correctement un

nombre complexe. Vous pourrez vous baser ou pas sur la structure cplx définie précédemment(au choix).

Attention : A partir de maintenant, nous n’utiliserons plus que le type complexe et plus lastructure cplx.

3 - Ecrivez la fonction complexe saisieComplexe1(void); qui permet la saisie auclavier d’un nombre complexe.

4 - Ecrivez une fonction nommée saisieComplexe2 qui fait le même travail en passagepar adresse.

5 - Ecrivez une fonction nommée afficheComplexe qui permet d’afficher un nombrecomplexe a l’écran. Vous passerez le nombre complexe à afficher par adresse.

6 - Ecrivez une fonction nommée produitComplexe qui permet d’effectuer le produitde deux matrices de nombres complexes fournies en paramètre. Ces deux matrices seront passéespar valeur, alors que le résultat sera passé par adresse.

I.2 - Matrices 2x2On souhaite gérer des matrices 2 × 2 de nombres complexes. On considère à partir de main-

tenant que toutes les fonctions, structures et types écrits lors de la question précédente sont déjàdéfinies. Dans cette partie du problème, on choisira systématiquement de faire appel aux fonc-tions et types déjà définis plutôt que de réécrire des morceaux de programme qui auraient lemême but.

1 - Ecrivez la structure puis le type mat22cplx qui permet de gérer une matrice 2 ×2 de nombres complexes. La nouvelle structure et le nouveau type devront ré-utiliser le typecomplexe .

2 - En faisant appel aux fonctions déjà écrites pour les nombres complexes, écrivez lafonction saisieMatriceComplexe qui permet de faire la saisie au clavier d’une matrice 2 × 2de nombres complexes.

3 - En faisant appel aux fonctions déjà écrites pour les nombres complexes, écrivez la fonc-tion afficheMatriceComplexe qui permet de faire l’affichage d’une matrice 2x2 de nombrescomplexes.

4 - Toujours en faisant appel aux fonctions déjà écrites pour les nombres complexes, écrivezla fonction produitMatriceComplexe qui permet de calculer le produit de deux matrices denombres complexes. Le résultat devra être renvoyé via le mécanisme classique de retour et nonen passage par adresse.

5 - Application En réutilisant tout ce qui a été écrit plus haut, écrivez un programme qui :

Licence STPI Semestre 3 - Examen de Validation de Module - ULSI301 - Langage C - p. 1/2

1. Demande à l’utilisateur combien de matrices il veut gérer,

2. Crée un tableau en allocation dynamique pour contenir les n matrices,

3. Propose la saisie des n matrices,

4. Calcule le produit de ces n matrices,

5. Affiche la matrice-résultat.

Licence STPI Semestre 3 - Examen de Validation de Module - ULSI301 - Langage C - p. 2/2

Licence STPI Semestre 3 - Examen de Rattrapage - Juillet 2006

ULSI301 - LANGAGE CDurée : 2h. - Documents et Calculatrices autorisés.

Toutes les réponses doivent être justifiéesLa qualité du code sera prise en compte dans la notation.

Dès le moment où une fonction est décrite dans une question, vous pouvez supposerqu’elle est correcte pour toute la suite de l’exercice, que vous ayez su l’écrire ou non.

- Exercice I : Bibliothèque : première version -

On veut écrire un logiciel permettant de gérer l’ensemble des livres contenus dans une biblio-thèque. Pour chaque livre, on a besoin des informations suivantes :

– Le titre du livre (200 caractères),– Le nom de l’auteur (100 caractères),– l’année de son édition.

I.1 - TypesEcrivez le type livre qui représente correctement un livre, ainsi que le type bibliotheque

qui permette de stocker 100 livres au maximum. Le type bibliotheque devra donc contenirdeux champs :

– un champ tableau suffisamment grand pour contenir les 100 livres possibles,– un champ nombre qui contient le nombre de livres actuellement présents dans la biblio-

thèque.

I.2 - Fonction PrincipaleEcrivez une fonction main qui crée une variable pour la bibliothèque, que vous initialiserez

pour qu’elle ne contienne aucun livre.

I.3 - Fonction d’Ajout d’un LivreOn veut écrire une fonction qui propose la saisie d’un livre à l’utilisateur et qui ajoute ce livre

à la bibliothèque. On propose les trois prototypes suivants :

void AjoutLivre1(bibliotheque b);bibliotheque AjoutLivre2(bibliotheque b);void AjoutLivre3(bibliotheque* b);

1 - En supposant dans un premier temps que ces trois fonctions sont correctes, écrivez laligne de programme que vous ajouteriez dans la fonction main pour appeler chacune d’elles. Ilest totalement inutile de réécrire entièrement le main.

2 - Expliquez maintenant avec précision pourquoi la fonction AjoutLivre1 ne pourraitpas fonctionner contrairement aux deux autres.

3 - Après avoir calculé sizeof(livre) et sizeof(bibliotheque), expliquez égale-ment avec précision pourquoi la fonction AjoutLivre3 est préférable par rapport à AjoutLivre2.

4 - Ecrivez la fonction AjoutLivre2.5 - Ecrivez la fonction AjoutLivre3.

Licence STPI Semestre 3 - Examen de Rattrapage - ULSI301 - Langage C - p. 1/2

I.4 - Fonction de recherche

Ecrivez une fonction qui affiche tous les livres dont l’année d’édition est supérieure ou égaleà 2000.

I.5 - Fonction de suppression d’un livre (un peu difficile)

Proposez une fonction qui permettrait de supprimer un livre de la bibliothèque.

- Exercice II : Bibliothèque : deuxième version -

On souhaite maintenant gérer une bibliothèque permettant de contenir un nombre de livres maxi-mum non prédéfini. On veut de plus concevoir une structure permettant de faciliter le classementdes livres dans la bibliothèque.

II.1 - Structrure

1 - Expliquez pourquoi une liste chaînée est une solution élégante à ce problème.2 - Ecrivez la structure maillon d’une telle liste, chaque maillon représentant un livre de

la bibliothèque. On supposera qu’un chaînage simple est suffisant.

II.2 - Ajout d’un Livre

1 - Proposez une fonction permettant de saisir puis d’ajouter un livre à n’importe quelendroit de la bibliothèque.

II.3 - Fonction de recherche

Ecrivez une fonction qui affiche tous les livres dont l’année d’édition est supérieure ou égaleà 2000.

II.4 - Fonction de suppression d’un livre

Proposez une fonction qui permettrait de supprimer un livre de la bibliothèque. On ne tolérerapas les fuites de mémoire.

Licence STPI Semestre 3 - Examen de Rattrapage - ULSI301 - Langage C - p. 2/2

Licence STPI Semestre 3 - Contrôle Continu - Novembre 2006

ULSI301 - LANGAGE CDurée : 1h. 30 - Documents et Calculatrices interdits.

NOM :Prénom :Groupe :

- Exercice I : Correspondances de Types -

Soit un programme qui débuterait de la façon suivante :

void f1(int k);2 int* f2(void);

4 int main(void){

6 char Carac;char* pCarac;

8 char tCarac[50];

10 int Entier;int* pEntier;

12 int tEntier[50];

14 .......

Donnez le type des expressions ci-après :Expression Votre Réponse Expression Votre Réponse

(A à H) (A à H)Carac pEntiertEntier *pCaractCarac+5 pCarac[0]tEntier[50] *tCaracmalloc(10*sizeof(char)); f1(2);f2(); *f2();tCarac[10] &Carac&pEntier &(*pCarac)&(tCarac[0]) &Entier824 ((char*)25875)

en répondant par A, B, C, D, E, F, G ou H avec :A char B char* C char**D int E int* F int**G void H void*

Vous répondez directement sur cette feuille. Toute réponse fausse compte comme un point néga-tif.

Licence STPI Semestre 3 - Contrôle Continu - ULSI301 - Langage C - p. 1/3

- Exercice II : Syntaxe du Langage C -

Soit un programme qui débuterait de la façon suivante :

int main(void)2 {char* pCarac;

4 int Entier;int* pEntier1;

6 int* pEntier2;int* pEntier3;

8 int* pEntier4;int tEntier[50];

10

pEntier1 = (int*) malloc(50*sizeof(int));12 pEntier3 = tEntier+10;

pEntier4 = pEntier1 + 152;14 .......

Pour chacune des expressions ci-après :

Expression Votre Réponse (A à C)pEntier2 = *(malloc(10*sizeof(int)));pEntier2 = (char*) pCarac;pEntier2 = (int*)pCarac;pEntier2 = tEntier;pEntier2 = tEntier[5];pEntier2 = Entier;pEntier3[0] = 3;pEntier3[50] = 2;*pEntier4 = 10;Entier = *pEntier2;pCarac[5] = ’H’;*(pEntier3+2) = 5;pEntier = 5;

Indiquez si :– A : elle n’est pas correcte syntaxiquement, c’est à dire qu’elle provoque une erreur de com-

pilation, en d’autres termes gcc afficherait une erreur– B : elle est correcte syntaxiquemnent (gcc n’affiche aucune erreur) mais fait planter le pro-

gramme– C : elle se compile et s’exécute correctement

Vous répondez directement sur cette feuille. Toute réponse fausse compte comme un pointnégatif.

N.B. : il est vivement conseillé de représenter l’état de la RAM sur un schéma au brouillon.

- Exercice III : Allocation Mémoire -

Soit le programme ci-dessous :

Licence STPI Semestre 3 - Contrôle Continu - ULSI301 - Langage C - p. 2/3

int* f(void);2

4 int main(void){

6 int *p;

8 p = f(10);printf("10 au carre vaut %d",p[11]);

10 }

12

14 int* f(void){int T[50];

16 int i;for(i = 0; i < 50; i++)

18 {T[i] = i*i;

20 }return T;

22 }

III.1 - Ca Plante !

Expliquez pourquoi ce programme "plante de temps en temps" : (quelques lignes)

III.2 - Modification

Réécrivez le et modifiez le pour éliminer ce problème.

Licence STPI Semestre 3 - Contrôle Continu - ULSI301 - Langage C - p. 3/3

Licence STPI Semestre 3 - Examen - Janvier 2007

ULSI301 - LANGAGE CDurée : 2h. - Documents et Calculatrices interdits.

Toutes les réponses doivent être justifiées - Les exercices sont indépendantsDès le moment où une fonction est décrite dans une question, vous pouvez supposerqu’elle est correcte pour toute la suite de l’exercice, que vous ayez su l’écrire ou non.

La qualité du code écrit fera partie des critères d’évaluation.

- Exercice I : QCM -

Dans cet exercice, toute réponse fausse compte comme un point négatif. La note atribuéeà cet exercice sera calculée par la formule max(votreNote,0). Vous répondrez directement surcette feuille.

Soit un programme qui débuterait de la façon suivante :

1 typedef struct{

3 char** lignes;char* data;

5 long largeur,hauteur;} image;

7

void f1(image k);9 image* f2(int l,int h);

11 int main(void){

13 image img;image* pimg;

15

.......

Donnez le type des expressions ci-après, en supposant qu’elles soient tapées après la ligne 15 :Expression Votre Réponse Expression Votre Réponse

(A à L) (A à L)pimg &(img.largeur)(pimg[0]).data (*img).datapimg+5 *(f2(5,3));

*(pimg.largeur) f2();&((*pimg).lignes); f1(*pimg);f1(pimg); img.lignes[3]img.data+2 &(img.lignes[5][3])

en répondant par A, B, C, D, E, F, G, H, I, J, K ou L avec :A char B char* C char**D long E long* F long**G img H img* I img**J void K void* L syntaxe incorrecte

Licence STPI Semestre 3 - Examen - ULSI301 - Langage C - p. 1/4

- Exercice II : Polynômes -

On veut représenter les polynômes sous forme d’une structure de données :

a0x0 + a1x

1 + a2x2 + ... + ai−1x

i−1 + ... + an−1xn−1 + anxn

On choisit de les représenter sous forme d’un tableau. Chaque case du tableau contiendra unterme, représenté par :

– le coefficient ai, qui est un réel,– la valeur de l’exposant i, qui est une valeur entière

On considèrera que tout terme ayant un exposant négatif ne fait pas partie du polynôme. Ainsi,si on représente le polynôme 1 + 2x − 5x3 dans un tableau "trop grand" permettant de stocker 5termes en tout, il pourrait être représenté par le tableau suivant :

coeff :exp :

01

coeff :exp :

21

coeff :exp :

-53

coeff :exp :

??-1

coeff :exp :

??-1

Dans ce tableau, les trois premiers termes sont donc significatifs, les deux derniers ne le sontpas.

II.1 - Fonctions de base1 - Ecrivez le type termePoly qui représente correctement un terme du polynôme.

2 - Ecrivez le type Polynome qui représente correctement un Polynôme complet de degréquelconque. La structure devra contenir notamment le nombre de termes total (significatifs + nonsignificatifs) ainsi qu’un pointeur sur l’ensemble des termes.

3 - Ecrivez la fonction :Polynome CreerPoly(int nbTermes);qui renvoie un polynôme de nbTermes correctement initialisé. L’exposant de chaque terme serainitialement affecté à la valeur −1.

Note 1 : le polynôme généré est donc un "polynôme vide" au sens où il ne contient aucunterme significatif.

Note 2 : votre programme doit pouvoir gérer un nombre quelconque de termes. L’exempledonné plus haut sur 5 termes n’est qu’un exemple !

Note 3 : Si pour une raison ou pour une autre le polynôme ne pouvait pas être créé, il faut quele polynôme renvoyé ait un nombre de termes égal à 0 et que son pointeur pointe sur NULL.

4 - Ecrivez la fonction :Polynome AjoutTerme1(float coefficient, int exposant, Polynome P);qui ajoute un terme significatif au polynôme. Par exemple, à partir de l’exemple du polynôme1 + 2x− 5x3, ajouter le terme 3x2 revient à obtenir :

coeff :exp :

01

coeff :exp :

21

coeff :exp :

-53

coeff :exp :

32

coeff :exp :

??-1

5 - Réécrivez la fonction d’ajout, alors appelée AjoutTerme2 , qui, au lieu de renvoyer lePolynome, ne renverra rien.

Dans ces conditions, justifiez pourquoi on est obligés de passer le polynôme par adresse à lafonction.

6 - Ecrivez la fonction AjoutTerme2 décrite ci-dessus.

Licence STPI Semestre 3 - Examen - ULSI301 - Langage C - p. 2/4

II.2 - Opérations sur les Polynômes

1 - Ecrivez la fonction :Polynome AjoutPolynomes(Polynome P1, Polynome P2);

qui renvoie un polynôme qui serait la somme des deux polynômes.Note : Dans cette question, le polynôme-résultat pourra contenir des termes "non significa-

tifs".

2 - Ecrivez la fonction :void ProduitPolynomes(Polynome* P1, Polynome* P2, Polynome* R);

qui fournit via la variable R un polynôme qui contient le produit des deux polyômes.Note : Dans cette question, on ne cherchera pas à factoriser les termes de même degré.

II.3 - Evaluation d’un Polynôme1 - Ecrivez la fonction :

float EvalPoly(Polynome* P,float x);qui calcule, la valeur que vaut P au point x.

2 - Expliquez l’intérêt de passer le polynôme par adresse dans la fonction EvalPoly.3 - On souhaite sauvegarder les données dans un fichier. Ecrivez la fonction :

void SavePoly(char* Nom, Polynome* P, float x1, float x2, float p);qui sauvegarde dans un fichier texte les valeurs y = P (x) pour x situé entre x1 et x2 avec un pas p.

II.4 - Fonction PrincipaleEn réutilisant toutes les fonctions déjà écrites, écrivez une fonction main qui crée les 3 poly-

nômes suivants :P1(x) = x2 + 3x + 1P2(x) = 5x3 + 3P3(x) = x + 7Le programme produira le polynôme suivant :P4(x) = P1(x)× (P2(x) + P3(x))

Enfin, le programme sauvera dans un fichier "RESULTATS.TXT" les valeurs du polynômeP4(x) évaluées entre x = 1 et x = 5.2 pour un pas sur x de 0.1

- Annexe : Prototypes de Fonctions Standard -

/* fonctions associées aux fichiers (stdio.h) */2 FILE* fopen(char* nom, char* mode);int fwrite(void* buf, int tailleCase, int nbCases,FILE* f);

4 int fread(void* buf, int tailleCase, int nbCases,FILE* f);void fclose(FILE* f);

6

/* fonctions pour le traitement des chaines de caractères (string.h) */8 int strlen(char* s); // renvoie la taille de la chaine de caractères s

10 /* gestion de la RAM (stdlib.h) */void* malloc(int nombreOctets);

12 void free(void* ptr);

Licence STPI Semestre 3 - Examen - ULSI301 - Langage C - p. 3/4

14 /* autres fonctions (stdio.h) */sprintf(char* destination, char* format, ...);

16 // sprintf est identique à printf mais le résultat est mis dans// destination au lieu d’être affiché à l’écran

18

/* fonctions mathématiques (math.h) */20 double pow(double x,double y); //calcule x^y

Licence STPI Semestre 3 - Examen - ULSI301 - Langage C - p. 4/4

Licence STPI Semestre 3 - Examen de Rattrapage - Février 2007

ULSI301 - LANGAGE CDurée : 2h. - Documents et Calculatrices interdits.

Toutes les réponses doivent être justifiées - Les exercices sont indépendantsDès le moment où une fonction est décrite dans une question, vous pouvez supposerqu’elle est correcte pour toute la suite de l’exercice, que vous ayez su l’écrire ou non.

La qualité du code écrit fera partie des critères d’évaluation.

- Exercice I : QCM -

Dans cet exercice, toute réponse fausse compte comme un point négatif. La note atribuéeà cet exercice sera calculée par la formule max(votreNote,0). Vous répondrez directement surcette feuille.

Soit un programme qui débuterait de la façon suivante :

1 typedef struct{

3 char** lignes;char* data;

5 long largeur,hauteur;} image;

7

void f1(image* k);9 image f2(void);

11 int main(void){

13 image img;image* pimg;

15

.......

Donnez le type des expressions ci-après, en supposant qu’elles soient tapées après la ligne 15 :Expression Votre Réponse Expression Votre Réponse

(A à L) (A à L)pimg &imgpimg.data img.data(pimg[0]).data f2(5,3);(*pimg).largeur) f1(pimg);f1(&img); f1(&pimg);&(img.data); **(*pimg).lignes;pimg+4 &*(img.lignes[2])

en répondant par A, B, C, D, E, F, G, H, I, J, K ou L avec :A char B char* C char**D long E long* F long**G image H image* I image**J void K void* L syntaxe incorrecte

Licence STPI Semestre 3 - Examen de Rattrapage - ULSI301 - Langage C - p. 1/3

- Exercice II : Figures à 3 dimensions -

On veut représenter des figures à 3 dimensions dans l’espace (par exemple un cube) :

A B

C

DE

F

Pour celà, on a besoin de définir la notion de "point" dans l’espace à 3 dimensions. Chaque pointsera décrit par ses 3 coordonnées x, y et z, pas nécessairement entières.Ensuite, nous avons besoin de définir la notion de "figure à 3 dimensions", qui sera décrite no-tamment par un tableau contenant les points formant la figure à représenter. Par exemple, dansle cas du cube, il est clair qu’il faudra 6 points, donc 6 cases dans ce tableau.

II.1 - Fonctions de base

1 - Ecrivez le type point qui représente correctement un point en 3 dimensions.

2 - Ecrivez le type figure3d qui représente correctement une figure complète à 3 di-mensions. Cette structure contiendra, en plus des données (les points eux-mêmes), le nombre depoints que constituent la figure ainsi que le nombre de points utilisés. Le but de ce dernier champest de pouvoir toujours savoir le numéro de la case qui suit le dernier point ajouté. Par exemple,si l’on a créé une figure3d de 10 points et que l’on n’a rempli que les coordonnées de 3 points àcette figure, ce champ vaudra 3.

3 - Ecrivez la fonction :figure3d CreeFigure(int nbPoints);qui renvoie une figure de nbPoints correctement initialisée. Les coordonnées x, y, et z de tousles points seront placées à la valeur 0, et le nombre de points utilisés sera placé à la valeur 0.

Note 1 : votre programme doit pouvoir gérer un nombre quelconque de points. L’exemple ducube, constitué de 6 points, n’est qu’un exemple !

Note 2 : Si pour une raison ou pour une autre la figure3d ne pouvait pas être créée, il fautque le polynôme renvoyé ait un nombre de points égal à 0 et que son pointeur pointe sur NULL.

4 - Ecrivez la fonction :figure3d AjoutPoint1(float x, float y, float z, figure3d f);

qui met le point constitué des coordonnées x, y et z à la place indiquée par le champ "nombre depoints utilisés", puis ajoutera 1 à ce champ.

5 - Réécrivez la fonction d’ajout, alors appelée AjoutPoint2 , qui, au lieu de renvoyerla figure3d, ne renverra rien.

Dans ces conditions, justifiez pourquoi on est obligés de passer par adresse la figure3d à lafonction.

6 - Ecrivez une fonction qui calcule la distance entre deux points :float Distance(point* P1, point* P2);

Expliquez ici l’intérêt du passage par adresse pour cette fonction précise.

Licence STPI Semestre 3 - Examen de Rattrapage - ULSI301 - Langage C - p. 2/3

II.2 - Opérations sur les Figures à 3 dimensions

1 - Ecrivez la fonction :figure3d ConcatenerFigures(figure3d f1, figure3d f2);

qui renvoie une figure qui serait la concaténation de deux figures.2 - Ecrivez la fonction :

figure3d Tri(figure3d f, point p);qui trie les points de la figure par ordre croissant de distance par rapport au point p passé enparamètre. Vous choisirez la méthode qui vous plait le mieux.

Note : pour info, on retrouve ce type de sous-programme dans tous les jeux en 3 dimensions.

II.3 - Fichier

Ecrivez une fonction : void SaveFigure(char* Nom, figure f );qui sauvegarde dans un fichier texte les points qui composent la figure f. Chaque point devraêtre sur une ligne du fichier texte, et sur chaque ligne on doit voir dans l’ordre les valeurs de x, y

et z séparées par une tabulation.

II.4 - Fonction Principale

En réutilisant toutes les fonctions déjà écrites, écrivez une fonction main qui crée une figurecontenant un cube de côté 10 et une pyramide à base carrée de hauteur 5, placée juste au dessusdu cube. Faites ensuite concaténer les deux figures au programme, et faites lui trier les pointsdans l’ordre croissant par rapport au point (−5, 0, 0) sur la figure concaténée.

Enfin, le programme sauvera dans un fichier "MAISON.TXT" la figure résultant.

- Annexe : Prototypes de Fonctions Standard -

/* fonctions associées aux fichiers (stdio.h) */2 FILE* fopen(char* nom, char* mode);int fwrite(void* buf, int tailleCase, int nbCases,FILE* f);

4 int fread(void* buf, int tailleCase, int nbCases,FILE* f);void fclose(FILE* f);

6

8 /* gestion de la RAM (stdlib.h) */void* malloc(int nombreOctets);

10 void free(void* ptr);

12 /* autres fonctions (stdio.h) */sprintf(char* destination, char* format, ...);

14 // sprintf est identique à printf mais le résultat est mis dans// destination au lieu d’être affiché à l’écran

16

/* fonctions mathématiques (math.h) */18 double pow(double x,double y); //calcule x^y

double sqrt(double x); //calcule racine(y)

Licence STPI Semestre 3 - Examen de Rattrapage - ULSI301 - Langage C - p. 3/3