1/6 Exemple de corrigé Exercice 1 Définir une structure de données
Transcription
1/6 Exemple de corrigé Exercice 1 Définir une structure de données
Mercredi 31 mai 2006 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 Définir une structure de données Heure permettant de représenter une heure au format hh/mm/ss, puis écrire les fonctions suivantes : 1) conversion d'un élément de type Heure en nombre de secondes (entier) 2) conversion d'un nombre de secondes (entier) en un élément de type Heure 3) addition de deux éléments de type Heure typedef struct { int hh; int mm; int ss; } Heure; int HeureEnSecondes(Heure h) { return (h.hh*3600 + h.mm*60 + h.ss); } Heure SecondesEnHeure(int sec) { Heure h; h.hh = sec/3600; sec = sec%3600; h.mm = sec/60; sec = sec%60; h.ss = sec; return h; } Heure AddHeures(Heure h1, Heure h2) { Heure h3; return (SecondesEnHeure(HeureEnSecondes(h1)+HeureEnSecondes(h2))); } 1/6 Autre solution : Heure AddHeures2(Heure h1, Heure h2) { Heure h3; h3.hh=h1.hh+h2.hh; h3.mm=h1.mm+h2.mm; h3.ss=h1.ss+h2.ss; if (h3.ss > 59) { h3.ss -= 60; h3.mm += 1; } if (h3.mm > 59) { h3.mm -= 60; h3.hh +=1; } return h3; } Exercice 2 On souhaite compléter le programme suivant : main() { float a = 7.8, b = 3.6; float* c; c = calcul( # ); printf("%f\n", # ); free c; } 1) Ecrire une fonction calcul adaptée à ce main, qui permet de renvoyer le résultat du calcul x + 5 y − 2 , et dont le profil est le suivant : float* calcul(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. 2/6 float* calcul(float* x, float* y) { float *ptr = (float*) malloc(sizeof(float)); *ptr = ((*x) + 5 * (*y) - 2); return ptr; } main() { float a = 7.8, b = 3.6; float* c; c = calcul( &a, &b ); printf("%f\n", *c ); free (c); } Exercice 3 Dire ce que calcule la fonction f selon les différentes valeurs des arguments x et y : int f(int x, int y) { if (x==0) return y; else return (f(x-1,x+y)); } renvoie : - ( si x = 0 : y ) affirmation incluse dans la suivante : i≤ x ∑i + y - (si x ≥ 0, ou) si x>0 : - si x<0 ne termine jamais i =1 Exercice 4 On souhaite gérer une base de données d'inscriptions pour l'organisation d'un congrès qui dure une journée. Les organisateurs proposent aux participants de s'inscrire pour des repas, ainsi que pour l'hébergement en hôtel. Un participant peut s'inscrire indépendamment aux 2 repas proposés : déjeuner (15 euros) et/ou dîner (35 euros) ou aucun. Il n'est pas obligé de prendre un hôtel. S'il en prend un, il peut choisir parmi 2 types d'hôtels différents : 2 étoiles (75 euros) ou 3 étoiles (100 euros). Un participant peut venir accompagné de son conjoint. Dans ce cas, la réservation d'hôtel est identique mais lorsqu'un repas est sélectionné alors il faut en compter 2. 1) Créer un nouveau type Participant qui inclut son nom (chaîne de caractères : tableau de 20 caractères), son prénom (chaîne de caractères : tableau de 30 caractères), ainsi que 3/6 toutes les autres informations nécessaires à son inscription selon les critères définis cidessus. On privilégiera une structure contenant un nombre minimal de champs. 2) Créer un nouveau type TabPart qui est un tableau de 100 éléments de type Participant. 3) Créer une fonction Nb2Etoiles qui, pour un argument de type TabPart donné, affiche le nom et le prénom des personnes qui ont choisi de réserver un hôtel 2 étoiles. On pourra utiliser la fonction printf avec pour format %s pour l'affichage des chaînes de caractères nom et prénom. 4) Créer une fonction NbDej qui, pour un argument de type TabPart donné, retourne le nombre de déjeuners à prévoir. 5) Créer une fonction Montant qui calcule, pour un Participant donné en argument, le montant de sa facture. typedef struct { char nom[20]; char prenom[30]; int dejeuner; // 0=non, 1=oui int diner; // 0=non, 1=oui int hotel; // 1=pas d'hotel, 2=2etoiles, 3=3etoiles int seul; // 0=non, 1=oui } Participant; typedef Participant TabPart[100]; void Nb2Etoiles(TabPart tab) { int i; for (i=0; i<100; i++) { if (tab[i].hotel==2) { printf("nom: %s, prenom:%s\n", tab[i].nom, tab[i].prenom); } } } int NbDej(TabPart tab) { int nb=0, i; for (i=0; i<100; i++) { if (tab[i].dejeuner==1) { nb+=1; if (tab[i].seul==0) nb+=1; } } return nb; } 4/6 int Montant(Participant p) { int total=0; if (p.dejeuner==1) total += 15; if (p.diner==1) total += 35; if (p.seul==0) total *= 2; if (p.hotel==2) total += 75; if (p.hotel==3) total += 100; return total; } 5/6