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.