UNIVERSITÉ BORDEAUX 1 Session de Janvier 1996
Département de formation premier cycle
Polycopié, notes de cours et de TD autorisées. Autres documents interdits.
Le sujet comporte une page recto-verso. Les 3 exercices sont indépendants ; donnez des réponses simples et précises : les fonctions C demandées sont très courtes (quelques lignes). Ecrire des généralités, ou copier des fonctions vues en cours ou en TD, vous fera perdre du temps sans vous rapporter aucun point.
|
Note : le calcul devra être fait directement, sans recourir à une fonction puissance écrite par ailleurs.
Notes : comme ci-dessus, n désigne le plus petit indice tel que pn = 0. Une fonction booléenne est une fonction dont le résultat est vrai (1) ou faux (0).
|
|
Note : on tentera de bien spécifier, soit en définissant une structure, soit en utilisant pour paramètres des adresses, la façon dont cette fonction retourne simultanément les trois résultats demandés.
long produit (int *p, int *alpha) { long x = 1; int i, j; for (i = 0; p [i] > 0; i++) for (j = 0; j < alpha [i]; j++) x = x * p [i]; return x; }
Noter que cette solution est correcte même pour un exposant ai nul, ou un vecteur vide. L'énoncé n'indique pas de taille MAX pour les vecteurs p et a ; celle-ci n'est donc pas connue, et il n'est pas nécessaire d'écrire, dans ces conditions :
for (i = 0; i < MAX && p [i] > 0; i++)
int premiers_distincts (int *p) { int i, j; for (i = 0; p [i] > 0; i++) { if (! premier (p[i]) ) return 0; for (j = 0; j < i; j++) if (p [j] == p [i]) return 0; } return 1; }
|
|
double integrale (polynome a) { double s = 0; int i, n = degre (a); for (i = 0; i <= n; i++) s = s + a[i] / (i+1); return s; }
|
|
void primitive (polynome b, polynome a) { int i, n = degre (a); b [0] = 0; for (i = 0; i <= n; i++) b [i+1] = a[i] / (i+1); for (i = n + 2; i <= DEGRE_MAX; i++) b [i] = 0; b [0] = - integrale (b); }
Noter qu'il faut prendre garde à bien annuler les termes de degré supérieur à n+1. Il est bon de signaler, sur la copie, que le calcul d'une primitive B n'a de sens que si A n'est pas de degré maximal.
struct marche { int position, droite, retour; }; struct marche simul1 (int n) { struct marche m = {0, 0, 0}; int i, x = 0; for (i = 0; i < n; i++) { if ( hasard (2) ) { x++; if (m.droite < x) m.droite = x; } else x--; if (x == 0) m.retour++; } m.position = x; return m; }
On peut évidemment éviter la variable x, en la remplaçant par m.position. En utilisant des adresses, la solution devient :
void simul1 (int n, int *position, int *droite, int *retour) { int i, x = 0; for (i = 0; i < n; i++) { if ( hasard (2) ) { x++; if (*droite < x) *droite = x; } else x--; if (x == 0) (*retour)++; } *position = x; }
On peut, comme précédemment, éviter la variable x, en la remplaçant par *position.
int simul2 (int n) { int i, h, x = 0, y = 0; for (i = 0; i < n; i++) { h = hasard (4); if (h == 0) y++; else if (h == 1) x++; else if (h == 2) y--; else x--; if (x == 0 && y == 0) return i + 1; } return 0; }Noter que l'instruction switch est mieux adaptée à des choix multiples, comme ici, mais elle n'a pas été présentée en cours.