• Aucun résultat trouvé

-ExamendeProgrammation-ISUP1-FacultédesSciences-SorbonneUniversité Responsable:AnnickValibouze-TDs:StevenVAROUMAS Mardi21Mai2019-9h30-12h30-14-24305

N/A
N/A
Protected

Academic year: 2022

Partager "-ExamendeProgrammation-ISUP1-FacultédesSciences-SorbonneUniversité Responsable:AnnickValibouze-TDs:StevenVAROUMAS Mardi21Mai2019-9h30-12h30-14-24305"

Copied!
4
0
0

Texte intégral

(1)

Mardi 21 Mai 2019 - 9h30-12h30 - 14-24 305

Responsable : Annick Valibouze - TDs : Steven VAROUMAS

- Examen de Programmation - ISUP1 - Faculté des Sciences - Sorbonne Université

Aucun document n’est autorisé. Numérotez et mettez votre nom sur chaque copie double. Signez à la fin de votre dernière copie.

Votretéléphone portabledoit être éteint et rangé dans votre sac (exclusion de l’examen sinon). Si vous devez sortir, vous demandez l’autorisation et remettez votre téléphone portable à un surveillant.

Cet examen est composé de 5 parties sur 4 pages. Les questions plus difficiles donnent lieu à plus de points que les faciles. Nous supposons connu le type que nous notonsLE, représentant les listes d’entiers comme elles furent définies lors du cours. Nous notonsVALetSUIVANTles pseudo-fonctions d’extraction d’une liste de typeLE.

1. QUESTIONSFACILES

Ceux qui ne parviennent pas à utiliser les listes pourront essayer avec des tableaux (avec des pénalités sur leurs points).

1.a) Qu’affiche le programme suivant ? (aucune explication n’est demandée) void main(){

int x=-1 ;

printf(‘‘f1(x)=%d’’,f1(x)) ; printf(‘‘x=%d \n’’,x) ; x=2 ;

printf(‘‘f2(&x)=%d’’,f2(&x)) ; printf(‘‘x=%d \n’’,x) ; while(x< 3) {f3(x) ; f4(x) ; x=x + 1}}

int f1(int x) {x=x*3 ; return x ;}

int f2(int * x) {*x=*x -1 ; return *x ;}

void f3(int y) {int x=1 ; x=x*2 ; if (x < 3) printf(‘‘Dans f3 x=%d ’’,x) ;}

void f4(int y) {static int x=1 ;

if (x < 3) printf(‘‘Dans f4 x=%d’’,x) ; x=x+1 ; }

1.b) Ecrire une fonctionMaxPairnon récursive qui retourne le plus grand entier pair d’un tableauTd’entiers passé en paramètre (Tn’est pas l’unique paramètre). Cette fonction est supposée écrite pour 1.c).

1.c) Ecrire un programmemaxpairqui reçoit des entiers positifs et affiche le plus grand entier pair parmi eux (donner aussi la commande de compilation produisantmaxpair). Exemple, si%est le prompt du shell

1

(2)

2

% maxpair 3 24 25 6

le plus grand entier pair est : 24

1.d) Complétez chacun des 4 “...” dans la fonctionCompteurci-dessous afin qu’elle retourne le nombre d’entiers < M dans la liste l(Compteurest supposée n’être appelée qu’une seule fois par une autre fonction qu’elle-même lors de l’exécution du programme).

int Compteur (LE l, int M){ ... ; if (VAL(l) < .... ) ... ; if (SUIVANT (l)==NULL) ... ;

else return Compteur(SUIVANT(l),M) ; }

1.e) Ecrire une fonctionint MaxPairL(LE l)non récursive et sans variable statique qui retourne la valeur paire maximale del.

1.f) Ecrire une fonctionProdScalairequi retourne la somme desT1[i]*T2[i], oùT1[i]etT2[i]

parcourent respectivementT1etT2deux tableaux d’entiers de même longueur donnés en arguments. Elle doit parcourir les tableaux avec une boucleforet un indice de bouclei.

1.g) Même question qu’en 1.f) avec deux variables locales automatiquespetqde type pointeur d’entiers et une boucle while ; Ne seront donc pas tolérés les(p+i), p[i], T1[i], T2[i].

1.h) Ecrire une fonction récursiveprodNonNulrqui retourne le produit des éléments non nuls d’un tableauTd’entiers ou bien d’une liste d’entiers (au choix).

2. STRUCTURES RÉCURSIVES

Nous désirons travailler sur des arbres d’entiers tels celui-ci que nous notonsa1 : 2

3 5

1 2

0

11 7

2.a) Chaque arbre sera représenté par pointeur vers unestruct sArbreà compléter ci-dessous de telle sorte queSousArbresoit un tableau de deux arbres :

struct sArbre { ... val ;

... SousArbres... ; }

Compléter cette instruction afin qu’un arbre puisse être typé parArbre:typedef ... Arbre ;.

(3)

3

L’arbre vide est représenté par l’adresseNULL. Chaquefeuilled’un arbreaest l’arbre vide. Lesnoeudsde asont des valeurs entières représentées par le typeint ; les noeuds de notre exemplea1 ont pour valeurs respectives 2,3,5,1,2,0,11,7 et son sommet et le noeud 2.

Laprofondeurp(a)d’un arbreaest 0 s’il est vide ; sinonp(a) = 1 + max(p(G(a)), p(D(a)))oùG(a)et D(a)désignent respectivement les sous-arbres gauche et droit dea. Nous supposons les arbres de profondeur finie.

2.b) Dessinez la représentation dea1(i.e. avec des cases pour lesstructet des flèches pour les pointeurs, etc). Ne donnez aucune explication. vous supposerez que le sous-arbre dea1de sommet 5 est le sous-arbre gauche (et non droit) du sous-arbre de sommet 3.

2.b) Compléter ces 3 pseudo-fonctions d’extractions du pré-processeur :

#define VAL(b) ...

#define AG(b) ...

#define AD(b) ...

de telle sorte qu’elles extraient debrespectivement son sommet, son arbre gauche et son arbre droit. Par la suite, vous pourrez utiliser ces pseudo-fonctions sans les avoir définies.

2.c) Supposons définie (écrite) la fonctionint max(int i, int j)qui retourne le max de ietj.

Ecrire une fonctionint prof(Arbre a)qui calcule la profondeur dea.

2.d) Ecrire une fonctionArbre ConsArbre(int v, Arbre ag, Arbre ad)qui retourne l’arbre de sommetv, d’arbre gaucheaget d’arbre droitad. Il vous est fortement recommandé d’utiliser les macros VAL,AGetAD. Pour la suite, cette fonction est supposée définie.

2.e) Ecrire une fonction void Double(Arbre a) qui multiplie par 2 tous les noeuds de a(i.e. en n’utilisant pas de mémoire supplémentaire dans le tas).

2.f) Ecrire une fonctionArbre Double(Arbre a) qui, sans modifiera, retourne un arbre dont les noeuds sont les doubles de ceux dea. Il vous est fortement recommandé d’utiliser la fonctionConsArbre.

2.g) Ecrire une fonctionArbre Somme(Arbre a)qui calcule la somme des noeuds dea.

3. STRUCTURES RÉCURSIVES ET ÉCHAPPEMENTS

Reprenons le typeArbredu 2. et supposons écrites les macrosVAL,AGetADdu 2.b).

3.a) Ecrire une fonction récursiveint Cherche(int n, Arbre a)qui teste sinest un noeud dea.

3.b) (Difficile) Modifierint Cherche(int n, Arbre a)envoid Cherche2(int n, Arbre a)afin de créer un échappement aveclongjmpdés que la valeurnest trouvée, si c’est le cas, et qui ne retourne rien sinon.

3.c) (Difficile) Ecrire une fonctionint Cherche1(int n, Arbre a)qui teste sinest un noeud de aen appelantvoid Cherche2(int n, Arbre a). Cette fonction doit récupérer l’éventuel échappe- ment dans le cas oùnest un noeud dea.

(4)

4

4. POINTEURS DE FONCTIONS

Nous reprenons le typeArbredu 2. et supposons écrites les macrosVAL,AGetADdu 2.b).

4.a) (Difficile) En vous inspirant de la fonctionvoid Double(Arbre a)du 2.e), écrire une fonction void mapA(Arbre a, ... pf ...), où pfest un pointeur vers une fonction de prototypeint (int), qui remplace chaque noeud deapar son image par la fonction pointée parpf(ne pas oublier le type du paramètre formelpf).

4.b) Soit la fonctionint doubleI(int)qui retourne le double de l’entieri. Ecrire un appel à la fonction mapAutilisant la fonction doubleIet de telle sorte que le résultat soit identique à celui de la fonction Double.

5. TABLEAUX À DEUX DIMENSIONS

Soientnun entier positif,int T[n][n]représentant une matricemetint V[n]représentant un vecteur v.

5.1) Ecrire une fonction qui calcule le produitm·v.

5.2) Ecrire une fonction qui calcule la matricem2sans modifier le tableauT ; vous choisirez la réservation mémoire qui vous semble la plus opportune pour le résultat et vous discuterez votre choix entre les différentes options.

5.3) Ecrire une fonctiontransposequi transforme le tableauint Tafin qu’il représente la transposée de m.

5.4) Ecrire une fonction qui retourne le déterminant dem.

Références

Documents relatifs

[r]

[1] Après Amiens, les voûtes de Metz sont les plus hautes de France dans une cathédrale achevée. [2] Ce sont en effet les principaux éléments de l’architecture gothique, qui

d- En supposant qu’il existe une fonction point qui permette de dessiner un point de coordonn´ ees (x, y), d´ efinir une fonction qui dessine la repr´ esentation graphique

d- En supposant qu’il existe une fonction point/2 qui permette de dessiner un point de coordonn´ ees (x, y), d´ efinir une fonction qui dessine la repr´ esentation graphique

Ils sont utilis´ es notamment dans les syst` emes pair ` a pair de t´ el´ echargement, dans certaines bases de donn´ ees nosql (BD distribu´ ee de grand volume), ou encore

Suppression d’un ´el´ement : si la feuille est toujours assez compl`ete, aucun probl`eme et si le nombre d’´el´ements tombe en-dessous de dL/2 e2. prendre des ´el´ements des

Pourtant, il ne faut pas non plus s’y tromper et tomber dans la nostal- gie facile d’un bon vieux temps idéalisé : l’arbre productif présent jusqu’au 19 e siècle dans

- le niveau du test passé (français entrée en CE1) - le score obtenu par l’élève (sur 20 points) - le niveau souhaité pour cet élève (CP ou CE1) - et si possible, le scan