Programmation C Université de Marne la Vallée ESIPE Informatique et Réseaux 1 ère année Informatique et Géomatique 1 ère année Programmation C Exercices au kilomètre Voici quelques exercices au kilomètre pour les plus assoifés... Exercice 1 Analyse d une fonction itérative Dire ce que fait le programme suivant. Indiquer l état de chacune des variables au fil de l exécution. 3 void f ( i n t tab, i n t n1, i n t n ) { 4 i n t i ; 5 n1 = n1 1 ; 6 for ( i = 0 ; i < n1 ; i ++) 7 p r i n t f ( "%d ", tab [ i ] ) ; 8 n = n / ; 9 tab [ 0 ] = tab [ n ] ; 10 } 11 1 i n t main ( ) { 13 i n t t [ ] = { 0, 1, 1,, 3, 5, 8, 13, 1, 3 4 } ; 14 i n t a = 10, b = 1 0 ; 15 f ( t, a, &b ) ; 16 p r i n t f ( " \ n" ) ; 17 f ( t, b, &b ) ; 18 p r i n t f ( " \ n" ) ; 19 return 0 ; 0 } Exercice Analyse d une fonction récursive Donner la sortie produite par le programme suivant. 3 void f ( n ) { 4 i f ( n > 0) { 5 p r i n t f ( "%d ", n ) ; 6 f ( n 1 ) ; 7 p r i n t f ( "%d ", n ) ; 8 } 9 } 10 11 i n t main ( ) { 1 f ( 5 ) ;
13 return 0 ; 14 } Exercice 3 Petits programmes entre amis 1. Écrire un programme qui affiche un menu de la forme 1. + 3. *. - 4. / et qui permet de choisir l une de ces quatre opérations arithmétiques. Le programme accepte ensuite deux nombres entiers en entrée et affiche le résultat suivant l opération choisie. Si la division est choisie, le programme affiche le quotient et le reste. Veiller à ce que les entrées soient cohérentes (gestion du dépassement de capacité, division par zéro, etc.) et à informer l utilisateur dans le cas contraire.. Écrire un programme qui affiche le capital obtenu en plaçant une somme s au taux t pendant n années. 3. Écrire un programme qui admet en entrée deux nombres a et c tels que a c et qui affiche pour chaque entier b vérifiant a b c une ligne de la forme b F -> b C où b est la valeur en degrés Celsius correspondant à b exprimé en degrés Fahrenheit. Rappel : Celsius = 5 9 (Fahrenheit 3). 4. Écrire un programme qui affiche, pour tous les caractères c une ligne où a est le code ASCII de c. c -> a Exercice 4 Petites fonctions entre amis 1. Écrire une fonction 1 void resoudre ( f l o a t a, f l o a t b, f l o a t c, f l o a t s1, f l o a t s ) ; qui calcule les solutions de l équation ax + bx + c = 0 où a, b et c sont des flottants. Donner la raison pour laquelle les paramètres s1 et s sont des pointeurs. Intégrer la fonction dans un programme.. Écrire une fonction 1 i n t compter_1 ( i n t n ) ; qui compte le nombre de bits égaux à 1 dans la représentation binaire de n. Utiliser les opérateurs & et». Intégrer la fonction dans un programme. 3. Écrire une fonction 1 void a f f i c h e r _ b i n a i r e ( i n t n ) ;
qui affiche les 3 bits de la représentation binaire de l entier n. Intégrer la fonction dans un programme. Exercice 5 Débogage conditionnel 1. La macro assert, définie dans l en-tête assert.h, sert à vérifier si les arguments d une fonction respectent certains pré-requis. Par exemple, 1 double d i v i s i o n ( double x, double y ) { a s s e r t ( y!= 0 ) ; 3 return x / y ; 4 } permet de stopper l exécution du programme si l argument y vaut 0. L intérêt d un tel procédé réside dans le fait que lorsque la condition testée par le assert est fausse, l endroit du code qui a provoqué l erreur peut être connu et le débogage du programme est ainsi facilité. Il existe cependant un problème : dans certains cas, les assert testent des conditions gourmandes en temps. Il est ainsi souvent préférable de pouvoir les désactiver pour gagner en efficacité. Définir une macro ASSERT qui, lorsqu elle est utilisée à la place de assert, peut être désactivée. Pour cela, définir une constante DEBOGUER. En fonction de sa valeur, 1 ou 0, la macro ASSERT délègue son argument à assert ou ne fait rien. Indication : utiliser les commandes #if, #else et #endif du préprocesseur.. Pour déboguer efficacement un programme, on souhaite afficher, pour chaque structure conditionnelle if, le nom du fichier.c qui le contient, sa ligne dans le code et si la condition testée est vérifiée ou non. Pour cela, définir une macro IF qui prend trois paramètres : une condition cond, un bloc d instructions bloc_then et un bloc d instructions bloc_else. Cette macro teste la condition cond et exécute bloc_then si cond est vraie, et bloc_else sinon. Elle affiche également que l on exécute une structure if, le fichier qui la contient, sa ligne dans le code et si c est bloc_then qui est exécuté ou bien bloc_else. Indication : utiliser les commandes LINE et FILE du préprocesseur qui permettent respectivement de connaître la ligne courante et le fichier courant. Exercice 6 Effets de bord 1. Rappeler ce qu est une expression à effet de bord.. Dire si les expressions suivantes sont à effet de bord : (a) 1 + (8 ) ; (b) 1 p r i n t f ( " Bonjour \ n" ) ; (c) 1 i n t a ;
(d) 1 a = + (8 ) ; (f) 1 i f ( a == 16) { a ; } (e) 1 i f ( a == 17) { a ; } 3. Rappeler ce qu est une fonction à effet de bord. 4. Dire si les fonctions suivantes sont à effet de bord : (a) 1 i n t somme( i n t tab, i n t n ) { i n t i, r e s ; 3 4 r e s = 0 ; 5 for ( i = 0 ; i < n ; i ++) 6 r e s += tab [ i ] ; 7 return r e s 8 } (b) 1 void a f f i c h e r ( i n t tab, i n t n ) { i n t i ; 3 4 for ( i = 0 ; i < n ; i ++) 5 p r i n t f ( "%d ", tab [ i ] ) ; 6 } (c) 1 void echanger ( i n t x, i n t y ) { i n t tmp ; 3 4 tmp = x ; 5 x = y ; 6 y = tmp ; 7 } (d) 1 i n t nb_appels = 0 ; 3 i n t f c t _ 1 ( i n t n ) { 4 nb_ appels ++; 5 return n + 1 ; 6 } (e)
1 i n t nb_appels = 0 ; 3 i n t f c t _ ( i n t n ) { 4 i f ( nb_appels == 0) 5 return 0 ; 6 e lse 7 return n + 1 ; 8 } 5. Expliquer ce qu affiche le programme suivant et en quoi il n est pas recommandable. 3 i n t main ( ) { 4 i n t n ; 5 6 n = 0 ; 7 n = etrange (&n, etrange (&n, 1 0 ) ) ; 8 p r i n t f ( "%d \ n", n ) ; 9 10 return 0 ; 11 } 1 13 i n t etrange ( i n t n, i n t m) { 14 n += m; 15 return n + 1 ; 16 } Exercice 7 Structures conditionnelles 1. Rappeler ce qu est un bloc.. Rappeler quelles sont les structures conditionnelles et expliquer leur utilité. 3. On suppose définies trois fonctions 1 i n t f ( ) ; i n t g ( ) ; 3 i n t h ( ) ; qui retournent chacune 0 ou 1 en fonction du résultat d un test qu elles réalisent. On souhaite afficher un caractère en fonction des résultats obtenus, conformément au tableau suivant : f g h Caractère 0 0 0 A 0 0 1 B 0 1 0 C 0 1 1 D 1 0 0 E 1 0 1 F 1 1 0 G 1 1 1 H
Écrire un programme qui répond à ce problème avec les contraintes suivantes : utiliser des structures conditionnelles if ; il est interdit d utiliser des variables ; toute exécution du programme appelle exactement une fois chacune des fonctions f, g et h. 4. Reprendre la question précédente avec les contraintes suivantes : utiliser une structure conditionnelle switch ; utiliser au plus une variable de type int ; toute exécution du programme appelle exactement une fois chacune des fonctions f, g et h. Indication : utiliser des masques de bits. 5. Donner et expliquer la sortie produite par les programmes suivants : (a) 3 i n t main ( ) { 4 i n t i ; 5 6 i = ; 7 switch ( i ) { 8 case 1 : p r i n t f ( " 1 " ) ; 9 case : p r i n t f ( " " ) ; 10 case 3 : p r i n t f ( " 3 " ) ; 11 case 4 : p r i n t f ( " 4 " ) ; 1 default : p r i n t f ( "d" ) ; 13 } 14 15 return 0 ; 16 } (b) 3 i n t main ( ) { 4 i n t i ; 5 6 i = 3 ; 7 switch ( i ) { 8 case 1 : p r i n t f ( " 1 " ) ; 9 case : p r i n t f ( " " ) ; 10 case 3 : p r i n t f ( " 3 " ) ; 11 case 4 : p r i n t f ( " 4 " ) ; 1 default : p r i n t f ( "d" ) ; 13 case 5 : p r i n t f ( " 5 " ) ; break ;
14 case 6 : p r i n t f ( " 6 " ) ; 15 } 16 17 return 0 ; 18 } (c) 3 i n t main ( ) { 4 i n t i ; 5 6 i = 3 ; 7 switch ( i ) { 8 case 1 : p r i n t f ( " 1 " ) ; 9 case : p r i n t f ( " " ) ; 10 case 3 : p r i n t f ( " 3 " ) ; 11 case 4 : p r i n t f ( " 4 " ) ; 1 default : p r i n t f ( "d" ) ; 13 case 5 : p r i n t f ( " 5 " ) ; break ; 14 case 6 : p r i n t f ( " 6 " ) ; 15 case 3 : p r i n t f ( " 3 " ) ; 16 } 17 18 return 0 ; 19 } 6. Rappeler quelles sont les structures de boucle et expliquer leur utilité. 7. Expliquer dans quelles circonstances il est préférable d utiliser une boucle for plutôt qu une boucle while et réciproquement. 8. Écrire, en utilisant judicieusement des boucles for, while ou encore do while, les fonctions : (a) 1 void a f f i c h e r _ t r i a n g l e _ 1 ( i n t n ) ; (b) qui produit la sortie suivante (donnée ici dans le cas n = 4) : * * * * * * * * * * 1 void a f f i c h e r _ t r i a n g l e _ ( i n t n ) ; qui produit la sortie suivante (donnée ici dans le cas n = 4) : * - - - * * - - * * * - * * * *
(c) 1 void afficher_damier ( i n t n ) ; (d) qui produit la sortie suivante (donnée ici dans le cas n = 4) : * - * - - * - * * - * - - * - * 1 void a f f i c h e r _ t r i a n g l e _ 3 ( i n t n ) ; qui produit la sortie suivante (donnée ici dans le cas n = 6) : * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 9. La suite de Syracuse est une suite (S i ) i 0 d entiers dépendant d un paramètre n définie de la manière suivante : n si i = 0, S S i := i 1 si S i 1 est pair, 3S i 1 + 1 sinon. Une conjecture énonce que pour tout entier n 1, il existe un entier i 0 tel que S i = 1. Écrire un programme qui demande à l utilisateur d entrer au clavier un entier n et qui affiche les éléments de la suite (S i ) i 0 correspondante et s arrête dès qu un terme est égal à 1. Exercice 8 Cartes 1. Définir les types nécessaires pour représenter un jeu de 5 cartes et une main de Texas hold em. Une main est constituée de deux cartes.. Définir des fonctions qui permettent d afficher des jeux et des mains. 3. Modifier (si besoin est) le type qui représente le jeu de cartes de sorte qu il tienne compte de l ordre entre les cartes et que certaines cartes soient absentes (le type modélise donc une pile de cartes). 4. Écrire des fonctions qui permettent de retirer la i ieme carte d un jeu. Écrire également une fonction qui permet d ajouter une carte en tête d un jeu. 5. Écrire une fonction qui permet de mélanger un jeu de cartes. Un algorithme répondant à ce problème consiste à créer un nouveau jeu de carte et à y empiler une à une les cartes du jeu que l on souhaite mélanger en les choisissant au hasard. 6. Écrire une fonction qui permet de servir une main, c est à dire retirer les deux premières cartes d un jeu et les placer dans une main.
Exercice 9 Structures Soit la structure suivante qui modélise une personne : 1 typedef s t r u c t { char nom [ 1 6 ] ; 3 char prenom [ 1 6 ] ; 4 i n t age ; 5 } Personne ; 1. Déclarer un type énumération couleur qui permet de modéliser les couleurs noir, brun, chatain, blond, roux et blanc.. Modifier cette structure de sorte à tenir compte de la taille d une personne et de sa couleur de cheveux. 3. Écrire les fonctions suivantes qui permettent respectivement de saisir les informations d une personne (sur l entrée standard) et de les afficher : 1 Personne s a i s i r ( ) ; void a f f i c h e r ( Personne p ) ; 4. Écrire une fonction 1 void echanger ( Personne p1, Personne p ) ; qui échange les valeurs de deux structures modélisant des personnes. Exercice 10 Unions 1. Rappeller la différence entre les types structures et unions. Rappeller l intêret des types union.. Soit les trois types suivants: 1 typedef s t r u c t e n t r e p r i s e { char nom [ 3 ] ; 3 long i n t s i r e t ; 4 } E n t r e p r i s e ; 5 6 typedef s t r u c t p a r t i c u l i e r { 7 char nom [ 3 ] ; 8 char prenom [ 3 ] ; 9 } P a r t i c u l i e r ; 10 11 typedef s t r u c t a s s o c i a t i o n { 1 char nom [ 3 ] ; 13 } Association ; Créer une structure Annuaire dans laquelle est présent un numéro de téléphone de type int, un autre entier organisation (qui désignera si l entrée de l annuaire est une entreprise un particulier ou une association) et une union abonne qui pourrait aussi bien être une Entreprise, un Particulier ou bien une Association.
3. Quel est la taille mémoire d une entrée de type Annuaire en octet? 4. Sachant que le champ organisation vaut 0 pour les entreprises, 1 pour les particuliers et pour les associations; écrire une fonction AfficheAbonne qui affiche sur la sortie standard les données de l abonné Annuaire A envoyé en argument.