Vous êtes sur la page 1sur 6

Jeudi 31 mai 2007

Examen d'Algorithmique et Programmation Impérative


Licence Mathématique et Informatique 1ère année
Licence Mathématique et Economie 2ème année
Durée : 2h
Aucun document autorisé

Exemple de corrigé

Exercice 1 sur 2 pts

1) Ecrire un programme demandant à l'utilisateur de taper 10 entiers et qui affiche leur


somme. Le programme ne devra utiliser que 3 variables et ne devra pas utiliser de tableau.


int main()
{
int a,i,somme=0;

printf("entrez 10 entiers:\n");

for (i=0; i<10; i++)


{
printf("%d:",i+1);
scanf("%d",&a);
somme += a;
}
printf("somme = %d\n", somme);

return 0;
}

Exercice 2 sur 3 pts

La fonction d'Ackermann A(m, n) est définie pour m, n ≥ 0 par les conditions suivantes :
A(0, n) = n+1 ;
A(m, 0) = A(m-1, 1) pour m > 0 ;
A(m, n) = A(m-1, A(m, n-1)) pour m, n >0.
1) Écrire une fonction récursive qui calcule la fonction d'Ackermann.
2) Dérouler le calcul de A(1, 2)


int ack(int m, int n)
{
if (m==0)
return n+1;
else
if (n==0)
return ack(m-1,1);
else
return ack(m-1,ack(m,n-1));
}

1/6
A(1,2) = A(0,A(1,1)
= A(0,A(0,A(1,0)))
= A(0,A(0,A(0,1)))
= A(0,A(0,2))
= A(0,3)
= 4

Exercice 3 sur 4 pts

On souhaite compléter le programme suivant :

int main()
{
float a = 9.5, b = 4.7;
float* x;
x = fonc( # );
printf("%f\n", # );
free(x);
return(0);
}

1) Ecrire une fonction fonc adaptée à ce main, qui permet de renvoyer le résultat du calcul
2 x 2 + 3 y − 7 , et dont le prototype est le suivant :
float* fonc(float* x, float* y)
2) Que doit-on mettre à la place des "#" dans le main afin que le programme affiche le
résultat du calcul ? Expliquez.


1)
float* fonc(float* x, float* y)
{
float *ptr = (float*) malloc(sizeof(float));
*ptr = (2 * (*x) * (*x) + 3 * (*y) - 7);
return ptr;
}

2)
main()
{
float a = 9.5, b = 4.7;
float* x;
x = calcul( &a, &b );
printf("%f\n", *x );
free(x);
return(0);
}

On doit mettre *x car la fonction printf attend un réel, en raison du format "%f" demandé, et
donc on doit lui passer le réel pointé par le pointeur x, autrement dit *x (opérateur de
déréférencement).

2/6
Exercice 4 sur 3 pts (1 par réponse)

Expliquer quel résultat produit l'exécution de la fonction f selon les différentes valeurs des
arguments a et b:

int f(int a, int b)


{
if (a==0)
return b;
else
if (b==0)
return 0;
else
return (f(a-b,b));
}


• si a est multiple de b (a=k.b avec k entier >=0), alors f retourne b
• si b est nul quelque soit a, f retourne 0
• sinon f boucle indéfiniment ( erreur de segmentation)

La note est de zéro à cet exercice si l'étudiant n'a fait qu'une simple traduction du programme
en français (style "si a vaut zéro ça renvoie b, etc…")

Exercice 5 sur 8 pts (1 par question)

On souhaite programmer une base de données permettant de gérer la nourriture à acheter


quotidiennement pour un zoo.
On gérera différents types d'aliments : graines, viande, fourrage, fruits, etc.
La base de données contiendra la liste de tous les animaux, avec leurs habitudes alimentaires,
et permettra de calculer la quantité à acheter chaque jour pour chaque catégorie d'aliments.
NB : dans les questions où il faut créer une fonction, la liste des paramètres indiqués n'est pas
forcément exhaustive. L'utilisation des variables globales est interdite.

1) Créer un nouveau type Aliment qui inclut son nom, et un numéro. Créer un nouveau
type TabAliments qui est un tableau de 20 éléments de type Aliment.
2) Créer un nouveau type Espece, qui contient son nom, son type d'aliment (numéro de
l'aliment), la quantité habituelle consommée quotidiennement (nombre d'unités), et un
numéro. Créer un nouveau type TabEspeces qui est un tableau de 30 éléments de type
Espece.
3) Créer un nouveau type Animal qui inclut son nom, et son espèce (numéro de son espèce).
Créer un nouveau type TabAnimaux qui est un tableau de 100 éléments de type Animal.
4) Créer une fonction AfficheNomAnimal qui, pour un Animal donné affiche son nom.
5) Créer une fonction AfficheEspece qui, pour une Espece donnée, affiche son nom ainsi
que le nom du type d'aliment qu'elle consomme.
6) Créer une fonction ChercheEspece qui renvoie l'Espece d'un animal donné.
3/6
7) Créer une fonction AfficheNomAlimentDe qui, pour un Animal donné, affiche le nom
de l'aliment qu'il consomme.
8) Créer une fonction QuantiteNecessaire qui, pour un Aliment donné, retourne la
quantité totale nécessaire de cet aliment pour un jour pour l'ensemble des animaux du zoo.


#include <stdio.h>

1)
typedef struct
{
char nom[20];
int numero;
} Aliment;

typedef Aliment TabAliments[20];

2)
typedef struct
{
char nom[20];
int ali;
int quantite;
} Espece;

typedef Espece TabEspeces[30];

3)
typedef struct
{
char nom[20];
int esp;
} Animal;

typedef Animal TabAnimaux[100];

4)
void AfficheNomAnimal(Animal ani)
{
printf("Animal : %s\n", ani.nom);
}

5)
void AfficheEspece(Espece esp, TabAliments TAl)
{
printf("Espèce : %s mange %s\n", esp.nom, TAl[esp.ali].nom);
}

6)
Espece ChercheEspece(Animal ani, TabEspeces TE)
{
return (TE[ani.esp]);
}

4/6
7)
void AfficheNomAlimentDe(Animal ani, TabEspeces TE, TabAliments TAl)
{
Espece esp = TE[ani.esp];
Aliment ali = TAl[esp.ali];
printf("L'aliment de %s est %s\n", ani.nom, ali.nom);
}

8)
int QuantiteNecessaire(Aliment al, TabAnimaux TAn, int nbAni, TabEspeces TE)
{
int i;
int quant=0;
Espece esp;

for (i=0; i<nbAni; i++)


{
esp = ChercheEspece(TAn[i], TE);
if (esp.ali == al.numero)
quant += esp.quantite;
}

return quant;
}

/* pour info, exemple de main, non demandé dans le sujet */


int main()
{
int i=0,j;
TabAliments TAl;
TabEspeces TE;
TabAnimaux TAn;
int nbAni;
int nbAli;
int nbEsp;

/* remplissage du tableau d'aliments */


strcpy(TAl[0].nom,"graines");
strcpy(TAl[1].nom,"viande");
strcpy(TAl[2].nom,"fourrage");
strcpy(TAl[3].nom,"fruits");
nbAli = 4;
for (j=0; j<nbAli; j++)
TAl[j].numero=j;

/* remplissage du tableau d'espèces */


strcpy(TE[0].nom,"panthère");
TE[0].ali = 1;
TE[0].quantite = 4;
strcpy(TE[1].nom,"perroquet");
TE[1].ali = 0;
TE[1].quantite = 1;
strcpy(TE[2].nom,"zèbre");
TE[2].ali = 2;
TE[2].quantite = 2;
strcpy(TE[3].nom,"lion");
TE[3].ali = 1;
5/6
TE[3].quantite = 5;
strcpy(TE[4].nom,"singe");
TE[4].ali = 3;
TE[4].quantite = 4;
nbEsp = 5;

/* remplissage du tableau d'animaux */


strcpy(TAn[0].nom,"Bagheera");
TAn[0].esp = 0;
strcpy(TAn[1].nom,"Coco");
TAn[1].esp = 1;
strcpy(TAn[2].nom,"Titi");
TAn[2].esp = 1;
strcpy(TAn[3].nom,"Marcel");
TAn[3].esp = 4;
strcpy(TAn[4].nom,"Cheetah");
TAn[4].esp = 4;
strcpy(TAn[5].nom,"Rex");
TAn[5].esp = 3;
strcpy(TAn[6].nom,"Macha");
TAn[6].esp = 0;
nbAni = 7;

AfficheNomAnimal(TAn[2]);
AfficheNomAlimentDe(TAn[2], TE, TAl);
AfficheEspece(TE[2], TAl);
for (i=0; i<nbAli; i++)
{
printf("Quantité nécessaire de %s : %d\n", TAl[i].nom,
QuantiteNecessaire(TAl[i], TAn, nbAni, TE));
}

return 0;
}

6/6

Vous aimerez peut-être aussi