1/6 Exemple de corrigé Exercice 1 sur 2 pts 1) Ecrire un programme
Transcription
1/6 Exemple de corrigé Exercice 1 sur 2 pts 1) Ecrire un programme
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
Documents pareils
Partiel MM009, Master 1 Master Mathématiques UPMC Les
F. Hecht, D. Bernardi, X. Claeys, B. Stamm
Mercredi 31 Octobre 2012
Le but final de l’examen est principalement la programmation d’une classe efficace pour construire un ensemble de
points du carre...