Exercices en langage C. C. Delannoy

Dimension: px
Commencer à balayer dès la page:

Download "Exercices en langage C. C. Delannoy"

Transcription

1 Exercices en langage C C. Delannoy

2 2 Exercices en langage C PREMIERE PARTIE : EXERCICES D'APPLICATION Cette premiè re partie vous propose des exercices, à résoudre, de préférence, pendant la phase d'étude du langage C luimême. E le épouse la structure d'un cours "classique" 1, sous la forme de 7 chapitres : types de base, opérateurs et expressions ;entrées-sorties conversationne les ;instructions de contrôle ;les fonctions ;les tableaux et les pointeurs ; les chaînes de caractères ;les structures. Chaque chapitre comporte : - des exercices d'application immédiate destinés à faciliter l'assimilation du cours correspondant, - des exercices, sans grande difficulté algorithmique mettant en oeuvre les différentes notions acquises au cours des précédents chapitres. Notez que l'utilisation des fichiers, ainsi que la gestion dynamique ne sont pas abordés dans cette premiè re partie ;ces deux points feront chacun l'objet d'un chapitre approprié dans la seconde partie de l'ouvrage. 1 Un tel cours vous est proposé, par exemple, dans "Apprendre à programmer en Turbo C" ou dans "C norme ANSI - Guide complet de programmation" du même auteur, également aux éditions Eyro les.

3 I : TYPES DE BASE, OPERATEURS ET EXPRESSIONS Exercice I.1 Enoncé Eliminer les parenthèses superflues dans les expressions suivantes : a = (x+5) /* expression 1 */ a = (x=y) + 2 /* expression 2 */ a = (x==y) /* expression 3 */ (a<b) && (c<d) /* expression 4 */ (i++) * (n+p) /* expression 5 */ Solution a = x+5 /* expression 1 */ L'opérateur + est prioritaire sur l'opérateur d'affectation =. a = (x=y) + 2 /* expression 2 */ Ici, l'opérateur + étant prioritaire sur =, les parenthèses sont indispensables. a = x==y /* expression 3 */

4 4 Exercices en langage C L'opérateur == est prioritaire sur =. a<b && c<d /* expression 4 */ L'opérateur & & est prioritaire sur l'opérateur <. i++ * (n+p) /* expression 5 */ L'opérateur + + est prioritaire sur *;en revanche, *est prioritaire sur + ;de sorte qu'on ne peut éliminer les derniè res parenthèses. Exercice I.2 Enoncé Soient les déclarations : char c = '\x01' ; short int p = 10 ; Quels sont le type et la valeur de chacune des expressions suivantes : p + 3 /* 1 */ c + 1 /* 2 */ p + c /* 3 */ 3 * p + 5 * c /* 4 */ Solution 1) p est d'abord soumis à la conversion "systématique" short -> int, avant d'ê tre ajouté à la valeur 3 (int). Le résultat 13 est de type int. 2) c est d'abord soumis à la conversion "systématique" char -> int (ce qui aboutit à la valeur 1), avant d'ê tre ajouté à la valeur 1 (int). Le résultat 2 est de type int.

5 I. Types de base, opérateurs et expressions 5 3) p est d'abord soumis à la conversion systématique short -> int, tandis que c est soumis à la conversion systématique char -> int ;les résultats sont alors additionnés pour aboutir à la valeur 11 de type int. 4) p et c sont d'abord aux mêmes conversions systématiques que ci-dessus ;le résultat 35 est de type int. Exercice I.3 Enoncé Soient les déclarations : char c = '\x05' ; int n = 5 ; long p = 1000 ; float x = 1.25 ; double z = 5.5 ; Quels sont le type et la valeur de chacune des expressions suivantes : n + c + p /* 1 */ 2 * x + c /* 2 */ (char) n + c /* 3 */ (float) z + n / 2 /* 4 */ Solution 1) c est tout d'abord converti en int, avant d'ê tre ajouté à n. Le résultat (10), de type int, est alors converti en long, avant d'ê tre ajouté à p. On obtient finalement la valeur 1010, de type long. 2) On évalue d'abord la valeur de 2*x, en convertissant 2 (int) en float, ce qui fournit la valeur 2.5 (de type float). Par ai leurs, c est converti en int (conversion systématique). On évalue ensuite la valeur de 2*x, en convertissant 2 (int) en float, ce qui fournit la valeur 2.5 (de type float). Pour effectuer l'addition, on convertit alors la valeur entiè re 5 (c) en float, avant de l'ajouter au résultat précédent. On obtient finalement la valeur 7.75, de type float.

6 6 Exercices en langage C 3) n est tout d'abord converti en char (à cause de l'opérateur de "cast"), tandis que c est converti (conversion systématique) en int. Puis, pour procéder à l'addition, il est nécessaire de reconvertir la valeur de (char) n en int. Finalement, on obtient la valeur 10, de type int. 4) z est d'abord converti en float, ce qui fournit la valeur 5.5 (approximative, car, en fait, on obtient une valeur un peu moins précise que ne le serait 5.5 exprimé en double). Par ai leurs, on procè de à la division entiè re de n par 2, ce qui fournit la valeur entiè re 2. Cette derniè re est ensuite convertie en float, avant d'ê tre ajoutée à 5.5, ce qui fournit le résultat 7.5, de type float. Remarque : Dans la premiè re définition de Kernighan et Ritchie, les valeurs de type float étaient, e les aussi, soumises à une conversion systématique en double. Dans ce cas, les expressions 3 et 4 étaient alors de type double. Exercice I.4 Enoncé Soient les déclarations suivantes : int n = 5, p = 9 ; int q ; float x ; Que le est la valeur affectée aux différentes variables concernées par chacune des instructions suivantes : q = n < p ; /* 1 */ q = n == p ; /* 2 */ q = p % n + p > n ; /* 3 */ x = p / n ; /* 4 */ x = (float) p / n ; /* 5 */ x = (p + 0.5) / n ; /* 6 */ x = (int) (p + 0.5) / n ; /* 7 */ q = n * (p > n? n : p) ; /* 8 */ q = n * (p < n? n : p) ; /* 9 *:

7 I. Types de base, opérateurs et expressions 7 Solution 1) 1 2) 0 3) 5 (p%n vaut 4, tandis que p> n vaut 1) 4) 1 (p/n est d'abord évalué en int, ce qui fournit 1 ;puis le résultat est converti en float, avant d'ê tre affecté à x). 5) 1.8 (p est converti en float, avant d'ê tre divisé par le résultat de la conversion de n en float). 6) 1.9 (p est converti en float, avant d'ê tre ajouté à 0.5 ;le résultat est divisé par le résultat de la conversion de n en float). 7) 1 (p est converti en float, avant d'ê tre ajouté à 0.5 ;le résultat (5.5) est alors converti en int avant d'ê tre divisé par n). 8) 25 9) 45 Exercice I.5 Enoncé Quels résultats fournit le programme suivant : #include <stdio.h> main () { int i, j, n ; i = 0 ; n = i++ ; printf ("A : i = %d n = %d \n", i, n ) ; i = 10 ; n = ++ i ; printf ("B : i = %d n = %d \n", i, n ) ;

8 8 Exercices en langage C i = 20 ; j = 5 ; n = i++ * ++ j ; printf ("C : i = %d j = %d n = %d \n", i, j, n ) ; i = 15 ; n = i += 3 ; printf ("D : i = %d n = %d \n", i, n) ; i = 3 ; j = 5 ; n = i *= --j ; printf ("E : i = %d j = %d n = %d \n", i, n) ; Solution A : i = 1 n = 0 B : i = 11 n = 11 C : i = 21 j = 6 n = 120 D : i = 18 n = 18 E : i = 12 j = 12 n = 6 Exercice I.6 Enoncé Quels résultats fournira ce programme : #include <stdio.h> main() { int n=10, p=5, q=10, r ; r = n == (p = q) ; printf ("A : n = %d p = %d q = %d r = %d\n", n, p, q, r) ; n = p = q = 5 ; n += p += q ; printf ("B : n = %d p = %d q = %d\n", n, p, q) ;

9 q = n < p? n++ : p++ ; printf ("C : n = %d p = %d q = %d\n", n, p, q) ; q = n > p? n++ : p++ ; printf ("D : n = %d p = %d q = %d\n", n, p, q) ; I. Types de base, opérateurs et expressions 9 Solution A : n = 10 p = 10 q = 10 r = 1 B : n = 15 p = 10 q = 5 C : n = 15 p = 11 q = 10 D : n = 16 p = 11 q = 15 Exercice I.7 Enoncé Quels résultats fournira ce programme : #include <stdio.h> main() { int n, p, q ; n = 5 ; p = 2 ; /* cas 1 */ q = n++ >p p++!= 3 ; printf ("A : n = %d p = %d q = %d\n", n, p, q) ; n = 5 ; p = 2 ; /* cas 2 */ q = n++<p p++!= 3 ; printf ("B : n = %d p = %d q = %d\n", n, p, q) ; n = 5 ; p = 2 ; /* cas 3 */

10 10 Exercices en langage C q = ++n == 3 && ++p == 3 ; printf ("C : n = %d p = %d q = %d\n", n, p, q) ; n = 5 ; p = 2 ; /* cas 4 */ q = ++n == 6 && ++p == 3 ; printf ("D : n = %d p = %d q = %d\n", n, p, q) ; Solution Ilne faut pas oublier que les opérateurs && et n'évaluent leur deuxiè me opérande que lorsque cela est nécessaire. Ainsi, ici, iln'est pas évalué dans les cas 1 et 3. Voici les résultats fournis par le programme : A : n = 6 p = 2 q = 1 B : n = 6 p = 3 q = 1 C : n = 6 p = 2 q = 0 D : n = 6 p = 3 q = 1

11 II : LES ENTREES-SORTIES CONVERSATIONNELLES Exercice II.1 Enoncé Quels seront les résultats fournis par ce programme : #include <stdio.h> main () { int n = 543 ; int p = 5 ; float x = ; printf ("A : %d %f\n", n, x) ; printf ("B : %4d %10f\n", n, x) ; printf ("C : %2d %3f\n", n, x) ; printf ("D : %10.3f %10.3e\n", x, x) ; printf ("E : %-5d %f\n", n, x) ; printf ("F : %*d\n", p, n) ; printf ("G : %*.*f\n", 12, 5, x) ; printf ("H : %x : %8x :\n", n, n) ; printf ("I : %o : %8o :\n", n, n) ; Solution A : B :

12 12 Exercices en langage C C : D : e+01 E : F : 543 G : H : 21f : 21f : I : 1037 : 1037 : Exercice II.2 Enoncé Quels seront les résultats fournis par ce programme : #include <stdio.h> main() { char c ; int n ; c = 'S' ; printf ("A : %c\n", c) ; n = c ; printf ("B : %c\n", n) ; printf ("C : %d %d\n", c, n) ; printf ("D : %x %x\n", c, n) ; Solution A : S B : S C : D : 53 53

13 II. Les entrées-sorties conversationnelles 13 Exercice II.3 Enoncé Que les seront les valeurs lues dans les variables n et p (de type int), par l'instruction suivante : scanf ("%d %d", &n, &p) ; lorsqu'on lui fournit les données suivantes (le symbole ^ représente un espace et le représente une fin de ligne, c'est-à -dire une "validation") : a) 253^45@ b) ^253^@ ^^ 4 ^ Solution a) n = 243, p = 45 b) n = 253, p = 4 (les derniers caractères de la deuxiè me ligne pourront éventue lement être utilisés par une instruction de lecture ultérieure). Exercice II.4 Enoncé Que les seront les valeurs lues dans les variables n et p (de type int), par l'instruction suivante : scanf ("%4d %2d", &n, &p) ; lorsqu'on lui fournit les données suivantes (le symbole ^ représente un espace et le représente une fin de ligne, c'est-à -dire une "validation") :

14 14 Exercices en langage C a) 12^45@ b) @ c) ^7@ d) 1^458@ e) ^^^4567^^8912@ Solution Rappelons que lorsqu'une indication de longueur est présente dans le code format fourni à scanf (comme, par exemple, le 4 de %4d), scanf interrompt son exploration si le nombre correspondant de caractères a été exploré, sans qu'un séparateur (ou "espace blanc") n'ait été trouvé. Notez bien, cependant, que les éventuels caractères séparateurs "sautés" auparavant ne sont pas considérés dans ce compte. Voici les résultats obtenus : a) n=12, p=45 b) n=1234, p=56 c) n=1234, p=56 d) n=1, p=45 e) n=4567, p=89 En a, on obtiendrait exactement les mêmes résultats sans indication de longueur (c'est-à -dire avec %d %d). En b, en revanche, sans l'indication de longueur 4, les résultats seraient différents (n vaudrait , tandis qu'ilmanquerait des informations pour p). En c, les informations ^ et 7 ne sont pas prises en compte par scanf (e les le seront éventue lement par une prochaine lecture!) ;sans la premiè re indication de longueur, les résultats seraient différents : pour n (en supposant que cela ne conduise pas à une valeur non représentable dans le type int) et 7 pour p. En d, cette fois, c'est l'indication de longueur 2 qui a de l'importance ;en son abscence, n vaudrait effectivement 1, mais p vaudrait 458. Enfin, en e, les deux indications de longueur sont importantes ; notez bien que les trois espaces placés avant les caractères pris en compte pour n, ainsi que les 2 espaces placés avant les caractères pris en compte pour p ne sont pas comptabilisés dans la longueur imposée. Exercice II.5

15 Enoncé II. Les entrées-sorties conversationnelles 15 Soit le programme suivant : #include <stdio.h> main() { int n, p ; do { printf ("donnez 2 entiers (0 pour finir) : ") ; scanf("%4d%2d", &n, &p) ; printf ("merci pour : %d %d\n", n, p) ; while (n) ; Quels résultats fournira-t-il, en supposant qu'on lui entre les données suivantes (attention, on supposera que les données sont frappées au clavier et les résultats affichés à l'écran, ce qui signifie qu'ily aura "mixage" entre ces deux sortes d'informations) : Solution Ici, on retrouve le mécanisme lié à l'indication d'une longueur maximale dans le code format, comme dans l'exercice précédent. De plus, on exploite le fait que les informations d'une ligne qui n'ont pas été prises en compte lors d'une lecture restent disponibles pour la lecture suivante. Enfin, rappelons que, tant que scanf n'a pas reçu suffisamment d'information, compte tenu des différents codes format spécifiés (et non pas des variables indiquées), e le en attend de nouve les. Voici finalement les résultats obtenus : donnez 2 entiers (0 pour finir) 1 2 merci pour : 1 2

16 16 Exercices en langage C donnez 2 entiers (0 pour finir) 3 4 merci pour : 3 4 donnez 2 entiers (0 pour finir) merci pour : donnez 2 entiers (0 pour finir) merci pour : donnez 2 entiers (0 pour finir) merci pour : 34 5 donnez 2 entiers (0 pour finir) merci pour : 6 7 donnez 2 entiers (0 pour finir) merci pour : 8 9 donnez 2 entiers (0 pour finir) 0 merci pour : 10 0 donnez 2 entiers (0 pour finir) 0 12 merci pour : 0 12

17 III :LES INSTRUCTIONS DE CONTROLE Exercice III.1 Enoncé Que les erreurs ont été commises dans chacun des groupes d'instructions suivants : 1) if (a<b) printf ("ascendant") else printf ("non ascendant") ; 2) int n ;... switch (2*n+1) { case 1 : printf ("petit") ; case n : printf ("moyen") ; 3) #define LIMITE 100 int n ;... switch (n) { case LIMITE-1 : printf ("un peu moins") ; case LIMITE : printf ("juste") ; case LIMITE+1 : printf ("un peu plus") ; 4) const int LIMITE=100 int n ;

18 18 Exercices en langage C... switch (n) { case LIMITE-1 : printf ("un peu moins") ; case LIMITE : printf ("juste") ; case LIMITE+1 : printf ("un peu plus") ; Solution 1) Ilmanque un point-virgule à la fin du premier printf : if (a<b) printf ("ascendant") ; else printf ("non ascendant") ; 2) Les valeurs suivant le mot case doivent obligatoirement être des "expressions constantes", c'est-à -dire des expressions calculables par le compilateur lui-même. Ce n'est pas le cas de n. 3) Aucune erreur, les expressions te les que LIMITE-1 étant bien des expressions constantes. 4) Ici, les expressions suivant le mot case ne sont plus des expressions constantes, car le symbole LIMITE a été défini sous forme d'une "constante symbolique" (en C+ +, cependant, ces instructions seront correctes). Exercice III.2 Enoncé Soit le programme suivant : #include <stdio.h> main() { int n ; scanf ("%d", &n) ; switch (n) { case 0 : printf ("Nul\n") ; case 1 :

19 case 2 : printf ("Petit\n") ; break ; case 3 : case 4 : case 5 : printf ("Moyen\n") ; default : printf ("Grand\n") ; III. Les instructions de contrôle 19 Quels résultats affiche-t-illorsqu'on lui fournit en donnée : a) 0 b) 1 c) 4 d) 10 e) -5 Solution a) Nul Petit b) Petit c) Moyen Grand d) Grand e) Grand Exercice III.3

20 20 Exercices en langage C Enoncé Que les erreurs ont été commises dans chacune des instructions suivantes : a) do c = getchar() while (c!= '\n') ; b) do while ( (c = getchar())!= '\n') ; c) do { while (1) ; Solution a) Ilmanque un point-virgule : do c = getchar() ; while (c!= '\n') ; b) Ilmanque une instruction (éventue lement "vide") aprè s le mot do. On pourrait écrire, par exemple : do { while ( (c = getchar())!= '\n') ; ou : do ; while ( (c = getchar())!= '\n') ; c) Iln'y aura pas d'erreur de compilation ;toutefois, ils'agit d'une "boucle infinie". Exercice III.4 Enoncé Ecrire plus lisiblement : do { while (printf("donnez un nombre >0 "), scanf ("%d", &n), n<=0) ;

21 III. Les instructions de contrôle 21 Solution Plusieurs possibilités existent, puisqu'il "suffit" de reporter, dans le corps de la boucle, des instructions figurant "artificie lement" sous forme d'expressions dans la condition de poursuite : do printf("donnez un nombre >0 ") ; while (scanf ("%d", &n), n<=0) ; ou, mieux : do { printf("donnez un nombre >0 ") ; scanf ("%d", &n) ; while (n<=0) ; Exercice III.5 Enoncé Soit le petit programme suivant : #include <stdio.h> main() { int i, n, som ; som = 0 ; for (i=0 ; i<4 ; i++) { printf ("donnez un entier ") ; scanf ("%d", &n) ; som += n ; printf ("Somme : %d\n", som) ; Ecrire un programme réalisant exactement la même chose, en employant, à la place de l'instruction for :

22 22 Exercices en langage C a) une instruction while, b) une instruction do... while. Solution a) b) #include <stdio.h> main() { int i, n, som ; som = 0 ; i = 0 ; /* ne pas oublier cette "initialisation" */ while (i<4) { printf ("donnez un entier ") ; scanf ("%d", &n) ; som += n ; i++ ; /* ni cette "incrémentation" */ printf ("Somme : %d\n", som) ; #include <stdio.h> main() { int i, n, som ; som = 0 ; i = 0 ; /* ne pas oublier cette "initialisation" */ do { printf ("donnez un entier ") ; scanf ("%d", &n) ; som += n ; i++ ; /* ni cette "incrémentation" */ while (i<4) ; /* attention, ici, toujours <4 */ printf ("Somme : %d\n", som) ;

23 Exercice III.6 III. Les instructions de contrôle 23 Enoncé Quels résultats fournit le programme suivant : #include <stdio.h> main() { int n=0 ; do { if (n%2==0) { printf ("%d est pair\n", n) ; n += 3 ; continue ; if (n%3==0) { printf ("%d est multiple de 3\n", n) ; n += 5 ; if (n%5==0) { printf ("%d est multiple de 5\n", n) ; break ; n += 1 ; while (1) ; Solution 0 est pair 3 est multiple de 3 9 est multiple de 3 15 est multiple de 3 20 est multiple de 5

24 24 Exercices en langage C Exercice III.7 Enoncé Quels résultats fournit le programme suivant : #include <stdio.h> main() { int n, p ; n=0 ; while (n<=5) n++ ; printf ("A : n = %d\n", n) ; n=p=0 ; while (n<=8) n += p++ ; printf ("B : n = %d\n", n) ; n=p=0 ; while (n<=8) n += ++p ; printf ("C : n = %d\n", n) ; n=p=0 ; while (p<=5) n+= p++ ; printf ("D : n = %d\n", n) ; n=p=0 ; while (p<=5) n+= ++p ; printf ("D : n = %d\n", n) ; Solution A : n = 6 B : n = 10 C : n = 10 D : n = 15

25 D : n = 21 III. Les instructions de contrôle 25 Exercice III.8 Enoncé Quels résultats fournit le programme suivant : #include <stdio.h> main() { int n, p ; n=p=0 ; while (n<5) n+=2 ; p++ ; printf ("A : n = %d, p = %d \n", n, p) ; n=p=0 ; while (n<5) { n+=2 ; p++ ; printf ("B : n = %d, p = %d \n", n, p) ; Solution A : n = 6, p = 1 B : n = 6, p = 3 Exercice III.9

26 26 Exercices en langage C Enoncé Quels résultats fournit le programme suivant : #include <stdio.h> main() { int i, n ; for (i=0, n=0 ; i<5 ; i++) n++ ; printf ("A : i = %d, n = %d\n", i, n) ; for (i=0, n=0 ; i<5 ; i++, n++) { printf ("B : i = %d, n = %d\n", i, n) ; for (i=0, n=50 ; n>10 ; i++, n-= i ) { printf ("C : i = %d, n = %d\n", i, n) ; for (i=0, n=0 ; i<3 ; i++, n+=i, printf ("D : i = %d, n = %d\n", i, n) ) ; printf ("E : i = %d, n = %d\n", i, n) ; Solution A : i = 5, n = 5 B : i = 5, n = 5 C : i = 9, n = 5 D : i = 1, n = 1 D : i = 2, n = 3 D : i = 3, n = 6 E : i = 3, n = 6

27 Exercice III.10 III. Les instructions de contrôle 27 Enoncé Ecrire un programme qui calcule les racines carrées de nombres fournis en donnée. Ils'arrê tera lorqu'on lui fournira la valeur 0. Ilrefusera les valeurs négatives. Son exécution se présentera ainsi : donnez un nombre positif : 2 sa racine carrée est : e+00 donnez un nombre positif : -1 svp positif donnez un nombre positif : 5 sa racine carrée est : e+00 donnez un nombre positif : 0 Rappelons que la fonction sqrt fournit la racine carrée (double) de la valeur (double) qu'on lui fournit en argument. Solution Ilexiste beaucoup de "rédactions possibles" ;en voici 3 : #include <stdio.h> #include <math.h> /* indispensable pour sqrt (qui fourni un résultat */ /* de type double */ main() { double x ; do { printf ("donnez un nombre positif : ") ; scanf ("%le", &x) ; if (x < 0) printf ("svp positif \n") ; if (x <=0) continue ; printf ("sa racine carrée est : %le\n", sqrt (x) ) ; while (x) ;

28 28 Exercices en langage C #include <stdio.h> #include <math.h> main() { double x ; do { printf ("donnez un nombre positif : ") ; scanf ("%le", &x) ; if (x < 0) { printf ("svp positif \n") ; continue ; if (x>0) printf ("sa racine carrée est : %le\n", sqrt (x) ) ; while (x) ; #include <stdio.h> #include <math.h> main() { double x ; do { printf ("donnez un nombre positif : ") ; scanf ("%le", &x) ; if (x < 0) { printf ("svp positif \n") ; continue ; if (x>0) printf ("sa racine carrée est : %le\n", sqrt (x) ) ; if (x==0) break ; while (1) ; Remarque : Ilne faut surtout pas oublier #include <math.h> car, sinon, le compilateur considè re (en l'abscence du prototype) que sqrt fournit un résultat de type int.

29 Exercice III.11 III. Les instructions de contrôle 29 Enoncé Calculer la somme des n premiers termes de la "série harmonique", c'est-à -dire la somme : 1 + 1/2 + 1/3 + 1/ /n La valeur de n sera lue en donnée. Solution #include <stdio.h> main() { int nt ; /* nombre de termes de la série harmonique */ float som ; /* pour la somme de la série */ int i ; do { printf ("combien de termes : ") ; scanf ("%d", &nt) ; while (nt<1) ; for (i=1, som=0 ; i<=nt ; i++) som += (float)1/i ; printf ("Somme des %d premiers termes = %f", nt, som) ; Remarques : 1) Rappelons que dans : som += (float)1/i l'expression de droite est évaluée en convertissant d'abord 1 et i en float.

30 30 Exercices en langage C Ilfaut éviter d'écrire : som += 1/i auquelcas, les valeurs de 1/i seraient toujours nu les (sauf pour i=1) puique l'opérateur /, lorsqu'il porte sur des entiers, correspond à la division entiè re. De même, en écrivant : som += (float) (1/i) le résultat ne serait pas plus satisfaisant puisque la conversion en flottant n'aurait lieu qu'aprè s la division (en entier). En revanche, on pourrait écrire : som += 1.0/i ; 2) Si l'on cherchait à exécuter ce programme pour des valeurs élevées de n (en prévoyant alors une variable de type float ou double), on constaterait que la valeur de la somme semble "converger" vers une limite (bien qu'en théorie la série harmonique "diverge"). Cela provient tout simplement de ce que, dè s que la valeur de 1/i est "petite" devant som, le résultat de l'addition de 1/i et de som est exactement som. On pourrait toutefois améliorer le résultat en effectuant la somme "à l'envers" (en effet, dans ce cas, le rapport entre la valeur à ajouter et la somme courante serait plus faible que précédemment).. Exercice III.12 Enoncé Afficher un triangle isocè le formé d'étoiles. La hauteur du triangle (c'est-à -dire le nombre de lignes) sera fourni en donnée, comme dans l'exemple ci-dessous. On s'arrangera pour que la derniè re ligne du triangle s'affiche sur le bord gauche de l'écran. combien de lignes? 10 * *** ***** ******* ********* *********** ************* ***************

31 ***************** ******************* III. Les instructions de contrôle 31 Solution #include <stdio.h> #define car '*' /* caractère de remplissage */ main() { int nlignes ; /* nombre total de lignes */ int nl ; /* compteur de ligne */ int nesp ; /* nombre d'espaces précédent une étoile */ int j ; printf ("combien de lignes? ") ; scanf ("%d", &nlignes) ; for (nl=0 ; nl<nlignes ; nl++) { nesp = nlignes - nl - 1 ; for (j=0 ; j<nesp ; j++) putchar (' ') ; for (j=0 ; j<2*nl+1 ; j++) putchar (car) ; putchar ('\n') ; Exercice III.13 Enoncé Afficher toutes les maniè res possibles d'obtenir un franc avec des piè ces de 2 centimes, 5 centimes et 10 centimes. Dire combien de possibilités ont été ainsi trouvées. Les résultats seront affichés comme suit : 1 F = 50 X 2c

32 32 Exercices en langage C 1 F = 45 X 2c 2 X 5c 1 F = 40 X 2c 4 X 5c 1 F = 35 X 2c 6 X 5c 1 F = 30 X 2c 8 X 5c 1 F = 25 X 2c 10 X 5c 1 F = 20 X 2c 12 X 5c 1 F = 15 X 2c 14 X 5c 1 F = 10 X 2c 16 X 5c 1 F = 5 X 2c 18 X 5c 1 F = 20 X 5c 1 F = 45 X 2c 1 X 10c 1 F = 40 X 2c 2 X 5c 1 X 10c 1 F = 35 X 2c 4 X 5c 1 X 10c 1 F = 10 X 2c 2 X 5c 7 X 10c 1 F = 5 X 2c 4 X 5c 7 X 10c 1 F = 6 X 5c 7 X 10c 1 F = 10 X 2c 8 X 10c 1 F = 5 X 2c 2 X 5c 8 X 10c 1 F = 4 X 5c 8 X 10c 1 F = 5 X 2c 9 X 10c 1 F = 2 X 5c 9 X 10c 1 F = 10 X 10c En tout, il y a 66 façons de faire 1 F Solution #include <stdio.h> main() { int nbf ; /* compteur du nombre de façons de faire 1 F */ int n10 ; /* nombre de pièces de 10 centimes */ int n5 ; /* nombre de pièces de 5 centimes */ int n2 ; /* nombre de pièces de 2 centimes */ nbf = 0 ; for (n10=0 ; n10<=10 ; n10++) for (n5=0 ; n5<=20 ; n5++) for (n2=0 ; n2<=50 ; n2++)

33 if ( 2*n2 + 5*n5 + 10*n10 == 100) { nbf ++ ; printf ("1 F = ") ; if (n2) printf ("%2d X 2c ", n2 ) ; if (n5) printf ("%2d X 5c ", n5 ) ; if (n10) printf ("%2d X 10c", n10) ; printf ("\n") ; III. Les instructions de contrôle 33 printf ("\nen tout, il y a %d façons de faire 1 F\n", nbf) ; Exercice III.14 Enoncé Ecrire un programme qui détermine la n ieme valeur u n ( n étant fourni en donnée) de la "suite de Fibonacci" définie comme suit : u1 = 1 u2 = 1 u n = u n-1 + u n-2 pour n> 2 Solution #include <stdio.h> main() { int u1, u2, u3 ; /* pour "parcourir" la suite */ int n ; /* rang du terme demandé */ int i ; /* compteur */

34 34 Exercices en langage C do { printf ("rang du terme demandé (au moins 3)? ") ; scanf ("%d", &n) ; while (n<3) ; u2 = u1 = 1 ; /* les deux premiers termes */ i = 2 ; while (i++ < n) /* attention, l'algorithme ne fonctionne */ { u3 = u1 + u2 ; /* que pour n > 2 */ u1 = u2 ; u2 = u3 ; /* autre formulation possible : */ /* for (i=3 ; i<=n ; i++, u1=u2, u2=u3) u3 = u1 + u2 ; */ printf ("Valeur du terme de rang %d : %d", n, u3) ; Notez que, comme à l'accoutumée en C, beaucoup de formulations sont possibles. Nous en avons d'ai leurs placé une seconde en commentaire de notre programme. Exercice III.15 Enoncé Ecrire un programme qui trouve la plus grande et la plus petite valeur d'une succession de notes (nombres entiers entre 0 et 20) fournies en données, ainsi que le nombre de fois où ce maximum et ce minimum ont été attribués. On supposera que les notes, en nombre non connu à l'avance, seront terminées par une valeur négative. On s'astreindra à ne pas utiliser de "tableau". L'exécution du programme pourra se présenter ainsi : donnez une note (-1 pour finir) : 12 donnez une note (-1 pour finir) : 8 donnez une note (-1 pour finir) : 13 donnez une note (-1 pour finir) : 7

35 donnez une note (-1 pour finir) : 11 donnez une note (-1 pour finir) : 12 donnez une note (-1 pour finir) : 7 donnez une note (-1 pour finir) : 9 donnez une note (-1 pour finir) : -1 III. Les instructions de contrôle 35 note maximale : 13 attribuée 1 fois note minimale : 7 attribuée 2 fois Solution #include <stdio.h> main() { int note ; /* note "courante" */ int max ; /* note maxi */ int min ; /* note mini */ int nmax ; /* nombre de fois où la note maxi a été trouvée */ int nmin ; /* nombre de fois où la note mini a été trouvée */ max = -1 ; /* initialisation max (possible car toutes notes >=0 */ min = 21 ; /* initialisation min (possible car toutes notes < 21) */ while (printf ("donnez une note (-1 pour finir) : "), scanf ("%d", &note), note >=0) { if (note == max) nmax++ ; if (note > max) { max = note ; nmax = 1 ; if (note == min) nmin++ ; if (note < min) { min = note ; nmin = 1 ; /* attention, si aucune note (cad si max<0) */ /* les résultats sont sans signification */ if (max >= 0) { printf ("\nnote maximale : %d attribuée %d fois\n", max, nmax) ;

36 36 Exercices en langage C printf ("note minimale : %d attribuée %d fois\n", min, nmin) ; Exercice III.16 Enoncé Ecrire un programme qui affiche la "table de multiplication" des nombres de 1 à 10, sous la forme suivante : I I I I I I I I I I I Solution #include <stdio.h> #define NMAX 10 /* nombre de valeurs */ main() { int i, j ; /* affichage ligne en-tête */ printf (" I") ; for (j=1 ; j<=nmax ; j++) printf ("%4d", j) ;

37 printf ("\n") ; printf (" ") ; for (j=1 ; j<=nmax ; j++) printf ("----") ; printf ("\n") ; III. Les instructions de contrôle 37 /* affichage des différentes lignes */ for (i=1 ; i<=nmax ; i++) { printf ("%4d I", i) ; for (j=1 ; j<=nmax ; j++) printf ("%4d", i*j) ; printf ("\n") ;

38

39 IV :LES FONCTIONS N.B. Ici, on ne trouvera aucun exercice faisant intervenir des pointeurs, et par conséquent aucun exercice mettant en oeuvre une transmission d'arguments par adresse. De tels exercices apparaîtront dans le chapitre suivant. Exercice IV.1 Enoncé a) Que fournit le programme suivant : #include <stdio.h> main() { int n, p=5 ; n = fct (p) ; printf ("p = %d, n = %d\n", p, n) ; int fct (int r) { return 2*r ; b) Ajouter une déclaration convenable de la fonction fct : - sous la forme la plus brè ve possible (suivant la norme ANSI),

40 40 Exercices en langage C - sous forme d'un "prototype". Solution a) Bien qu'ilne possède pas de déclaration de la fonction fct, le programme main est correct. En effet, la norme ANSI autorise qu'une fonction ne soit pas déclarée, auquelcas e le est considérée comme fournissant un résultat de type int. Cette facilité est toutefois fortement déconsei lée (et e le ne sera plus acceptée de C+ +). Voici les résultats fournis par le programme : p = 5, n = 10 b) La déclaration la plus brè ve sera : int fct () ; La déclaration (vivement consei lée), sous forme de prototype sera : int fct (int) ; ou, éventue lement, sous forme d'un prototype "complet" : int fct (int r) ; Dans ce dernier cas, le nom r n'a aucune signification : on utilise souvent le même nom (lorsqu'on le connaît!) que dans l'en-tête de la fonction, mais ilpourrait s'agir de n'importe quelautre nom de variable). Exercice IV.2 Enoncé Ecrire :

41 IV. Les fonctions 41 - une fonction, nommée f1, se contentant d'afficher "bonjour" (e le ne possédera aucun argument, ni valeur de retour), - une fonction, nommée f2, qui affiche "bonjour" un nombre de fois égalà la valeur reçue en argument (int) et qui ne renvoie aucune valeur, - une fonction, nommée f3, qui fait la même chose que f2, mais qui, de plus, renvoie la valeur (int) 0. Ecrire un petit programme appelant successivement chacune de ces 3 fonctions, aprè s les avoir convenablement déclarées sous forme d'un prototype. Solution #include <stdio.h> void f1 (void) { printf ("bonjour\n") ; void f2 (int n) { int i ; for (i=0 ; i<n ; i++) printf ("bonjour\n") ; int f3 (int n) { int i ; for (i=0 ; i<n ; i++) printf ("bonjour\n") ; return 0 ; main() { void f1 (void) ; void f2 (int) ; int f3 (int) ; f1 () ; f2 (3) ; f3 (3) ;

42 42 Exercices en langage C Exercice IV.3 Enoncé Quels résultats fournira ce programme : #include <stdio.h> int n=10, q=2 ; main() { int fct (int) ; void f (void) ; int n=0, p=5 ; n = fct(p) ; printf ("A : dans main, n = %d, p = %d, q = %d\n", n, p, q) ; f() ; int fct (int p) { int q ; q = 2 * p + n ; printf ("B : dans fct, n = %d, p = %d, q = %d\n", n, p, q) ; return q ; void f (void) { int p = q * n ; printf ("C : dans f, n = %d, p = %d, q = %d\n", n, p, q) ;

43 IV. Les fonctions 43 Solution B : dans fct, n = 10, p = 5, q = 20 A : dans main, n = 20, p = 5, q = 2 C : dans f, n = 10, p = 20, q = 2 Exercice IV.4 Enoncé Ecrire une fonction qui reçoit en arguments 2 nombres flottants et un caractère et qui fournit un résultat correspondant à l'une des 4 opérations appliquées à ses deux premiers arguments, en fonction de la valeur du dernier, à savoir : addition pour le caractère +, soustraction pour -, multiplication pour *et division pour / (tout autre caractère que l'un des 4 cités sera interprété comme une addition). On ne tiendra pas compte des risques de division par zéro. Ecrire un petit programme (main) utilisant cette fonction pour effectuer les 4 opérations sur deux nombres fournis en donnée. Solution #include <stdio.h> float oper (float v1, float v2, char op) { float res ; switch (op) { case '+' : res = v1 + v2 ; break ; case '-' : res = v1 - v2 ; break ; case '*' : res = v1 * v2 ; break ; case '/' : res = v1 / v2 ;

44 44 Exercices en langage C break ; default : res = v1 + v2 ; return res ; main() { float oper (float, float, char) ; /* prototype de oper */ float x, y ; printf ("donnez deux nombres réels : ") ; scanf ("%e %e", &x, &y) ; printf ("leur somme est : %e\n", oper (x, y, '+') ) ; printf ("leur différence est : %e\n", oper (x, y, '-') ) ; printf ("leur produit est : %e\n", oper (x, y, '*') ) ; printf ("leur quotient est : %e\n", oper (x, y, '/') ) ; Exercice IV.5 Enoncé Transformer le programme (fonction + main) écrit dans l'exercice précédent de maniè re à ce que la fonction ne dispose plus que de 2 arguments, le caractère indiquant la nature de l'opération à effectuer étant précisé, cette fois, à l'aide d'une variable globale. Solution #include <stdio.h>

45 IV. Les fonctions 45 char op ; /* variable globale pour la nature de l'opération */ /* attention : doit être déclarée avant d'être utilisée */ float oper (float v1, float v2) { float res ; switch (op) { case '+' : res = v1 + v2 ; break ; case '-' : res = v1 - v2 ; break ; case '*' : res = v1 * v2 ; break ; case '/' : res = v1 / v2 ; break ; default : res = v1 + v2 ; return res ; main() { float oper (float, float) ; /* prototype de oper */ float x, y ; printf ("donnez deux nombres réels : ") ; scanf ("%e %e", &x, &y) ; op = '+' ; printf ("leur somme est : %e\n", oper (x, y) ) ; op = '-' ; printf ("leur différence est : %e\n", oper (x, y) ) ; op = '*' ; printf ("leur produit est : %e\n", oper (x, y) ) ; op = '/' ; printf ("leur quotient est : %e\n", oper (x, y) ) ; Remarque : Il s'agissait ici d'un exercice d'"école" destiné à forcer l'utilisation d'une variable globale. Dans la pratique, on évitera le plus possible ce genre de programmation qui favorise trop largement les risques d'"effets de bord".

46 46 Exercices en langage C Exercice IV.6 Enoncé Ecrire une fonction, sans argument ni valeur de retour, qui se contente d'afficher, à chaque appel, le nombre totalde fois où e le a été appelée sous la forme : appel numéro 3 Solution La mei leure solution consiste à prévoir, au sein de la fonction en question, une variable de classe statique. E le sera initialisée une seule fois à zéro (ou à toute autre valeur éventue lement explicitée) au début de l'exécution du programme. Ici, nous avons, de plus, prévu un petit programme d'essai. #include <stdio.h> void fcompte (void) { static int i ; /* il est inutile, mais pas défendu, d'écrire i=0 */ i++ ; printf ("appel numéro %d\n", i) ; /* petit programme d'essai de fcompte */ main() { void fcompte (void) ; int i ; for (i=0 ; i<3 ; i++) fcompte () ; Là encore, la démarche consistant à utiliser comme compteur d'appels une variable globale (qui devrait alors être connue du programme utilisateur) est à proscrire.

47 Exercice IV.7 IV. Les fonctions 47 Enoncé Ecrire 2 fonctions à un argument entier et une valeur de retour entiè re permettant de préciser si l'argument reçu est multiple de 2 (pour la premiè re fonction) ou multiple de 3 (pour la seconde fonction). Utiliser ces deux fonctions dans un petit programme qui lit un nombre entier et qui précise s'ilest pair, multiple de 3 et/ou multiple de 6, comme dans cet exemple (ily a deux exécutions) : donnez un entier : 9 il est multiple de 3 donnez un entier : 12 il est pair il est multiple de 3 il est divisible par 6 Solution #include <stdio.h> int mul2 (int n) { if (n%2) return 0 ; else return 1 ; int mul3 (int n) { if (n%3) return 0 ; else return 1 ; main() { int mul2 (int) ;

48 48 Exercices en langage C int mul3 (int) ; int n ; printf ("donnez un entier : ") ; scanf ("%d", &n) ; if (mul2(n)) printf ("il est pair\n") ; if (mul3(n)) printf ("il est multiple de 3\n") ; if (mul2(n) && mul3(n)) printf ("il est divisible par 6\n") ;

49 V : TABLEAUX ET POINTEURS Exercice V.1 Enoncé Quels résultats fournira ce programme : #include <stdio.h> main() { int t [3] ; int i, j ; int * adt ; for (i=0, j=0 ; i<3 ; i++) t[i] = j++ + i ; /* 1 */ for (i=0 ; i<3 ; i++) printf ("%d ", t[i]) ; /* 2 */ printf ("\n") ; for (i=0 ; i<3 ; i++) printf ("%d ", *(t+i)) ; /* 3 */ printf ("\n") ; for (adt = t ; adt < t+3 ; adt++) printf ("%d ", *adt) ; /* 4 */ printf ("\n") ; for (adt = t+2 ; adt>=t ; adt--) printf ("%d ", *adt) ; /* 5 */

50 50 Exercices en langage C printf ("\n") ; Solution /*1*/ remplit le tableau avec les valeurs 0 (0+ 0), 2 (1+ 1) et 4 (2+ 2) ;on obtiendrait plus simplement le même résultat avec l'expression 2*i. /*2 */ affiche "classiquement" les valeurs du tableau t, dans l'ordre "naturel". /* 3 */ fait la même chose, en utilisant le formalisme pointeur au lieu du formalisme tableau. Ainsi, *(t+i) est parfaitement équivalent à t[i]. /*4 */ fait la même chose, en utilisant la "lvalue" adt (à laque le on a affecté initialement l'adresse t du tableau) et en "l'incrémentant" pour parcourir les différentes adresses des 4 éléments du tableau. /*5 */ affiche les valeurs de t, à l'envers, en utilisant le même formalisme pointeur que dans 4. On aurait pu écrire, de façon équivalente : for (i=2 ; i>=0 ; i--) printf ("%d ", t[i]) ; Voici les résultats fournis par ce programme : Exercice V.2

51 Enoncé V. Tableaux et pointeurs 51 Ecrire, de deux façons différentes, un programme qui lit 10 nombres entiers dans un tableau avant d'en rechercher le plus grand et le plus petit : a) en utilisant uniquement le "formalisme tableau", b) en utilisant le "formalisme pointeur", à chaque fois que cela est possible Solution a) La programmation est, ici, "classique". Nous avons simplement défini un symbole NVAL destiné à contenir le nombre de valeurs du tableau. Notez bien que la déclaration int t[nval] est acceptée puisque NVAL est une "expression constante". En revanche, e le ne l'aurait pas été si nous avions défini ce symbole NVAL par une "constante symbolique" (const int NVAL = 10). #include <stdio.h> #define NVAL 10 /* nombre de valeurs du tableau */ main() { int i, min, max ; int t[nval] ; printf ("donnez %d valeurs\n", NVAL) ; for (i=0 ; i<nval ; i++) scanf ("%d", &t[i]) ; max = min = t[0] ; for (i=1 ; i<nval ; i++) { if (t[i] > max) max = t[i] ; /* ou max = t[i]>max? t[i] : max */ if (t[i] < min) min = t[i] ; /* ou min = t[i]<min? t[i] : min */ printf ("valeur max : %d\n", max) ; printf ("valeur min : %d\n", min) ; b) On peut remplacer systématiquement, t[i] par *(t+i)./ De plus, dans scanf, on peut remplacer & t[i] par t+i. Voici finalement le programme obtenu : #include <stdio.h> #define NVAL 10 /* nombre de valeurs du tableau */ main() { int i, min, max ;

52 52 Exercices en langage C int t[nval] ; printf ("donnez %d valeurs\n", NVAL) ; for (i=0 ; i<nval ; i++) scanf ("%d", t+i) ; /* attention t+i et non *(t+i) */ max = min = *t ; for (i=1 ; i<nval ; i++) { if (*(t+i) > max) max = *(t+i) ; if (*(t+i) < min) min = *(t+i) ; printf ("valeur max : %d\n", max) ; printf ("valeur min : %d\n", min) ; Exercice V.3 Enoncé Soient deux tableaux t1 et t2 déclarés ainsi : float t1[10], t2[10] ; Ecrire les instructions permettant de recopier, dans t1, tous les éléments positifs de t2, en complétant éventue lement t1 par des zéros. Ici, on ne cherchera pas à fournir un programme complet et on utilisera systématiquement le formalisme tableau. Solution On peut commencer par remplir t1 de zéros, avant d'y recopier les éléments positifs de t2 : int i, j ; for (i=0 ; i<10 ; i++) t1[i] = 0 ; /* i sert à pointer dans t1 et j dans t2 */ for (i=0, j=0 ; j<10 ; j++)

53 if (t2[j] > 0) t1[i++] = t2[j] ; V. Tableaux et pointeurs 53 Mais, on peut recopier d'abord dans t1 les éléments positifs de t2, avant de compléter éventue lement par des zéros. Cette deuxiè me formulation, moins simple que la précédente, se révélerait toutefois plus efficace sur de grands tableaux : int i, j ; for (i=0, j=0 ; j<10 ; j++) if (t2[j] > 0) t1[i++] = t2[j] ; for (j=i ; j<10 ; j++) t1[j] = 0 ; Exercice V.4 Enoncé Quels résultats fournira ce programme : #include <stdio.h> main() { int t[4] = {10, 20, 30, 40 ; int * ad [4] ; int i ; for (i=0 ; i<4 ; i++) ad[i] = t+i ; /* 1 */ for (i=0 ; i<4 ; i++) printf ("%d ", * ad[i]) ; /* 2 */ printf ("\n") ; printf ("%d %d \n", * (ad[1] + 1), * ad[1] + 1) ; /* 3 */ Solution Le tableau ad est un tableau de 4 éléments ;chacun de ces éléments est un pointeur sur un int. L'instruction /* 1 */ remplit le tableau ad avec les adresses des 4 éléments du tableau t. L'instruction /*2 */ affiche finalement les 4 éléments du tableau t ;en effet, *ad[i] représente la valeur située à l'adresse ad[i]. /*2 */ est équivalente ici à : for (i=0 ; i<4 ; i++) printf ("%d", t[i]) ;

54 54 Exercices en langage C Enfin, dans l'instruction /*3 */, *(ad[1] + 1) représente la valeur située à l'entier suivant celui d'adresse ad[1] ;ils'agit donc de t[2]. En revanche, *ad[1] + 1 représente la valeur située à l'adresse ad[1] augmentée de 1, autrement dit t[1] + 1. Voici, en définitive, les résultats fournis par ce programme : Exercice V.5 Enoncé Soit le tableau t déclaré ainsi : float t[3] [4] ; Ecrire les (seules) instructions permettant de calculer, dans une variable nommée som, la somme des éléments de t : a) en utilisant le "formalisme usueldes tableaux à deux indices", b) en utilisant le "formalisme pointeur". Solution a) La premiè re solution ne pose aucun problème particulier : int i, j ; som = 0 ; for (i=0 ; i<3 ; i++) for (j=0 ; j<4 ; j++) som += t[i] [j] ; b) Le formalisme pointeur est ici moins facile à appliquer que dans le cas des tableaux à un indice. En effet, avec, par exemple, float t[4], t est de type int * et ilcorrespond à un pointeur sur le premier élément du tableau. Ilsuffit donc d'incrémenter convenablement t pour parcourir tous les éléments du tableau.

55 V. Tableaux et pointeurs 55 En revanche, avec notre tableau float t [3] [4], t est du type pointeur sur des tableaux de 4 flottants(type : float[4] *). La notation *(t+i) est généralement inutilisable sous cette forme puisque, d'une part, e le correspond à des valeurs de tableaux de 4 flottants et que, d'autre part, l'incrément i porte, non plus sur des flottants, mais sur des blocs de 4 flottants ;par exemple, t+2 représente l'adresse du huitiè me flottant, compté à partir de celui d'adresse t. Une solution consiste à "convertir" la valeur de t en un pointeur de type float *. On pourrait se contenter de procéder ainsi : float * adt ;... adt = t ; En effet, dans ce cas, l'affectation entraîne une conversion forcée de t en float *, ce qui ne change pas l'adresse correspondante 1 (seule la nature du pointeur a changé). Généralement, on y gagnera en lisibilité en explicitant la conversion mise en oeuvre à l'aide de l'opérateur de "cast". Notez que, d'une part, cela peut éviter certains messages d'avertissement ("warnings") de la part du compilateur. Voici finalement ce que pourraient être les instructions demandées : int i ; int * adt ; som = 0 ; adt = (float *) t ; for (i=0 ; i<12 ; i++) som += * (adt+i); Exercice V.6 Enoncé Ecrire une fonction qui fournit en valeur de retour la somme des éléments d'un tableau de flottants transmis, ainsi que sa dimension, en argument. Ecrire un petit programme d'essai. 1 Attention, cela n'est vrai que parce que l'on passe de pointeurs sur des groupes d'éléments à un pointeur sur ces éléments. Autrement dit, aucune "contrainte d'alignement" ne risque de nuire ici. Iln'en irait pas de même, par exemple, pour des conversions de char *en int *.

56 56 Exercices en langage C Solution En ce qui concerne le tableau de flottants reçu en argument, ilne peut être transmis que par adresse. Quant au nombre d'élément (de type int), nous le transmettrons classiquement par valeur. L'en-tête de notre fonction pourra se présenter sous l'une des formes suivantes : float somme (float t[], int n) float somme (float * t, int n) float somme (float t[5], int n) /* déconseillé car laisse croire que t */ /* est de dimension fixe 5 */ En effet, la dimension rée le de t n'a aucune incidence sur les instructions de la fonction e le-même (e le n'intervient pas dans le calculde l'adresse d'un élément du tableau 2 et e le ne sert pas à "a louer" un emplacement puisque le tableau en question aura été a loué dans la fonction appelant somme). Voici ce que pourrait être la fonction demandée : float somme (float t[], int n) /* on pourrait écrire somme (float * t,... */ /* ou encore somme (float t[4],... */ /* mais pas somme (float t[n],... */ { int i ; float s = 0 ; for (i=0 ; i<n ; i++) s += t[i] ; /* on pourrait écrire s += * (t+i) ; */ return s ; Pour ce qui est du programme d'utilisation de la fonction somme, on peut, là encore, écrire le "prototype" sous différentes formes : float somme (float [], int ) ; float somme (float *, int ) ; float somme (float [5], int ) ; /* déconseillé car laisse croire que t */ /* est de dimension fixe 5 */ Voici un exemple d'un telprogramme : #include <stdio.h> main() 2 Iln'en irait pas de même pour des tableaux à plusieurs indices.

57 { float somme (float *, int) ; float t[4] = {3, 2.5, 5.1, 3.5 ; printf ("somme de t : %f\n", somme (t, 4) ) ; V. Tableaux et pointeurs 57 Exercice V.7 Enoncé Ecrire une fonction qui ne renvoie aucune valeur et qui détermine la valeur maximale et la valeur minimale d'un tableau d'entiers (à un indice) de tai le quelconque. Ilfaudra donc prévoir 4 arguments : le tableau, sa dimension, le maximum et le minimum. Ecrire un petit programme d'essai. Solution En langage C, un tableau ne peut être transmis que par adresse (en toute rigueur, C n'autorise que la transmission par valeur mais, dans le cas d'un tableau, on transmet une valeur de type pointeur qui n'est rien d'autre que l'adresse du tableau!). En ce qui concerne son nombre d'éléments, on peut indifféremment en transmettre l'adresse (sous forme d'un pointeur de type int *), ou la valeur ;ici, la seconde solution est la plus normale. En revanche, en ce qui concerne le maximum et le minimum, ils ne peuvent pas être transmis par valeur, puisqu'ils doivent précisément être déterminés par la fonction. Ilfaut donc obligatoirement prévoir de passer des pointeurs sur des float. L'en-tête de notre fonction pourra donc se présenter ainsi (nous ne donnons plus toutes les écritures possibles) : void maxmin (int t[], int n, int * admax, int * admin) L'algorithme de recherche de maximum et de minimum peut être calqué sur celui de l'exercice V.2, en remplaçant max par *admax et min par *admin. Cela nous conduit à la fonction suivante : void maxmin (int t[], int n, int * admax, int * admin)

58 58 Exercices en langage C { int i ; *admax = t[1] ; *admin = t[1] ; for (i=1 ; i<n ; i++) { if (t[i] > *admax) *admax = t[i] ; if (t[i] < *admin) *admin = t[i] ; Si l'on souhaite éviter les "indirections" qui apparaissent systématiquement dans les instructions de comparaison, on peut "travai ler" temporairement sur des variables locales à la fonction (nommées ici max et min). Cela nous conduit à une fonction de la forme suivante : void maxmin (int t[], int n, int * admax, int * admin) { int i, max, min ; max = t[1] ; min = t[1] ; for (i=1 ; i<n ; i++) { if (t[i] > max) max = t[i] ; if (t[i] < min) min = t[i] ; *admax = max ; *admin = min ; Voici un petit exemple de programme d'utilisation de notre fonction : #include <stdio.h> main() { void maxmin (int [], int, int *, int *) ; int t[8] = { 2, 5, 7, 2, 9, 3, 9, 4 ; int max, min ; maxmin (t, 8, &max, &min) ; printf ("valeur maxi : %d\n", max) ; printf ("valeur mini : %d\n", min) ;

59 Exercice V.8 V. Tableaux et pointeurs 59 Enoncé Ecrire une fonction qui fournit en retour la somme des valeurs d'un tableau de flottants à deux indices dont les dimensions sont fournies en argument. Solution Par analogie avec ce que nous avions fait dans l'exercice V.6, nous pourrions songer à déclarer le tableau concerné dans l'en-tête de la fonction sous la forme t[][]. Mais, cela n'est plus possible car, cette fois, pour déterminer l'adresse d'un élément t[i][j] d'un teltableau, le compilateur doit en connaître la deuxiè me dimension. Une solution consiste à considérer qu'on reçoit un pointeur (de type float*) sur le début du tableau et d'en parcourir tous les éléments (au nombre de n*p si n et p désignent les dimensions du tableau) comme si l'on avait affaire à un tableau à une dimension. Cela nous conduit à cette fonction : float somme (float * adt, int n, int p) { int i ; float s ; for (i=0 ; i<n*p ; i++) s += adt[i] ; /* ou s += *(adt+i) */ return s ; Pour utiliser une te le fonction, la seule difficulté consiste à lui transmettre effectivement l'adresse de début du tableau, sous la forme d'un pointeur de type int *. Or, avec, par exemple t[3][4], t, s'ilcorrrespond bien à la bonne adresse, est du type "pointeur sur des tableaux de 4 flottants". A priori, toutefois, compte tenu de la présence du prototype, la conversion voulue sera mise en oeuvre automatiquement par le compilateur. Toutefois, comme nous l'avons déjà dit dans l'exercice V.5, on y gagnera en lisibilité (et en éventuels messages d'avertissement!) en faisant appelà l'opérateur de "cast". Voici finalement un exemple d'un telprogramme d'utilisation de notre fonction : #include <stdio.h> main() {

60 60 Exercices en langage C float somme (float *, int, int) ; float t[3] [4] = { {1,2,3,4, {5,6,7,8, {9,10,11,12 ; printf ("somme : %f\n", somme ((float *)t, 3, 4) ) ;

61 VI:LES CH AINES DE CARACTERES Exercice VI.1 Enoncé Quels résultats fournira ce programme : #include <stdio.h> main() { char * ad1 ; ad1 = "bonjour" ; printf ("%s\n", ad1) ; ad1 = "monsieur" ; printf ("%s\n", ad1) ; Solution L'instruction ad1 = "bonjour" place dans la variable ad1l'adresse de la chaîne constante "bonjour". L'instruction printf ("%s\n", ad1) se contente d'afficher la valeur de la chaîne dont l'adresse figure dans ad1, c'est-à -dire, en l'occurrence "bonjour". De maniè re comparable, l'instruction ad1 = "monsieur" place l'adresse de la chaîne constante "monsieur"

62 62 Exercices en langage C dans ad1 ;l'instruction printf ("%s\n", ad1) affiche la valeur de la chaîne ayant maintenant l'adresse contenue dans ad1, c'est-à -dire maintenant "monsieur". Finalement, ce programme affiche tout simplement : bonjour monsieur On aurait obtenu plus simplement le même résultat en écrivant : printf ("bonjour\nmonsieur\n") ; Exercice VI.2 Enoncé Quels résultats fournira ce programme : #include <stdio.h> main() { char * adr = "bonjour" ; /* 1 */ int i ; for (i=0 ; i<3 ; i++) putchar (adr[i]) ; /* 2 */ printf ("\n") ; i = 0 ; while (adr[i]) putchar (adr[i++]) ; /* 3 */ Solution La déclaration /*1 */ place dans la variable adr, l'adresse de la chaîne constante bonjour. L'instruction /* 2 */ affiche les caractères adr[0], adr[1] et adr[2], c'est-à -dire les 3 premiers caractères de cette chaîne. L'instruction /*3 */ affiche tous les caractères à partir de celui d'adresse adr, tant que l'on a pas affaire à un caractère nul;comme notre chaîne

Claude Delannoy. 3 e édition C++

Claude Delannoy. 3 e édition C++ Claude Delannoy 3 e édition Exercices Exercices C++ en en langage langage delc++ titre 4/07/07 15:19 Page 2 Exercices en langage C++ AUX EDITIONS EYROLLES Du même auteur C. Delannoy. Apprendre le C++.

Plus en détail

I. Introduction aux fonctions : les fonctions standards

I. Introduction aux fonctions : les fonctions standards Chapitre 3 : Les fonctions en C++ I. Introduction aux fonctions : les fonctions standards A. Notion de Fonction Imaginons que dans un programme, vous ayez besoin de calculer une racine carrée. Rappelons

Plus en détail

Initiation à la programmation en Python

Initiation à la programmation en Python I-Conventions Initiation à la programmation en Python Nom : Prénom : Une commande Python sera écrite en caractère gras. Exemples : print 'Bonjour' max=input("nombre maximum autorisé :") Le résultat de

Plus en détail

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3. 1. Structure d un programme C Un programme est un ensemble de fonctions. La fonction "main" constitue le point d entrée pour l exécution. Un exemple simple : #include int main() { printf ( this

Plus en détail

Algorithmique et Programmation, IMA

Algorithmique et Programmation, IMA Algorithmique et Programmation, IMA Cours 2 : C Premier Niveau / Algorithmique Université Lille 1 - Polytech Lille Notations, identificateurs Variables et Types de base Expressions Constantes Instructions

Plus en détail

Chapitre 1 : La gestion dynamique de la mémoire

Chapitre 1 : La gestion dynamique de la mémoire Chapitre 1 : La gestion dynamique de la mémoire En langage C un programme comporte trois types de données : Statiques; Automatiques ; Dynamiques. Les données statiques occupent un emplacement parfaitement

Plus en détail

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP COURS PROGRAMMATION INITIATION AU LANGAGE C SUR MICROCONTROLEUR PIC page 1 / 7 INITIATION AU LANGAGE C SUR PIC DE MICROSHIP I. Historique du langage C 1972 : naissance du C dans les laboratoires BELL par

Plus en détail

Rappels Entrées -Sorties

Rappels Entrées -Sorties Fonctions printf et scanf Syntaxe: écriture, organisation Comportement Données hétérogènes? Gestion des erreurs des utilisateurs 17/11/2013 Cours du Langage C ibr_guelzim@yahoo.fr ibrahimguelzim.atspace.co.uk

Plus en détail

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java Info0101 Intro. à l'algorithmique et à la programmation Cours 3 Le langage Java Pierre Delisle, Cyril Rabat et Christophe Jaillet Université de Reims Champagne-Ardenne Département de Mathématiques et Informatique

Plus en détail

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation impérative et structures de données simples Introduction au langage C Sandrine Blazy - 1ère année 24 octobre 2007 Cours d Algorithmique-Programmation

Plus en détail

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles) 1/4 Objectif de ce cours /4 Objectifs de ce cours Introduction au langage C - Cours Girardot/Roelens Septembre 013 Du problème au programme I passer d un problème exprimé en français à la réalisation d

Plus en détail

Recherche dans un tableau

Recherche dans un tableau Chapitre 3 Recherche dans un tableau 3.1 Introduction 3.1.1 Tranche On appelle tranche de tableau, la donnée d'un tableau t et de deux indices a et b. On note cette tranche t.(a..b). Exemple 3.1 : 3 6

Plus en détail

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile Dans ce TP, vous apprendrez à définir le type abstrait Pile, à le programmer en Java à l aide d une interface

Plus en détail

Chapitre 2 Devine mon nombre!

Chapitre 2 Devine mon nombre! Python 3 : objectif jeux Chapitre 2 Chapitre 2 Devine mon nombre! 2.1. Thèmes abordés dans ce chapitre commentaires modules externes, import variables boucle while condition : if... elif... else la fonction

Plus en détail

Introduction au langage C

Introduction au langage C Introduction au langage C Cours 1: Opérations de base et premier programme Alexis Lechervy Alexis Lechervy (UNICAEN) Introduction au langage C 1 / 23 Les premiers pas Sommaire 1 Les premiers pas 2 Les

Plus en détail

Licence ST Université Claude Bernard Lyon I LIF1 : Algorithmique et Programmation C Bases du langage C 1 Conclusion de la dernière fois Introduction de l algorithmique générale pour permettre de traiter

Plus en détail

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la

Plus en détail

IN 102 - Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

IN 102 - Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C IN 102 - Cours 1 Qu on le veuille ou non, les systèmes informatisés sont désormais omniprésents. Même si ne vous destinez pas à l informatique, vous avez de très grandes chances d y être confrontés en

Plus en détail

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr Table des matières 1 Les bases 3 2 Variables et constantes 5 3 Quelques fonctions indispensables

Plus en détail

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence Licence Algorithmique & Langage C Paternité - Pas d'utilisation Commerciale Partage des Conditions Initiales à l'identique 2.0 France Vous êtes libres : * de reproduire, distribuer et communiquer cette

Plus en détail

Programmation C++ (débutant)/instructions for, while et do...while

Programmation C++ (débutant)/instructions for, while et do...while Programmation C++ (débutant)/instructions for, while et do...while 1 Programmation C++ (débutant)/instructions for, while et do...while Le cours du chapitre 4 : le for, while et do...while La notion de

Plus en détail

V- Manipulations de nombres en binaire

V- Manipulations de nombres en binaire 1 V- Manipulations de nombres en binaire L ordinateur est constitué de milliards de transistors qui travaillent comme des interrupteurs électriques, soit ouverts soit fermés. Soit la ligne est activée,

Plus en détail

Chap III : Les tableaux

Chap III : Les tableaux Chap III : Les tableaux Dans cette partie, on va étudier quelques structures de données de base tels que : Les tableaux (vecteur et matrice) Les chaînes de caractères LA STRUCTURE DE TABLEAU Introduction

Plus en détail

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

INTRODUCTION A JAVA. Fichier en langage machine Exécutable INTRODUCTION A JAVA JAVA est un langage orienté-objet pur. Il ressemble beaucoup à C++ au niveau de la syntaxe. En revanche, ces deux langages sont très différents dans leur structure (organisation du

Plus en détail

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux. UEO11 COURS/TD 1 Contenu du semestre Cours et TDs sont intégrés L objectif de ce cours équivalent a 6h de cours, 10h de TD et 8h de TP est le suivant : - initiation à l algorithmique - notions de bases

Plus en détail

Bases de programmation. Cours 5. Structurer les données

Bases de programmation. Cours 5. Structurer les données Bases de programmation. Cours 5. Structurer les données Pierre Boudes 1 er décembre 2014 This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. Types char et

Plus en détail

Java Licence Professionnelle CISII, 2009-10

Java Licence Professionnelle CISII, 2009-10 Java Licence Professionnelle CISII, 2009-10 Cours 4 : Programmation structurée (c) http://www.loria.fr/~tabbone/cours.html 1 Principe - Les méthodes sont structurées en blocs par les structures de la programmation

Plus en détail

Cours d initiation à la programmation en C++ Johann Cuenin

Cours d initiation à la programmation en C++ Johann Cuenin Cours d initiation à la programmation en C++ Johann Cuenin 11 octobre 2014 2 Table des matières 1 Introduction 5 2 Bases de la programmation en C++ 7 3 Les types composés 9 3.1 Les tableaux.............................

Plus en détail

SUPPORT DE COURS. Langage C

SUPPORT DE COURS. Langage C Dpt Informatique 2010-2011 SUPPORT DE COURS Langage C Semestre 1 par : «CaDePe» Marie-Françoise Canut Marianne de Michiel André Péninou Table des Matières 1 Généralités...8 1.1 Introduction aux langages

Plus en détail

INITIATION A LA PROGRAMMATION

INITIATION A LA PROGRAMMATION 2004-2005 Université Paris Dauphine IUP Génie Mathématique et Informatique INITIATION A LA PROGRAMMATION PROCEDURALE, A L'ALGORITHMIQUE ET AUX STRUCTURES DE DONNEES PAR LE LANGAGE C Maude Manouvrier La

Plus en détail

Programmation en langage C

Programmation en langage C Programmation en langage C Anne CANTEAUT INRIA - projet CODES B.P. 105 78153 Le Chesnay Cedex Anne.Canteaut@inria.fr http://www-rocq.inria.fr/codes/anne.canteaut/cours C 2 Table des matières 3 Table des

Plus en détail

Programmation système I Les entrées/sorties

Programmation système I Les entrées/sorties Programmation système I Les entrées/sorties DUT 1 re année Université de Marne La vallée Les entrées-sorties : E/O Entrées/Sorties : Opérations d échanges d informations dans un système informatique. Les

Plus en détail

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation : Algorithmique et programmation : STRUCTURES DE DONNÉES A. Structure et enregistrement 1) Définition et rôle des structures de données en programmation 1.1) Définition : En informatique, une structure de

Plus en détail

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51 DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51 PLAN DU COURS Introduction au langage C Notions de compilation Variables, types, constantes, tableaux, opérateurs Entrées sorties de base Structures de

Plus en détail

Les chaînes de caractères

Les chaînes de caractères Les chaînes de caractères Dans un programme informatique, les chaînes de caractères servent à stocker les informations non numériques comme par exemple une liste de nom de personne ou des adresses. Il

Plus en détail

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu. Seance 2: Complétion du code de jeu. (durée max: 2h) Mot clé const et pointeurs: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu. Implémentez jeu_recupere_piece

Plus en détail

Cours Informatique Master STEP

Cours Informatique Master STEP Cours Informatique Master STEP Bases de la programmation: Compilateurs/logiciels Algorithmique et structure d'un programme Programmation en langage structuré (Fortran 90) Variables, expressions, instructions

Plus en détail

Programmation Classique en langage C

Programmation Classique en langage C DI GALLO Frédéric Programmation Classique en langage C Cours du Cycle d Approfondissement CNAM ANGOULEME 2000-2001 DI GALLO Frédéric Page 1 01/04/01 PROGRAMMATION CLASSIQUE : LANGAGE C DI GALLO Frédéric

Plus en détail

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java Langages objets Introduction M2 Pro CCI, Informatique Emmanuel Waller, LRI, Orsay présentation du module logistique 12 blocs de 4h + 1 bloc 2h = 50h 1h15 cours, 45mn exercices table, 2h TD machine page

Plus en détail

Les structures. Chapitre 3

Les structures. Chapitre 3 Chapitre 3 Les structures Nous continuons notre étude des structures de données qui sont prédéfinies dans la plupart des langages informatiques. La structure de tableau permet de regrouper un certain nombre

Plus en détail

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel) Algorithmes et Programmes Introduction à l informatiquel! Vie d'un programme! Algorithme! Programmation : le langage! Exécution et test des programmes Chapitre : Algorithmes et Programmes 2 Cycle de vie

Plus en détail

Atelier C TIA Portal CTIA04 : Programmation des automates S7-300 Opérations numériques

Atelier C TIA Portal CTIA04 : Programmation des automates S7-300 Opérations numériques Atelier C TIA Portal CTIA04 : Programmation des automates S7-300 Opérations numériques CTIA04 Page 1 1. Les types de données sous S7 300 Il existe plusieurs types de données utilisées pour la programmation

Plus en détail

Algorithmique avec Algobox

Algorithmique avec Algobox Algorithmique avec Algobox 1. Algorithme: Un algorithme est une suite d instructions qui, une fois exécutée correctement, conduit à un résultat donné Un algorithme doit contenir uniquement des instructions

Plus en détail

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski cegielski@u-pec.fr

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski cegielski@u-pec.fr Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski cegielski@u-pec.fr Mars 2002 Pour Irène et Marie Legal Notice Copyright c 2002 Patrick Cégielski Université

Plus en détail

Le chiffre est le signe, le nombre est la valeur.

Le chiffre est le signe, le nombre est la valeur. Extrait de cours de maths de 6e Chapitre 1 : Les nombres et les opérations I) Chiffre et nombre 1.1 La numération décimale En mathématique, un chiffre est un signe utilisé pour l'écriture des nombres.

Plus en détail

Définitions. Numéro à préciser. (Durée : )

Définitions. Numéro à préciser. (Durée : ) Numéro à préciser (Durée : ) On étudie dans ce problème l ordre lexicographique pour les mots sur un alphabet fini et plusieurs constructions des cycles de De Bruijn. Les trois parties sont largement indépendantes.

Plus en détail

Travaux pratiques. Compression en codage de Huffman. 1.3. Organisation d un projet de programmation

Travaux pratiques. Compression en codage de Huffman. 1.3. Organisation d un projet de programmation Université de Savoie Module ETRS711 Travaux pratiques Compression en codage de Huffman 1. Organisation du projet 1.1. Objectifs Le but de ce projet est d'écrire un programme permettant de compresser des

Plus en détail

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application Université de Provence Licence Math-Info Première Année V. Phan Luong Algorithmique et Programmation en Python Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application 1 Ordinateur Un

Plus en détail

Cours de C++ François Laroussinie. 2 novembre 2005. Dept. d Informatique, ENS de Cachan

Cours de C++ François Laroussinie. 2 novembre 2005. Dept. d Informatique, ENS de Cachan Cours de C++ François Laroussinie Dept. d Informatique, ENS de Cachan 2 novembre 2005 Première partie I Introduction Introduction Introduction Algorithme et programmation Algorithme: méthode pour résoudre

Plus en détail

COMPARAISONDESLANGAGESC, C++, JAVA ET

COMPARAISONDESLANGAGESC, C++, JAVA ET REPUBLIQUE DU BENIN *******@******* MINISTERE DE L ENSEIGNEMENT SUPERIEUR ET DE LA RECHERCHE SCIENTIFIQUE(MESRS) *******@******* UNIVERSITE D ABOMEY CALAVI(UAC) *******@******* ECOLE POLYTECHNIQUE D ABPOMEY

Plus en détail

Le langage C. Séance n 4

Le langage C. Séance n 4 Université Paris-Sud 11 Institut de Formation des Ingénieurs Remise à niveau INFORMATIQUE Année 2007-2008 Travaux pratiques d informatique Le langage C Séance n 4 But : Vous devez maîtriser à la fin de

Plus en détail

Introduction au Langage de Programmation C

Introduction au Langage de Programmation C Faculté Polytechnique de Mons Service d'informatique Introduction au Langage de Programmation C Mohammed Benjelloun 1 ère Candidature Année académique 2003-2004 Avant-propos Ces notes permettent de se

Plus en détail

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES Leçon 11 PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES Dans cette leçon, nous retrouvons le problème d ordonnancement déjà vu mais en ajoutant la prise en compte de contraintes portant sur les ressources.

Plus en détail

Chapitre 2. Classes et objets

Chapitre 2. Classes et objets Chapitre 2: Classes et Objets 1/10 Chapitre 2 Classes et objets Chapitre 2: Classes et Objets 2/10 Approche Orientée Objet Idée de base de A.O.O. repose sur l'observation de la façon dont nous procédons

Plus en détail

UE C avancé cours 1: introduction et révisions

UE C avancé cours 1: introduction et révisions Introduction Types Structures de contrôle Exemple UE C avancé cours 1: introduction et révisions Jean-Lou Desbarbieux et Stéphane Doncieux UMPC 2004/2005 Introduction Types Structures de contrôle Exemple

Plus en détail

Les différents types de données et leurs opérations de base

Les différents types de données et leurs opérations de base Séquence 2 Les différents types de données et leurs opérations de base Contenu Présentation générale... 21 Partie 1 Les 3 familles de données et l'opération d'affectation... 22 1. Les trois familles de

Plus en détail

1.6- Génération de nombres aléatoires

1.6- Génération de nombres aléatoires 1.6- Génération de nombres aléatoires 1- Le générateur aléatoire disponible en C++ 2 Création d'un générateur aléatoire uniforme sur un intervalle 3- Génération de valeurs aléatoires selon une loi normale

Plus en détail

Généralités sur le Langage Java et éléments syntaxiques.

Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques....1 Introduction...1 Genéralité sur le langage Java....1 Syntaxe de base du Langage...

Plus en détail

Algorithme. Table des matières

Algorithme. Table des matières 1 Algorithme Table des matières 1 Codage 2 1.1 Système binaire.............................. 2 1.2 La numérotation de position en base décimale............ 2 1.3 La numérotation de position en base binaire..............

Plus en détail

LE PROBLEME DU PLUS COURT CHEMIN

LE PROBLEME DU PLUS COURT CHEMIN LE PROBLEME DU PLUS COURT CHEMIN Dans cette leçon nous définissons le modèle de plus court chemin, présentons des exemples d'application et proposons un algorithme de résolution dans le cas où les longueurs

Plus en détail

Les structures de données. Rajae El Ouazzani

Les structures de données. Rajae El Ouazzani Les structures de données Rajae El Ouazzani Les arbres 2 1- Définition de l arborescence Une arborescence est une collection de nœuds reliés entre eux par des arcs. La collection peut être vide, cad l

Plus en détail

Langage Éric Guérin 5 octobre 2010

Langage Éric Guérin 5 octobre 2010 Langage Éric Guérin 5 octobre 2010 Langage C TABLE DES MATIÈRES Table des matières 1 Introduction 7 1.1 Historique........................................... 7 1.2 Architecture matérielle....................................

Plus en détail

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions Cours d introduction à l informatique Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions Qu est-ce qu un Une recette de cuisine algorithme? Protocole expérimental

Plus en détail

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février 2014 17:30 à 20:30

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février 2014 17:30 à 20:30 Examen intra 20 février 2014 17:30 à 20:30 Nom, prénom : Code permanent : Répondez directement sur le questionnaire. Question #1 5% Quelle influence peut avoir le typage dynamique sur la maintenabilité

Plus en détail

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année 2003-2004 Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES Maude Manouvrier La reproduction de ce document par

Plus en détail

TP, première séquence d exercices.

TP, première séquence d exercices. TP, première séquence d exercices. Benoît Valiron benoit.valiron@lipn.univ-paris13.fr 7 novembre 2010 Introduction Vous écrirez les réponses aux questions courtes sur une feuille à rendre à la fin de la

Plus en détail

1. Structure d'un programme FORTRAN 95

1. Structure d'un programme FORTRAN 95 FORTRAN se caractérise par la nécessité de compiler les scripts, c'est à dire transformer du texte en binaire.(transforme un fichier de texte en.f95 en un executable (non lisible par un éditeur) en.exe.)

Plus en détail

STAGE IREM 0- Premiers pas en Python

STAGE IREM 0- Premiers pas en Python Université de Bordeaux 16-18 Février 2014/2015 STAGE IREM 0- Premiers pas en Python IREM de Bordeaux Affectation et expressions Le langage python permet tout d abord de faire des calculs. On peut évaluer

Plus en détail

SHERLOCK 7. Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5

SHERLOCK 7. Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5 SHERLOCK 7 Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5 Cette note montre comment intégrer un script Java dans une investigation Sherlock et les différents aspects de Java script. S T E M M E R I M A G I N

Plus en détail

Représentation d un entier en base b

Représentation d un entier en base b Représentation d un entier en base b 13 octobre 2012 1 Prérequis Les bases de la programmation en langage sont supposées avoir été travaillées L écriture en base b d un entier est ainsi défini à partir

Plus en détail

Le prototype de la fonction main()

Le prototype de la fonction main() Le prototype de la fonction main() 1. Introduction...1 2. Paramètres et type de retour de la fonction main()...1 3. Exemple 1...2 4. La fonction exit() du C...2 5. Détecter le code de retour d un programme

Plus en détail

Chapitre 2. Eléments pour comprendre un énoncé

Chapitre 2. Eléments pour comprendre un énoncé Chapitre 2 Eléments pour comprendre un énoncé Ce chapitre est consacré à la compréhension d un énoncé. Pour démontrer un énoncé donné, il faut se reporter au chapitre suivant. Les tables de vérité données

Plus en détail

Utilisation d objets : String et ArrayList

Utilisation d objets : String et ArrayList Chapitre 6 Utilisation d objets : String et ArrayList Dans ce chapitre, nous allons aborder l utilisation d objets de deux classes prédéfinies de Java d usage très courant. La première, nous l utilisons

Plus en détail

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy Claude Delannoy Programmer en langage C++ 8 e édition Avec une intro aux design patterns et une annexe sur la norme C++11 Groupe Eyrolles, 1993-2011. Groupe Eyrolles, 2014, pour la nouvelle présentation,

Plus en détail

Cours d Informatique

Cours d Informatique Cours d Informatique 1ère année SM/SMI 2007/2008, Info 2 Département de Mathématiques et d Informatique, Université Mohammed V elbenani@hotmail.com sayah@fsr.ac.ma 2007/2008 Info2, 1ère année SM/SMI 1

Plus en détail

TD3: tableaux avancées, première classe et chaînes

TD3: tableaux avancées, première classe et chaînes TD3: tableaux avancées, première classe et chaînes de caractères 1 Lestableaux 1.1 Élémentsthéoriques Déclaration des tableaux Pour la déclaration des tableaux, deux notations sont possibles. La première

Plus en détail

Licence Sciences et Technologies Examen janvier 2010

Licence Sciences et Technologies Examen janvier 2010 Université de Provence Introduction à l Informatique Licence Sciences et Technologies Examen janvier 2010 Année 2009-10 Aucun document n est autorisé Les exercices peuvent être traités dans le désordre.

Plus en détail

Feuille TD n 1 Exercices d algorithmique éléments de correction

Feuille TD n 1 Exercices d algorithmique éléments de correction Master Sciences, Technologies, Santé Mention Mathématiques, spécialité Enseignement des mathématiques Algorithmique et graphes, thèmes du second degré Feuille TD n 1 Exercices d algorithmique éléments

Plus en détail

Manuel d utilisation 26 juin 2011. 1 Tâche à effectuer : écrire un algorithme 2

Manuel d utilisation 26 juin 2011. 1 Tâche à effectuer : écrire un algorithme 2 éducalgo Manuel d utilisation 26 juin 2011 Table des matières 1 Tâche à effectuer : écrire un algorithme 2 2 Comment écrire un algorithme? 3 2.1 Avec quoi écrit-on? Avec les boutons d écriture........

Plus en détail

Par combien de zéros se termine N!?

Par combien de zéros se termine N!? La recherche à l'école page 79 Par combien de zéros se termine N!? par d es co llèg es An dré Do ucet de Nanterre et Victor Hugo de Noisy le Grand en seignants : Danielle Buteau, Martine Brunstein, Marie-Christine

Plus en détail

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia Ministère de l Enseignement Supérieur, de la Recherche Scientifique et de la Technologie Direction Générale des Etudes Technologiques Institut Supérieur des Etudes Technologiques de Djerba SUPPORT DE COURS

Plus en détail

ALGORITHMIQUE ET PROGRAMMATION En C

ALGORITHMIQUE ET PROGRAMMATION En C Objectifs ALGORITHMIQUE ET PROGRAMMATION Une façon de raisonner Automatiser la résolution de problèmes Maîtriser les concepts de l algorithmique Pas faire des spécialistes d un langage Pierre TELLIER 2

Plus en détail

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre 2009. Enrica.Duchi@liafa.jussieu.fr

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre 2009. Enrica.Duchi@liafa.jussieu.fr . Cours intensif Java 1er cours: de C à Java Septembre 2009 Enrica DUCHI LIAFA, Paris 7 Enrica.Duchi@liafa.jussieu.fr LANGAGES DE PROGRAMMATION Pour exécuter un algorithme sur un ordinateur il faut le

Plus en détail

avec des nombres entiers

avec des nombres entiers Calculer avec des nombres entiers Effectuez les calculs suivants.. + 9 + 9. Calculez. 9 9 Calculez le quotient et le rest. : : : : 0 :. : : 9 : : 9 0 : 0. 9 9 0 9. Calculez. 9 0 9. : : 0 : 9 : :. : : 0

Plus en détail

Le Langage C++ Patrick TRAU - ULP IPST version du 02/10/05

Le Langage C++ Patrick TRAU - ULP IPST version du 02/10/05 Le Langage C++ Patrick TRAU - ULP IPST version du 02/10/05 1) Introduction 1.1) Organisation - fonctionnement de l'ordinateur Je suppose que vous savez utiliser un ordinateur, et comprenez comment il fonctionne.

Plus en détail

Présentation du langage et premières fonctions

Présentation du langage et premières fonctions 1 Présentation de l interface logicielle Si les langages de haut niveau sont nombreux, nous allons travaillé cette année avec le langage Python, un langage de programmation très en vue sur internet en

Plus en détail

Logiciel de Base. I. Représentation des nombres

Logiciel de Base. I. Représentation des nombres Logiciel de Base (A1-06/07) Léon Mugwaneza ESIL/Dépt. Informatique (bureau A118) mugwaneza@univmed.fr I. Représentation des nombres Codage et représentation de l'information Information externe formats

Plus en détail

Initiation. àl algorithmique et à la programmation. en C

Initiation. àl algorithmique et à la programmation. en C Initiation àl algorithmique et à la programmation en C Initiation àl algorithmique et à la programmation en C Cours avec 129 exercices corrigés Illustration de couverture : alwyncooper - istock.com Dunod,

Plus en détail

Programmer en JAVA. par Tama (tama@via.ecp.fr( tama@via.ecp.fr)

Programmer en JAVA. par Tama (tama@via.ecp.fr( tama@via.ecp.fr) Programmer en JAVA par Tama (tama@via.ecp.fr( tama@via.ecp.fr) Plan 1. Présentation de Java 2. Les bases du langage 3. Concepts avancés 4. Documentation 5. Index des mots-clés 6. Les erreurs fréquentes

Plus en détail

Solutions du chapitre 4

Solutions du chapitre 4 Solutions du chapitre 4 Structures de contrôle: première partie 4.9 Identifiez et corrigez les erreurs (il peut y en avoir plus d une par segment de code) de chacune des proposition suivantes: a) if (

Plus en détail

UE Programmation Impérative Licence 2ème Année 2014 2015

UE Programmation Impérative Licence 2ème Année 2014 2015 UE Programmation Impérative Licence 2 ème Année 2014 2015 Informations pratiques Équipe Pédagogique Florence Cloppet Neilze Dorta Nicolas Loménie prenom.nom@mi.parisdescartes.fr 2 Programmation Impérative

Plus en détail

Cours Programmation Système

Cours Programmation Système Cours Programmation Système Filière SMI Semestre S6 El Mostafa DAOUDI Département de Mathématiques et d Informatique, Faculté des Sciences Université Mohammed Premier Oujda m.daoudi@fso.ump.ma Février

Plus en détail

Représentation des Nombres

Représentation des Nombres Chapitre 5 Représentation des Nombres 5. Representation des entiers 5.. Principe des représentations en base b Base L entier écrit 344 correspond a 3 mille + 4 cent + dix + 4. Plus généralement a n a n...

Plus en détail

Introduction. I Étude rapide du réseau - Apprentissage. II Application à la reconnaissance des notes.

Introduction. I Étude rapide du réseau - Apprentissage. II Application à la reconnaissance des notes. Introduction L'objectif de mon TIPE est la reconnaissance de sons ou de notes de musique à l'aide d'un réseau de neurones. Ce réseau doit être capable d'apprendre à distinguer les exemples présentés puis

Plus en détail

Stockage du fichier dans une table mysql:

Stockage du fichier dans une table mysql: Stockage de fichiers dans des tables MYSQL avec PHP Rédacteur: Alain Messin CNRS UMS 2202 Admin06 30/06/2006 Le but de ce document est de donner les principes de manipulation de fichiers dans une table

Plus en détail

3IS - Système d'exploitation linux - Programmation système

3IS - Système d'exploitation linux - Programmation système 3IS - Système d'exploitation linux - Programmation système 2010 David Picard Contributions de : Arnaud Revel, Mickaël Maillard picard@ensea.fr Environnement Les programmes peuvent être exécutés dans des

Plus en détail

Série TD 3. Exercice 4.1. Exercice 4.2 Cet algorithme est destiné à prédire l'avenir, et il doit être infaillible! Exercice 4.3. Exercice 4.

Série TD 3. Exercice 4.1. Exercice 4.2 Cet algorithme est destiné à prédire l'avenir, et il doit être infaillible! Exercice 4.3. Exercice 4. Série TD 3 Exercice 4.1 Formulez un algorithme équivalent à l algorithme suivant : Si Tutu > Toto + 4 OU Tata = OK Alors Tutu Tutu + 1 Tutu Tutu 1 ; Exercice 4.2 Cet algorithme est destiné à prédire l'avenir,

Plus en détail

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C Haute Ecole d Ingénierie et de Gestion Du Canton du Vaud MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C Programmation en mode simulation 1. DOCUMENTS DE RÉFÉRENCE...

Plus en détail

INF111. Initiation à la programmation impérative en C http://ama.liglab.fr/ amini/cours/l1/inf111/ Massih-Reza Amini

INF111. Initiation à la programmation impérative en C http://ama.liglab.fr/ amini/cours/l1/inf111/ Massih-Reza Amini Initiation à la programmation impérative en C http://ama.liglab.fr/ amini/cours/l1// Massih-Reza Amini Université Joseph Fourier Laboratoire d Informatique de Grenoble 2/52 Introduction Structures de contrôle

Plus en détail