PROGRAMMATION EN C EXERCICES RESOLUS

Wafae SABBAR

SOMMAIRE
1 . NOTIONS DE BASE 2 . TYPES DE BASE, OPERATEURS ET EXPRESSIONS 3 . LIRE ET ÉCRIRE DES DONNÉES 4 . LA STRUCTURE ALTERNATIVE 5 . LA STRUCTURE REPETITIVE 6 . LES TABLEAUX 7 . LES CHAÎNES DE CARACTÈRES 8 . LES POINTEURS 9 . LES FONCTIONS 10 . LES FICHIERS SEQUENTIELS

1 . NOTIONS DE BASE

Exercice 1.1 Comparez la syntaxe de la définition d'une fonction en C avec celle des fonctions et des procédures dans Pascal. Exercice 1.2 Lesquels des identificateurs suivants sont acceptés par C ? fonction-1 _ Exercice 1.3 Modifiez le programme 'hello world' de façon à obtenir le même résultat sur l'écran en utilisant plusieurs fois la fonction printf. HELLO_WORLD en C _MOYENNE_du_MOIS_ 3e_jour __A_ 3 a

limite_inf. lim_supérieure

#include <stdio.h> |main() |/* Notre premier programme en C */ |{ | printf("hello, world\n"); | return 0; |} Exercice 1.4 Expérimentez avec les séquences d'échappement que vous trouvez dans le tableau ci-dessous et complétez les colonnes vides. séq. d'échapp. descr. anglaise descr. française \n \t \b \r ###BOT_TEXT###quot; \ ###BOT_TEXT### \a Exercice 1.5 Ci-dessous, vous trouvez un simple programme en C. Essayez de distinguer et de classifier autant que possible les éléments qui composent ce programme (commentaires, variables, déclarations, instructions, etc.) new line passage à la ligne

3

WAFAE SABBAR

/* Lecture des données */ while (COMPTEUR < 4) { /* Lire la valeur du nombre suivant */ printf("Entrez un nombre entier :"). COMPTEUR. &NOMBRE). } 4 WAFAE SABBAR . return 0. /* Incrémenter le compteur */ COMPTEUR++. /* Initialisation des variables */ SOMME = 0. SOMME.#include <stdio. */ main() { int NOMBRE. } /* Impression du résultat */ printf("La somme est: %i \n". COMPTEUR = 0. scanf("%i".h> /* Ce programme calcule la somme de 4 nombres entiers introduits au clavier. /* Ajouter le nombre au résultat */ SOMME += NOMBRE. SOMME).

5 . 150075} {-12 .. OPERATEURS ET EXPRESSIONS Exercice 2..14159265 1015 2*107 10000001 2*10-7 10000001 -1... Choisissez les types les plus économiques..2 305. sachant que vous travaillerez dans les ensembles de nombres indiqués.5} {0 .. sans perdre en précision. 1285} {vrai.0001 (13) Exercice 2.....5 125 -220 32000 0 -3000005.......1 Quel(s) type(s) numérique(s) pouvez-vous utiliser pour les groupes de nombres suivants? Dressez un tableau et marquez le choix le plus économique: (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) 1 12 4 0 -125 1 12 -4 0 250 1 12 4 0 250 1 12 -4 0.. 210} {-47 .05*1050 0.3 Complétez le tableau suivant: base décimale base octale base hexadécimale représ... 104} {0.... 2... 300} {-120 . faux} Exercice 2. 47} {0 .. 1500750...BASE....000000001 410 50000 2 410 50000 -2 3... 100} {-10 . binaire 01770 8100 0XAAAA 1001001001 1100101011111110 10000 0234 5 WAFAE SABBAR .122212 0 -12 Traduisez les déclarations suivantes en C..Y MESURE SURFACE1 SURFACE2 N1 N2 N3 N4 TROUVE {0 ... TYPES DE BASE. (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) entier entier entier réel réel entier entier entier entier booléen COMPTEUR X.. 326} {-1280 .

B 6 WAFAE SABBAR . * la valeur arrondie (en moins) à trois positions derrière la virgule de A/B.23ul 70000u 0 0.5L 1.0l -1.4 Pour les constantes correctement définies.6 Eliminer les parenthèses superflues dans les expressions de l'exercice 3. double B. scanf("%lf".0 -1.Exercice 2. * la tangente de A en n'utilisant que les fonctions sin et cos.5. &A). /* Saisie de A et B */ printf("Introduire la valeur pour A : ").7 Essayez le programme suivant et modifiez-le de façon à ce qu'il affiche: *A . Exercice 2. double RES. * la valeur arrondie (en moins) de A/B.h> main() { double A. #include <stdio. trouvez les types et les valeurs numériques décimales: 12332 0xeba 0FE0 '0' 67e0 23.0e-1 1e1f 'O' 0XEUL Exercice 2. (1) (5*X)+2*((3*B)+4) (2) (5*(X+2)*3)*(B+4) (3) A == (B=5) (4) A += (X+5) (5) A != (C *= (-D)) (6) A *= C+(X-D) (7) A %= D++ (8) A %= ++D (9) (X++)*(A+C) (10) A = X*(B<C)+Y*!(B<C) (11) !(X-D+C)||D (12) A&&B||!0&&C&&!D (13) ((A&&B)||(!0&&C))&&!D (14) ((A&&B)||!0)&&(C&&(!D)) Exercice 2.4 0123l 40000 o \r 345LU '\n' 40000u '###BOT_TEXT###' 01001 34. * l'hypoténuse d'un triangle rectangle de côtés A et B.5 Evaluer les expressions suivantes en supposant a=20 b=5 c=-10 d=2 x=12 y=15 Notez chaque fois la valeur rendue comme résultat de l'expression et les valeurs des variables dont le contenu a changé.

&B). /* Calcul */ RES = B*B. short C = 10. return 0.printf("Introduire la valeur pour B : ").8 Soient les déclarations: long A = 15. RES).0) / C 7 WAFAE SABBAR . RES). /* Calcul */ RES = A*A. /* code ASCII : 65 */ Quels sont le type et la valeur de chacune des expressions: (1) (2) (3) (4) (5) (6) C B C 3 2 2 + + + * * * 3 1 B C + 2 * B B + (A + 10) / C B + (A + 10. } Exercice 2. /* Affichage du résultat */ printf("Le carré de B est %f \n". char B = 'A'. /* Affichage du résultat */ printf("Le carré de A est %f \n". scanf("%lf".

printf ("C : N=%d P=%d Q=%d\n". printf printf printf return ("G : %c %c\n". printf ("D : N=%d P=%d Q=%d\n".2 En vous référant aux exemples du chapitre 3. Q = ++N == 6 && ++P == 3. Exemple: Introduisez la date (jour mois année): 11 11 1991 données jour : mois : année : reçues : 3 11 11 1991 * Testez les réactions du programme à vos entrées. ("H : %d %d\n".h> main() { int N=10. Exercice 3. C. LIRE ET ÉCRIRE DES DONNÉES Exercice 3. printf ("F : N=%d P=%d Q=%d\n". R. N = 5.2. Q). N = 5. Q=10. N). N. N. * Changez la partie format du programme de façon à séparer les différentes données par le symbole '-' . C. P. Exercice 3. P. P = 2. 0. printf ("E : N=%d P=%d Q=%d\n". P=5. P=2. ("I : %x %x\n". Q). char C='S'. N). N. Q).1 #include <stdio. N = 5. écrivez un programme qui lit la date du clavier et écrit les données ainsi que le nombre de données correctement reçues sur l'écran. C. Q).3 . Essayez d'introduire des nombres de différents formats et différentes grandeurs. P = 2. trouvez et notez les résultats du programme ci-dessus. N.3 Ecrire un programme qui lit un caractère au clavier et affiche le caractère ainsi que son code numérique: 8 WAFAE SABBAR . P = 2. N=5. P. Q = N++ < P || P++ != 3. N). Q = N++ > P || P++ != 3. Q = ++N == 3 && ++P == 3. P. N=C. } a) Sans utiliser l'ordinateur. b) Vérifiez vos résultats à l'aide de l'ordinateur.

B. 9 WAFAE SABBAR . C sont les longueurs des trois côtés (type int) et P le demi-périmètre du triangle. R3 (type double). Utilisez la formule suivante en faisant attention aux priorités et aux conversions automatiques de type: 2 b) Ecrire un programme qui calcule le prix net d'un article (type double) à partir du prix TTC (type double) et du pourcentage de TVA (type int) qui a été ajoutée. C de type entier qui sont entrées au clavier : A ==> B . b) en employant getch et printf.8 Ecrire un programme qui calcule la somme de quatre nombres du type int entrés au clavier. B ==> C . Exercice 3. Utilisez la formule : S = P(P-A)(P-B)(P-C) où A. Exercice 3.5 Ecrire un programme qui affiche le quotient et le reste de la division entière de deux nombres entiers entrés au clavier ainsi que le quotient rationnel de ces nombres.9 a) Ecrire un programme qui calcule le prix TTC (type double) d'un article à partir du prix net (type int) et du pourcentage de TVA (type int) à ajouter. . Exercice 3. R2.7 Ecrire un programme qui calcule et affiche l'aire d'un triangle dont il faut entrer les longueurs des trois côtés. B. a) en se servant de 5 variables (mémorisation des valeurs entrées) b) en se servant de 2 variables (perte des valeurs entrées) Exercice 3. C ==> A Exercice 3.si les résistances sont branchées en série: Rsér = R1+R2+R3 .6 Ecrire un programme qui affiche la résistance équivalente à trois résistances R1.4 Ecrire un programme qui permute et affiche les valeurs de trois variables A.si les résistances sont branchées en parallèle: Exercice 3.a) en employant getchar et printf.

10 WAFAE SABBAR . YB) sont entrées au clavier comme entiers.(Déduisez la formule du calcul de celle indiquée ci-dessus) Exercice 3.10 Ecrire un programme qui calcule et affiche la distance DIST (type double) entre deux points A et B du plan dont les coordonnées (XA. YA) et (XB.

Exercice 4. else printf ("quatrième choix \n").A=5 et B=10 .A=10 et B=5 . else if (A==B) printf ("troisième choix \n"). else if (B<10) printf ("deuxième choix \n").4 . else if (A>10) printf ("deuxième choix \n").else appartenant ensemble.A=20 et B=20 Exercice 4.2 Considérez la séquence d'instructions suivante: if (A>B) if (A>10) printf ("premier choix \n"). b) Déterminez les réponses du programme pour chacun des couples de nombres suivants et vérifiez à l'aide de l'ordinateur. a) Copiez la séquence d'instructions en utilisant des tabulateurs pour marquer les blocs if . en utilisant: a) if .A=20 et B=10 . else printf ("quatrième choix \n"). b) Pour quelles valeurs de A et B obtient-on les résultats: premier choix. if (B<10) printf ("troisième choix \n"). B et C) au clavier et qui affiche la plus grande des trois valeurs.else appartenant ensemble. a) Copiez la séquence d'instructions en utilisant des tabulateurs pour marquer les blocs if .A=10 et B=10 . sur l'écran? c) Pour quelles valeurs de A et B n'obtient-on pas de réponse sur l'écran? d) Notez vos réponses et choisissez vous-mêmes des valeurs pour A et B pour les vérifier l'aide de l'ordinateur.else et une variable d'aide MAX 11 WAFAE SABBAR . .3 Ecrivez un programme qui lit trois valeurs entières (A... deuxième choix. .1 Considérez la séquence d'instructions suivante: if (A>B) printf ("premier choix \n").A=5 et B=5 . LA STRUCTURE ALTERNATIVE Exercice 4.

2 12 WAFAE SABBAR .b) if . pour A.else sans variable d'aide c) les opérateurs conditionnels et une variable d'aide MAX d) les opérateurs conditionnels sans variable d'aide Exercice 4.6 Ecrivez un programme qui lit deux valeurs entières (A et B) au clavier et qui affiche le signe de la somme de A et B sans faire l'addition. B et C.7 Ecrivez un programme qui calcule les solutions réelles d'une équation du second degré ax +bx+c = 0 en discutant la formule: 2 Utilisez une variable d'aide D pour la valeur du discriminant b -4ac et décidez à l'aide de D. Triez les valeurs A. B et C.. B et C) au clavier.5 Ecrivez un programme qui lit deux valeurs entières (A et B) au clavier et qui affiche le signe du produit de A et B sans faire la multiplication. Exercice 4. deux ou aucune solution réelle.. Affichez les résultats et les messages nécessaires sur l'écran. Utilisez la fonction fabs de la bibliothèque <math>.4 Ecrivez un programme qui lit trois valeurs entières (A. B et C par échanges successifs de manière à obtenir : val(A) val(B) val(C) Affichez les trois valeurs. Exercice 4.else if . Exercice 4. Considérez aussi les cas où l'utilisateur entre des valeurs nulles pour A. pour A et B. si l'équation a une. .. Utilisez des variables du type int pour A.

5 .8 N 13 WAFAE SABBAR .7 Calculez la somme. b) en utilisant do .. 9) lors de l'entrée des données et effectuez un signal sonore si les données sortent de ce domaine. a) en utilisant while. Exercice 5.1 Ecrivez un programme qui lit N nombres entiers au clavier et qui affiche leur somme. a) Utilisez while. Retenez seulement les chiffres (0. le produit et la moyenne d'une suite de chiffres non nuls entrés au clavier. LA STRUCTURE REPETITIVE Exercice 5.1 : Répétez l'introduction du nombre N jusqu'à ce que N ait une valeur entre 1 et 15. Choisissez un type approprié pour les valeurs à afficher. + 1/N Exercice 5. 1 . leur produit et leur moyenne. Le nombre N est à entrer au clavier. b) Utilisez for.while. d) Laquelle des trois variantes est la plus naturelle pour ce problème? Exercice 5.. Exercice 5..2 Complétez la 'meilleure' des trois versions de l'exercice 5. Exercice 5.4 Calculez la factorielle N! = 123.. Exercice 5.3 Calculez par des soustractions successives le quotient entier et le reste de la division entière de deux entiers entrés au clavier. Résolvez ce problème.5 Calculez par multiplications successives X de deux entiers naturels X et N entrés au clavier. c) en utilisant for..6 Calculez la somme des N premiers termes de la série harmonique : 1 + 1/2 + 1/3 + .. sachant que la suite est terminée par zéro. Quelle structure répétitive utilisez-vous? Pourquoi? Exercice 5.(N-1)N d'un entier naturel N en respectant que 0!=1.

D.10 Calculez pour une valeur X donnée du type float la valeur numérique d'un polynôme de degré n: P(X) = AnX + An-1X n n-1 + .. + A1X + A0 Les valeurs de n. des coefficients An.13 a) Calculez la racine carrée X d'un nombre réel positif A par approximations successives en utilisant la relation de récurrence suivante: XJ+1 = (XJ + A/XJ) / 2 X1 = A La précision du calcul J est à entrer par l'utilisateur.12 Calculez le N-ième terme UN de la suite de FIBONACCI qui est donnée par la relation de récurrence: U1=1 U2=1 UN=UN-1 + UN-2 (pour N>2) Déterminez le rang N et la valeur UN du terme maximal que l'on peut calculer si on utilise pour UN : . de deux entiers naturels entrés au clavier en utilisant l'algorithme d'EUCLIDE. Utilisez le schéma de Horner qui évite les opérations d'exponentiation lors du calcul: Exercice 5.9 Calculez le nombre lu à rebours d'un nombre positif entré au clavier en supposant que le fichier d'entrée standard contient le nombre à inverser..11 Calculez le P.C. A0 et de X seront entrées au clavier.le type long double Exercice 5. .. Exemple: Entrée: 1234 Affichage: 4321 Exercice 5.le type int . . 14 WAFAE SABBAR . Exercice 5. Exemple: Entrée: 1 2 3 4 0 Affichage: 4321 Exercice 5.le type long .G.. terminée par zéro (Contrôlez s'il s'agit vraiment de chiffres).le type double .Calculez le nombre lu à rebours d'un nombre positif entré au clavier en supposant que le fichier d'entrée standard contient une suite de chiffres non nuls.

. plus petit que 50.. c) Affichez lors du calcul toutes les approximations calculées : La 1ère approximation de la racine carrée de . est .. .... Exercice 5. est ..14 Affichez un triangle isocèle formé d'étoiles de N lignes (N est fourni au clavier): Nombre de lignes : 8 * *** ***** ******* ********* *********** ************* *************** Exercice 5. La 2e approximation de la racine carrée de .. . ...b) Assurez-vous lors de l'introduction des données que la valeur pour A est un réel positif et que J est un entier naturel positif.. La 3e approximation de la racine carrée de .15 Affiche la table des produits pour N variant de 1 à 10 : X*Y I 0 1 2 3 4 5 6 7 8 9 10 -------------------------------------------------0 I 0 0 0 0 0 0 0 0 0 0 0 1 I 0 1 2 3 4 5 6 7 8 9 10 2 I 0 2 4 6 8 10 12 14 16 18 20 3 I 0 3 6 9 12 15 18 21 24 27 30 4 I 0 4 8 12 16 20 24 28 32 36 40 5 I 0 5 10 15 20 25 30 35 40 45 50 6 I 0 6 12 18 24 30 36 42 48 54 60 7 I 0 7 14 21 28 35 42 49 56 63 70 8 I 0 8 16 24 32 40 48 56 64 72 80 9 I 0 9 18 27 36 45 54 63 72 81 90 10 I 0 10 20 30 40 50 60 70 80 90 100 15 WAFAE SABBAR .. est .

Remplir le tableau par des valeurs entrées au clavier et afficher le tableau ainsi que la somme de chaque ligne et de chaque colonne en n'utilisant qu'une variable d'aide pour la somme.1 Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes). remplit le tableau par des valeurs entrées au clavier et affiche le tableau. Exercice 6. Exercice 6. Calculer et afficher ensuite la somme des éléments du tableau. remplit le tableau par des valeurs entrées au clavier et affiche le tableau. remplit le tableau par des valeurs entrées au clavier et affiche le tableau. Copiez ensuite toutes les composantes strictement positives dans un deuxième tableau TPOS et toutes les valeurs strictement négatives dans un troisième tableau TNEG.6 . Afficher les tableaux TPOS et TNEG. LES TABLEAUX Exercice 6. Exercice 6. Exercice 6.7 Ecrire un programme qui transfère un tableau M à deux dimensions L et C (dimensions maximales: 10 lignes et 10 colonnes) dans un tableau V à une dimension L*C. Remplir le tableau par des valeurs entrées au clavier et afficher le tableau ainsi que la somme de tous ses éléments.2 Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes). Afficher le tableau résultant. Exemple: 16 WAFAE SABBAR . Afficher le tableau résultant.3 Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes). Exercice 6. remplit le tableau par des valeurs entrées au clavier et affiche le tableau. Idée: Echanger les éléments du tableau à l'aide de deux indices qui parcourent le tableau en commençant respectivement au début et à la fin du tableau et qui se rencontrent en son milieu. Exercice 6. Effacer ensuite toutes les occurrences de la valeur 0 dans le tableau T et tasser les éléments restants.4 Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension maximale: 50 composantes). Ranger ensuite les éléments du tableau T dans l'ordre inverse sans utiliser de tableau d'aide.5 Ecrire un programme qui lit les dimensions L et C d'un tableau T à deux dimensions du type int (dimensions maximales: 50 lignes et 50 colonnes).6 Ecrire un programme qui lit les dimensions L et C d'un tableau T à deux dimensions du type int (dimensions maximales: 50 lignes et 50 colonnes).

b) Utilisez le schéma de Horner qui évite les opérations d'exponentiation: Exercice 6. Exercice 6.9 Calcul d'un polynôme de degré N Calculer pour une valeur X donnée du type float la valeur numérique d'un polynôme de degré n: P(X) = AnX + An-1X n n-1 + .. a) Utilisez la fonction pow() pour le calcul. la (N+1) indéfinie. Afficher ensuite la valeur et la position du maximum et du minimum.10 Maximum et minimum des valeurs d'un tableau Ecrire un programme qui détermine la plus grande et la plus petite valeur dans un tableau d'entiers A. le programme retiendra la position du premier maximum ou minimum rencontré.8 ==> / \ | a b c d e f g h i j k l | \ / Produit scalaire de deux vecteurs Ecrire un programme qui calcule le produit scalaire de deux vecteurs d'entiers U et V (de même dimension). Exemple: / | 3 \ \ / -4 | * | 2 / \ \ 5 | = 3*2+2*(-3)+(-4)*5 = -20 / 2 -3 Exercice 6. Insérer une valeur VAL donnée au clavier dans le tableau A de manière à obtenir un tableau de N+1 valeurs triées. . Si le tableau contient plusieurs maxima ou minima. A0 seront entrées au clavier et mémorisées dans un tableau A de type float et de dimension n+1../ \ | a b c d | | e f g h | | i j k l | \ / Exercice 6. + A1X + A0 Les valeurs des coefficients An.11 Insérer une valeur dans un tableau trié valeur est Un tableau A de dimension N+1 contient N valeurs entières triées par ordre croissant.. ième 17 WAFAE SABBAR . ..

Comparer A[IA] et B[IB]. Méthode: Parcourir le tableau de gauche à droite à l'aide de l'indice I. Méthode: Utiliser trois indices IA.12 Recherche d'une valeur dans un tableau Problème: Rechercher dans un tableau d'entiers A une valeur VAL entrée au clavier. arrêter le traitement avec un message correspondant. b) La recherche dichotomique ('recherche binaire'. . Fusionner les éléments de A et B dans un troisième tableau FUS trié par ordre croissant. il suffit de recopier les éléments restants de l'autre tableau dans le tableau FUS. sinon afficher un message correspondant. Ecrire le programme pour le cas où le tableau A est trié par ordre croissant.13 Fusion de deux tableaux triés Problème: On dispose de deux tableaux A et B (de dimensions respectives N et M).si la valeur recherchée précède la valeur actuelle du tableau. . remplacer FUS[IFUS] par le plus petit des deux éléments. La valeur POS qui est utilisée pour mémoriser la position de la valeur dans le tableau. Exercice 6.14 Tri par sélection du maximum Problème: Classer les éléments d'un tableau A par ordre décroissant.si la valeur recherchée suit la valeur actuelle du tableau. Question: Quel est l'avantage de la recherche dichotomique? Expliquer brièvement. aura la valeur -1 aussi longtemps que VAL n'a pas été trouvée. 'binary search') Condition: Le tableau A doit être trié Comparer le nombre recherché à la valeur au milieu du tableau.Exercice 6. continuer la recherche dans le demi-tableau à gauche de la position actuelle. Lorsque l'un des deux tableaux A ou B est épuisé. IB et IFUS. continuer la recherche dans le demi-tableau à droite de la position actuelle. . Exemple: 18 WAFAE SABBAR .s'il y a égalité ou si le tableau est épuisé. déterminer la position PMAX du (premier) maximum à droite de A[I] et échanger A[I] et A[PMAX]. triés par ordre croissant. Pour chaque élément A[I] du tableau. avancer dans le tableau FUS et dans le tableau qui a contribué son élément. Implémenter deux versions: a) La recherche séquentielle Comparer successivement les valeurs du tableau avec la valeur donnée. Afficher la position de VAL si elle se trouve dans le tableau. Exercice 6.

15 Tri par propagation (bubble sort) Problème: Classer les éléments d'un tableau A par ordre croissant. on effectue à plusieurs reprises le traitement suivant: On propage. * Si aucune permutation n'a eu lieu. Exemple: Implémenter l'algorithme en considérant que: * La partie du tableau (à droite) où il n'y a pas eu de permutations est triée. Méthode: En recommençant chaque fois au début du tableau. le plus grand élément du tableau vers la fin du tableau (comme une bulle qui remonte à la surface d'un liquide). par permutations successives. le tableau est trié.Exercice 6. 19 WAFAE SABBAR .

Exercice 6.16 Statistique des notes Ecrire un programme qui lit les points de N élèves d'une classe dans un devoir et les mémorise dans un tableau POINTS de dimension N. * Rechercher et afficher: - la note maximale, - la note minimale, - la moyenne des notes. * A partir des POINTS des élèves, établir un tableau NOTES de dimension 7 qui est composé de la façon suivante: NOTES[6] contient le nombre de notes 60 NOTES[5] contient le nombre de notes de 50 à 59 NOTES[4] contient le nombre de notes de 40 à 49 ... NOTES[0] contient le nombre de notes de 0 à 9 Etablir un graphique de barreaux représentant le tableau NOTES. Utilisez les symboles ####### pour la représentation des barreaux et affichez le domaine des notes en dessous du graphique. Idée: Déterminer la valeur maximale MAXN dans le tableau NOTES et afficher autant de lignes sur l'écran. (Dans l'exemple ci-dessous, MAXN = 6). Exemple: La note maximale est 58 La note minimale est 13 La moyenne des notes est 37.250000

6 5 4 3 2 1

> > > > > >

####### ####### ####### ####### ####### ####### ####### ####### ####### ####### ####### ####### ####### ####### ####### ####### ####### ####### ####### ####### +-------+-------+-------+-------+-------+-------+-------+ I 0 - 9 I 10-19 I 20-29 I 30-39 I 40-49 I 50-59 I 60 I

Exercice 6.17 Mise à zéro de la diagonale principale d'une matrice Ecrire un programme qui met à zéro les éléments de la diagonale principale d'une matrice carrée A donnée. Exercice 6.18

20

WAFAE SABBAR

Matrice unitaire Ecrire un programme qui construit et affiche une matrice carrée unitaire U de dimension N. Une matrice unitaire est une matrice, telle que: / 1 si i=j =| \ 0 si ij

uij

Exercice 6.19 Transposition d'une matrice Ecrire un programme qui effectue la transposition tA d'une matrice A de dimensions N et M en une matrice de dimensions M et N. a) La matrice transposée sera mémorisée dans une deuxième matrice B qui sera ensuite affichée. b) La matrice A sera transposée par permutation des éléments. Rappel: / \ t | a b c d | | e f g h | | i j k l | \ / / | | | | \ \ | | | | /

tA =

=

a b c d

e f g h

i j k l

Exercice 6.20 Multiplication d'une matrice par un réel Ecrire un programme qui réalise la multiplication d'une matrice A par un réel X. Rappel: / \ / \ | a b c d | | X*a X*b X*c X*d | X * | e f g h | = | X*e X*f X*g X*h | | i j k l | | X*i X*j X*k X*l | \ / \ / a) Le résultat de la multiplication sera mémorisé dans une deuxième matrice A qui sera ensuite affichée. b) Les éléments de la matrice A seront multipliés par X. Exercice 6.21 Addition de deux matrices Ecrire un programme qui réalise l'addition de deux matrices A et B de mêmes dimensions N et M. Rappel: / \ / \ | a b c d | | a' b' c' d' | | e f g h | + | e' f' g' h' | | i j k l | | i' j' k' l' | \ / \ / / \ | a+a' b+b' c+c' d+d' | | e+e' f+f' g+g' h+h' | | i+i' j+j' k+k' l+l' | \ /

=

21

WAFAE SABBAR

a) Le résultat de l'addition sera mémorisé dans une troisième matrice C qui sera ensuite affichée. b) La matrice B est ajoutée à A. Exercice 6.22 Multiplication de deux matrices En multipliant une matrice A de dimensions N et M avec une matrice B de dimensions M et P on obtient une matrice C de dimensions N et P: A(N,M) * B(M,P) = C(N,P) La multiplication de deux matrices se fait en multipliant les composantes des deux matrices lignes par colonnes:

Rappel: / | | | | \ \ | | | | / / \ | p q | | r s | | t u | \ / / | | | | \ \ | | | | /

a e h k

b f i l

c g j m

*

=

a*p e*p h*p k*p

+ + + +

b*r f*r i*r l*r

+ + + +

c*t g*t j*t m*t

a*q e*q h*q k*q

+ + + +

b*s f*s i*s l*s

+ + + +

c*u g*u j*u m*u

Ecrire un programme qui effectue la multiplication de deux matrices A et B. Le résultat de la multiplication sera mémorisé dans une troisième matrice C qui sera ensuite affichée. Exercice 6.23 Triangle de Pascal Ecrire un programme qui construit le triangle de PASCAL de degré N et le mémorise dans une matrice carrée P de dimension N+1. Exemple: Triangle de Pascal de degré 6: n=0 n=1 n=2 n=3 n=4 n=5 n=6 1 1 1 1 1 1 1

1 2 3 4 5 6

1 3 6 10 15

1 4 1 10 5 1 20 15 6 1

Méthode: Calculer et afficher seulement les valeurs jusqu'à la diagonale principale (incluse). Limiter le degré à entrer par l'utilisateur à 13. Construire le triangle ligne par ligne: - Initialiser le premier élément et l'élément de la diagonale à 1.

22

WAFAE SABBAR

Exemples: Les éléments soulignés sont des points-cols: / \ / \ / \ / \ | 1 8 3 4 0 | | 4 5 8 9 | | 3 5 6 7 7 | | 1 2 3 | | | | 3 8 9 3 | | 4 2 2 8 9 | | 4 5 6 | | 6 7 2 7 0 | | 3 4 9 3 | | 6 3 2 9 7 | | 7 8 9 | \ / \ / \ / \ / Méthode: Etablir deux matrices d'aide MAX et MIN de même dimensions que A.. Ces éléments sont appelés des points-cols.j] est un minimum MIN[i. Afficher les positions et les valeurs de tous les points-cols trouvés.j] est un maximum MAX[i.j] = | sur la colonne j \ 0 sinon 23 WAFAE SABBAR .24 Recherche de 'points-cols' Rechercher dans une matrice donnée A les éléments qui sont à la fois un maximum sur leur ligne et un minimum sur leur colonne.j = Pi-1. telles que: / 1 si A[i.j + Pi-1.j-1 Exercice 6.j] = | sur la ligne i \ 0 sinon / 1 si A[i.Calculer les valeurs entre les éléments initialisés de gauche à droite en utilisant la relation: Pi.

2 Ecrire un programme qui lit 5 mots. Exemple: Cette ligne contient quelques lettres e. Ctt lign contint qulqus lttrs . . Les mots sont mémorisés dans 5 variables M1.7 . i) char i[4] = "'o'". sans changer le contenu de la d) toute la caractères dans TXT: phrase à rebours. b) le nombre de 'e' contenus dans le texte. 'b'..M5. '###BOT_TEXT###'}. b) char b[12] = "un deux trois".4 Ecrire un programme qui lit un texte TXT (de moins de 200 caractères) et qui enlève toutes les apparitions du charactère 'e' en tassant les éléments restants.3 Ecrire un programme qui lit une ligne de texte (ne dépassant pas 200 caractères) la mémorise dans une variable TXT et affiche ensuite: a) la longueur L de la chaîne. a) char a[] = "un\ndeux\ntrois\n". mais dans l'ordre inverse. LES CHAÎNES DE CARACTÈRES Exercice 7. c) char c[] = 'abcdefg'. g) char g[2] = {'a'. la phrase à rebours. Lesquelles des chaînes suivantes sont initialisées correctement ? Corrigez les déclarations fausses et indiquez pour chaque chaîne de caractères le nombre d'octets qui sera réservé en mémoire. Les modifications se feront dans la même variable TXT. d) char d[10] = 'x'. e) char e[5] = "cinq". h) char h[4] = {'a'.1. f) char f[] = "Cette " "phrase" "est coupée". séparés par des espaces et qui les affiche ensuite dans une ligne. après avoir inversé l'ordre des voici une petite phrase ! ! esarhp etitep enu iciov Exercice 7.5 24 WAFAE SABBAR .. 'c'}. . c) toute variable TXT. Exercice 7. Exemple voici une petite phrase ! ! phrase petite une voici Exercice 7. Exercice 7.

9 Soient les instructions: char STR[200]. %ld \n".7 Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2 et qui copie la première moitié de CH1 et la première moitié de CH2 dans une troisième chaîne CH3. atof(STR)). printf("Entrée printf("integer printf("long printf("double nombre :"). = = = = %s \n". Afficher le résultat.8 Ecrire un programme qui lit un verbe régulier en "er" au clavier et qui en affiche la conjugaison au présent de l'indicatif de ce verbe. %d \n". Contrôlez s'il s'agit bien d'un verbe en "er" avant de conjuguer.Ecrire un programme qui demande l'introduction du nom et du prénom de l'utilisateur et qui affiche alors la longueur totale du nom sans compter les espaces. Utiliser les fonctions gets. 25 WAFAE SABBAR . les compare lexicographiquement et affiche le résultat: Exemple: Introduisez la première chaîne: ABC Introduisez la deuxième chaîne: abc "ABC" précède "abc" Exercice 7. STR).6 Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2. puts. puts("Entrez un gets(STR). Employer la fonction strlen. a) Utiliser les fonctions spéciales de <string>. atoi(STR)). Exemple: Verbe : fêter je fête tu fêtes il fête nous fêtons vous fêtez ils fêtent Exercice 7. Exemple: Introduisez votre nom et votre prénom: Mickey Mouse Bonjour Mickey Mouse ! Votre nom est composé de 11 lettres. Exercice 7. %f \n". atol(STR)). strcat et strlen. b) Utiliser uniquement les fonctions gets et puts. Exercice 7.

Exercice 7.123 d) 123. <n_int> <n_long> <n_uns_long> <s> <b> est un nombre du type int est un nombre du type long est un nombre du type unsigned long est une chaîne de caractères longueur maximale de la chaîne: 17 resp.1234 Nombre --> Chaîne Le standard ANSI-C ne contient pas de fonctions pour convertir des nombres en chaînes de caractères. Afficher le tableau trié. Exercice 7. <s>. 33 byte est la base pour la conversion (2 . ltoa et ultoa qui convertissent des entiers en chaînes de caractères. Trier les 10 mots lexicographiquement en utilisant les fonctions strcmp et strcpy. <chaîne de formatage>. <b>) ultoa (<n_uns_long>.10 Ecrivez un petit programme utilisant la fonction ltoa qui sert à contrôler les résultats de l'exercice 3. . La conversion se fait dans la base <b>.. <b>) Chacune de ces trois procédures convertit son premier argument en une chaîne de caractères qui sera ensuite attribuée à <s>. <s>. . Conversion de nombres en chaînes de caractères itoa (<n_int>.11 Ecrire un programme qui lit 10 mots et les mémorise dans un tableau de chaînes de caractères. <expr2>.. on peut quand même utiliser les fonctions itoa. ) Exercice 7. . Syntaxe: sprintf( <chaîne cible>.3. Si on se limite aux systèmes fonctionnant sous DOS. <expr1>. Utilisez la méthode de tri par sélection directe (voir Exercice 6. <s>.14).45 e) 12E3 f) 1234f5 g) -1234567 h) 123e-02 i) -0.12 26 WAFAE SABBAR . 36) Remarque avancée En ANSI-C il existe la possibilité d'employer la fonction sprintf pour copier des données formatées dans une variable de la même façon que printf les imprime à l'écran.Quelles sont les valeurs affichées si on entre les chaînes de caractères suivantes: a) 123 b) -123 c) . <b>) ltoa (<n_long>.

Ecrire un programme qui lit un nombre entre 1 et 7 et qui affiche le nom du jour de la semaine correspondant: pour 1 pour 2 ... ... "dimanche" pour 7 "lundi" "mardi" Utiliser le premier élément du tableau pour mémoriser un petit message d'erreur. Exercice 7.13 Ecrire un programme qui lit 5 mots, séparés par des espaces et qui les affiche ensuite dans une ligne, mais dans l'ordre inverse. Les mots sont mémorisés dans un tableau de chaînes de caractères. Exemple voici une petite phrase ! ! phrase petite une voici Exercice 7.14 Refaire l'exercice 7.8 (Conjugaison des verbes réguliers en "er") en utilisant deux tableaux de chaînes de caractères: SUJ pour les sujets TERM pour les terminaisons Employez les fonctions printf, scanf, strlen. Exercice 7.15 Ecrire un programme qui lit deux chaînes de caractères, et qui indique leur précédence lexicographique dans le code de caractères de la machine (ici: code ASCII). Testez votre programme à l'aide des exemples du chapitre 7.5. Exercice 7.16 Ecrire un programme qui lit une chaîne de caractères CH et qui convertit toutes les majuscules dans des minuscules et vice-versa. Le résultat sera mémorisé dans la même variable CH et affiché après la conversion. Exercice 7.17 Ecrire une procédure qui lit une chaîne de caractères et l'interprète comme un entier positif dans la base décimale. Pour la conversion, utiliser les fonctions de <ctype> et la précédence alphabétique des caractères de '0' à '9'. Mémoriser le résultat dans une variable du type long. La conversion s'arrête à la rencontre du premier caractère qui ne représente pas de chiffre décimal. Utiliser un indicateur logique OK qui précise si la chaîne représente correctement une valeur entière et positive. Exercice 7.18 Ecrire une procédure qui lit une chaîne de caractères et l'interprète comme un entier positif dans la base hexadécimale. Pour la conversion, utiliser les fonctions de <ctype> et la précédence alphabétique des caractères. La conversion ignore les caractères qui ne représentent pas de chiffre hexadécimal et s'arrête à la fin de la chaîne de caractères. Le résultat sera mémorisé dans une variable du type long et affiché dans les bases hexadécimale et décimale.

27

WAFAE SABBAR

Exercice 7.19 En se basant sur l'exercice 7.17, écrire un programme qui lit une chaîne de caractères et l'interprète comme un nombre rationnel positif ou négatif introduit en notation décimale. Mémoriser le résultat dans une variable du type double. Si le nombre a été introduit correctement, la valeur du résultat sera affichée, sinon le programme affichera un message d'erreur. Méthode: Utiliser une variable SIG pour mémoriser le signe de la valeur. Convertir tous les caractères numériques (avant et derrière le point décimal) en une valeur entière N. Compter les décimales (c.-à-d.: les positions derrière le point décimal) à l'aide d'une variable DEC et calculer la valeur rationnelle comme suit: N = N * SIG / pow(10, DEC) -1234.23400 Exemples: -1234.234 -123 45 Erreur! 123.23. Erreur! +00123.0123 123.012300 Exercice 7.20 En se basant sur l'exercice 7.19, écrire un programme qui lit une chaîne de caractères et l'interprète comme un nombre rationnel positif ou négatif introduit en notation exponentielle. Mémoriser le résultat dans une variable du type double. Si le nombre a été introduit correctement, la valeur du résultat sera affichée, sinon le programme affichera un message d'erreur. Méthode: Utiliser une variable SIGE pour mémoriser le signe de l'exposant. Utiliser une variable EXP pour la valeur de l'exposant. Calculer la valeur de l'exposant à l'aide de SIGE, DEC et EXP. Calculer ensuite la valeur exacte de N à l'aide d'une formule analogue à celle de l'exercice ci-dessus. Exemples: -1234.234 -1234. 234 123E+02 123E-02 123.4e -12.1234e02 123.4e3.4 12.12E1 12.12 E1 Exercice 7.21 Ecrire un programme qui supprime la première occurrence d'une chaîne de caractères OBJ dans une chaîne de caractères SUJ. Exemples: PHON ALPHONSE EI PIERRE T TOTALEMENT HELLO Exercice 7.22 Ecrire un programme qui remplace la première occurrence d'une chaîne de caractères CH1 par la chaîne CH2 dans une chaîne de caractères SUJ. Utiliser une chaîne de sauvegarde FIN pendant le remplacement. ALSE PIERRE OTALEMENT HELLO -1234.234000 Erreur! 123400.000000 1.230000 123.400000 -1212.340000 Erreur! 121.200000 Erreur!

28

WAFAE SABBAR

Exemples: PHON IE IE EI TOT

OY EI ARTE IE FIN TTT

ALPHONSE PIERRE PIERRE PIERRE TOTALEMENT HELLO

ALOYSE PEIRRE PARTERRE PIERRE FINALEMENT HELLO

Exercice 7.23 Ecrire un programme qui remplace toutes les occurrences d'une chaîne de caractères CH1 par la chaîne CH2 dans une chaîne de caractères SUJ. Utiliser une chaîne de sauvegarde FIN pendant le remplacement. Exemples: PHON OY ALPHONSE AN ONT BANANE T Y TOTALEMENT TTT HELLO L HELLO ALOYSE BONTONTE YOYALEMENY HELLO HEO

29

WAFAE SABBAR

*P1=(*P2)++. P1=&A.8 . int B = 2. Exercice 8.3 Pourquoi les créateurs du standard ANSI-C ont-ils décidé de légaliser les pointeurs sur le premier élément derrière un tableau? Donner un exemple. P2=&B. A=++*P2**P1. return 0. int *P1.2 Ecrire un programme qui lit deux tableaux A et B et leurs dimensions N et M au clavier et qui ajoute les éléments de B à la fin de A. P1=&A. P2=&C. ++*P2. *P2=*P1/=*P2. *P1-=*P2. Utiliser le formalisme pointeur à chaque fois que cela est possible.4 1 2 3 / / 1 2 3 &A / 30 WAFAE SABBAR . LES POINTEURS Exercice 8. } Copiez le tableau suivant et complétez-le pour chaque instruction du programme ci-dessus.1 main() { int A = 1. A B C P1 P2 Init. P1=&A P2=&C *P1=(*P2)++ P1=P2 P2=&B *P1-=*P2 ++*P2 *P1*=*P2 A=++*P2**P1 P1=&A *P2=*P1/=*P2 Exercice 8. Exercice 8. int C = 3. *P1*=*P2. P1=P2. *P2.

67. Utiliser un pointeur P. 56. Le programme utilisera les pointeurs P1 et P2 pour parcourir le tableau. un programme qui vérifie sans utiliser une fonction de <string>. 89. si une chaîne CH introduite au clavier est un palindrome: a) en utilisant uniquement le formalisme tableau b) en utilisant des pointeurs au lieu des indices numériques Rappel: Un palindrome est un mot qui reste le même qu'on le lise de gauche à droite ou de droite à gauche: Exemples: PIERRE ==> n'est pas un palindrome OTTO ==> est un palindrome 23432 ==> est un palindrome Exercice 8. *P+2 *(P+2) &P+1 &A[4]-3 A+3 &A[7]-P P+(*P-10) *(P+*(P+8)-A[7]) 31 WAFAE SABBAR .9 Ecrire un programme qui lit une chaîne de caractères CH et détermine la longueur de la chaîne à l'aide d'un pointeur P. la fonction isspace et une variable numérique N qui contiendra le nombre des mots.6 Ecrire un programme qui range les éléments d'un tableau A du type int dans l'ordre inverse. Utiliser deux pointeurs PA et PB pour le transfer et afficher le tableau résultant A. Le programme n'utilisera pas de variables numériques. 45. int *P. Le programme utilisera des pointeurs P1 et P2 et une variable numérique AIDE pour la permutation des éléments.10 Ecrire un programme qui lit une chaîne de caractères CH et détermine le nombre de mots contenus dans la chaîne. une variable logique. 90}. 23.7 Ecrire un programme qui lit deux tableaux d'entiers A et B et leurs dimensions N et M au clavier et qui ajoute les éléments de B à la fin de A.8 Ecrire de deux façons différentes. Exercice 8. Exercice 8. P = A. 34. Quelles valeurs ou adresses fournissent ces expressions: a) b) c) d) e) f) g) h) Exercice 8.5 Ecrire un programme qui lit un entier X et un tableau A du type int au clavier et élimine toutes les occurrences de X dans A en tassant les éléments restants. 78.Soit P un pointeur qui 'pointe' sur un tableau A: int A[] = {12. Exercice 8. Exercice 8.

Exemple: Entrez un ligne de Jeanne La chaîne "Jeanne" 1 fois la lettre 2 fois la lettre 1 fois la lettre 3 fois la lettre Exercice 8. Exemples: Bonjour Bravo ==> njou Bonjour bravo ==> Bnjou abacab aa ==> bcab Exercice 8. Le reste des caractères dans CH sera tassé à l'aide d'un pointeur et de la fonction strcpy.11 Ecrire un programme qui lit une chaîne de caractères CH au clavier et qui compte les occurrences des lettres de l'alphabet en ne distinguant pas les majuscules et les minuscules. Utiliser uniquement des pointeurs.13 Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2 au clavier et élimine toutes les lettres de CH1 qui apparaissent aussi dans CH2.Exercice 8.15 Ecrire un programme qui lit une matrice A de dimensions N et M au clavier et affiche les données suivantes en utilisant le formalisme pointeur à chaque fois que cela est possible: a) la matrice A b) la transposée de A c) la matrice A interprétée comme tableau unidimensionnel Exercice 8. Utiliser deux pointeurs P1 et P2. Exemples: Alphonse phon ==> Alse totalement t ==> otalement abacab aa ==> abacab texte (max. une variable logique TROUVE et la fonction strcpy.12 Ecrire un programme qui lit un caractère C et une chaîne de caractères CH au clavier. Ensuite toutes les occurrences de C dans CH seront éliminées. Afficher seulement le nombre des lettres qui apparaissent au mois une fois dans le texte. 100 caractères) : contient : 'A' 'E' 'J' 'N' Exercice 8. Exercice 8.14 Ecrire un programme qui lit deux chaînes de caractères CH1 et CH2 au clavier et supprime la première occurrence de CH2 dans CH1. Utiliser un tableau ABC de dimension 26 pour mémoriser le résultat et un pointeur PCH pour parcourir la chaîne CH et un pointeur PABC pour parcourir ABC.16 32 WAFAE SABBAR . une variable logique TROUVE et la fonction strcpy.

20 Ecrire un programme qui lit 10 phrases d'une longueur maximale de 200 caractères au clavier et qui les mémorise dans un tableau de pointeurs sur char en réservant dynamiquement l'emplacement en mémoire pour les chaînes. den 1. le 2 avril 1993 Luxemburg.19 Ecrire un programme qui lit le jour. l'ordre des phrases est inversé en modifiant les pointeurs et le tableau résultant est affiché.Ecrire un programme qui lit deux matrices A et B de dimensions N et M respectivement M et P au clavier et qui effectue la multiplication des deux matrices. Exercice 8. April 1993 Exercice 8. "François-Xavier".21 Ecrire un programme qui lit 10 mots au clavier (longueur maximale: 50 caractères) et attribue leurs adresses à un tableau de pointeurs MOT. Exercice 8. Ensuite. April 1993 Introduisez la date: 2 4 1993 Luxembourg. le mois et l'année d'une date au clavier et qui affiche la date en français et en allemand. qui sera ensuite affichée. Exercice 8.17 Ecrire un programme qui lit 5 mots d'une longueur maximale de 50 caractères et les mémorise dans un tableau de chaînes de caractères TABCH. Utiliser le formalisme pointeur à chaque fois que cela est possible. Le résultat de la multiplication sera affecté à la matrice C. b) Imaginez que vous devez écrire un programme pour chacun des deux tableaux qui trie les chaînes selon l'ordre lexicographique.22 33 WAFAE SABBAR . "Paul". Effacer les 10 mots un à un. "François-Xavier". MFRAN et MDEUT que vous initialisez avec les noms des mois dans les deux langues. Afficher à chaque fois les mots restants en attendant la confirmation de l'utilisateur (par 'Enter'). le 1er avril 1993 Luxemburg. "Claude" }. den 2. "Jean-Marie".18 Considérez les déclarations de NOM1 et NOM2: char *NOM1[] = {"Marc". La première composante de chaque tableau contiendra un message d'erreur qui sera affiché lors de l'introduction d'une donnée illégale. Exemples: Introduisez la date: 1 4 1993 Luxembourg. Afficher les mots. a) Représenter graphiquement la mémorisation des deux variables NOM1 et NOM2. Exercice 8. Utiliser deux tableaux de pointeurs. "Claude" }. en suivant l'ordre lexicographique et en libérant leur espace en mémoire. lequel des deux programmes sera probablement le plus rapide? Exercice 8. Inverser l'ordre des caractères à l'intérieur des 5 mots à l'aide de deux pointeurs P1 et P2. "Jean-Marie". En supposant que vous utilisez le même algorithme de tri pour les deux programmes. char NOM2[][16] = {"Marc". "Paul".

Libérer la mémoire occupée par chaque mot après l'avoir copié.Ecrire un programme qui lit 10 mots au clavier (longueur maximale: 50 caractères) et attribue leurs adresses à un tableau de pointeurs MOT. Copier les mots selon l'ordre lexicographique en une seule 'phrase' dont l'adresse est affectée à un pointeur PHRASE. Utiliser les fonctions de <string>.15). Trier les phrases lexicographiquement en n'échangeant que les pointeurs. Utiliser la méthode de tri par propagation (méthode de la bulle .23 Ecrire un programme qui lit 10 phrases au clavier (longueur maximale: 50 caractères) et attribue leurs adresses à un tableau de pointeurs MOT.décrite dans l'exercice 7. Réserver l'espace nécessaire à la PHRASE avant de copier les mots. Réserver dynamiquement l'emplacement en mémoire pour les mots. Exercice 8. 34 WAFAE SABBAR .

b) Définir les fonctions d'après les trois méthodes décrites ci-dessus en ajoutant les déclarations manquantes. &R).1 Soient les fonctions main.B | en A ranger 0 | en B ranger 0 | P(A.3 35 WAFAE SABBAR . printf("Introduire le rayon du cercle : "). scanf("%lf". } double PI(void) { return 3.Y) | donnée: entier X | résultat: entier Y | en X ranger X+1 | en Y ranger Y+1 | écrire X.B fprogramme (* fin PARAMETRES *) procédure P(X. } a) Etablir la hiérarchie des appels pour les trois fonctions.B) | écrire A. \n". c) Quels messages fournit le compilateur lorsqu'une fonction n'est pas définie ou déclarée avant son appel? Comment peut-on expliquer ces messages? Exercice 9.2 Exécuter le programme suivant et construire les grilles correspondantes. } double SURFACE(double RAYON) { return PI()*RAYON*RAYON. programme PARAMETRES | entier A. SURFACE(R)). PI et SURFACE définies par: #include <stdio.9 .h> main() { double R. LES FONCTIONS Exercice 9.Y fprocédure (* fin P *) Exercice 9. printf("La surface du cercle est %f.14159265. return 0. Implémenter le programme ensuite en C.

Implémenter le programme ensuite en C.Z) | donnée: entier X.C | MANIPULER(A.Y.B.C | en A ranger 3 | en B ranger -8 | en C ranger 12 | écrire A.B.B.C | en A ranger 208 | en B ranger 5 | en C ranger -34 | écrire A.C | MODIFIER(A.B.5 Exécuter le programme suivant et construire les grilles correspondantes.Y | résultat: entier Z | écrire X.B.Z) | donnée: entier X | résultat: entier Y.C) | écrire A.Y.Z | en X ranger X divent 2 | en Y ranger Y*2 36 WAFAE SABBAR .C fprogramme (* fin CALCUL *) procédure MODIFIER(X. Implémenter le programme ensuite en C.4 Exécuter le programme suivant et construire les grilles correspondantes. programme MANIPULATION | entier A. programme CALCUL | entier A.B.C) | écrire A.B. Implémenter le programme ensuite en C.B.Z | entier T | en T ranger X | en X ranger Y | en Y ranger Z | en Z ranger T fprocédure (* fin MODIFIER *) Exercice 9. programme TRUC | entier A | en A ranger 2 | écrire A | MACHIN(A) | écrire A fprogramme (* fin TRUC *) procédure MACHIN(X) | donnée: entier X | écrire X | en X ranger 1000 | écrire X fprocédure (* fin MACHIN *) Exercice 9.C fprogramme (* fin MANIPULATION *) procédure MANIPULER(X.Y.Exécuter le programme suivant et construire les grilles correspondantes.

Exercice 9.7 Ecrire deux fonctions qui calculent la valeur X pour une valeur réelle X (type double) et une valeur entière positive N (type int) : a) EXP1 retourne la valeur X comme résultat. b) EXP2 affecte la valeur X à X. Ecrire un programme qui teste les deux fonctions à l'aide de valeurs lues au clavier..Y.11 En mathématiques. Exercice 9. N N N Ecrire un petit programme qui teste la fonction NCHIFFRES: Exemple: Introduire un nombre entier : 6457392 Le nombre 6457392 a 7 chiffres. Exercice 9.10 Ecrire la fonction NCHIFFRES du type int qui obtient une valeur entière N (positive ou négative) du type long comme paramètre et qui fournit le nombre de chiffres de N comme résultat. on définit la fonction factorielle de la manière suivante: 0! = 1 n! = n*(n-1)*(n-2)* . Exercice 9. * 1 (pour n>0) 37 WAFAE SABBAR . Exercice 9.6 Ecrire un programme se servant d'une fonction MOYENNE du type float pour afficher la moyenne arithmétique de deux nombres réels entrés au clavier.Z fprocédure (* fin MANIPULER *) Exercice 9..| en Z ranger X+Y | écrire X.8 Ecrire une fonction MIN et une fonction MAX qui déterminent le minimum et le maximum de deux nombres réels. Ecrire un programme se servant des fonctions MIN et MAX pour déterminer le minimum et le maximum de quatre nombres réels entrés au clavier.9 Ecrire un programme se servant d'une fonction F pour afficher la table de valeurs de la fonction définie par f(x) = sin(x) + ln(x) où x est un entier compris entre 1 et 10.

La dimension N doit être inférieure à NMAX. . tout en définissant et utilisant les fonctions adéquates. Exemple: Le tableau T lu dans l'exemple ci-dessus sera affiché par l'appel : ECRIRE_TAB(T. . Exercice 9.13 La fonction LIRE_TAB à trois paramètres TAB. Exemple: Pour un appel par LIRE_TAB(T. 1 On n'utilisera pas de tableau.14 Ecrire la fonction ECRIRE_TAB à deux paramètres TAB et N qui affiche N composantes du tableau TAB du type int. et sera présenté comme suit: 43 55 67 79 Exercice 9.15 tableau (max. &N. N). Implémenter la fonction LIRE_TAB en choisissant bien le type des paramètres.-à-d. N et NMAX lit la dimension N et les composantes d'un tableau TAB du type int.10): 4 43 55 67 79 38 WAFAE SABBAR .10): 11 tableau (max. Exercice 9. il faudra calculer les coefficients d'après la formule ci-dessous.Ecrire une fonction FACT du type double qui reçoit la valeur N (type int) comme paramètre et qui fournit la factorielle de N comme résultat. Ecrire un petit programme qui teste la fonction FACT. la fonction se comportera comme suit: Dimension du Dimension du Elément[0] : Elément[1] : Elément[2] : Elément[3] : Exercice 9.12 Ecrire un programme qui construit et affiche le triangle de Pascal en calculant les coefficients binomiaux: 1 1 1 1 1 1 2 3 4 1 3 1 6 4 . c. 10).

Ecrire la fonction SOMME_TAB qui calcule la somme des N éléments d'un tableau TAB du type int. N et TAB sont fournis comme paramètres; la somme est retournée comme résultat du type long. Exercice 9.16 A l'aide des fonctions des exercices précédents, écrire un programme qui lit un tableau A d'une dimension inférieure ou égale à 100 et affiche le tableau et la somme des éléments du tableau. Exercice 9.17 Tri de Shell Traduire la fonction TRI_SHELL définie ci-dessous en C. Utiliser la fonction PERMUTER définie dans le cours. Ecrire un programme profitant des fonctions définies dans les exercices précédents pour tester la fonction TRI_SHELL. procédure TRI_SHELL(T,N) | (* Trie un tableau T d'ordre N par la méthode | de Shell en ordre croissant. *) | résultat: entier tableau T[100] | donnée: entier N | entier SAUT, M, K | booléen TERMINE | en SAUT ranger N | tant que (SAUT>1) faire | | en SAUT ranger SAUT divent 2 | | répéter | | | en TERMINE ranger vrai | | | pour M variant de 1 à N-SAUT faire | | | | en K ranger M+SAUT | | | | si (T[M]>T[K]) alors | | | | | PERMUTER(T[M],T[K]) | | | | | en TERMINE ranger faux | | | | fsi | | | fpour | | jusqu'à TERMINE | ftant (* SAUT <= 1 *) fprocédure (* fin TRI_SHELL *) Remarque: L'algorithme a été développé par D.L.Shell en 1959. En comparant d'abord des éléments très éloignés, l'algorithme a tendance à éliminer rapidement les grandes perturbations dans l'ordre des éléments. La distance entre les éléments qui sont comparés est peu à peu réduite jusqu'à 1. A la fin du tri, les éléments voisins sont arrangés. Exercice 9.18 Déterminer le maximum de N éléments d'un tableau TAB d'entiers de trois façons différentes: a) la fonction MAX1 retourne la valeur maximale b) la fonction MAX2 retourne l'indice de l'élément maximal c) la fonction MAX3 retourne l'adresse de l'élément maximal Ecrire un programme pour tester les trois fonctions. Exercice 9.19 Tri par sélection Ecrire la fonction TRI_SELECTION qui trie un tableau de N entiers par la méthode de sélection directe du maximum (voir exercice 7.14). La fonction fera appel à la fonction PERMUTER (définie dans le cours) et à la fonction MAX3 (définie dans l'exercice précédent).

39

WAFAE SABBAR

Ecrire un programme pour tester la fonction TRI_SELECTION. Exercice 9.20 Ecrire la fonction INSERER qui place un élément X à l'intérieur d'un tableau qui contient N éléments triés par ordre croissant, de façon à obtenir un tableau à N+1 éléments triés par ordre croissant. La dimension du tableau est incrémentée dans la fonction INSERER. Ecrire un programme profitant des fonctions définies plus haut pour tester la fonction INSERER. Exercice 9.21 Tri par insertion Ecrire la fonction TRI_INSERTION qui utilise la fonction INSERER pour trier par ordre croissant les éléments d'un tableau à N éléments. Ecrire un programme pour tester la fonction TRI_INSERTION. Méthode: Trier le tableau de gauche à droite en insérant à chaque fois l'élément I+1 dans le tableau (déjà trié) des I premiers éléments.

Exercice 9.22 Ecrire la fonction RANGER qui arrange le contenu de ses deux paramètres X et Y de façon à ce que le contenu de X soit plus petit que celui de Y. RANGER retourne la valeur logique 1 si un échange a eu lieu, sinon 0. Exercice 9.23 Tri par propagation Ecrire la fonction TRI_BULLE qui trie un tableau de N éléments entiers par ordre croissant en appliquant la méthode de la bulle (tri par propagation - voir exercice 7.15). Employer la fonction RANGER de l'exercice cidessus. Ecrire un programme pour tester la fonction TRI_BULLE. Exercice 9.24 Fusion de tableaux triés Ecrire la fonction FUSION qui construit un tableau FUS trié par ordre croissant avec les éléments de deux tableaux A et B triés par ordre croissant. Pour deux tableaux de dimensions N et M, le tableau FUS aura la dimension N+M. (Méthode: voir exercice 7.13)

40

WAFAE SABBAR

Ecrire un programme qui teste la fonction FUSION à l'aide de deux tableaux lus au clavier et triés à l'aide de TRI_BULLE. Exercice 9.25 Ecrire la fonction LONG_CH qui retourne la longueur d'une chaîne de caractères CH comme résultat. Implémentez LONG_CH sans utiliser de variable d'aide numérique. Exercice 9.26 Ecrire la fonction MAJ_CH qui convertit toutes les lettres d'une chaîne en majuscules, sans utiliser de variable d'aide. Exercice 9.27 Ecrire la fonction AJOUTE_CH à deux paramètres CH1 et CH2 qui copie la chaîne de caractères CH2 à la fin de la chaîne CH1 sans utiliser de variable d'aide. Exercice 9.28 Ecrire la fonction INVERSER_CH qui inverse l'ordre des caractères d'une chaîne CH. Utiliser la fonction LONG_CH (définie plus haut) et définir une fonction d'aide PERMUTER_CH qui échange les valeurs de deux variables du type char. Exercice 9.29 Ecrire la fonction NMOTS_CH qui retourne comme résultat le nombre de mots contenus dans une chaîne de caractères CH. Utiliser une variable logique, la fonction isspace et une variable d'aide N. Exercice 9.30 Ecrire la fonction MOT_CH qui retourne un pointeur sur le N-ième mot d'une chaîne CH s'il existe, sinon un pointeur sur le symbole de fin de chaîne. Exercice 9.31 Ecrire la fonction EGAL_N_CH qui retourne la valeur 1 si les N premiers caractères de CH1 et CH2 sont égaux, sinon la valeur 0. (Si N est plus grand que la longueur de CH1 ou de CH2, le résultat peut être 1 ou 0). Exercice 9.32 Utiliser la fonction EGAL_N_CH et LONG_CH pour écrire la fonction CHERCHE_CH qui retourne un pointeur sur la première apparition de CH1 dans CH2, sinon un pointeur sur le symbole de fin de chaîne. Exercice 9.33 Ecrire la fonction CH_ENTIER qui retourne la valeur numérique d'une chaîne de caractères représentant un entier (positif ou négatif) du type long. Si la chaîne ne représente pas une valeur entière correcte, la fonction arrête la conversion et fournit la valeur qu'elle a su reconnaître jusqu'à ce point. Exercice 9.34 Ecrire la fonction CH_DOUBLE qui retourne la valeur numérique d'une chaîne de caractères représentant un réel en notation décimale. Si la chaîne ne représente pas une valeur décimale correcte, la fonction arrête la conversion et fournit la valeur qu'elle a su reconnaître jusqu'à ce point. (Méthode: voir exercice 8.18.) Exercice 9.35

41

WAFAE SABBAR

Exercice 9. Exercice 9. Choisir les paramètres nécessaires.36 Ecrire la fonction DOUBLE_CH qui construit une chaîne de caractères CH qui représente un nombre réel N avec 4 positions derrière la virgule.41 Ecrire la fonction MULTI_MATRICE qui effectue la multiplication de la matrice MAT1 par un entier X: MAT1 = X * MAT1 Choisir les paramètres nécessaires et écrire un petit programme qui teste la fonction MULTI_MATRICE.40 Ecrire la fonction ADDITION_MATRICE qui effectue l'addition des matrices suivante: MAT1 = MAT1 + MAT2 Choisir les paramètres nécessaires et écrire un petit programme qui teste la fonction ADDITION_MATRICE.42 Ecrire la fonction TRANSPO_MATRICE à cinq paramètres MAT. b) Ecrire la fonction LIRE_MATRICE à quatre paramètres MAT. CMAX qui lit les dimensions L et C d'une matrice à deux dimensions.39 Ecrire la fonction SOMME_MATRICE du type long qui calcule la somme des éléments d'une matrice MAT du type int. Exercice 9.38 Ecrire la fonction ECRIRE_MATRICE à quatre paramètres MAT. CMAX qui effectue la transposition de la matrice MAT en utilisant la fonction PERMUTER. Ecrire un petit programme qui teste la fonction SOMME_MATRICE. et CMAX qui lit les composantes d'une matrice MAT du type int et de dimensions L et C. LMAX.43 4 42 WAFAE SABBAR . Utiliser la fonction INVERSER_CH définie plus haut. Les dimensions L et C doivent être inférieures à LMAX respectivement CMAX. L. Exercice 9. N et CH sont les paramètres de la fonction DOUBLE_CH. C. Exercice 9. Implémenter les fonctions en choisissant bien le type des paramètres et utiliser un dialogue semblable à celui de LIRE_TAB. N et CH sont les paramètres de la fonction ENTIER_CH. Exercice 9. L.Ecrire la fonction ENTIER_CH qui construit une chaîne de caractères CH qui représente un nombre entier N du type long. C. Idée pour la conversion : Multiplier N par 10 et utiliser ENTIER_CH.37 a) Ecrire la fonction LIRE_DIM à quatre paramètres L. Exercice 9. Ecrire un petit programme qui teste la fonction TRANSPO_MATRICE. C. LMAX. C et CMAX qui affiche les composantes de la matrice de dimensions L et C. L. Exercice 9. TRANSPO_MATRICE retourne une valeur logique qui indique si les dimensions de la matrice sont telles que la transposition a pu être effectuée. Représenter schématiquement la hiérarchie des appels des fonctions utilisées.

Ecrire un petit programme qui teste la fonction MULTI_2_MATRICES. (Méthode de calcul: voir exercice 7.Ecrire la fonction MULTI_2_MATRICES qui effectue la multiplication de deux matrices MAT1 (dimensions N et M) et MAT2 (dimensions M et P) en une troisième matrice MAT3 (dimensions N et P): MAT3 = MAT1 * MAT2 Supposez que les dimensions maximales des trois matrices soient toutes égales à 30 lignes et 30 colonnes.22.) 43 WAFAE SABBAR .

TXT. sinon la valeur zéro.TXT qui est la copie exacte (enregistrement par enregistrement) du fichier INFORM.TXT.3 Ajouter un nouvel enregistrement (entré au clavier) à la fin de INFORM. Exercice 10. Exercice 10.10 .2 Ecrire un programme qui crée sur disquette un fichier INFBIS.4 Insérer un nouvel enregistrement dans INFORM.6 Créer sur disquette puis afficher à l'écran le fichier FAMILLE.TXT tous les enregistrements: a) dont le numéro de matricule se termine par 8 b) dont le prénom est "Paul" (utiliser strcmp) c) dont le nom est un palindrome. Définir une fonction d'aide PALI qui fournit le résultat 1 si la chaîne transmise comme paramètre est un palindrome. Exercice 10.TXT.TXT dont les informations sont structurées de la manière suivante: Nom de famille Prénom du père Prénom de la mère Nombre d'enfants 44 WAFAE SABBAR .TXT et sauver le nouveau fichier sous le nom INFBIS. LES FICHIERS SEQUENTIELS Exercice 10. Exercice 10. Exercice 10.TXT.TXT dont les informations sont structurées de la manière suivante: Numéro de matricule (entier) Nom (chaîne de caractères) Prénom (chaîne de caractères) Le nombre d'enregistrements à créer est à entrer au clavier par l'utilisateur.1 Créer sur disquette puis afficher à l'écran le fichier INFORM.5 Supprimer dans INFORM. Sauver le nouveau fichier à chaque fois sous le nom INFBIS.TXT en supposant que le fichier est trié relativement à la rubrique NOM et sauver le nouveau fichier sous le nom INFBIS.

Exercice 10. créer un fichier NOMBRES. Exercice 10. . Exercice 10. les trie d'après la méthode par propagation (méthode de la bulle .TXT qui contient une liste de nombres entiers. le nombre de palindromes ainsi que la longueur moyenne des mots contenus dans le fichier MOTS.: des retours à la ligne). Si plusieurs retours à la ligne se suivent.10 A l'aide d'un éditeur de textes. Utiliser une fonction d'aide FIN_PHRASE qui décide si un caractère transmis comme paramètre est un des séparateurs mentionnés ci-dessus.voir exercice 7. leur somme et leur moyenne. . Exercice 10. Les noms des fichiers source et destination sont entrés au clavier.le nombre de mots. 45 WAFAE SABBAR . '!' ou '?' et 0 dans le cas contraire. Attention: Le nombre de rubriques des enregistrements varie avec le nombre d'enfants ! Exercice 10. un point d'interrogation ou un point d'exclamation. dans un fichier contenant un texte.12 Ecrire un programme qui détermine dans un fichier un texte dont le nom est entré au clavier.11 Ecrire un programme qui remplace.le nombre de caractères qu'il contient. Les mots seront mémorisés à l'aide d'un tableau de pointeurs sur char et la mémoire nécessaire sera réservée de façon dynamique.Prénoms des enfants Le nombre d'enregistrements à créer est entré au clavier.9 Ecrire un programme qui charge les mots du fichier MOTS.8 Ecrire un programme qui affiche le nombre de mots.7 Ecrire un programme qui crée sur disquette le fichier MOTS. le nombre de phrases terminées par un point.TXT contenant une série de 50 mots au maximum (longueur maximale d'un mot: 50 caractères). Dans le fichier.'. Exercice 10.15) et les écrit dans un deuxième fichier MOTS_TRI. les retours à la ligne par des espaces. seulement le premier sera remplacé. La saisie des mots se terminera à l'introduction du symbole '*' qui ne sera pas écrit dans le fichier. chaque nombre doit être suivi par un retour à la ligne.13 Ecrire un programme qui détermine dans un fichier un texte dont le nom est entré au clavier: .le nombre de paragraphes (c.TXT. .TXT dans la mémoire centrale.le nombre de chacune des lettres de l'alphabet (sans distinguer les majuscules et les minuscules). FIN_PHRASE retourne la valeur (logique) 1 si le caractère est égal à '.-à-d.TXT sur la disquette. Exercice 10. Ecrire un programme qui affiche les nombres du fichier.

si le reste de la division par 97 est zéro et la valeur de contrôle est 97. Un numéro de CCP est composé de trois parties: un numéro de compte. : . . .fin de ligne . On admettra que deux mots sont toujours séparés par un ou plusieurs des caractères suivants: . un séparateur '-' et un numéro de contrôle. Exemple: Nom du fichier texte : A:LITTERA.Les retours à la ligne ne devront pas être comptabilisés dans les caractères. ? ! .guillemets: " . Exemple: Nombre de CCP 15742-28 : Nombre de CCP 72270-5 : Nombre de CCP 22610-10 : Nombre de CCP 50537-0 : 15742 modulo 97 = 28 72270 modulo 97 = 5 22610 modulo 97 = 9 50537 modulo 97 = 0 nombre incorrect.ponctuation: . . Nombre de CCP 50537-97 : 50537 modulo 97 = 0 correct correct incorrect correct WAFAE SABBAR 46 . SEPA utilise un tableau qui contient les séparateurs à détecter.si le reste de la division entière de la valeur devant le séparateur '-' par 97 est différent de zéro et égal à la valeur de contrôle.TXT Votre fichier contient: 12 paragraphes 571 mots 4186 caractères dont 279 fois la lettre a 56 fois la lettre b . Exercice 10.apostrophe: ' Utiliser une fonction d'aide SEPA qui décide si un caractère transmis comme paramètre est l'un des séparateurs mentionnés ci-dessus. 3 fois la lettre z et 470 autres caractères Exercice 10.espace . . SEPA restituera la valeur (logique) 1 si le caractère est un séparateur et 0 dans le cas contraire.15 Ecrire un programme qui vérifie la validité d'une série de numéros de CCP mémorisés dans un fichier. Un numéro de CCP est correct: . car la valeur de contrôle devrait être 97. Utiliser la fonction getchar.parenthèses: ( ) .14 Ecrire un programme qui affiche le contenu d'un fichier texte sur un écran de 25 lignes et 80 colonnes en attendant la confirmation de l'utilisateur (par 'Enter') après chaque page d'écran.

Utiliser une fonction CCP_TEST qui obtient comme paramètres les deux parties numériques d'un nombre de CCP et qui affiche alors un message indiquant si le numéro de CCP est valide ou non. Exercice 10.TXT qui contient les numéros ci-dessus. suivis par des retours à la ligne. la tableau TABC est sauvé dans un fichier FC dont le nom est à entrer au clavier. 47 WAFAE SABBAR .16 Deux fichiers FA et FB dont les noms sont à entrer au clavier contiennent des nombres entiers triés dans l'ordre croissant. créer à l'aide d'un éditeur de texte un fichier CCP. Pour tester le programme. TABB et TFUS dont les nombres d'éléments sont inconnus. La mémoire pour TABA. est réservée dynamiquement après que les longueurs des fichiers FA et FB ont été détectées. Ecrire un programme qui copie le contenu de FA et FB respectivement dans les tableaux TABA et TABB dans la mémoire centrale. Les tableaux TABA et TABB sont fusionnés dans un troisième tableau trié en ordre croissant TABC. Après la fusion.

SOLUTIONS SOLUTIONS 48 WAFAE SABBAR .

.. française \n \t \b new line tabulator passage à la ligne tabulation curseur arrière back 49 WAFAE SABBAR .4 séq. NOTIONS DE BASE Exercice 1. lim_supérieure __A_ _ a 3 pas accepté (contient le caractère spécial '. end les commentaires sont délimités par { .2 fonction-1 pas accepté (contient le caractère spécial '-' ) _MOYENNE_du_MOIS_ accepté 3e_jour pas accepté (chiffre au début de l'identificateur) limite_inf.3 Voici une des solutions possibles: #include <stdio.h> /* Notre premier programme en C */ main() { printf("hello. (Les fonctions fournissant le résultat void correspondent aux procédures de Pascal... return 0. d'échapp... descr.. ").. */ Exercice 1. } Exercice 1. anglaise descr. printf("\n").) il existe une structure spéciale program pour la fonction principale main est exécutée automatiquement la définition du programme principal lors de l'appel du programme les blocs d'instructions sont délimités par les blocs d'instructions sont délimités par begin .' ) pas accepté (contient le caractère spécial 'é' ) accepté accepté accepté pas accepté (chiffre au début de l'identificateur) Exercice 1. printf("world"). il existe des fonctions et des procédures En C. *) ou { . } les commentaires sont délimités par (* .1 En Pascal. } les points-virgules séparent les instructions simples à l'intérieur d'un bloc d'instructions /* .. il existe seulement des fonctions.1 ..

Commande au compilateur: #include<stdio. . SOMME. } Solution: .h> pour pouvoir utiliser les fonctions printf et scanf. scanf("%i". . */ main() { int NOMBRE.\r ###BOT_TEXT###quot; \ ###BOT_TEXT### \a return back-slash NUL attention (bell) retour au début de la ligne trait oblique fin de chaîne signal acoustique quotation marks guillemets Exercice 1. COMPTEUR. /* Initialisation des variables */ SOMME = 0. /* Incrémenter le compteur */ COMPTEUR++.5 #include <stdio. /* Lecture des données */ while (COMPTEUR < 4) { /* Lire la valeur du nombre suivant */ printf("Entrez un nombre entier :"). . .Fonctions utilisées: printf. COMPTEUR déclarées comme entiers (type int). . return 0.Opérateurs: 50 WAFAE SABBAR .Variables utilisées: NOMBRE. /* Ajouter le nombre au résultat */ SOMME += NOMBRE. &NOMBRE). COMPTEUR = 0.Fonction main n'a pas de paramètres (la liste des paramètres est vide) et fournit par défaut un résultat du type int (à l'environnement).Commentaires (mis en italique). } /* Impression du résultat */ printf("La somme est: %i \n". SOMME. scanf de la bibliothèque <stdio>. SOMME).h> /* Ce programme calcule la somme de 4 nombres entiers introduits au clavier.

qui peut contenir une information pour le format d'affichage des variables indiquées dans la suite (ici: "%i" pour afficher la valeur du type int contenue dans SOMME). . (ici: SOMME) 51 WAFAE SABBAR .L'instruction return 0.la fonction scanf est appelée avec deux paramètres: le format de saisie de la donnée (ici: "%i" pour lire un entier du type int) l'adresse de la variable destination (ici: l'adresse de NOMBRE). . les paramètres qui suivent la chaîne de caractères indiquent les noms des variables à afficher.+= ++ < = opérateur arithmétique d'affectation opérateur arithmétique opérateur de comparaison opérateur d'affectation ..la fonction printf est appelée avec un respectivement avec deux paramètres: le premier paramètre est une chaîne de caractères.. } répète le bloc d'instructions aussi longtemps que la <condition> est remplie.Structure de contrôle: while(<condition>) { . retourne la valeur zéro comme code d'erreur à l'environnement après l'exécution du programme Ajoutes : .

.... réel SURFACE1 float SURFACE1.... 1 073 741 824} double SURFACE2..Y... Choisissez les types les plus économiques... 104} {0. 1500750.2 Traduisez les déclarations suivantes en C.. TYPES DE BASE. 1024} {-47 . entier X.. 210} = {0 ... entier N3 {0 .... entier MESURE int MESURE. réel SURFACE2 entier N1 int N1..1 signed No: 1 2 3 4 5 6 7 8 9 10 11 12 13 X choix possible !X! meilleur choix !X! X X !X! !X! !X! X X X X X !X! X !X! !X! !X! !X! !X! X char !X! short int long X !X! X X !X! X X X X !X! X X X unsigned char short int long float double long double X X X !X! X X X X X X X X X X X !X! X X X X X X X Exercice 2. 16384} {0 ... 47} = {-16384 ...5} {0 . 8 positions significatives 52 WAFAE SABBAR . OPERATEURS ET EXPRESSIONS Exercice 2..... 150075} 6 positions significatives {-12 ......5 ... 326} = {0 ... Solution: (1) (2) (3) (4) (5) (6) (7) (8) entier COMPTEUR int COMPTEUR. 100} {-10 ..Y char X. 300} {-120 ... sans perdre en précision... entier N2 int N2. sachant que vous travaillerez dans les ensembles de nombres indiqués..OPERATEURS 2..

5L -1.23ul 0FE0 40000 40000u 70000u 1e1f '0' o '###BOT_TEXT###' 0 'O' 67e0 \r 01001 int double long double double int long char long unsigned int float char char int char double int 12332 23. 'FE' seulement pour hexa. dépend de la machine (ASCII: 48) apostrophes manquent valeur en général zéro valeur zéro val.0 10+11*16+14*256 = 3770 3+2*8+1*64 = 83 val.. 3. (10) booléen TROUVE int TROUVE.5 -1. faux} par convention Exercice 2. dépend de la machine (ASCII: 10) 'unsigned' seulement pour des entiers -0..4*1010} 11 positions significatives {vrai.. {-1280 .4 Donnée Type (si correct) Valeur / Erreur 12332 23.4 345lu 34.0 0xeba 0123l '\n' 1. dépend de la machine (ASCII: 79) 67 apostrophes manquent 1+0*8+0*64+1*512 = 513 -1.....4 déclaration correcte: 345ul 34. (9) entier N4 double N4. 40000 40000 10 val.1 0 => octal..long N3.0e-1 double unsigned long 70000 53 WAFAE SABBAR . binaire 1016 8100 43690 585 51966 10000 156 01770 017644 0125252 01111 0145376 023420 0234 0X3F8 0X1FA4 0XAAAA 0X249 0XCAFE 0X2710 0X9C 1111111000 1111110100100 1010101010101010 1001001001 1100101011111110 10011100010000 10011100 Exercice 2.3 base décimale base octale base hexadécimale représ. 1285} = {-1 .

5 Evaluer les expressions suivantes en supposant A=20 B=5 C=-10 D=2 X=12 Y=15 (1) (2) (3) (4) (5) (6) (7) (8) (9) (5*X)+2*((3*B)+4) (5*(X+2)*3)*(B+4) A == (B=5) A += (X+5) A != (C *= (-D)) A *= C+(X-D) A %= D++ A %= ++D (X++)*(A+C) -> 98 -> 1890 -> 0 -> 37 -> 0 -> 0 -> 0 -> 2 -> 120 -> 0+15 = 15 -> !0||1 = 1 -> 1||1&&1&&0 = 1 -> (1||1)&&0 = 0 / / B=5 A=37 C=20 A=0 D=3 A=0 D=3 A=2 X=13 A=15 / / / (10) A = X*(B<C)+Y*!(B<C) (11) !(X-D+C)||D (12) A&&B||!0&&C&&!D (13) ((A&&B)||(!0&&C))&&!D (14) ((A&&B)||!0)&&(C&&(!D)) -> (1||1)&&(1&&0) = 0 / Exercice 2.6 (1) (2) (3) (4) (5) (6) (7) (8) (9) (5*X) + 2*((3*B)+4) (5*(X+2)*3)*(B+4) A == (B=5) A += (X+5) A != (C *= (-D)) A *= C + (X-D) A %= D++ A %= ++D (X++) * (A+C) <=> 5*X + 2*(3*B+4) <=> 5*(X+2)*3*(B+4) / <=> A += X+5 <=> A != (C *= -D) <=> A *= C + X-D / / <=> X++ * (A+C) / / / <=> (A&&B||!0&&C)&&!D (10) A = X*(B<C) + Y*!(B<C) (11) !(X-D+C)||D (12) A&&B||!0&&C&&!D (13) ((A&&B)||(!0&&C))&&!D (14) ((A&&B)||!0)&&(C&&(!D)) <=> (A&&B||!0)&&C&&!D Exercice 2.0.7 #include <stdio.h> #include <math.0l 0XEUL long double 0 unsigned long 14 Exercice 2.h> 54 WAFAE SABBAR .

/* Calcul */ RES = sin(A)/cos(A). /* Affichage du résultat */ printf("La valeur A/B arrondie à trois décimales: %f \n". RES).B). /* Calcul */ RES = floor(1000*(A/B))/1000.2)). /* Saisie de A et B */ printf("Introduire la valeur pour A : "). scanf("%lf". /* Affichage du résultat */ printf("La tangente de A est %f \n". scanf("%lf". RES). return 0. double RES.8 Soient les déclarations: long A = 15. Expression /* code ASCII : 65 */ Type Valeur (1) C + 3 (2) B + 1 (3) C + C (4) 3 * C + 2 * B (5) 2 * B + (A + 10) / C int int int int long 13 66 75 160 132 (6) 2 * B + (A + 10. short C = 10. RES). RES). /* Affichage du résultat */ printf("La valeur arrondie en moins de A/B est %f \n". } Exercice 2. double B. printf("Introduire la valeur pour B : ").main() { double A. &A).0) / C double 132. /* Calcul */ RES = floor(A/B). /* Affichage du résultat */ printf("L'hypoténuse du triangle rectangle est %f \n".5 55 WAFAE SABBAR . /* Calcul */ RES = sqrt(pow(A. char B = 'A'. /* Calcul */ RES = pow(A. RES).2)+pow(B. /* Affichage du résultat */ printf("A exposant B est %f \n". &B).

h> 56 WAFAE SABBAR . #include <stdio. RECU=scanf("%i-%i-%i". C). printf("\ndonnées reçues : %i\njour : %i\nmois : %i\nannee : %i\n".h> main() { int JOUR. &MOIS. . MOIS. . printf("Introduire un caractère suivi de 'Enter'\n"). RECU. .h> main() { int C. &JOUR. ANNEE. printf("Introduisez la date (JOUR. MOIS. ANNéE) : "). printf("Le caractère %c a le code ASCII %d\n". C = getchar(). Solution: . LIRE ET ÉCRIRE DES DONNÉES Exercice 3.3 Ecrire un programme qui lit un caractère au clavier et affiche le caractère ainsi que son code numérique : a) en employant getchar et printf. return 0. C. &JOUR. return 0. Exercice 3. JOUR.2 #include <stdio. &ANNEE). RECU. . MOIS. } b) en employant getch et printf. } Changez la partie format du programme de façon à séparer les différentes données par le symbole '-'. ANNEE). &ANNEE). RECU=scanf("%i %i %i". &MOIS.3 .1 Voici les résultats du programme : C D E F G H I : : : : : : : n=6 p=2 n=6 p=3 n=6 p=2 n=6 p=3 S S 83 83 53 53 q=1 q=1 q=0 q=1 Exercice 3. . #include <stdio.

A. C. printf("Introduisez trois nombres (A. (float)A/B). &A. B. C=B. Le résultat de la division est du type float et doit être représenté par le spécificateur de format %f (ou %e). printf("Reste : %i\n". A/B). si nous écrivions: (float)(A/B) nous n'obtiendrions pas le résultat désiré. C. C).5 #include <stdio. &A. } Exercice 3. &B). AIDE=A. B.4 Solution: #include <stdio. D'autre part. /* Affichage à l'aide de tabulations */ printf("A = %i\tB = %i\tC = %i\n". alors la valeur de la deuxième opérande B est convertie automatiquement en float. } Exercice 4. C = getch(). il faut qu'au moins l'une des deux opérandes soit d'un type rationnel. AIDE. return 0. C). } Remarque: Conversion des types Pour obtenir un résultat rationnel. B.#include <conio. A=C. printf("Quotient rationnel : %f\n".h> main() { int C. A%B). Si nous convertissons la valeur de l'opérande A en float à l'aide de l'opérateur de conversion forcée. printf("Division entiere : %i\n". printf("Le caractère %c a le code ASCII %d\n". printf("Introduire un caractère \n"). return 0. A. &B. printf("Introduisez deux nombres entiers : "). printf("A = %i\tB = %i\tC = %i\n". Remarquez bien que la conversion forcée concerne uniquement la valeur de la variable A ! La valeur de B est convertie automatiquement. scanf("%i %i %i".h> main() { int A. C) : "). parce que la conversion se ferait seulement après la division ! 57 WAFAE SABBAR . B=AIDE. &C). scanf("%i %i". B. return 0. C).h> main() { int A. B.

double P. scanf("%lf %lf %lf". nous n'avons pas besoin de la variable d'aide RRES: #include <stdio. B. RRES=R1+R2+R3.6 #include <stdio. B et C : "). return 0. */ int A. return 0. } Exercice 3. */ /* déclarons P comme rationnel. &B. R2 et R3 : "). &R3). /* En forçant la conversion de A. R1+R2+R3). */ printf("Introduisez les valeurs pour A. les autres opérandes */ /* sont converties automatiquement. &R3). printf("Resistance resultante parallele : %f\n". R3. printf("Introduisez les valeurs pour R1.h> main() { /* Pour être sûrs de ne pas dépasser le domaine de la */ /* variable. &R2. printf("Introduisez les valeurs pour R1.h> main() { /* Pour ne pas perdre de précision lors de la division. &R1. RRES). R3. RRES=(R1*R2*R3)/(R1*R2+R1*R3+R2*R3). printf("Resistance resultante parallele : %f\n". nous choisissons le type long pour la somme. printf("Surface du triangle S = %f\n". /* ou bien: float P. RRES. C. R2 et R3 : "). printf("Resistance resultante serielle : %f\n".h> #include <math. R2. scanf("%i %i %i". */ 58 WAFAE SABBAR . (R1*R2*R3)/(R1*R2+R1*R3+R2*R3)). } En affichant immédiatement le résultat du calcul. RRES). } Exercice 3.Exercice 3. scanf("%lf %lf %lf". sqrt(P*(P-A)*(P-B)*(P-C))). &R1.h> main() { double R1. &C). return 0. &R2.8 a) en se servant de 5 variables (mémorisation des valeurs entrées) #include <stdio.h> main() { double R1. printf("Resistance resultante serielle : %f\n". */ P=((double)A+B+C)/2. R2. &A.7 #include <stdio.

PTTC).int A. scanf("%d". SOM+=A. &D). &C). scanf("%d". b) en se servant de 2 variables (perte des valeurs entrées) main() { /* Pour être sûrs de ne pas dépasser le domaine de la */ /* variable. } 59 WAFAE SABBAR . scanf("%d". SOM = (long)A+B+C+D. SOM+=A.9 a) #include <stdio. printf("Entrez le premier nombre : "). nombre : "). printf("Entrez le prix net de l'article : "). printf("Entrez le quatrième nombre : "). SOM+=A. nombre : "). printf("Entrez le troisième nombre : "). = %ld\n". D. printf("Entrez le taux de la TVA (en %) : "). printf("Entrez le deuxième nombre : "). TVA. A. &TVA). */ int A. SOM+=A. printf(" %d + %d + %d + %d return 0. } nombre : "). scanf("%d". C. &A). &A). } Exercice 3. printf("Entrez le premier scanf("%d". scanf("%d". scanf("%d". double PTTC. nombre : ").2lf Francs\n". &PNET). printf("Entrez le troisième scanf("%d". B. printf("Le prix TTC est %. return 0. C. nous choisissons le type long pour la somme. printf("Entrez le quatrième scanf("%d". return 0. B. &A). SOM = 0. &B). &A). long SOM. PTTC = PNET+(double)PNET*TVA/100. &A).h> main() { int PNET. SOM). long SOM. SOM). printf("Entrez le deuxième scanf("%d". printf("La somme des nombres entrés est %ld\n". D.

TVA. .-à-d. Pour ne pas perdre de la précision lors de la division et pour éviter un dépassage du domaine lors du calcul du produit.0 à la place de 100 : PNET = PTTC*100. il faut forcer l'utilisation du type double. suite . la valeur 100 est d'abord convertie en double (valeur 100. . printf("Entrez le taux de la TVA (en %) : "). Il existe plusieurs possibilités de résoudre ce problème: . PNET).h> main() { int TVA. .2lf Francs\n". En utilisant l'opérateur de la conversion forcée. /* Calcul: Ici. } Remarque: Conversion de types et priorités Ici. nous divisons le produit du PNET (type int) et de la TVA (type int) par 100.0) pour être multipliée avec PTTC.Remarque: Conversion des types et priorités Lors du calcul de PTTC (type double). double PNET.0+TVA)). PTTC.utiliser une constante du type double lors de la division: PTTC = PNET+PNET*TVA/100.0. Comme l'évaluation des opérateurs binaires * et / se fait en passant de gauche à droite. /* donnée et résultat du type double */ printf("Entrez le prix TTC de l'article : ").0/(100. b) #include <stdio. &TVA). Il ne suffirait donc pas d'écrire: PTTC = (double)PNET+PNET*TVA/100. &PTTC). La première opérande de la division est donc du type double et le résultat de l'addition est automatiquement converti en double avant la division. PNET et PTTC sont du type double. 60 WAFAE SABBAR . pas de forçage de type nécessaire */ PNET = PTTC*100/(100+TVA). Un simple remède aux confusions serait ici l'utilisation de la constante 100. .déclarer PNET et/ou TVA comme double : double PNET. Parce que la multiplication et la division ont la priorité sur l'addition. c. il faut respecter la suite de l'évaluation de l'expression.utiliser la conversion (double) lors des premières opérations effectuées: PTTC = PNET+(double)PNET*TVA/100. return 0. scanf("%lf".: à la fin du calcul. scanf("%d". printf("Le prix net est %. PTTC. la conversion se ferait trop tard.

XB.h> #include <math. DIST).YB ").%d". printf("Entrez les coordonnées du point B : XB. return 0. scanf("%d.2)+pow(YA-YB. YA. /* Attention: La chaîne de format que nous utilisons */ /* s'attend à ce que les données soient séparées par */ /* une virgule lors de l'entrée. &XA. &XB. scanf("%d. XA. XB. &YA).%d". printf("La distance entre A(%d. YB. %d) est %. &YB).YA ").10 #include <stdio. } 61 WAFAE SABBAR .2)).h> main() { int XA.% d) et B(%d. DIST=sqrt(pow(XA-XB. double DIST. YB. */ printf("Entrez les coordonnées du point A : XA.Exercice 3. YA.2f\n".

LA STRUCTURE ALTERNATIVE Exercice 4. if (A>B) if (A>10) printf ("premier choix \n"). else printf ("quatrième choix \n"). else printf ("quatrième choix \n"). else if (A>10) printf ("deuxième choix \n"). else if (A>10) printf ("deuxième choix \n"). if (A>B) printf ("premier choix \n"). else if (A==B) printf ("troisième choix \n").else appartenant ensemble.2 Considérez la séquence d'instructions suivante: if (A>B) if (A>10) printf ("premier choix \n").else appartenant ensemble. if (B<10) printf ("troisième choix \n"). else if (B<10) 62 WAFAE SABBAR .1 if (A>B) printf ("premier choix \n"). a) Copiez la séquence d'instructions en utilisant des tabulateurs pour marquer les blocs if . if (B<10) printf ("troisième choix \n"). A=10 et B=5 : A=5 et B=5 : A=5 et B=10 : premier choix troisième choix troisième choix quatrième choix A=10 et B=10 : quatrième choix A=20 et B=10 : premier choix quatrième choix A=20 et B=20 : deuxième choix quatrième choix Exercice 4. else printf ("quatrième choix \n"). else if (B<10) printf ("deuxième choix \n"). b) Déterminez les réponses du programme pour chacun des couples de nombres suivants et vérifiez à l'aide de l'ordinateur. a) Copiez la séquence d'instructions en utilisant des tabulateurs pour marquer les blocs if .4 .

B.. scanf("%i %i %i".C).3 a) if . } b) if . printf("La valeur maximale est %i\n". . &C).B).else if . else printf("%i\n". else MAX=B.A). else if (B>C) printf("%i\n". else if (A==B) printf ("troisième choix \n"). printf("La valeur maximale est "). C. if (C>MAX) MAX=C. 63 WAFAE SABBAR .else if . B..h> main() { int A. &A. &B... Si (A>B) alors la construction if . printf("Introduisez trois nombres entiers :"). &A. MAX). return 0.printf ("deuxième choix \n"). b) Le résultat: "premier choix" apparaît pour (A>B) et (A>10) "deuxième choix" apparaît pour (10 A>B) "troisième choix" apparaît pour (10 A>B 10) et (A=B) 10>10 impossible A>B et A=B impossible => "troisième choix" n'apparaît jamais "quatrième choix" apparaît pour (10 A>B 10) et (A B) 10>10 impossible => "quatrième choix" n'apparaît jamais c) On n'obtient pas de réponses pour (A B).else garantit que toutes les combinations sont traitées et fournissent un résultat Exercice 4. &B.else et une variable d'aide MAX #include <stdio.. else printf ("quatrième choix \n"). if (A>B && A>C) printf("%i\n". &C). scanf("%i %i %i".else sans variable d'aide int A. int MAX.. C. . if (A>B) MAX=A. printf("Introduisez trois nombres entiers :").

return 0. &C). } printf("Après le tri : \tA = %i\tB = %i\tC = %i\n". C. &C). scanf("%i %i %i". &A. A. /* Valeur maximale -> A */ if (A<B) { AIDE = A. int MAX. (A>((B>C)?B:C)) ? A : ((B>C)?B:C)). &B. } Exercice 4. B = C. scanf("%i %i %i". B. A. B. printf("La valeur maximale est %i\n". Exercice 4.4 #include <stdio. &C). printf("La valeur maximale est %i\n". C. &B. &A. scanf("%i %i %i".h> main() { /* Afficher le signe du produit de deux entiers sans 64 WAFAE SABBAR . AIDE. printf("Introduisez trois nombres entiers :"). A = C.5 #include <stdio. printf("Introduisez trois nombres entiers :"). B. d) opérateurs conditionnels sans variable d'aide int A.c) opérateurs conditionnels et une variable d'aide MAX int A. B. } /* trier B et C */ if (B<C) { AIDE = B. C = AIDE. C). &B. printf("Introduisez trois nombres entiers :"). &A. MAX). } if (A<C) { AIDE = A. MAX = (MAX>C) ? MAX : C. MAX = (A>B) ? A : B. A = B. B = AIDE. C = AIDE.h> main() { /* Tri par ordre décroissant de trois entiers en échangeant les valeurs */ int A. printf("Avant le tri : \tA = %i\tB = %i\tC = %i\n". C. B. C).

printf("Introduisez deux nombres entiers :").4. return 0. B.B). if ((A>0 && B>0) || (A<0 && B>0 && fabs(A)<fabs(B)) || (A>0 && B<0 && fabs(A)>fabs(B))) printf("Le signe de la somme %i + %i est positif\n".\n"). /* Calcul du discriminant b^2-4ac */ D = pow(B. scanf("%i %i %i". else if (A==0 && B==0) /* Contradiction: c # 0 et c = 0 */ printf("Cette équation ne possède pas de solutions. B. else printf("Le produit %i * %i est zéro\n". } Exercice 4. else if ((A<0 && B<0) || (A<0 && B>0 && fabs(A)>fabs(B)) || (A>0 && B<0 && fabs(A)<fabs(B))) printf("Le signe de la somme %i + %i est négatif\n". scanf("%i %i". B).A. B). } Exercice 4.h> #include <math. 65 WAFAE SABBAR . scanf("%i %i". et c : "). &A.2) . &A. double D. printf("Introduisez les valeurs pour a.7 #include <stdio.faire la multiplication */ int A. B. else if ((A<0 && B>0) || (A>0 && B<0)) printf("Le signe du produit %i * %i est négatif\n". A.A.0*A*C.h> main() { /* Afficher le signe de la somme de deux entiers sans faire l'addition */ int A. A.h> #include <math.B). &B).\n"). A.6 #include <stdio. A. /* Discriminant */ printf("Calcul des solutions réelles d'une équation du second \n"). B).h> main() { /* Calcul des solutions réelles d'une équation du second degré */ int A. printf("degré de la forme ax^2 + bx + c = 0 \n\n"). &C). C. /* Distinction des différents cas */ if (A==0 && B==0 && C==0) /* 0x = 0 */ printf("Tout réel est une solution de cette équation. B). b. &A. return 0. printf("Introduisez deux nombres entiers :"). &B. else printf("La somme %i + %i est zéro\n". if ((A>0 && B>0) || (A<0 && B<0)) printf("Le signe du produit %i * %i est positif\n". &B).

printf(" x2 = %.4f\n". } return 0. (-B+sqrt(D))/(2*A)).4f\n". } else if (D<0) /* b^2-4ac < 0 */ printf("Cette équation n'a pas de solutions réelles. (-B-sqrt(D))/(2*A)). } else /* b^2-4ac > 0 */ { printf("Les solutions réelles de cette équation sont :\n"). printf(" x = %. printf(" x = %.4f\n". (double)C/B). else if (D==0) /* b^2-4ac = 0 */ { printf("Cette équation a une seule solution réelle :\n").4f\n". printf(" x1 = %.else if (A==0) /* bx + c = 0 */ { printf("La solution de cette équation du premier degré est :\n").\n"). } 66 WAFAE SABBAR . (double)-B/(2*A)).

N. scanf("%d". &NOMB). LA STRUCTURE REPETITIVE Exercice 5.5 . while(I<=N) { printf("%d. I++. scanf("%d".4f\n". I++. PROD=1. SOM += NOMB.h> main() { int N. I=1. Remplacez le bloc de traitement (en gras) de (a) par : SOM=0.while. /* compteur */ long SOM. 67 WAFAE SABBAR . I). &N). (float)SOM/N). SOM=0. /* le produit des nombres entrés */ printf("Nombre de données : "). PROD). PROD *= NOMB. N. N. &NOMB). return 0. } printf("La somme des %d nombres est %ld \n". nombre : ". I=1.0f\n". c) en utilisant for. nombre : ". PROD *= NOMB. printf("La moyenne des %d nombres est %. SOM += NOMB. I).1 a) en utilisant while. scanf("%d". /* nombre de données */ int NOMB. /* nombre courant */ int I. SOM). printf("Le produit des %d nombres est %. } b) en utilisant do . do { printf("%d. } while(I<=N). PROD=1. /* la somme des nombres entrés */ double PROD. #include <stdio.

Quelle structure répétitive utilisez-vous? Pourquoi? Comme il n'y pas d'initialisation ni de réinitialisation de variables. &NOMB). Comme l'introduction du nombre de données doit toujours être exécuté (au moins une fois). par do { printf("Nombre de données : "). elle permet d'intégrer très confortablement l'initialisation et l'incrémentation des variables dans la structure. PROD=1. while(RES>=DEN) { RES-=DEN. I<=N .h> main() { int NUM. nombre : ". /* reste de la division entière */ printf("Introduisez le numérateur : "). &N). 68 WAFAE SABBAR . RES=NUM. SOM += NOMB. I). } d) Laquelle des trois variantes est la plus naturelle pour ce problème? La structure for est la plus compacte et celle qui exprime le mieux l'idée de l'algorithme. } while(N<1 || N>15). /* numérateur de la division entière */ int DEN. scanf("%d". printf("Introduisez le dénominateur : "). I=1 . le plus naturel sera l'utilisation de la structure do . /* dénominateur de la division entière */ int DIV.2 Remplacer les lignes printf("Nombre de données : "). &N). D'autre part. Exercice 5. /* résultat de la division entière */ int RES. DIV++. nous avons le choix entre while et do while.while.Remplacez le bloc de traitement (en gras) de (a) par : for (SOM=0. I++) { printf("%d. Exercice 5. &NUM). DIV=0. scanf("%d". scanf("%d". &DEN). scanf("%d". scanf("%d". PROD *= NOMB.3 #include <stdio.

FACT). I<=N . /* a */ /* Pour N=0. */ printf ("%d! = %. FACT=1.4 Solution combinée : (Essayez l'une ou l'autre des solutions en déplaçant les marques des commentaires !) #include <stdio. */ do { printf("Entrez un entier naturel : ").0. DIV++) RES-=DEN. /* Le compteur */ double FACT. while (I<=N) { FACT*=I. */ printf(" %d divisé par %d est %d reste %d\n". RES>=DEN . I++) FACT*=I. DIV. return 0. N. scanf("%d". I=1 . DIV=0 . le résultat sera automatiquement 0!=1 */ /* for (FACT=1. &N). NUM. /* La donnée */ int I. le résultat sera automatiquement 0!=1 */ I=1. } Exercice 5. } Exercice 5. return 0. } /* b */ /* Pour N=0. I++.h> main() { 69 WAFAE SABBAR .5 #include <stdio.Type double à */ /* cause de la grandeur du résultat. /* La factorielle N! . RES).} /* ou mieux encore : */ /* for (RES=NUM.h> main() { int N. } while (N<0).0f\n". DEN.

I++) SOM += (float)1/I. scanf ("%d".h> main() { int X. /* nombre de termes à calculer */ int I.6 #include <stdio. &X). /* Attention: Pour X=0 et N=0 . /* Le compteur des données */ 70 WAFAE SABBAR . */ printf("Entrez l'entier naturel X : "). I<=N .0. /* Pour N=0. /* Les données int I. scanf("%d". &N). } while (N<1). N. } while (X<0). I=1 . } Exercice 5. else printf("Résultat : %d ^ %d = %. } */ Exercice 5.0f\n". I<=N . SOM). N. &N). return 0. for (SOM=0. do { printf("Entrez l'exposant N : "). 0^0 n'est pas défini */ if (N==0 && X==0) printf("zéro exposant zéro n'est pas défini !\n").7 Solution (une de plusieurs solutions possibles) : #include <stdio. RESU).h> main() { int N. do { printf ("Nombre de termes: "). le résultat sera automatiquement X^0=1 */ for (RESU=1.int X. I++) RESU*=X. /* Type double /* grandeur du do { */ */ à cause de la */ résultat. return 0. /* compteur pour la boucle */ float SOM. printf("La somme des %d premiers termes est %f \n". I=1 . X.0. /* Le chiffre courant */ int N=0. } while (N<0). /* Type float à cause de la précision du résultat. scanf("%d". /* Le compteur double RESU. N.

NOMB). &X).8 #include <stdio. /* Le nombre résultat */ do { printf("Entrez le %d%s chiffre : ". } while (X). &X). /* Le produit actuel . PROD*=X. scanf("%d". scanf("%d". printf("La moyenne des chiffres est %f \n". if (X<0||X>9) printf("\a"). } 71 WAFAE SABBAR . /* La somme actuelle */ long PROD=1. /* Le chiffre courant */ int N=0. if (X<0||X>9) printf("\a").h> main() { int X. SOM+=X. return 0.int SOM=0. (N+1). (N+1). SOM). VALD *= 10. (float)SOM/N). } } while (X). (N)?"e":"er"). /* Le compteur des décimales */ long VALD=1. } else if (!X && N>0) {/* Seulement si au moins un chiffre a été accepté */ printf("La somme des chiffres est %d \n". else if (X) { NOMB += VALD*X. (N)?"e":"er"). return 0.Type long à */ /* cause de la grandeur du résultat. else if (X) { N++. printf("Le produit des chiffres est %ld\n". } Exercice 5. N++. PROD). /* Valeur de la position décimale courante */ long NOMB=0. } else printf("La valeur du nombre renversé est %ld\n". */ */ do { /* Saisie des données (pour perfectionnistes) */ printf("Entrez le %d%s chiffre : ".

return 0. N)*X.9 #include <stdio.. NINV=0. /* coefficients successifs du polynôme */ float P. WAFAE SABBAR 72 . NINV). */ do { printf("Entrez un nombre positif (<10000) : ".h> main() { int N. on n'a plus besoin de la variable VALD. NOMB>0 . NOMB /= 10. */ printf("Le nombre 'inversé' est : %d\n". } while (NOMB<0 || NOMB>9999). par NOMB += pow(10. } /* Autre possibilité : */ /* for (NINV=0 . il est impossible */ /* d'inverser correctement des nombres comme 10033 . /* argument */ float A. Il faut cependant inclure les fonctions de la bibliothèque <math>. scanf("%d". } Exercice 5.Remarque : En remplaçant la ligne NOMB += VALD*X. /* coefficient courant du terme Horner */ printf("Entrer le degré N du polynôme : "). NINV += NOMB%10. Exercice 5. /* degré du polynôme */ float X. NOMB/=10) NINV = NINV*10 + NOMB%10. while(NOMB>0) { NINV *= 10. cette variante est plus lente et plus volumineuse que la première. /* Le nombre inversé */ /* Attention: en utilisant le type int. Finalement. /* Le nombre à inverser */ int NINV. le calcul de 10 serait alors répété à chaque exécution de la boucle. N D'autre part. &NOMB).10 #include <stdio.h> main() { int NOMB.. NOMB).

&N). X. scanf("%d". P). } printf("Valeur du polynôme pour X = %. scanf("%d".0 . scanf("%f". UN. for (RESTE=A. &X). /* données */ int X.h> main() { int A. U2. &B). Y. /* compteur pour la boucle */ do { printf("Rang du terme demandé : "). return 0. d'aide pour l'algorithme d'Euclide */ do { printf("Entrer l'entier A (non nul) : "). B. U1=U2=1. /* var. N--) { printf("Entrer le coefficient A%d : ". for(P=0. /* rang du terme demandé */ int I. /* Initialisation des deux premiers termes */ if (N==1) 73 WAFAE SABBAR . } while(!A). X). B. return 0. &A). } while(N<1). Y=RESTE) RESTE = X%Y. } while(!B).11 #include <stdio. } Exercice 5. } Exercice 5. &A). do { printf("Entrer l'entier B (non nul) : ").2f : %. RESTE. Y=B . printf("Le PGCD de %d et de %d est %d\n".scanf("%d". &N). N).h> main() { int U1. /* pour parcourir la suite */ int N.2f\n". scanf("%f". N>=0 . X=Y. X=A. scanf("%d". A.12 #include <stdio. P = P*X + A. RESTE . printf("Entrer la valeur X de l'argument : ").

U2.h> main() { double A. scanf("%d".2f\n". scanf("%lf". } 74 WAFAE SABBAR . J++) { X = (X + A/X) / 2. J=1 . U2 = UN. U2. } while(N<=0 || N>=50).306989e 4931 U23601 = 9. return 0. for(X=A. U2. UN. &A).2f est %. U1 = U2. /* degré/précision de l'approximation */ int J. /* degré de l'approximation courante */ do { printf("Entrer le réel positif A : "). } Rang et terme maximal calculable en utilisant les déclarations : int U1. de format : %Le) U23 = 28657 U46 = 1836311903 308 U1476 = 1.285655e Exercice 5. UN. printf("La %2d%s approximation de la racine carrée" " de %. double U1. N. UN. de format : %d) (spéc. U2.UN=U1. &N). else { for (I=3 . /* donnée */ double X. J<=N . X). (spéc. long U1. I<=N . UN). J. else if (N==2) UN=U2. /* approximation de la racine carrée de A */ int N. } return 0. A. de format : %e) (spéc. UN. long double U1. (J==1)?"ère":"e".13 #include <stdio. do { printf("Entrer le degré de l'approximation : "). } } printf("Valeur du terme de rang %d : %d\n". } while(A<0). de format : %ld) (spéc. I++) { UN = U1+U2.

for (L=0 . for (J=0 . printf("\n"). I++) putchar(' ').15 #include <stdio. for (I=0 .h> main() { const int MAX = 10. /* nombre d'espaces int I. L<LIG . printf("------").Exercice 5. &LIG). J++) printf("%4d". J<=MAX . I). /* nombre de lignes int L. /* compteur des lignes int ESP. for (I=0 . J++) printf("----"). J). L++) { ESP = LIG-L-1. printf("\n"). putchar('\n').14 #include <stdio. printf("\n"). } return 0. for (J=0 . } return 0. /* nombre de lignes et de colonnes */ int I. I<=MAX . /* compteur des colonnes */ /* Affichage de l'en-tête */ printf(" X*Y I"). J<=MAX . /* compteur des caractères do { printf("Nombres de lignes : "). I++) { printf("%3d I". for (J=0 . J++) printf("%4d". } 75 WAFAE SABBAR . I*J). /* compteur des lignes */ int J. I++) putchar('*'). } while (LIG<1 || LIG>20).h> main() { int LIG. J<=MAX . I<2*L+1 . I<ESP . } */ */ */ */ Exercice 5. /* Affichage du tableau */ for (I=0 . scanf("%d".

T[I]). I=0. for (I=0.6 . I++) { printf("Elément %d : ". SOM). } /* Affichage du tableau */ printf("Tableau donné : \n"). for (I=0. scanf("%d". /* dimension */ int I. /* dimension */ int I. &T[I]). /* Calcul de la somme */ for (SOM=0. I<N. /* tableau donné */ int N. /* somme des éléments . I++) printf("%d ". /* Edition du résultat */ printf("Somme de éléments : %ld\n". 76 WAFAE SABBAR . I<N. &N ). } Exercice 6. LES TABLEAUX Exercice 6. &N ). I++) { printf("Elément %d : ".h> main() { /* Déclarations */ int T[50]. scanf("%d". scanf("%d".50) : "). /* indices courants */ /* Saisie des données */ printf("Dimension du tableau (max. printf("\n"). T[I]). &T[I]). return 0.2 #include <stdio.1 #include <stdio. /* tableau donné */ int N. I++) printf("%d ".50) : "). } /* Affichage du tableau */ printf("Tableau donné :\n").type long à cause */ /* de la grandeur prévisible du résultat. I++) SOM += T[I]. /* indice courant */ long SOM. I). scanf("%d". */ /* Saisie des données */ printf("Dimension du tableau (max. I<N. I<N.J. I<N.h> main() { /* Déclarations */ int T[50]. for (I=0. for (I=0. I).

50) : ").J--) /* Echange de T[I] et T[J] */ { AIDE = T[I]. J=N-1 . for (I=0. for (I=0. printf("\n"). I<J . I++) printf("%d ". scanf("%d". } /* Nouvelle dimension du tableau ! */ N = J. /* tableau donné */ int N.h> main() { /* Déclarations */ int T[50]. T[I]). */ for (I=0. I++) printf("%d ". &N ). /* Edition des résultats */ printf("Tableau résultat :\n"). I<N. /* Effacer les zéros et comprimer : */ /* Copier tous les éléments de I vers J et */ /* augmenter J pour les éléments non nuls. I). /* indices courants */ int AIDE. return 0. scanf("%d". printf("\n"). } Exercice 6. I++) { T[J] = T[I]. for (I=0. I<N. } /* Affichage du tableau */ printf("Tableau donné : \n"). T[I] = T[J]. printf("\n"). I<N. } /* Edition des résultats */ printf("Tableau résultat :\n"). &T[I]). T[J] = AIDE.printf("\n"). I++) printf("%d ". I<N . I<N. } 77 WAFAE SABBAR . I++. J=0 . /* pour l'échange */ /* Saisie des données */ printf("Dimension du tableau (max. /* Inverser le tableau */ for (I=0. T[I]). I++) { printf("Elément %d : ". return 0. for (I=0. /* dimension */ int I.3 #include <stdio. if (T[I]) J++. T[I]).J.

printf("\n"). /* indices courants */ long SOM. J. } Exercice 6. } if (T[I]<0) { TNEG[NNEG]=T[I]. printf("Tableau TNEG :\n"). printf("\n"). /* Transfer des données */ for (I=0. NPOS.Exercice 6. /* tableau donné */ int L. TNEG[I]). printf("\n"). /* Initialisation des dimensions de TPOS et TNEG */ NPOS=0.5 #include <stdio. I<N. C. for (I=0. NPOS++. scanf("%d". scanf("%d". int N.type long à cause */ 78 WAFAE SABBAR . I++) printf("%d ". NNEG++. NNEG.h> main() { /* Déclarations */ int T[50][50]. I<N. /* somme des éléments . I++) { printf("Elément %d : ". for (I=0. I++) printf("%d ". /* dimensions */ int I. } } /* Edition du résultat */ printf("Tableau TPOS :\n"). &N ).4 #include <stdio. NNEG=0. int I. I<N. I<NNEG. TPOS[I]). I<NPOS. } /* Affichage du tableau */ printf("Tableau donné :\n"). I++) { if (T[I]>0) { TPOS[NPOS]=T[I]. for (I=0. I). TPOS[50]. TNEG[50]. I++) printf("%d ". &T[I]). T[I]). return 0. /* indice courant */ /* Saisie des données */ printf("Dimension du tableau (max.50) : "). for (I=0.h> main() { /* Déclarations */ /* Les tableaux et leurs dimensions */ int T[50].

I++) { for (J=0.J).I. J++) printf("%7d".I. /* indices courants */ long SOM.type long à cause */ /* de la grandeur prévisible des résultats. J<C. scanf("%d". J. T[I][J]). J<C. I<L. I<L.6 #include <stdio. I++) for (J=0. 79 WAFAE SABBAR . scanf("%d".50) : "). */ /* Saisie des données */ printf("Nombre de lignes (max. J++) { printf("Elément[%d][%d] : ". SOM). } /* Affichage du tableau */ printf("Tableau donné :\n"). for (I=0.h> main() { /* Déclarations */ int T[50][50]. /* somme des éléments . I++) for (J=0. &L ). for (I=0.50) : "). I++) { for (J=0. I=0. J<C. &C ). scanf("%d". I++) for (J=0.J).50) : "). } Exercice 6. J<C. J++) SOM += T[I][J]. return 0. scanf("%d". printf("Nombre de colonnes (max. &C ). &T[I][J])./* de la grandeur prévisible du résultat. /* Edition du résultat */ printf("Somme des éléments : %ld\n". scanf("%d".50) : "). &T[I][J]). J<C. J++) { printf("Elément[%d][%d] : ". printf("\n"). J++) printf("%7d". scanf("%d". /* dimensions */ int I. C. } /* Affichage du tableau */ printf("Tableau donné :\n"). for (I=0. &L ). } /* Calcul de la somme */ for (SOM=0. I<L. I<L. I<L. */ /* Saisie des données */ printf("Nombre de lignes (max. T[I][J]). printf("Nombre de colonnes (max. for (I=0. /* tableau donné */ int L.

SOM). I++) for (J=0. I<L. &C ). /* dimensions */ int I. for (I=0. I++) printf("%d ".printf("\n").J. I++) { for (J=0. scanf("%d". } /* Calcul et affichage de la somme des lignes */ for (I=0. I<L. I++) { for (SOM=0. J++) V[I*C+J] = M[I][J]. J. } return 0. for (I=0. J=0. V[I]). I++) SOM += T[I][J]. } /* Transfer des éléments ligne par ligne */ for (I=0. I<L. I<L*C. &M[I][J]). printf("Somme . printf("\n").SOM). } Exercice 6. J<C. I++) for (J=0. /* tableau à 2 dimensions */ int V[100]. J<C.I.ligne %d : %ld\n". C. } /* Affichage du tableau 2-dim */ printf("Tableau donné :\n"). J<C. printf("Nombre de colonnes (max. 80 WAFAE SABBAR . &L ).10) : ").h> main() { /* Déclarations */ int M[10][10]. scanf("%d". return 0. J++) printf("%7d".I.7 #include <stdio. I<L. J<C. J++) { for (SOM=0. I=0. /* tableau à 1 dimension */ int L. M[I][J]). J++) { printf("Elément[%d][%d] : ". /* indices courants */ /* Saisie des données */ printf("Nombre de lignes (max.colonne %d : %ld\n". scanf("%d". for (I=0.10) : "). printf("\n").J). I<L. printf("Somme . J++) SOM += T[I][J]. } /* Calcul et affichage de la somme des colonnes */ for (J=0. /* Affichage du tableau 1-dim */ printf("Tableau résultat : "). J<C.

I). scanf("%d". &V[I]).h> #include <math. } printf("** Deuxième tableau **\n"). I<N. I<N. &N). I++) { printf("Elément %d : ". I++) { printf("Elément %d : ". scanf("%d". /* Edition du résultat */ printf("Produit scalaire : %ld\n". &X). /* degré du polynôme */ float X. printf("Entrer la valeur X de l'argument : "). /* indice courant */ int N. } Exercice 6. /* argument */ float P. for (I=0. /* tableaux donnés */ int N. I<N.9 Calcul d'un polynôme de degré N Solution combinée: #include <stdio. I++) { printf("Entrer le coefficient A%d : ". &N ).h> main() { float A[20]. I<=N . I++) PS += (long)U[I]*V[I]. /* Saisie des coefficients */ for (I=0 . scanf("%f". return 0.8 Produit scalaire de deux vecteurs #include <stdio. /* indice courant */ long PS. I).50) : "). scanf("%d".} Exercice 6. for (I=0. /* produit scalaire */ /* Saisie des données */ printf("Dimension des tableaux (max. V[50]. /* dimension */ int I. scanf("%d". &U[I]). &A[I]). scanf("%f". 81 WAFAE SABBAR . I). PS). /* résultat */ /* Saisie du degré N et de l'argument X */ printf("Entrer le degré N du polynôme (max.20) : "). } /* Calcul du produit scalaire */ for (PS=0. printf("** Premier tableau **\n")./* tableau des coefficients de P */ int I.h> main() { /* Déclarations */ int U[50]. I=0.

I<N. I++) { printf("Elément %d : ". I=0 . /* position du maximum */ /* Saisie des données */ printf("Dimension du tableau (max. I<=N . printf("Valeur du maximum : %d\n". /* b) Calcul de /* commencer le for (P=0.10 Maximum et minimum des valeurs d'un tableau #include <stdio. A[I]). /* dimension */ int I. A[MAX]).h> main() 82 WAFAE SABBAR .I). /* indice courant */ int MIN. I++) P += A[I]*pow(X. return 0. scanf("%d".} /* a) Calcul à l'aide de pow for (P=0. MAX). I<=N . scanf("%d". X.*/ . &A[I]). for (I=0. I). printf("Position du maximum : %d\n". } Exercice 6. MAX=0.2f : %. } /* Affichage du tableau */ printf("Tableau donné :\n"). for (I=0. /* position du minimum */ int MAX.h> main() { /* Déclarations */ int A[50].2f\n". I=0 P = P*X + */ Horner */ calcul avec le dernier coefficient. &N ). if(A[I]<A[MIN]) MIN=I. I++) { if(A[I]>A[MAX]) MAX=I. I++) A[N-I]. I<N. I<N. for (I=0. I++) printf("%d ".11 Insérer une valeur dans un tableau trié #include <stdio.50) : "). printf("Valeur du minimum : %d\n".. return 0.0. } /* Edition du résultat */ printf("Position du minimum : %d\n". MIN). A[MIN]). P).. printf("\n"). } Exercice 6. /* Recherche du maximum et du minimum */ MIN=0. /* tableau donné */ int N. /* Edition du résultat */ printf("Valeur du polynôme pour X = %.0.

&N ). /* dimension */ int I.12 Recherche d'une valeur dans un tableau a) La recherche séquentielle Comparer successivement les valeurs du tableau avec la valeur donnée. I++) { printf("Elément %d : ". scanf("%d".h> main() { /* Déclarations */ int A[50]. I<N. I++) printf("%d ". I--) A[I]=A[I-1]. /* Affichage du tableau */ printf("Tableau donné : \n"). /* indice courant */ /* Saisie des données */ printf("Dimension du tableau (max. /* tableau donné */ int VAL. return 0. for (I=0. printf("\n"). scanf("%d". /* valeur à insérer int N. (I>0)&&(A[I-1]>VAL) . /* tableau donné int VAL.50) : "). */ for (I=N . I++) printf("%d ". /* VAL est copié à la position du dernier */ /* élément déplacé. } printf("Elément à insérer : "). scanf("%d". #include <stdio. printf("\n"). /* Déplacer les éléments plus grands que */ /* VAL d'une position vers l'arrière. &VAL ). /* valeur à rechercher */ int POS. } Exercice 6. A[I]). I). &N ). for (I=0. */ A[I]=VAL. for (I=0. /* Nouvelle dimension du tableau ! */ N++. /* indice courant */ */ */ */ /* Saisie des données */ printf("Dimension N du tableau initial (max. I<N. &A[I]). /* dimension int I. /* Edition des résultats */ printf("Tableau résultat :\n"). 83 WAFAE SABBAR . scanf("%d".{ /* Déclarations */ int A[50]. A[I]). /* position de la valeur */ int N. I<N.50) : ").

else printf("La valeur %d se trouve à la position %d. 'binary search') #include <stdio. /* dimension */ int I. A[I]). &VAL ). /* Initialisation des limites du domaine de recherche */ INF=0. \n". for (I=0. I<N. /* valeur à rechercher */ int POS.50) : "). /* Affichage du tableau */ printf("Tableau donné : \n"). &N ). scanf("%d". for (I=0. for (I=0 . I++) printf("%d ". /* position de la valeur */ int N. scanf("%d". SUP. } b) La recherche dichotomique ('recherche binaire'. /* indice courant */ int INF.\n"). /* Recherche de la position de la valeur */ POS = -1. VAL. I++) printf("%d ". /* Recherche de la position de la valeur */ 84 WAFAE SABBAR . /* Affichage du tableau */ printf("Tableau donné : \n"). return 0. printf("\n"). I++) { printf("Elément %d : ". I++) if (A[I]==VAL) POS=I. printf("\n"). I<N. I<N. POS). I).h> main() { /* Déclarations */ int A[50]. SUP=N-1. I++) { printf("Elément %d : ". &A[I]).for (I=0. /* tableau donné */ int VAL. scanf("%d". &A[I]). } printf("Elément à rechercher : "). for (I=0. &VAL ). I). (I<N)&&(POS==-1) . A[I]). } printf("Elément à rechercher : "). MIL. scanf("%d". /* Edition du résultat */ if (POS==-1) printf("La valeur recherchée ne se trouve pas " "dans le tableau. scanf("%d". I<N. /* limites du champ de recherche */ /* Saisie des données */ printf("Dimension du tableau (max.

le pire des cas pour la recherche dichotomique peut entraîner 20 exécutions de la boucle. Exemple: Lors de la recherche dans un tableau de 1024 éléments: . la recherche se termine beaucoup plus rapidement.le pire des cas pour la recherche dichotomique peut entraîner 10 exécutions de la boucle. M.le pire des cas pour la recherche séquentielle peut entraîner 1 048 576 exécutions de la boucle. La recherche dichotomique devient extrêmement avantageuse pour la recherche dans de grands tableaux (triés) : L'avantage de la recherche dichotomique par rapport à la recherche séquentielle monte alors exponentiellement avec la grandeur du tableau à trier. \n". Lors de la recherche dans un tableau de 1 048 576 éléments: . while ((INF<=SUP) && (POS==-1)) { MIL=(SUP+INF)/2.\n"). Ainsi. B[50]. int IA. if (VAL < A[MIL]) SUP=MIL-1. il faut traverser tout le tableau avant de trouver la valeur ou avant d'être sûr qu'une valeur ne se trouve pas dans le tableau. } Question: Quel est l'avantage de la recherche dichotomique? Dans le pire des cas d'une recherche séquentielle. IB. FUS[100]. . IFUS. . else if (VAL > A[MIL]) INF=MIL+1. VAL. Exercice 6. /* indices courants */ 85 WAFAE SABBAR .h> main() { /* Déclarations */ /* Les tableaux et leurs dimensions */ int A[50]. POS). Lors de la recherche dichotomique.le pire des cas pour la recherche séquentielle peut entraîner 1024 exécutions de la boucle. else POS=MIL. return 0. } /* Edition du résultat */ if (POS==-1) printf("La valeur recherchée ne se trouve pas " "dans le tableau.13 Fusion de deux tableaux triés #include <stdio.POS=-1. int N. else printf("La valeur %d se trouve à la position %d. on élimine la moitié des éléments du tableau à chaque exécution de la boucle.

/* Saisie des données */ printf("Dimension du tableau A scanf("%d". IFUS++. } else { FUS[IFUS]=B[IB]. IA<N. B */ /* Fusion des éléments de A et B dans FUS */ /* de façon à ce que FUS soit aussi trié. B[IB]). */ while (IA<N) { FUS[IFUS]=A[IA]. printf("Tableau B :\n"). printf("Entrer les éléments de for (IA=0. IA). IFUS++. IA++. } printf("Dimension du tableau B scanf("%d". IB<M. &N ). &M ). IB++. scanf("%d". A dans l'ordre croissant :\n"). IA++. &B[IB]). IB). IA++) { printf("Elément A[%d] : ". while ((IA<N) && (IB<M)) if(A[IA]<B[IB]) { FUS[IFUS]=A[IA]. IFUS=0. IA<N. IFUS++. */ /* alors copier le reste de l'autre tableau. */ IA=0. for (IB=0. scanf("%d". printf("Entrer les éléments de for (IB=0. IA++) printf("%d ". IB++.50) : "). IB<M. &A[IA]). } /* Si IA ou IB sont arrivés à la fin de leur tableau. } /* Edition du résultat */ 86 WAFAE SABBAR . printf("\n"). (max. for (IA=0. IFUS++.50) : "). } while (IB<M) { FUS[IFUS]=B[IB]. A[IA]). IB++) { printf("Elément B[%d] : ". } /* Affichage des tableaux A et printf("Tableau A :\n"). (max. B dans l'ordre croissant :\n"). IB=0. IB++) printf("%d ". printf("\n").

I++) { /* Recherche du maximum à droite de A[I] */ PMAX=I.14 Tri par sélection du maximum #include <stdio. /* indice courant */ int AIDE.h> main() 87 WAFAE SABBAR . /* rang à partir duquel A n'est pas trié */ int J. I<N-1. } Exercice 6. scanf("%d". J++) printf("%d ". /* tableau donné */ int N. A[J]). } Exercice 6. return 0. for (J=I+1. */ for (I=0. &A[J]). FUS[IFUS]). scanf("%d". /* Echange de A[I] avec le maximum */ AIDE=A[I]. /* indique la position de l'élément */ /* maximal à droite de A[I] */ /* Saisie des données */ printf("Dimension du tableau (max. &N ).h> main() { /* Déclarations */ int A[50]. IFUS++) printf("%d ". return 0. for (J=0. J++) printf("%d ". printf("\n"). /* dimension */ int I. A[I]=A[PMAX]. } /* Affichage du tableau */ printf("Tableau donné :\n"). for (J=0. } /* Edition du résultat */ printf("Tableau trié :\n"). IFUS<N+M. for (IFUS=0. printf("\n"). A[J]). J<N. for (J=0.50) : ").printf("Tableau FUS :\n"). /* Tri du tableau par sélection directe du maximum. J<N. printf("\n"). J++) if (A[J]>A[PMAX]) PMAX=J.15 Tri par propagation (bubble sort) #include <stdio. A[PMAX]=AIDE. J). J++) { printf("Elément %d : ". J<N. /* pour la permutation */ int PMAX. J<N.

*/ for (I=N-1 . /* dimension */ int I. } } /* Edition du résultat */ printf("Tableau trié :\n"). /* Tri du tableau par propagation de l'élément maximal. J<I. /* int NOTES[7]. minimum de points */ nombre de lignes du graphique */ 88 WAFAE SABBAR . printf("\n").50) : "). scanf("%d". A[J]=A[J+1]. A[J]). /* int SOM. J++) printf("%d ". for (J=0. return 0. J++) if (A[J]>A[J+1]) { FIN=J. AIDE=A[J].16 Statistique des notes #include <stdio. /* position où la dernière permutation a eu lieu. J<N. printf("\n"). /* pour la permutation */ int FIN. MIN. */ /* Saisie des données */ printf("Dimension du tableau (max. I=FIN) { FIN=0. J). for (J=0.{ /* Déclarations */ int A[50]. /* int MAXN. IN. I>0 . J<N. &N ). J<N. /* int N. /* int MAX. &A[J]). */ /* permet de ne pas trier un sous-ensemble déjà trié. } Exercice 6. /* int I. A[J]). J++) printf("%d ". /* rang à partir duquel A est trié */ int J. for (J=0. /* indice courant */ int AIDE. for (J=0. /* tableau donné */ int N. /* tableau des points */ tableau des notes */ nombre d'élèves */ compteurs d'aide */ somme des points */ maximum. J++) { printf("Elément %d : ". A[J+1]=AIDE.h> main() { int POINTS[50]. } /* Affichage du tableau */ printf("Tableau donné :\n"). scanf("%d".

I++) NOTES[POINTS[I]/10]++. /* Calcul et affichage de la moyenne des points */ for (SOM=0.50) : "). else printf(" "). printf("La moyenne des notes est %f \n". /* Affichage du graphique de barreaux */ /* Représentation de MAXN lignes */ for (I=MAXN.I=0 . } } /* Affichage du domaine des notes */ printf("\n +"). scanf("%d". IN++) if (NOTES[IN] > MAXN) MAXN = NOTES[IN].9 I 10-19 I 20-29 " "I 30-39 I 40-49 I 50-59 I 60 I\n"). /* Recherche du maximum MAXN dans NOTES */ for (MAXN=0. I>0. MAX)./* Saisie des données */ printf("Entrez le nombre d'élèves (max. for (I=0. I<N. I++) {printf("Elève %d:".17 Mise à zéro de la diagonale principale d'une matrice #include <stdio. } printf("\n"). IN<7 . } Exercice 6. (float)SOM/N). &N). IN++) NOTES[IN] = 0. I=0. /* Calcul et affichage du maximum et du minimum des points */ for (MAX=0. I--) { printf("\n %2d >". IN<7 . for (IN=0. /* Etablissement du tableau NOTES */ for (IN=0 . scanf("%d". I++) SOM += POINTS[I].h> 89 WAFAE SABBAR .IN=0 . IN++) printf("-------+"). I<N. I++) {if (POINTS[I] > MAX) MAX=POINTS[I]. I<N. &POINTS[I]). return 0. for (I=0. IN<7. printf("La note minimale est %d \n". MIN=60. if (POINTS[I] < MIN) MIN=POINTS[I]. I+1). for (IN=0. IN<7. IN++) { if (NOTES[IN]>=I) printf(" #######"). I). printf("Entrez les points des élèves:\n"). MIN). } printf("La note maximale est %d \n". I<N . printf("\n I 0 .

18 Matrice unitaire #include <stdio. I<N. J<N. J<N. for (I=0.50) : "). scanf("%d". } return 0. } Exercice 6. for (I=0. /* Construction de la matrice carrée unitaire */ for (I=0. J++) if (I==J) U[I][J]=1. I<N. J. A[I][J]). /* matrice unitaire */ int N.50) : "). /* dimension de la matrice carrée */ int I. /* indices courants */ /* Saisie des données */ printf("Dimension de la matrice carrée (max. I++) for (J=0. /* Edition du résultat */ printf("Matrice résultat :\n"). I<N.J). I++) { for (J=0. I++) { for (J=0. J<N. scanf("%d". printf("\n"). A[I][J]). /* indices courants */ /* Saisie des données */ printf("Dimension de la matrice carrée (max. } /* Mise à zéro de la diagonale principale */ for (I=0. J++) printf("%7d".h> main() { /* Déclarations */ int U[50][50]. &A[I][J]). 90 WAFAE SABBAR . /* dimension de la matrice unitaire */ int I. J<N. I<N. I++) for (J=0. } /* Affichage de la matrice */ printf("Matrice donnée :\n"). I<N. &N). I++) A[I][I]=0.main() { /* Déclarations */ int A[50][50]. for (I=0. /* matrice carrée */ int N. scanf("%d". J++) printf("%7d". printf("\n"). J. &N).I. J++) { printf("Elément[%d][%d] : ".

I++) { for (J=0. J. I<N. /* matrice initiale */ matrice résultat */ dimensions des matrices */ indices courants */ /* Saisie des données */ printf("Nombre de lignes (max. /* int B[50][50]. J++) printf("%7d". J++) printf("%7d".J).50) : "). scanf("%d". I<N. printf("\n"). else U[I][J]=0. M. U[I][J]). I++) for (J=0.h> main() { /* Déclarations */ int A[50][50].19 Transposition d'une matrice a) La matrice transposée sera mémorisée dans une deuxième matrice B qui sera ensuite affichée. J++) { printf("Elément[%d][%d] : ". printf("\n"). for (I=0. 91 WAFAE SABBAR .50) : "). for (I=0. I<N. J<M.I. &N ). I++) { for (J=0. &A[I][J]). } /* Affichage de la matrice */ printf("Matrice donnée :\n"). scanf("%d". /* int I. #include <stdio. } return 0. /* Edition du résultat */ printf("Matrice unitaire de dimension %d :\n". &M ). /* int N. Exercice 6. N).else U[I][J]=0. A[I][J]). J<N. J<M. } Remarque: L'opération: if (I==J) U[I][J]=1. peut être simplifiée par: U[I][J] = (I==J). printf("Nombre de colonnes (max. for (I=0. scanf("%d".

/* int N. J++) { printf("Elément[%d][%d] : ". I<N. } b) La matrice A sera transposée par permutation des éléments. I++) for (J=0. A[I][J] = A[J][I]. #include <stdio. A[I][J]). J++) B[J][I]=A[I][J]. I++) { for (J=0. for (I=0.} /* Affectation de la matrice transposée à B */ for (I=0. J<M. } /* Affichage de la matrice */ printf("Matrice donnée :\n").50) : "). M. &A[I][J]). I<N. J<I. J++) printf("%7d". A[J][I] = AIDE. printf("Nombre de colonnes (max. I++) { for (J=0. scanf("%d". I<DMAX. B[I][J]). I++) for (J=0. printf("\n"). /* Edition du résultat */ /* Attention: maintenant le rôle de N et M est inversé. J++) printf("%7d". } return 0. scanf("%d". J<M.50) : ").I. J++) { AIDE = A[I][J].h> main() { /* Déclarations */ int A[50][50]. I<M.J). /* int AIDE. J<M. /* int DMAX. J. for (I=0. /* int I. scanf("%d". /* matrice donnée */ dimensions de la matrice */ indices courants */ pour la permutation */ la plus grande des deux dimensions */ /* Saisie des données */ printf("Nombre de lignes (max. I++) for (J=0. } 92 WAFAE SABBAR . } /* Transposition de la matrice A par permutation des */ /* éléments [I][J] à gauche de la diagonale principale */ /* avec les éléments [J][I] à droite de la diagonale. &N ). printf("\n"). I<N. J<N. for (I=0. &M ). for (I=0. */ DMAX = (N>M) ? N : M. */ printf("Matrice résultat :\n").

} return 0. J<M. /* Edition du résultat */ printf("Matrice résultat :\n"). A[I][J]). } printf("Multiplicateur X : "). #include <stdio. scanf("%f".20 Multiplication d'une matrice par un réel a) Le résultat de la multiplication sera mémorisé dans une deuxième matrice A qui sera ensuite affichée. J++) B[I][J] = X*A[I][J]. &A[I][J]). I<N. I<M. J++) printf("%10. J<N. I<N./* Edition du résultat */ /* Attention: maintenant le rôle de N et M est inversé. scanf("%f". I++) { for (J=0. for (I=0. I++) for (J=0. J.J). /* Affichage de la matrice */ printf("Matrice donnée :\n").2f". M. J++) printf("%10. scanf("%d". I<N. J<M. for (I=0. /* matrice résultat */ int N. */ printf("Matrice résultat :\n"). &X ). A[I][J]). I<N.50) : "). } Exercice 6.50) : ").2f". /* dimensions des matrices */ int I. /* multiplicateur */ /* Saisie des données */ printf("Nombre de lignes (max.I. J++) printf("%7d". J<M. printf("\n"). &M ). for (I=0. } /* Affectation du résultat de la multiplication à B */ for (I=0. I++) { for (J=0. J++) { printf("Elément[%d][%d] : ". J<M. B[I][J]). printf("Nombre de colonnes (max. for (I=0. I++) { for (J=0. /* indices courants */ float X. I++) for (J=0. } 93 WAFAE SABBAR .h> main() { /* Déclarations */ float A[50][50]. printf("\n"). printf("\n"). &N ). /* matrice donnée */ float B[50][50]. scanf("%d".

} printf("Multiplicateur X : "). /* Affichage de la matrice */ printf("Matrice donnée :\n"). J++) printf("%10.2f".h> main() { /* Déclarations */ float A[50][50]. &N ). I++) { for (J=0. scanf("%d". A[I][J]). scanf("%f". for (I=0. for (I=0. } return 0. I++) for (J=0. } /* Multiplication des éléments de A par X */ for (I=0.50) : "). I<N. printf("Nombre de colonnes (max. } b) Les éléments de la matrice A seront multipliés par X. /* float X. } Exercice 6. J++) { printf("Elément[%d][%d] : ". for (I=0.I. J<M. scanf("%f".h> main() { /* Déclarations */ 94 WAFAE SABBAR . /* Edition du résultat */ printf("Matrice résultat :\n"). I++) for (J=0. A[I][J]). &A[I][J]). &X). J++) printf("%10. J<M. #include <stdio. M. J<M. printf("\n"). &M ). /* int I.J). J++) A[I][J] *= X. /* matrice donnée */ dimensions de la matrice */ indices courants */ multiplicateur */ /* Saisie des données */ printf("Nombre de lignes (max. J.50) : "). I++) { for (J=0. #include <stdio. printf("\n"). J<M. I<N. /* int N. I<N.2f". scanf("%d". I<N.return 0.21 Addition de deux matrices a) Le résultat de l'addition sera mémorisé dans une troisième matrice C qui sera ensuite affichée.

/* /* /* /* /* matrice donnée */ matrice donnée */ matrice résultat */ dimensions des matrices */ indices courants */ /* Saisie des données */ printf("Nombre de lignes (max.50) : ").J). #include <stdio. J++) printf("%7d". for (I=0. &A[I][J]). J<M.50) : "). printf("*** Matrice A ***\n"). I++) for (J=0. printf("\n"). } /* Affectation du résultat de l'addition à C */ for (I=0. I++) { for (J=0. } return 0.int int int int int A[50][50]. I<N.J). } b) La matrice B est ajoutée à A. J++) printf("%7d". I<N. scanf("%d". J++) C[I][J] = A[I][J]+B[I][J]. I<N. for (I=0. I. M. I<N. J<M. N. I++) { for (J=0. J++) { printf("Elément[%d][%d] : ". B[50][50]. } /* Affichage des matrices */ printf("Matrice donnée A :\n"). I++) for (J=0. I<N. printf("\n"). scanf("%d". C[50][50]. scanf("%d". J<M. I++) for (J=0. scanf("%d". J<M. for (I=0. J++) { printf("Elément[%d][%d] : ". for (I=0. J<M. } printf("*** Matrice B ***\n").h> 95 WAFAE SABBAR . J++) printf("%7d". /* Edition du résultat */ printf("Matrice résultat C :\n"). printf("Nombre de colonnes (max. &M ). printf("\n"). J.I. I++) { for (J=0. B[I][J]). } printf("Matrice donnée B :\n"). C[I][J]).I. &B[I][J]). I<N. for (I=0. A[I][J]). J<M. &N ).

I<N. &N ). M. /* matrice donnée et résultat */ int B[50][50]. for (I=0. I++) { for (J=0. J++) printf("%7d". A[I][J]). J++) { printf("Elément[%d][%d] : ". I++) for (J=0. J<M. for (I=0. for (I=0. } /* Addition de B à A */ for (I=0. &M ). } printf("*** Matrice B ***\n"). } return 0. J. J<M. I<N. for (I=0. &A[I][J]). J<M. /* matrice donnée */ int N. I<N. printf("Nombre de colonnes (max. for (I=0. I++) { for (J=0. I<N. J++) A[I][J] += B[I][J]. printf("*** Matrice A ***\n").J).50) : "). A[I][J]).I. J<M. printf("\n"). printf("\n"). /* dimensions des matrices */ int I. J<M.50) : "). I++) for (J=0. J++) printf("%7d". scanf("%d". } 96 WAFAE SABBAR . J<M. I++) { for (J=0. scanf("%d".I. J++) { printf("Elément[%d][%d] : ". } /* Affichage des matrices */ printf("Matrice donnée A :\n"). B[I][J]). I++) for (J=0. /* indices courants */ /* Saisie des données */ printf("Nombre de lignes (max. J++) printf("%7d". scanf("%d". /* Edition du résultat */ printf("Matrice résultat A :\n"). scanf("%d". &B[I][J]). printf("\n"). I<N. } printf("Matrice donnée B :\n").main() { /* Déclarations */ int A[50][50].J). I<N.

for (I=0. printf("Nombre de lignes de B : %d\n". printf("Nombre de lignes de A (max. I<N.I. &N ). for (I=0. K. M. &A[I][J]). I++) for (J=0. for (I=0. /* indices courants */ /* Saisie des données */ printf("*** Matrice A ***\n").50) : "). M).50) : "). for (I=0. A[I][J]). I<N. } printf("*** Matrice B ***\n"). /* matrice donnée */ int B[50][50]. scanf("%d". B[I][J]). &B[I][J]). } /* Affichage des matrices */ printf("Matrice donnée A :\n"). scanf("%d". &M ). /* matrice donnée */ int C[50][50]. printf("\n"). printf("\n"). } printf("Matrice donnée B :\n"). K<M.J). scanf("%d". } /* Affectation du résultat de la multiplication à C */ for (I=0. J++) printf("%7d". scanf("%d". } /* Edition du résultat */ printf("Matrice résultat C :\n"). I<N. K++) C[I][J] += A[I][K]*B[K][J]. I++) { for (J=0. J. /* dimensions des matrices */ int I. I++) { for (J=0. J<P. I<M. J<P.22 Multiplication de deux matrices #include <stdio. J<P. I<M. 97 WAFAE SABBAR . J<M.50) : "). /* matrice résultat */ int N.h> main() { /* Déclarations */ int A[50][50]. I++) for (J=0. J++) { printf("Elément[%d][%d] : ". printf("Nombre de colonnes de B (max.J). scanf("%d". J++) { printf("Elément[%d][%d] : ". for (K=0.Exercice 6. printf("Nombre de colonnes de A (max. &P ). I++) for (J=0.I. J++) printf("%7d". J++) { C[I][J]=0. J<M. P.

13) : "). /* matrice résultat */ int N. for (I=0. I++) { for (J=0. printf("\n"). J<I. /* dimensions des matrices */ int I. J. N). /* indices courants */ /* Saisie des données */ do { printf("Entrez le degré N du triangle (max./* matrice indiquant les minima des colonnes */ int N. scanf("%d"./* matrice indiquant les maxima des lignes */ int MIN[50][50]. */ for (I=0.for (I=0. for (J=0. J<=I. J++) P[I][J] = P[I-1][J] + P[I-1][J-1]. P[I][0]=1. for (J=1. I++) { P[I][I]=1. I<N. } return 0. } /* Edition du résultat */ printf("Triangle de Pascal de degré %d :\n". I++) { printf(" N=%2d". J<P. C[I][J]). &N). /* matrice donnée */ int MAX[50][50]. /* compteur des points-cols */ 98 WAFAE SABBAR . } Exercice 6. } while (N>13||N<0). } return 0. J++) if (P[I][J]) printf("%5d". /* Construction des lignes 0 à N du triangle: */ /* Calcul des composantes du triangle jusqu'à */ /* la diagonale principale.h> main() { /* Déclarations */ int A[50][50]. P[I][J]). J++) printf("%7d". } Exercice 6.24 Recherche de 'points-cols' #include <stdio. I<=N. M. /* degré du triangle */ int I. I). J. printf("\n").h> main() { /* Déclarations */ int P[14][14]. /* indices courants */ int AIDE. /* pour la détection des extréma */ int C.23 Triangle de Pascal #include <stdio. I<=N.

for (J=1. scanf("%d". J<M. I<N. scanf("%d". I<N. J++) { /* Recherche du minimum sur la colonne J */ AIDE=A[0][J].J). for (I=0. I++) { /* Recherche du maximum sur la ligne I */ AIDE=A[I][0]. } /* Construction de la matrice d'aide MIN */ /* qui indique les positions de tous les */ /* minima sur une colonne.cols :\n"). /* MAX[I][J] = (A[I][J]==AIDE) else MAX[I][J]=0. &N ). I<N. I<N. I<N. J<M. J<M. } /* Construction de la matrice d'aide MAX */ /* qui indique les positions de tous les */ /* maxima sur une ligne. scanf("%d". J++) { printf("Elément[%d][%d] : ". for (C=0. /* Marquage de tous les maxima sur la ligne */ for (J=0. I++) { for (J=0. J++) printf("%7d". J<M. */ for (I=0. */ printf("Points . J++) */ */ */ */ 99 WAFAE SABBAR .I./* Saisie des données */ printf("Nombre de lignes (max. &A[I][J]). I++) if (A[I][J]<AIDE) AIDE=A[I][J]. J<M. I++) for (J=0. for (I=1. &M ). printf("Nombre de colonnes (max. } /* Affichage de la matrice */ printf("Matrice donnée :\n"). J++) if (A[I][J]>AIDE) AIDE=A[I][J]. /* Marquage de tous les minima sur la colonne J */ for (I=0. I<N.50) : "). J++) if (A[I][J]==AIDE) /* ou bien : MAX[I][J]=1. for (I=0. } /* Edition du résultat */ /* Les composantes qui sont marquées comme extréma */ /* dans MAX et dans MIN sont des points-cols. A[I][J]). I++) for (J=0. /* MIN[I][J] = (A[I][J]==AIDE) else MIN[I][J]=0. printf("\n"). */ for (J=0. I++) if (A[I][J]==AIDE) /* ou bien : MIN[I][J]=1. I=0.50) : "). J<M.

if (MAX[I][J]&&MIN[I][J]) { C++. printf("L'élément %d\test un maximum " "sur la ligne %d\n" " \t et un minimum " "sur la colonne %d\n".\n"). I. return 0. } 100 WAFAE SABBAR . } if (C==0) printf("Le tableau ne contient pas de points-cols. J). A[I][J].

Déclaration correcte Espace: 5 octets f) char f[] = "Cette " "phrase" "est coupée". Espace: 8 octets d) char d[10] = 'x'. Espace: 2 octets e) char e[5] = "cinq". 101 WAFAE SABBAR .1. Déclaration correcte Espace: 15 octets b) char b[12] = "un deux trois".7 . Correction: char b[14] = "un deux trois". a) char a[] = "un\ndeux\ntrois\n". ou mieux: char b[] = "un deux trois". il faut utiliser les guillemets (ou indiquer une liste de caractères). '###BOT_TEXT###'}. Déclaration correcte Espace: 23 octets g) char g[2] = {'a'. Correction: char c[] = "abcdefg". '###BOT_TEXT###'} ou mieux: char d[10] = "x". Déclaration incorrecte: Il faut utiliser une liste de caractères ou une chaîne pour l'initialisation Correction: char d[10] = {'x'. Déclaration incorrecte: Les symboles '' encadrent des caractères. Déclaration incorrecte: la chaîne d'initialisation dépasse le bloc de mémoire réservé. LES CHAÎNES DE CARACTÈRES Exercice 7. pour initialiser avec une chaîne de caractères. Espace: 14 octets c) char c[] = 'abcdefg'.

séparés par des espaces :\n").Déclaration correcte Espace: 2 octets h) char h[4] = {'a'. 102 WAFAE SABBAR . M4. M2. printf("Le texte est composé de %d caractères.L). /* longueur de la chaîne */ int C. Espace: 4 octets Exercice 7. M5[30]. mais d'une chaîne contenant les caractères '

'. 'c'}. /* compteur des lettres 'e' */ int AIDE. printf("Entrez 5 mots. /* b) Compter les lettres 'e' dans le texte */ C=0. */ /* a) Compter les caractères */ /* La marque de fin de chaîne '###BOT_TEXT###' est */ /* utilisée comme condition d'arrêt. il faut aussi indiquer le symbole de fin de chaîne. M2.M5. Espace: 4 octets i) char i[4] = "'o'". printf("Le texte contient %d lettres

Centres d'intérêt liés

e

Centres d'intérêt liés

.C). M2[30]. Déclaration incorrecte: Dans une liste de caractères. 'o'. scanf ("%s %s %s %s %s". M3.\n". TXT[L]. M1). M4.2 #include <stdio. TXT[I].3 #include <stdio. } Exercice 7.h> main() { /* Déclarations */ char TXT[201]. printf("%s %s %s %s %s\n". M5). M3.\n". I++) if (TXT[I]=='e') C++. '###BOT_TEXT###'}.J. for (I=0. return 0. Correction: char h[4] = {'a'. '

Centres d'intérêt liés

' et '###BOT_TEXT###'. 'c'. L++) . /* indices courants */ int L. 'b'.200 caractères) :\n"). */ for (L=0. /* chaîne donnée */ int I. gets(TXT). /* pour l'échange des caractères */ /* Saisie des données */ printf("Entrez une ligne de texte (max. M1. /* L'utilisation de scanf est impossible pour */ /* lire une phrase contenant un nombre variable de mots.h> main() { char M1[30]. M3[30]. M4[30]. 'b'. Déclaration correcte.

PRENOM))). printf("Votre nom est composé de %d lettres. I<J ./* c) Afficher la phrase à l'envers */ for (I=L-1. I++) { TXT[J] = TXT[I].h> main() { /* Déclarations */ char TXT[201].4 #include <stdio. /* Eliminer les lettres 'e' et comprimer : */ /* Copier les caractères de I vers J et incrémenter J */ /* seulement pour les caractères différents de 'e'. scanf("%s %s". printf("\nBonjour %s %s !\n". TXT[I] . */ putchar('\n'). */ /* d) Inverser l'ordre des caractères */ for (I=0. return 0.\n". PRENOM). } Exercice 7.J=L-1 . NOM. PRENOM[40]. /* Edition du résultat */ puts(TXT). printf("Introduisez votre nom et votre prénom: \n").h> #include <string.TXT[I]). /* ou bien printf("Votre nom est composé de %d lettres.\n". /* indices courants */ /* Saisie des données */ printf("Entrez une ligne de texte (max.TXT). */ 103 WAFAE SABBAR . PRENOM).5 #include <stdio. */ return 0. /* ou printf("%c".h> main() { char NOM[40]. gets(TXT).I=0 . TXT[J]=AIDE. } Exercice 7.200 caractères) :\n"). } puts(TXT). strlen(strcat(NOM. } /* Terminer la chaîne !! */ TXT[J]='###BOT_TEXT###'. TXT[I]=TXT[J].J. I--) putchar(TXT[I]). if (TXT[I] != 'e') J++. NOM. /* chaîne donnée */ int I. /* ou printf("%s\n". I++. I>=0. strlen(NOM) + strlen(PRENOM)). */ for (J=0. /* ou printf("\n").J--) { AIDE=TXT[I].

} Exercice 7. CH1.h> #include <string.CH2 . /* chaînes entrées */ int RES.CH1). CH2[100]. /* résultat de la fonction strcmp */ printf("Introduisez la première chaîne de caractères : "). else printf("###BOT_TEXT###quot;%s###BOT_TEXT###quot; est égal à ###BOT_TEXT###quot;%s###BOT_TEXT###quot;\n".h> main() { /* Déclarations */ char CH1[200].CH2). } Exercice 7. CH1.CH1 . gets(CH2).7 a) Utiliser les fonctions spéciales de <string>.return 0. if (RES<0) printf("###BOT_TEXT###quot;%s###BOT_TEXT###quot; précède ###BOT_TEXT###quot;%s###BOT_TEXT###quot;\n". CH2). strncat(CH3.6 #include <stdlib. printf("Introduisez la deuxième chaîne de caractères : "). CH2.CH1. return 0. /* Traitements */ strncpy(CH3. gets(CH1).CH2). /* Comparaison et affichage du résultat */ RES = strcmp(CH1. /* chaîne résultat */ /* Saisie des données */ printf("Introduisez la première chaîne de caractères : "). printf("Introduisez la deuxième chaîne de caractères : "). #include <stdio. CH2. return 0.h> main() { /* Déclarations */ char CH1[100]. gets(CH2). CH3). 104 WAFAE SABBAR . CH2[200]. strlen(CH1)/2). gets(CH1). strlen(CH2)/2). } b) Utiliser uniquement les fonctions gets et puts. else if (RES>0) printf("###BOT_TEXT###quot;%s###BOT_TEXT###quot; précède ###BOT_TEXT###quot;%s###BOT_TEXT###quot;\n". /* Affichage du résultat */ printf("Un demi ###BOT_TEXT###quot;%s###BOT_TEXT###quot; plus un demi ###BOT_TEXT###quot;%s###BOT_TEXT###quot; donne ###BOT_TEXT###quot;%s###BOT_TEXT###quot;\n".h> #include <string. /* chaînes données */ char CH3[100]="".

I++) CH3[I]=CH1[I]. J++. I++) { CH3[J]=CH2[I].h> main() { /* Déclarations */ char VERB[20].h> main() { /* Déclarations */ char CH1[100]. L1++) . puts("Introduisez la deuxième chaîne de caractères : "). } /* Terminer la chaîne CH3 */ CH3[J]='###BOT_TEXT###'. /* Affichage du résultat */ puts("Chaîne résultat : ").h> #include <string. /* chaîne contenant le verbe */ char AFFI[30]. else 105 WAFAE SABBAR . CH2[L2]. /* indice courant dans CH1 et CH2 int J. I<(L2/2) . L2++) . /* chaînes données char CH3[100]="". /* Copier la première moitié de CH2 vers CH3 */ J=I. for (I=0 . gets(VERB). puts(CH3). for (L2=0. return 0. /* chaîne pour l'affichage */ int L.#include <stdio. /* longueurs de CH1 et CH2 int I. /* chaîne résultat int L1. /* Contrôler s'il s'agit d'un verbe en 'er' */ L=strlen(VERB). I<(L1/2) .8 #include <stdio. /* longueur de la chaîne */ /* Saisie des données */ printf("Verbe : ").L2. /* Copier la première moitié de CH1 vers CH3 */ for (I=0 . gets(CH1). CH1[L1]. gets(CH2). /* indice courant dans CH3 */ */ */ */ */ /* Saisie des données */ puts("Introduisez la première chaîne de caractères : "). } Exercice 7.!"). if ((VERB[L-2]!='e') || (VERB[L-1]!='r')) puts("\aCe n'est pas un verbe du premier groupe. CH2[100]. /* Détermination les longueurs de CH1 et CH2 */ for (L1=0.

ltoa(N. . strcat(AFFI.000000 1. strcat(AFFI. VERB).&N). STR. STR.000000 -0. puts(AFFI). } return 0. 8)). STR. . ltoa(N. 2)). 16)). } Exercice 7. "ent"). strcat(AFFI. */ AFFI[0]='###BOT_TEXT###'.. printf("Entrée = %ld\n". ltoa(N.h> #include <stdlib. printf("base 8 = %s\n". .45 12000.9 Entrée: a) 123 b) -123 c) .000000 h) 123e-02 123 i) -0.45 e) 12E3 f) 1234f5 integer long double 123 -123 0 123 12 1234 123 -123 0 123 12 1234 123 0 123.000000 123. AFFI[0]='###BOT_TEXT###'. VERB).{ /* Couper la terminaison 'er'. char STR[200]. "je "). N).10 #include <stdio. printf("base 2 = %s\n".000000 -123. scanf("%ld".123 d) 123.230000 -0. "e"). } 106 WAFAE SABBAR . puts(AFFI). } while(N).123400 g) -1234567 dépassement -1234567 -1234567..000000 1234. /* Conjuguer . */ VERB[L-2]='###BOT_TEXT###'. strcat(AFFI. "ils ").1234 0 Exercice 7. strcat(AFFI. printf("base 16 = %s\n". do { puts("Entrez un nombre :").h> main() { long N. strcat(AFFI. return 0.

J++) puts(MOT[J]). for (J=0. MOT[PMOT]) < 0) PMOT=J. MOT[I]). "mardi". /* tableau de 10 mots à trier */ char AIDE[50]. strcpy(MOT[I]. strcpy(MOT[PMOT]."dimanche"}. &N). I++) { /* Recherche du prochain mot à droite de A[I] */ PMOT=I. /* ou : scanf ("%s\n". "mercredi". scanf("%d".Exercice 7. 107 WAFAE SABBAR . MOT[J]). /* indice courant */ int PMOT. } Exercice 7. gets(MOT[J]). /* Echange des mots à l'aide de strcpy */ strcpy(AIDE. */ } /* Tri du tableau par sélection directe du */ /* prochain mot dans la suite lexicographique. /* chaîne d'aide pour la permutation */ int I.h> #include <string. "lundi". } /* Edition du résultat */ printf("Tableau trié lexicographiquement :\n").12 #include <stdio. for (J=I+1.h> main() { /* Déclarations */ int N.MOT[J]). /* nombre entré */ char JOUR[8][9] = {"\aErreur!".11 #include <stdio. */ /* Saisie des données */ for (J=0. AIDE). MOT[PMOT]). */ for (I=0. (N==1)?'r':' '.h> main() { /* Déclarations */ char MOT[10][50]. /* ou : printf("%s\n". J). /* rang à partir duquel MOT n'est pas trié */ int J. JOUR[N]). N. J<10.\n". "jeudi". J++) if (strcmp(MOT[J]. /* Saisie du nombre */ printf("Entrez un nombre entre 1 et 7 : ").pour perfectionnistes */ if (N>0 && N<8) printf("Le %de%c jour de la semaine est %s. /* Affichage du résultat . "vendredi". return 0. */ printf("\n"). I<9. J++) { printf("Mot %d : ". "samedi". /* indique la position du prochain mot */ /* dans la suite lexicographique. J<10. J<10.

h> #include <string.."ez". if ((VERB[L-2] != 'e') || (VERB[L-1] != 'r')) printf("###BOT_TEXT###quot;%s###BOT_TEXT###quot; n'est pas un verbe du premier groupe. I>=0. else { /* Couper la terminaison 'er'. char TERM[6][5] = {"e".VERB). printf("\n"). */ VERB[L-2]='###BOT_TEXT###'. séparés par des espaces :\n"). /* Après le retour à la ligne."e".SUJ[I]. MOT[I]). I<5. */ for (I=0. /* Conjuguer . } 108 WAFAE SABBAR ."tu".else puts(JOUR[0]).h> main() { /* Déclarations */ char MOT[5][50]. /* indice courant */ /* Saisie des données */ printf("Verbe : ")."ent"}."vous".. */ for (I=0.14 #include <stdio."ons". I++) printf("%s %s%s\n". return 0. I<6. MOT[I]). } Exercice 7."ils"}. /* tableau pour les 5 mots */ int I. VERB).13 #include <stdio.\n". return 0. I--) printf("%s ". char VERB[20]. } return 0. /* longueur de la chaîne */ int I. } Exercice 7.h> main() { /* Déclarations */ /* Sujets et terminaisons */ char SUJ[6][5] = {"je". /* indice courant */ /* Saisie des mots */ printf("Entrez 5 mots."es"."il". /* Contrôler s'il s'agit d'un verbe en 'er' */ L=strlen(VERB). /* Affichage du résultat */ for (I=4. VERB. scanf lit */ /* les 5 données à la fois. scanf("%s". I++) scanf("%s". /* chaîne contenant le verbe */ int L."nous". TERM[I]).

return 0. I++) . I++) { if (CH[I]>='A' && CH[I]<='Z') CH[I] = CH[I]-'A'+'a'. } /* Affichage de la chaîne convertie */ printf("Chaîne convertie : %s\n". /* indice courant */ /* Saisie de la chaîne */ printf("Entrez la chaîne à convertir : ").h> main() { /* Déclarations */ char CH[100]. (CH1[I]==CH2[I]) && CH1[I] && CH2[I]. CH2). CH2). Exercice 7. printf("Entrez la deuxième chaîne à comparer : "). CH). else printf("###BOT_TEXT###quot;%s###BOT_TEXT###quot; précède ###BOT_TEXT###quot;%s###BOT_TEXT###quot;\n". CH1. */ for (I=0. CH1.16 #include <stdio. les exercices suivants sont à résoudre sans utiliser les fonctions spéciales des bibliothèques <string>. */ if (CH1[I]==CH2[I]) printf("###BOT_TEXT###quot;%s###BOT_TEXT###quot; est égal à ###BOT_TEXT###quot;%s###BOT_TEXT###quot;\n". gets(CH2).h> main() { /* Déclarations */ char CH1[50]. } 109 WAFAE SABBAR . CH2. CH1).Sauf indication contraire. else if (CH1[I]<CH2[I]) printf("###BOT_TEXT###quot;%s###BOT_TEXT###quot; précède ###BOT_TEXT###quot;%s###BOT_TEXT###quot;\n". CH2[50]. /* Conversion de la chaîne */ for (I=0. return 0. /* Chercher la première position où */ /* CH1 et CH2 se distinguent. gets(CH1). Ils servent à comprendre et à suivre le raisonnement de ces fonctions. /* indice courant */ /* Saisie des données */ printf("Entrez la première chaîne à comparer : "). <stdlib> ou <ctype>. else if (CH[I]>='a' && CH[I]<='z') CH[I] = CH[I]-'a'+'A'. /* Comparer le premier élément qui */ /* distingue CH1 et CH2. gets(CH). } Exercice 7. /* chaîne à convertir */ int I. CH[I].15 #include <stdio. /* chaînes à comparer */ int I.

h> main() { /* Déclarations */ char CH[100].\n". else 110 WAFAE SABBAR . /* indice courant */ int OK.h> #include <ctype.Exercice 7. /* indice courant */ int OK. CH).h> main() { /* Déclarations */ char CH[100]. gets(CH). I++) if (isdigit(CH[I])) N = N*10 + (CH[I]-'0'). OK && CH[I]. if (isdigit(CH[I])) N = N*16 + (CH[I]-'0'). N=0.17 #include <stdio. /* chaîne numérique à convertir */ long N. /* Affichage de la chaîne convertie */ if (OK) printf("Valeur numérique : %ld\n". else OK=0. N=0. return 0. /* Conversion de la chaîne */ OK=1. else printf("\a###BOT_TEXT###quot;%s###BOT_TEXT###quot; ne représente pas correctement " "un entier et positif. gets(CH). /* résultat numérique */ int I. } Exercice 7.h> #include <ctype. /* indicateur logique précisant si la */ /* chaîne a été convertie avec succès */ /* Saisie de la chaîne */ printf("Entrez un nombre hexadécimal entier et positif : "). /* indicateur logique précisant si la */ /* chaîne a été convertie avec succès */ /* Saisie de la chaîne */ printf("Entrez un nombre entier et positif : "). /* résultat numérique */ int I. /* chaîne numérique à convertir */ long N.18 #include <stdio. for (I=0. for (I=0. OK && CH[I]. I++) if (isxdigit(CH[I])) { CH[I] = toupper(CH[I]). N). /* Conversion de la chaîne */ OK=1.

} Exercice 7. /* signe de la valeur rationnelle */ int DEC.0 + (CH[I]-'0').') I++. N). /* indice courant */ int SIG.\n".h> main() { /* Déclarations */ char CH[100]. else if (CH[I]) OK=0. CH). I=0. I++) N = N*10.h> #include <math. /* résultat numérique */ int I. SIG=1. isdigit(CH[I]).19 #include <stdio. /* Traitement du signe */ if (CH[I]=='-') SIG=-1. } else OK=0.0 + (CH[I]-'0'). /* Traitement et comptage des décimales */ for (DEC=0. isdigit(CH[I]). /* Affichage de la chaîne convertie */ if (OK) { printf("Valeur numérique hexadécimale : %lX\n". return 0. /* Positions devant le point décimal */ for ( .h> #include <ctype. /* Conversion de la chaîne : */ /* Initialisation des variables */ OK=1. N). printf("Valeur numérique décimale : %ld\n". } else printf("\a###BOT_TEXT###quot;%s###BOT_TEXT###quot; n'est pas une valeur " "hexadécimale correcte. if (CH[I]=='-' || CH[I]=='+') I++. /* chaîne numérique à convertir */ double N.0.N = N*16 + 10 + (CH[I]-'A'). /* Traitement du point décimal */ if (CH[I]=='. /* nombre de décimales */ int OK. N=0. 111 WAFAE SABBAR . DEC++) N = N*10. gets(CH). /* indicateur logique précisant si la */ /* chaîne a été convertie avec succès */ /* Saisie de la chaîne */ printf("Entrez un nombre rationnel : "). I++.

/* Traitement de la marque exponentielle */ if (CH[I]=='e'||CH[I]=='E') I++. SIGE=1. /* signe de l'exposant */ int EXP. isdigit(CH[I]). gets(CH). SIG=1. /* indicateur logique précisant si la */ /* chaîne a été convertie avec succès */ /* Saisie de la chaîne */ printf("Entrez un nombre rationnel : ").') I++. I=0. /* Traitement du signe de l'exposant */ 112 WAFAE SABBAR . else if (CH[I]) OK=0. /* Traitement du signe */ if (CH[I]=='-') SIG=-1. I++) N = N*10. else printf("\a###BOT_TEXT###quot;%s###BOT_TEXT###quot; n'est pas une valeur " "rationnelle correcte.20 #include <stdio. */ = SIG*N/pow(10. Calcul de la valeur à partir du signe et */ du nombre de décimales.0 + (CH[I]-'0').h> #include <ctype. N). /* signe de la valeur rationnelle */ int DEC. /* indice courant */ int SIG.0 + (CH[I]-'0'). /* chaîne numérique à convertir */ double N. } if /* /* N /* if Exercice 7. /* nombre de décimales */ int SIGE. isdigit(CH[I]).\n".(CH[I]) OK=0.h> #include <math.0.DEC). /* Traitement du point décimal */ if (CH[I]=='. Affichage de la chaîne convertie */ (OK) printf("Valeur numérique : %f\n". N=0. /* résultat numérique */ int I.h> main() {/* Déclarations */ char CH[100]. /* Positions devant le point décimal */ for ( . /* valeur de l'exposant */ int OK. CH). if (CH[I]=='-' || CH[I]=='+') I++. /* Conversion de la chaîne */ /* Initialisation des variables */ OK=1. /* Traitement et comptage des décimales */ for (DEC=0. I++. DEC++) N = N*10. return 0.

return 0.if (CH[I]=='-') SIGE=-1.\n". if (CH[I]) OK=0. /* Affichage de la chaîne convertie */ if (OK) printf("Valeur numérique : %f\n". for (I=0. N). /* Calcul de la valeur à partir du signe et */ /* de l'exposant. I++) EXP = EXP*10 + (CH[I]-'0'). /* indice courant dans SUJ */ int J. de la valeur de l'exposant EXP et */ /* du nombre de positions rationnelles DEC */ EXP = SIGE*EXP . I++) /* Si la première lettre est identique. CH). } /* Si la position de départ de OBJ dans SUJ a été trouvée */ /* alors déplacer le reste de SUJ à cette position.EXP). */ N = SIG*N*pow(10. /* indicateur logique qui précise */ /* si la chaîne OBJ a été trouvée */ /* Saisie des données */ printf("Introduisez la chaîne à supprimer : "). else printf("\a###BOT_TEXT###quot;%s###BOT_TEXT###quot; n'est pas une valeur " "rationnelle correcte. isdigit(CH[I]). /* Recherche de OBJ dans SUJ */ TROUVE=0. /* Calcul de l'exposant à partir du signe */ /* SIGE. /* Traitement de la valeur de l'exposant */ for (EXP=0. /* Maintenant I indique la position de OBJ */ /* dans SUJ et J indique la longueur de OBJ */ 113 WAFAE SABBAR . */ if (TROUVE) { I--. */ if (SUJ[I]==OBJ[0]) { /* alors comparer le reste de la chaîne */ for (J=1. /* chaîne à transformer */ char OBJ[100]. /* chaîne à supprimer dans SUJ */ int I. printf("Introduisez la chaîne à transformer : "). } Exercice 7. /* indice courant dans OBJ */ int TROUVE. OBJ[J] && (OBJ[J]==SUJ[I+J]). SUJ[I] && !TROUVE.DEC. gets(SUJ). gets(OBJ). if (CH[I]=='-' || CH[I]=='+') I++.h> main() { /* Déclarations */ char SUJ[100].21 #include <stdio. if (OBJ[J]=='###BOT_TEXT###') TROUVE=1. J++) .

copier ensuite CH2 et FIN dans SUJ. if (CH1[J]=='###BOT_TEXT###') TROUVE=1. gets(CH1).for (. /* indice courant dans CH1 et CH2 */ int K. /* chaîne de sauvegarde pour */ /* la fin de SUJ. gets(CH2). K++. /* chaîne de remplacement */ char FIN[100].h> main() { /* Déclarations */ char SUJ[100]. /* chaîne à rechercher */ char CH2[100]. */ if (TROUVE) { I--. } /* Si CH1 a été trouvée dans SUJ alors sauvegarder la fin */ /* de SUJ dans FIN. return 0. /* chaîne à transformer */ char CH1[100]. I++) if (SUJ[I]==CH1[0]) { for (J=1. FIN[K]='###BOT_TEXT###'. /* indicateur logique qui précise */ /* si la chaîne OBJ a été trouvée */ /* Saisie des données */ printf("Introduisez la chaîne à rechercher CH1 : "). SUJ). gets(SUJ). /* indice courant dans SUJ */ int J. printf("Introduisez la chaîne à remplacer CH2 : "). SUJ[K+I+J]. /* indice d'aide pour les copies */ int TROUVE. CH1[J] && (CH1[J]==SUJ[I+J]). CH2[K]. SUJ[I] && !TROUVE. } Exercice 7. SUJ[I]='###BOT_TEXT###'. printf("Introduisez la chaîne à transformer SUJ : "). /* Copier CH2 dans SUJ */ for (K=0. K++) FIN[K]=SUJ[K+I+J]. */ int I. for (I=0. 114 WAFAE SABBAR . /* Maintenant I indique la position de CH1 */ /* dans SUJ et J indique la longueur de CH1 */ /* Sauvegarder la fin de SUJ dans FIN */ for (K=0. I++) SUJ[I]=SUJ[I+J]. J++) . } /* Affichage du résultat */ printf("Chaîne résultat : ###BOT_TEXT###quot;%s###BOT_TEXT###quot;\n".I++) SUJ[I]=CH2[K]. SUJ[I+J]. /* Recherche de CH1 dans SUJ */ TROUVE=0.22 #include <stdio.

printf("Introduisez la chaîne à transformer SUJ : "). gets(CH1). /* chaîne de sauvegarde pour */ /* la fin de SUJ. /* Recopier FIN dans SUJ */ for (K=0. /* Terminer la chaîne SUJ */ SUJ[I+K]='###BOT_TEXT###'. K++. CH2[K].I++) SUJ[I]=CH2[K]. FIN[K]. SUJ[K+I+J]./* Recopier FIN dans SUJ */ for (K=0. /* indice courant dans CH1 et CH2 */ int K. } /* Affichage du résultat */ printf("Chaîne résultat : ###BOT_TEXT###quot;%s###BOT_TEXT###quot;\n". */ for (K=0. gets(SUJ). /* indice d'aide pour les copies */ /* Saisie des données */ printf("Introduisez la chaîne à rechercher CH1 : "). gets(CH2). FIN[K]='###BOT_TEXT###'. K++) FIN[K]=SUJ[K+I+J]. FIN[K]. if (CH1[J]=='###BOT_TEXT###') /* TROUVE ! */ { /* Maintenant I indique la position de CH1 */ /* dans SUJ et J indique la longueur de CH1 */ /* Sauvegarder la fin de SUJ dans FIN */ for (K=0. */ int I. printf("Introduisez la chaîne à remplacer CH2 : "). SUJ).23 #include <stdio. J++) . 115 WAFAE SABBAR . K++. SUJ[I]. /* Copier CH2 dans SUJ et déplacer */ /* I derrière la copie de CH2. /* indice courant dans SUJ */ int J. K++) SUJ[I+K]=FIN[K].h> main() { /* Déclarations */ char SUJ[100]. /* chaîne à transformer */ char CH1[100]. /* chaîne à rechercher */ char CH2[100]. CH1[J] && (CH1[J]==SUJ[I+J]). I++) if (SUJ[I]==CH1[0]) { for (J=1. /* Terminer la chaîne SUJ */ SUJ[I]='###BOT_TEXT###'.I++) SUJ[I]=FIN[K]. /* Recherche de CH1 dans SUJ */ for (I=0. } Exercice 7. /* chaîne de remplacement */ char FIN[100]. return 0.

return 0. /* réajustement de l'indice I */ } } /* Affichage du résultat */ printf("Chaîne résultat : ###BOT_TEXT###quot;%s###BOT_TEXT###quot;\n". SUJ).I--. } 116 WAFAE SABBAR .

for (I=0. I<M. I<N. *(A+I)).8 . /* dimensions des tableaux */ int I. LES POINTEURS Exercice 8. I). for (I=0. &N ). I++) { printf("Elément %d : ". &M ). /* tableaux */ int N. I++) printf("%d ". /* indice courant */ /* Saisie des données */ printf("Dimension du tableau A (max. } /* Affichage des tableaux */ printf("Tableau donné A :\n"). 117 WAFAE SABBAR . for (I=0.h> main() { /* Déclarations */ int A[100]. scanf("%d". P1=&A P2=&C *P1=(*P2)++ P1=P2 P2=&B *P1-=*P2 ++*P2 *P1*=*P2 A=++*P2**P1 P1=&A 1 1 1 3 3 3 3 3 3 B C P1 P2 2 3 / / 2 3 &A / 2 3 &A &C 2 4 &A &C 2 4 &C &C 2 4 &C &B 2 2 &C &B 3 2 &C &B 3 6 &C &B 24 4 6 &C &B 24 4 6 &A &B 6 6 &A &B *P2=*P1/=*P2 6 Exercice 8.50) : "). B[50]. *(B+I)). I). printf("Tableau donné B :\n"). I++) { printf("Elément %d : ". scanf("%d".1 A Init. A+I). printf("\n"). scanf("%d". for (I=0. I<M. M.50) : "). I++) printf("%d ". } printf("Dimension du tableau B (max. scanf("%d". B+I). I<N.2 #include <stdio.

/* Edition du résultat */ printf("Tableau résultat A :\n"). Au moment où la condition est remplie. P). return 0. nous utilisons souvent des expressions de la forme: for (P=A . } Exercice 8. printf("\n").. I++) printf("%d ".h> main() { /* Déclarations */ int A[10]. P++) printf("%d ".. for (I=0. Exemple: #include <stdio. return 0. plus précisément sur le premier élément derrière le tableau.printf("\n").3 Solution: En traitant des tableaux à l'aide de pointeurs. Exercice 8. I++) *(A+N+I) = *(B+I). I<N. /* Nouvelle dimension de A */ N += M. for (P=A. P++) ou for (P=CH . . } A la fin des boucles. P<A+N . P<A+10.. } } ou les versions analogues avec while.4 Soit P un pointeur qui 'pointe' sur un tableau A: 118 WAFAE SABBAR . /* Copie de B à la fin de A */ for (I=0. P pointe déjà à l'extérieur du tableau. /* tableau */ int *P. /* pointeur dans A */ /* Saisie des données */ printf("Introduire 10 entiers : \n"). Dans ces boucles. *P). I<M. P++) scanf("%d". printf("\n"). /* Affichage du tableau */ printf("Tableau donné A :\n"). P contient l'adresse A+10 et pointe donc sur l'élément A[10] qui ne fait plus partie du tableau. P<A+10. P++) { { . for (P=A.. *P . le pointeur P est incrémenté à la fin du bloc d'instruction et comparé ensuite à la condition de la boucle. *(A+I)).

/* dimension du tableau int X. 78. scanf("%d". P1++) printf("%d ". } 119 WAFAE SABBAR . 34. /* Edition du résultat */ for (P1=A. /* Effacer toutes les occurrences de X et comprimer : */ /* Copier tous les éléments de P1 vers P2 et augmenter */ /* P2 pour tous les éléments différents de X. P1). printf("\n"). scanf("%d". /* pointeurs d'aide */ */ */ */ /* Saisie des données */ printf("Dimension du tableau (max. P1<A+N. return 0. if (*P2 != X) P2++. P1<A+N. int *P. P1++) { printf("Elément %d : ". 90}. P = A. /* tableau donné int N. Quelles valeurs ou adresses fournissent ces expressions: a) *P+2 => la valeur 14 b) *(P+2) c) &P+1 d) &A[4]-3 e) A+3 f) &A[7]-P g) P+(*P-10) => la valeur 34 => l'adresse du pointeur derrière le pointeur P (rarement utilisée) => l'adresse de la composante A[1] => l'adresse de la composante A[3] => la valeur (indice) 7 => l'adresse de la composante A[2] h) *(P+*(P+8)-A[7]) => la valeur 23 Exercice 8.h> main() { /* Déclarations */ int A[50]. P1<A+N. for (P1=A.int A[] = {12. 89.5 #include <stdio. P1++) printf("%d ". *P1). 23. 56. &X ). */ for (P1=P2=A. &N ). *P1).50) : "). /* valeur à éliminer int *P1. /* Affichage du tableau */ for (P1=A. } /* Nouvelle dimension de A */ N = P2-A. } printf("Introduire l'élément X à éliminer du tableau : "). 45. 67. printf("\n"). *P2. P1<A+N. P1-A). scanf("%d". P1++) { *P2 = *P1.

M. *P2 = AIDE. return 0.P2--) { AIDE = *P1. PA-A). scanf("%d". /* dimensions des tableaux */ int *PA. *P1 = *P2. scanf("%d". /* pointeurs d'aide */ /* Saisie des données */ printf("Dimension du tableau (max. P1-A). P1++) printf("%d ".*PB. /* pour la permutation */ int *P1.50) : "). PB++) { printf("Elément %d : ". &M ). P1<A+N. /* Inverser la tableau */ for (P1=A. P1<A+N. /* tableaux */ int N. 120 WAFAE SABBAR . } /* Affichage du tableau */ for (P1=A. for (PA=A. PB-B). for (PB=B.6 #include <stdio. PA++) { printf("Elément %d : ". } printf("Dimension du tableau B (max. PB<B+M.7 #include <stdio. P1<P2.Exercice 8. P1).50) : "). *P1).P2=A+(N-1). for (P1=A. P1++) { printf("Elément %d : ".50) : "). B[50]. /* pointeurs d'aide */ /* Saisie des données */ printf("Dimension du tableau A (max. scanf("%d". /* dimension du tableau */ int AIDE. PA). } Exercice 8.h> main() { /* Déclarations */ int A[50]. printf("\n"). P1++. } /* Edition du résultat */ for (P1=A. P1++) printf("%d ". PA<A+N. /* tableau donné */ int N. PB). printf("\n"). scanf("%d". &N ).h> main() { /* Déclarations */ int A[100]. *P1). P1<A+N. scanf("%d". *P2. scanf("%d". &N ).

for (I=0 . printf("Tableau donné B :\n"). gets(CH). } b) en utilisant des pointeurs au lieu des indices numériques : 121 WAFAE SABBAR . PA<A+N. PA<A+N.PB=B . printf("\n"). *PA). /* Placer J sur la dernière lettre de la chaîne */ for(J=0. PA++.J--) if (CH[I] != CH[J]) PALI=0. PA++) printf("%d ". /* Affichage du résultat */ if (PALI) printf("La chaîne ###BOT_TEXT###quot;%s###BOT_TEXT###quot; est un palindrome. for (PA=A. PB<B+M. *PA). /* Edition du résultat */ printf("Tableau résultat A :\n").\n". return 0. CH).8 a) en utilisant uniquement le formalisme tableau #include <stdio.} /* Affichage des tableaux */ printf("Tableau donné A :\n").\n". for (PB=B. for (PA=A. CH).PB++) *PA = *PB. } Exercice 8. J++) .h> main() { /* Déclarations */ char CH[101]. /* chaîne donnée */ int I. return 0. PB<B+M . /* indicateur logique: */ /* vrai si CH est un palindrome */ /* Saisie des données */ printf("Entrez une ligne de texte (max. CH[J]. /* Nouvelle dimension de A */ N += M. I++. PALI && I<J . printf("\n"). PA++) printf("%d ". PB++) printf("%d ".J. printf("\n"). /* Contrôler si CH est un palindrome */ PALI=1. else printf("La chaîne ###BOT_TEXT###quot;%s###BOT_TEXT###quot; n'est pas un palindrome. /* indices courants */ int PALI.100 caractères) :\n"). J--. *PB). /* Copier B à la fin de A */ for (PA=A+N.

/* pointeur d'aide */ 122 WAFAE SABBAR .10 #include <stdio. return 0.\n". /* chaîne donnée */ char *P. P1++. else printf("La chaîne ###BOT_TEXT###quot;%s###BOT_TEXT###quot; n'est pas un palindrome. P-CH).h> main() { /* Déclarations */ char CH[101]. /* Placer P2 sur la dernière lettre de la chaîne */ for (P2=CH. P++) .9 #include <stdio. /* Contrôler si CH est un palindrome */ PALI=1.*P2.\n". P2--.#include <stdio.P2--) if (*P1 != *P2) PALI=0.h> main() { /* Déclarations */ char CH[101].\n". } Exercice 8. /* pointeur d'aide */ /* Saisie des données */ printf("Entrez une ligne de texte (max. CH). for (P1=CH .h> main() { /* Déclarations */ char CH[101].h> #include <ctype. gets(CH). /* chaîne donnée */ char *P1. CH). } Exercice 8.100 caractères) :\n"). /* chaîne donnée */ char *P. *P2. CH. /* Placer P à la fin de la chaîne */ for (P=CH. /* Affichage du résultat */ printf("La chaîne ###BOT_TEXT###quot;%s###BOT_TEXT###quot; est formée de %d caractères. PALI && P1<P2 . /* pointeurs d'aide */ int PALI. *P.100 caractères) :\n"). gets(CH). P2++) . /* Affichage du résultat */ if (PALI) printf("La chaîne ###BOT_TEXT###quot;%s###BOT_TEXT###quot; est un palindrome. /* indicateur logique: */ /* vrai si CH est un palindrome */ /* Saisie des données */ printf("Entrez une ligne de texte (max. return 0.

/* Attention aux parenthèses! */ if (*PCH>='a' && *PCH<='z') (*(ABC+(*PCH-'a')))++. /* nombre des mots */ int DANS_MOT. /* pointeur d'aide dans CH */ int ABC[26]. /* indicateur logique: */ /* vrai si P pointe à l'intérieur un mot */ /* Saisie des données */ printf("Entrez une ligne de texte (max. PABC<ABC+26. return 0. for (P=CH. N++. /* chaîne donnée */ char *PCH. /* pointeur d'aide dans ABC */ /* Saisie des données */ printf("Entrez une ligne de texte (max.int N.h> main() { /* Déclarations */ char CH[101]. N. gets(CH). else if (!DANS_MOT) { DANS_MOT=1. } Exercice 8. (N==1)?' ':'s'). P++) if (isspace(*P)) DANS_MOT=0.\n". CH). PABC++) *PABC=0.100 caractères) :\n"). /* compteurs des différents caractères */ int *PABC. PABC++) if (*PABC) printf(" %d\tfois la lettre '%c' \n".11 #include <stdio. return 0. *PABC. /* Compter les mots */ N=0. gets(CH). *PCH. DANS_MOT=0. PABC<ABC+26. PCH++) { if (*PCH>='A' && *PCH<='Z') (*(ABC+(*PCH-'A')))++. } /* Affichage du résultat (pour perfectionnistes) */ printf("La chaîne ###BOT_TEXT###quot;%s###BOT_TEXT###quot; \nest formée de %d mot%c. 'A'+(PABC-ABC)). } 123 WAFAE SABBAR .100 caractères) :\n"). CH. *P. for (PABC=ABC. */ printf("La chaîne ###BOT_TEXT###quot;%s###BOT_TEXT###quot; contient :\n". /* Compter les lettres */ for (PCH=CH. /* Initialiser le tableau ABC */ for (PABC=ABC. } /* Affichage des résultats */ /* (PABC-ABC) est le numéro de la lettre de l'alphabet.

si /* actuel dans CH1 a été trouvé */ et CH2 */ le caractère */ dans CH2.100 caractères) :\n"). */ for (P2=CH2. printf("Entrez la deuxième chaîne de caractères" " (max. gets(CH2). /* pointeur d'aide dans CH */ /* Saisie des données */ printf("Entrez une ligne de texte (max. CH). else P++.12 #include <stdio. while (*P) { if (*P==C) strcpy(P. /* pointeurs d'aide dans CH1 int TROUVE.100 caractères) :\n"). /* indicateur logique: vrai.h> #include <string. /* Comprimer la chaîne à l'aide de strcpy */ P=CH. */ /* Saisie des données */ printf("Entrez la première chaîne de caractères" " (max.h> #include <string.13 #include <stdio. /* chaîne donnée */ char C. /* Eliminer les lettres communes */ /* Idée: Parcourir CH2 de gauche à droite et contrôler */ /* pour chaque caractère s'il se trouve aussi dans CH1. printf("Entrez le caractère à éliminer (suivi de Enter) : "). *P2. P+1). /* chaînes données char *P1. C=getchar().Exercice 8. } Exercice 8. éliminer le caractère de CH1 à */ /* l'aide de strcpy. gets(CH).h> main() { /* Déclarations */ char CH1[101]. */ /* Si tel est le cas. /* lettre à éliminer */ char *P. for (P1=CH1 . P1++) if (*P2==*P1) { 124 WAFAE SABBAR .h> main() { /* Déclarations */ char CH[101]. return 0. } /* Affichage du résultat */ printf("Chaîne résultat : ###BOT_TEXT###quot;%s###BOT_TEXT###quot;\n". CH2[101]. *P1 && !TROUVE . P2++) { TROUVE = 0.100 caractères) :\n"). *P2. gets(CH1).

(P2-CH2) est alors la longueur de CH2. */ TROUVE=0. P1++) { for (P2=CH2 . /* chaînes données char *P1. return 0.TROUVE = 1. } } /* Affichage du résultat */ printf("Chaîne résultat : ###BOT_TEXT###quot;%s###BOT_TEXT###quot; \n". /* pointeurs d'aide dans CH1 int TROUVE. strcpy(P1. P1+1).15 #include <stdio.100 caractères) :\n"). CH1). alors P1 indique la position */ /* de la première occurence de CH2 dans CH1 et P2 pointe à */ /* la fin de CH2. /* indicateur logique: vrai. si /* actuel dans CH1 a été trouvé */ et CH2 */ le caractère */ dans CH2. /* Affichage du résultat */ printf("Chaîne résultat : ###BOT_TEXT###quot;%s###BOT_TEXT###quot; \n". *P2. P1+(P2-CH2)). /* Si CH2 se trouve dans CH1. } Exercice 8. CH2[101]. for (P1=CH1 . */ /* Saisie des données */ printf("Entrez la chaîne à transformer" " (max. *P1 && !TROUVE . CH1).h> #include <string. P1 est incrémenté. On pourrait aussi résoudre le problème à */ /* l'aide d'un troisième pointeur P3 parcourant CH1.100 caractères) :\n"). return 0. *P2 == *(P1+(P2-CH2)) . gets(CH1).14 #include <stdio. printf("Entrez la chaîne à supprimer " " (max. donc */ P1--. P2++) . /* Rechercher CH2 dans CH1 : */ /* L'expression P2-CH2 est utilisée pour déterminer l'indice */ /* de P2 dans CH2. gets(CH2). if (!*P2) TROUVE = 1. } /* A la fin de la boucle. } Exercice 8.h> main() { /* Déclarations */ 125 WAFAE SABBAR . */ if (TROUVE) strcpy(P1.h> main() { /* Déclarations */ char CH1[101].

} /* c) Interprétation de la matrice comme vecteur : */ /* Attention. for (J=0.int A[50][50]. I<N. J<M. for (I=0. /* indices courants */ /* Saisie des données */ printf("Nombre de lignes (max. *((int *)A+I*50+J)).h> main() { /* Déclarations */ int A[50][50]. /* matrice */ int N. M. &N ). printf("\n"). &M ). I++) printf("%7d ". scanf("%d". J<M. J<M. /* dimensions des matrices */ int I. /* dimensions de la matrice */ int I. I++) for (J=0. ce serait une faute grave d'afficher */ /*'simplement' les NxM premiers éléments de A ! */ printf("Matrice affichée comme vecteur :\n"). *((int *)A+I*50+J)). printf("Nombre de colonnes (max. /* matrice résultat */ int N. 126 WAFAE SABBAR . /* matrice donnée */ int C[50][50]. } /* b) Affichage de la transposée de A */ printf("Matrice transposée :\n"). /* indices courants */ /* Saisie des données */ printf("*** Matrice A ***\n").J). K.50) : "). J. I++) { for (J=0. I<N. scanf("%d". *((int *)A+I*50+J)). J++) { for (I=0. J++) { printf("Elément[%d][%d] : ". I++) for (J=0. I<N. M. /* matrice donnée */ int B[50][50]. J. printf("\n"). P. } /* a) Affichage de la matrice */ printf("Matrice donnée :\n"). I<N.16 #include <stdio. J<M. } Exercice 8. for (I=0. scanf("%d". /* Lecture de la matrice au clavier */ for (I=0. J++) printf("%7d". printf("\n"). J++) printf(" %d ". return 0. (int *)A+I*50+J).50) : ").I.

for (K=0.50) scanf("%d". scanf("%d". J++) { *((int *)C+I*50+J)=0. J++) { printf("Elément[%d][%d] : ". I++) { for (J=0. J<P. J++) { printf("Elément[%d][%d] : ". *((int *)C+I*50+J)). printf("\n"). J<P. I++) { for (J=0. J++) printf("%7d".J). &P ).I. scanf("%d". J++) printf("%7d". } return 0. J<P. I++) { for (J=0. *((int *)B+I*50+J)). J<M. } printf("Matrice donnée B :\n"). : "). (int *)B+I*50+J). &M ). J<M. for (I=0. (int *)A+I*50+J). *((int *)A+I*50+J)). J<P. M).50) scanf("%d". for (I=0. } printf("*** Matrice B ***\n"). I<N. I<M. I++) for (J=0. I<N. I<N. printf("Nombre de colonnes de B (max. for (I=0.I. } : "). J++) printf("%7d".J). printf("\n"). } 127 WAFAE SABBAR . printf("Nombre de lignes de B : %d\n". : "). I<N. I<M. printf("Nombre de colonnes de A (max.printf("Nombre de lignes de A (max. K++) *((int*)C+I*50+J) += *((int*)A+I*50+K) * *((int*)B+K*50+J). &N ). } /* Edition du résultat */ printf("Matrice résultat C :\n"). K<M. for (I=0. I++) for (J=0. I++) for (J=0. /* Affichage des matrices */ printf("Matrice donnée A :\n"). for (I=0.50) scanf("%d". printf("\n"). } /* Affectation du résultat de la multiplication à C */ for (I=0.

*P1 = *P2. for (I=0. P2--./* char AIDE. I<5. gets((char *)(TABCH+I)). 128 WAFAE SABBAR . } } /* Affichage des mots inversés */ for (I=0. } Exercice 8.50 caractères) : ". I++) puts((char *)(TABCH+I)). P1++.h> main() { /* Déclarations */ char TABCH[5][51]. *P2.17 #include <stdio. /* char *P1. I++) { P1 = P2 = (char *)(TABCH+I). /* Placer P2 à la fin de la chaîne */ while (*P2) P2++. } /* Inverser l'ordre des caractères à l'intérieur des mots */ for (I=0. /* int I. I). I<5. *P2 = AIDE.18 a) Représenter graphiquement la mémorisation des deux variables NOM1 et NOM2. return 0. /* sinon '###BOT_TEXT###' est placé au début de la chaîne */ while (P1<P2) { AIDE = *P1. P2--. /* tableau de chaînes de caractères */ pour la permutation des caractères */ pointeurs d'aide */ indice courant */ /* TABCH+I est l'adresse de la I-ième chaîne du tableau */ /* Il vaut mieux convertir TABCH+I en pointeur sur char */ /* Saisie des données */ printf("Entrez 5 mots :\n"). I<5.Exercice 8. I++) { printf("Mot %d (max.

"janvier". /* indicateur logique: */ /* vrai si la date entrée est correcte */ /* Saisie des données */ do { printf("Introduire le jour. "September". "avril". "mai".19 #include <stdio. "octobre". JOUR. "mars". puts(MFRAN[0]). "juillet". &MOIS. MOIS. "Dezember"}. MFRAN[MOIS]. scanf("%d %d %d". Pour des chaînes de caractères d'une longueur 'normale'. Pour trier le tableau de chaînes de caractères. int JOUR. ANNEE). il faut uniquement changer les pointeurs. 129 WAFAE SABBAR . le mois et l'année : "). "septembre". le tri d'un tableau de pointeurs est donc certainement plus rapide que le tri d'un tableau de chaînes de caractères. "März". "Juni". den %d. "juin". il faut changer tous les caractères des chaînes un à un. La durée d'une opération d'échange est dépendante de la longueur des chaînes de caractères. ANNEE). /* Affichage des dates */ printf("Luxembourg. "April". puts(MDEUT[0]). "Juli".h> main() { /* Tableaux de pointeurs sur des chaînes de caractères */ char *MFRAN[] = {"\aErreur d'entrée !". &ANNEE). La durée d'une opération d'échange est constante. "août". CORRECT=1. "Januar". (JOUR==1)?"er":"". %s %d \n".JOUR. "Februar". } } while (!CORRECT). &JOUR. "November".b) Pour trier les chaînes du tableau de pointeurs. "novembre". char *MDEUT[] = {"\aEingabefehler !". /* données pour la date */ int CORRECT. "février". "Mai". "Oktober". le %d%s %s %d \n". ANNEE. Exercice 8. if (JOUR<0||JOUR>31||MOIS<0||MOIS>12||ANNEE<0||ANNEE>3000) { CORRECT=0. "August". peu importe la longueur des chaînes. "décembre"}. printf("Luxemburg. MDEUT[MOIS].

/* et quitter le programme. */ if (TEXTE[I]) /* copier la phrase à l'adresse */ /* fournie par malloc.21 #include <stdio.J. for (I=0. for (I=0.. return 0. I<10.h> #include <string. . } Exercice 8.J=9 . */ exit(-1). else { /* sinon afficher un message d'erreur */ printf("\aPas assez de mémoire \n").h> #include <string. INTRO). I<10. /* chaîne pour l'introduction des données */ char *TEXTE[10]. I++.I).return 0. /* Réservation de la mémoire */ TEXTE[I] = malloc(strlen(INTRO)+1). } /* Afficher le tableau résultat */ puts("Contenu du tableau résultat :"). gets(INTRO).h> main() 130 WAFAE SABBAR . I<10. /* indices courants */ /* Saisie des données et allocation dynamique de mémoire */ puts("Introduire 10 phrases terminées chaque fois" " par un retour à la ligne :"). */ strcpy(TEXTE[I].. } Exercice 8. I++) puts(TEXTE[I]). I<J . /* S'il y a assez de mémoire. TEXTE[I] = TEXTE[J]. I++) { /* Lecture d'une phrase */ printf("Phrase %d : ". TEXTE[J] = PAIDE. /* pointeur d'aide pour l'échange des pointeurs */ int I. for (I=0. } } /* Afficher le tableau donné */ puts("Contenu du tableau donné :").h> #include <stdlib. /* Tableau des pointeurs sur les 10 chaînes */ char *PAIDE.h> #include <stdlib.J--) { PAIDE = TEXTE[I].h> main() { /* Déclarations */ char INTRO[500]. I++) puts(TEXTE[I]). /* Inverser l'ordre des phrases avec le pointeur PAIDE */ for (I=0.20 #include <stdio.

I<10. MOT[J])>0) MAX=J.%d :\n". */ exit(-1). I++) { /* Recherche de la dernière chaîne dans l'ordre */ /* lexicographique : Initialiser d'abord MAX avec */ /* l'indice d'une chaîne encore existante. /* S'il y a assez de mémoire. MAX++) . J<10. } 131 WAFAE SABBAR . J++) if (MOT[J]) puts(MOT[J]). else { /* sinon afficher un message d'erreur */ printf("\aPas assez de mémoire \n"). /* et quitter le programme.\n"). /* Tableau de pointeurs sur les 10 chaînes */ int MAX. gets(INTRO). J<10. /* Réservation de la mémoire */ MOT[I] = malloc(strlen(INTRO)+1). I<10. */ if (MOT[I]) /* copier la phrase à l'adresse */ /* fournie par malloc.{ /* Déclarations */ char INTRO[51]. INTRO). /* Affichage des mots restants */ printf("Passage No. I++) { /* Lecture d'une phrase */ printf("Phrase %d : ". getchar(). I). for (J=MAX. for (I=0../* chaîne pour l'introduction des données */ char *MOT[10]. J++) if (MOT[J] && strcmp(MOT[MAX]. } } /* Suppression des mots du tableau par ordre lexicographique */ for (I=0. */ strcpy(MOT[I]. !MOT[MAX] .J.. */ for (MAX=0 . for (J=0. } return 0. /* indice du prochain candidat à supprimer */ int I. printf("Poussez Enter pour continuer . */ /* Les conditions de la forme MOT[I] ou !MOT[I] */ /* contrôlent si la chaîne I a déjà été supprimée */ /* ou non. /* indices courants */ /* Saisie des données et allocation dynamique de mémoire */ puts("Introduire 10 phrases terminées chaque fois" " par un retour à la ligne :").. /* Suppression de la chaîne */ free(MOT[MAX]). . MOT[MAX]=0..I).

Exercice 8. } } /* Calcul de la longueur totale de la 'phrase' */ L=11. /* indices courants */ int L. MOT[J])>0) MAX=J. else { printf("\aPas assez de mémoire \n").h> #include <string. INTRO).I). /* Longueur de la phrase */ /* Saisie des données et allocation dynamique de mémoire */ puts("Introduire 10 phrases terminées chaque fois" " par un retour à la ligne :"). I++) { /* Recherche de la dernière chaîne dans l'ordre */ /* lexicographique : Initialiser d'abord MAX avec */ /* l'indice d'une chaîne encore existante. /* Réservation de la mémoire pour la 'phrase' */ PHRASE = malloc(L).h> main() { /* Déclarations */ char INTRO[51]. I<10. if (!PHRASE) { printf("\aPas assez de mémoire pour" " mémoriser la phrase. } /* Initialisation de la PHRASE */ PHRASE[0]='###BOT_TEXT###'./* chaîne pour l'introduction des données */ char *MOT[10]. /* pour les espaces et le symbole de fin de chaîne */ for (I=0. I++) { /* Lecture d'une phrase */ printf("Phrase %d : ". /* Copier la chaîne dans la PHRASE */ 132 WAFAE SABBAR . I++) L += (strlen(MOT[I])+1). MAX++) . */ for (MAX=0 . /* Pointeur cible */ int MAX. exit(-1). J<10. I<10. /* Tableau de pointeurs sur les 10 chaînes */ char *PHRASE.J. !MOT[MAX] . I<10.22 #include <stdio. for (I=0. /* Copier et supprimer les mots du tableau par */ /* ordre lexicographique */ for (I=0. /* Réservation de la mémoire */ MOT[I] = malloc(strlen(INTRO)+1). /* indice du prochain candidat à copier */ int I. J++) if (MOT[J] && strcmp(MOT[MAX]. if (MOT[I]) strcpy(MOT[I]. gets(INTRO). exit(-1).h> #include <stdlib. for (J=MAX.\n").

if (MOT[I]) strcpy(MOT[I]. /* Réservation de la mémoire */ MOT[I] = malloc(strlen(INTRO)+1).23 #include <stdio.MOT[MAX]). MOT[J] = MOT[J+1]. /* ligne à partir de laquelle MOT est trié */ int J." "). */ for (I=9 . 133 WAFAE SABBAR . MOT[MAX]=0. INTRO). /* Tableau de pointeurs sur les 10 chaînes */ int I. I<10.h> #include <string. } } /* Tri du tableau par propagation de l'élément maximal. I>0 . } /* Affichage de la PHRASE */ puts("Résultat :").h> #include <stdlib./* pour la permutation des pointeurs */ int FIN. /* ligne où la dernière permutation a eu lieu */ /* permet de ne pas trier un sous-ensemble déjà trié */ /* Saisie des données et allocation dynamique de mémoire */ puts("Introduire 10 phrases terminées chaque fois" " par un retour à la ligne :"). for (J=0. I=FIN) { FIN=0. exit(-1). gets(INTRO). else { printf("\aPas assez de mémoire \n"). for (I=0.I). AIDE = MOT[J]. /* chaîne pour l'introduction des données */ char *MOT[10]. /* indice courant */ char *AIDE. MOT[J+1] = AIDE. strcat(PHRASE. J<I.strcat(PHRASE. /* Suppression de la chaîne */ free(MOT[MAX]). } Exercice 8. return 0. J++) if (strcmp(MOT[J]. puts(PHRASE).h> main() { /* Déclarations */ char INTRO[51]. I++) { /* Lecture d'une phrase */ printf("Phrase %d : ".MOT[J+1])>0) { FIN=J.

for (I=0. I<10.} } /* Affichage du tableau */ puts("Tableau trié :"). I++) puts(MOT[I]). } 134 WAFAE SABBAR . return 0.

} 135 WAFAE SABBAR . printf("Introduire le scanf("%lf". printf("La surface du return 0. . \n". &R).h> double PI(void) { return 3.14159265. SURFACE(R)). suite .14159265.Déclarations locales des fonctions et définition 'top-down': #include <stdio. . } double PI(void) { return 3. LES FONCTIONS Exercice 9. . } . rayon du cercle : ").9 .1 a) Etablir la hiérarchie des appels pour les trois fonctions: b) Définir les fonctions d'après les trois méthodes décrites ci-dessus en ajoutant les déclarations manquantes. double SURFACE(double RAYON) { /* Déclaration locale de PI */ double PI(void). return PI()*RAYON*RAYON. cercle est %f. } de SURFACE */ RAYON).h> main() { /* Déclaration locale double SURFACE(double double R.Définition 'bottom-up' sans déclarations: #include <stdio.

} double PI(void) { return 3. printf("Introduire le rayon du cercle : "). 136 WAFAE SABBAR . SURFACE(R)). printf("La surface du cercle est %f.14159265.. printf("Introduire le rayon du cercle : "). } double SURFACE(double RAYON) { return PI()*RAYON*RAYON. \n". } main() { double R. Cette incompatibilité de type ("Type mismatch") est signalée par un message d'erreur et le programme ne peut pas être compilé avec succès.double SURFACE(double RAYON) { return PI()*RAYON*RAYON. SURFACE(R)).Déclaration globale des fonctions et définition 'top-down': #include <stdio. Le compilateur suppose alors par défaut que la fonction fournit un résultat du type int et que les paramètres ont le type des arguments utilisés lors de l'appel.. return 0. &R). double PI(void). scanf("%lf".. } c) Si nous compilons le programme donné sans changements.h> /* Déclaration globale des fonctions */ double SURFACE(double RAYON). le compilateur détecte une incompatibilité de type. return 0. : Call to function 'SURFACE' with no prototype Error .. printf("La surface du cercle est %f. En rencontrant ensuite la définition de la fonction. Cet avertissement restera sans conséquences si ces suppositions sont correctes. \n". nous obtenons les messages suivants: Warning . : Type mismatch in redeclaration of 'SURFACE' Explications: Le premier message est un avertissement qui nous informe que la fonction SURFACE est appelée sans être déclarée auparavant. main() { double R. &R). scanf("%lf". } . car la fonction SURFACE retourne en réalité une valeur du type double.

/* Prototype de la fonction appelée */ int A. B=0.Exercice 9. printf("%d %d \n". int *Y). printf("%d %d \n". P(A.h> main() { void P(int X. &B). X. } Exercice 9. B). A=0. } void P(int X. *Y). *Y = *Y+1.3 Affichage: 2 2 1000 2 Implémentation: 137 WAFAE SABBAR .2 Affichage: 1 1 01 Implémentation: #include <stdio. int *Y) { X = X+1.B. A. return 0.

&B. A=3. printf("%d \n". return 0. printf("%d %d %d \n". MACHIN(A). B=-8. 138 WAFAE SABBAR .#include <stdio. X). int *Z) { int T. int *Y. C). C). return 0.h> main() { void MACHIN(int X).C. T = X. printf("%d \n". A. A=2. int *Z).h> main() { void MODIFIER(int X. C=12. A). X = *Y. B. A. } void MODIFIER(int X.&C). printf("%d \n". int *Y. A). } void MACHIN(int X) { printf("%d \n".4 Affichage: 3 -8 12 3 12 3 Implémentation: #include <stdio. /* Prototype */ int A. MODIFIER(A.B. *Y = *Z. B. X). printf("%d %d %d \n". X = 1000. } Exercice 9. /* Prototype de la fonction appelée */ int A.

printf("%d %d %d \n". Y = Y*2.h> main() { void MANIPULER(int X. } Exercice 9. *Z = X+Y. B.C. 5 5 10 5 -34 -34 114 114 Implémentation: #include <stdio. /* Prototype */ int A. int *Z) { printf("%d %d %d \n". X = X/2.B. Y. return 0.6 #include <stdio.&C).5 Affichage: 208 208 104 208 suite .*Z = T. . } void MANIPULER(int X. X. *Z). A=208. } Exercice 9.h> main() { /* Prototypes des fonctions appelées */ float MOYENNE(float X. MANIPULER(A. int Y. /* Traitements */ 139 WAFAE SABBAR . A. float Y). *Z). C=-34. X. printf("%d %d %d \n". /* Variables locales */ float A. C). C). int Y. A. Y. B=5.B. . printf("%d %d %d \n". int *Z).B. B.

float Y) { return (X+Y)/2. A. &A). /* Traitements */ printf("Introduire un réel X : "). %d) = ".2f . } void EXP2(double *X. A). int N). *X = AIDE. void EXP2(double *X. printf("Introduire l'exposant positif N : "). } double EXP1(double X.7 #include <stdio. &B). for (RES=1. } Exercice 9. A. EXP1(A. /* b */ /* Comme la valeur initiale de A est perdue à l'appel */ /* de EXP2. &B). N--) RES *= X. int B. N>0. printf("%f\n". B).4f\n".0. B. printf("La moyenne arithmétique de %. A. &A. N>0. int N) { double RES. MOYENNE(A.0. scanf("%d". return 0. } float MOYENNE(float X. B). 140 WAFAE SABBAR .printf("Introduire deux nombres : "). return 0. } Remarque: Cette solution de EXP2 respecte automatiquement le cas où N=0.B)). int N). /* a */ printf("EXP1(%.B)).h> main() { /* Prototypes des fonctions appelées */ double EXP1(double X.2f et %. EXP2(&A. scanf("%lf". N--) AIDE *= *X. scanf("%f %f". return RES. il faut partager l'affichage si on veut */ /* afficher la valeur de A avant et après l'appel ! */ printf("EXP2(%. %d) = %f\n". /* Variables locales */ double A. int N) { double AIDE.2f .2f est %. B. for (AIDE=1.

B). printf("Le maximum des 4 réels est %f \n".D. /* Traitements */ printf("Introduire 4 réels : ").B). MAX(C. MIN( MIN(A. MIN(C. double MAX(double X. double Y). return 0. scanf("%lf %lf %lf %lf".h> #include <math.Exercice 9. double Y) { return (X<Y) ? X : Y. /* Variables locales */ int I. } /* ou bien */ /* double MIN(double X.D)) ). 141 WAFAE SABBAR . } */ Exercice 9.D)) ). double Y). MAX( MAX(A.B.h> main() { /* Prototypes des fonctions appelées */ double F(int X).8 #include <stdio. &D). else return Y. &A. &B. double Y) { if (X>Y) return X. } double MAX(double X. double Y) { return (X>Y) ? X : Y. else return Y.9 #include <stdio.h> main() { /* Prototypes des fonctions appelées */ double MIN(double X. /* Variables locales */ double A.C. } double MAX(double X. } double MIN(double X. &C. printf("Le minimum des 4 réels est %f \n". double Y) { if (X<Y) return X.

scanf("%d". printf("La factorielle de %d est %. F(I)). N>10. I++) N /= 10. &N). */ int I. /* Variables locales */ int N.h> main() { /* Prototypes des fonctions appelées */ double FACT(int N). &A).h> main() { /* Prototypes des fonctions appelées */ int NCHIFFRES(long N). /* Conversion du signe si N est négatif */ if (N<0) N *= -1. N peut être */ /* modifié à l'intérieur de la fonction.NCHIFFRES(A)). } Exercice 9.10 #include <stdio.11 #include <stdio. /* Traitements */ printf("Introduire un nombre entier N : ").A . printf("Le nombre %ld a %d chiffres. /* Traitements */ printf("Introduire un nombre entier : "). } 142 WAFAE SABBAR . } double F(int X) { return sin(X)+log(X)-sqrt(X). return 0.\n". FACT(N)). /* Compter les chiffres */ for (I=1. /* Variables locales */ long A. return 0. scanf("%ld". for (I=1 . return I.N . I<=10 . I.0f \n"./* Traitements */ printf("\tX\tF(X)\n"). } int NCHIFFRES(long N) { /* Comme N est transmis par valeur. I++) printf("\t%d\t%f\n". } Exercice 9. return 0.

} void TRIANGLE(int LIGNES) { /* Prototypes des fonctions appelées */ void LIGNEC(int P).12 Il y a beaucoup de solutions possibles à ce problème.Q)). } double C(int P. printf("\n"). 143 WAFAE SABBAR . */ double RES. N>0 . /* Variables locales */ int N. Q<=P. TRIANGLE(N).h> main() { /* Prototypes des fonctions appelées */ void TRIANGLE(int LIGNES). P<LIGNES.double FACT(int N) { /* Comme N est transmis par valeur. for (RES=1. scanf("%d". /* Traitements */ for (P=0.0 . Voici probablement la solution la plus modulaire. N peut être */ /* modifié à l'intérieur de la fonction. } void LIGNEC(int P) { /* Prototypes des fonctions appelées */ double C(int P. /* Traitements */ printf("Introduire le nombre de lignes N : "). int Q) { /* Prototypes des fonctions appelées */ double FACT(int N). /* Traitements */ for (Q=0. } Exercice 9. Q++) printf("%6. return 0. &N). C(P. P++) LIGNEC(P). #include <stdio. int Q). N--) RES *= N. return RES. /* Variables locales */ int P. /* Variables locales */ int Q.0f".

/* Dimension du tableau */ /* Traitements */ LIRE_TAB (T. scanf("%d". int N). TAB+I). } } Exercice 9. /* Tableau d'entiers */ int DIM. I<*N. . &DIM. int NMAX) { /* Variables locales */ int I.14 void ECRIRE_TAB (int *TAB. /* Attention: écrire N et non &N ! */ } while (*N<0 || *N>NMAX). } Exercice 9. N). printf("Tableau donné : \n"). long SOMME_TAB(int *TAB. I++) { printf("Elément[%d] : ".16 #include <stdio. . void ECRIRE_TAB (int *TAB. scanf("%d". 144 WAFAE SABBAR . int N) { /* Affichage des composantes du tableau */ while(N) { printf("%d ". } Exercice 9./* Traitements */ return FACT(P)/(FACT(Q)*FACT(P-Q)). } printf("\n"). 100). *TAB). int N). int NMAX). TAB++. int *N. /* Saisie des composantes du tableau */ for (I=0. N--. int *N.13 void LIRE_TAB (int *TAB.h> main() { /* Prototypes des fonctions appelées */ void LIRE_TAB (int *TAB. } double FACT(int N) { . /* Variables locales */ int T[100].%d) : ". NMAX). /* Saisie de la dimension du tableau */ do { printf("Dimension du tableau (max. I).

int N). while (SAUT>1) { SAUT /= 2. /* Tableau d'entiers */ int DIM. } void ECRIRE_TAB (int *TAB. ECRIRE_TAB (T.17 Tri de Shell #include <stdio. DIM). void LIRE_TAB (int *TAB. . } void TRI_SHELL(int *T. /* Dimension du tableau */ /* Traitements */ LIRE_TAB (T. int N) { /* Trie un tableau T d'ordre N par la méthode de Shell */ /* Prototypes des fonctions appelées */ void PERMUTER(int *A. M. return 0. int NMAX) { . K. ECRIRE_TAB (T. printf("Tableau donné : \n"). DIM). /* Variables locales */ int SAUT.h> main() { /* Prototypes des fonctions appelées */ void TRI_SHELL(int *T. int *N. } long SOMME_TAB(int *TAB. 100). void ECRIRE_TAB (int *TAB. &DIM. printf("Tableau trié : \n"). int *B). . . DIM) ). int *N. printf("Somme des éléments du tableau : %ld\n". int N) { . TRI_SHELL(T. do 145 WAFAE SABBAR .ECRIRE_TAB (T. int N) { . int NMAX). /* Variables locales */ int T[100]. SOMME_TAB(T. DIM). } Exercice 9. . return 0. } void LIRE_TAB (int *TAB. int TERMINE. . . /* Traitements */ SAUT = N. int N). DIM).

return MAX. } b) la fonction MAX2 retourne l'indice de l'élément maximal int MAX2(int *TAB. int *B) { int AIDE. . I<N. *B = AIDE. 146 WAFAE SABBAR . AIDE = *A.T+K). . int *N. M++) /* Attention aux indices! */ { K=M+SAUT.MAX. for (I=1. if (*(T+M) > *(T+K)) { PERMUTER(T+M. . *A = *B. . I<N. int N) { int I. /* Attention: utiliser la négation de */ } /* la condition employée en lang algorithmique */ } void PERMUTER(int *A. int NMAX) { . } void ECRIRE_TAB (int *TAB. int N) { . int N) { int MAX.I. I++) if (MAX < *(TAB+I)) MAX = *(TAB+I). } void LIRE_TAB (int *TAB.{ TERMINE=1. for (M=0. } Exercice 9. } } } while(!TERMINE). I++) if (*(TAB+MAX) < *(TAB+I)) MAX = I. TERMINE=0. /* variables d'aide */ MAX=*TAB. /* variables d'aide */ MAX=0. return MAX.18 Déterminer le maximum de N éléments d'un tableau TAB d'entiers de trois façons différentes: a) la fonction MAX1 retourne la valeur maximale int MAX1(int *TAB. M<N-SAUT. for (I=1.

int N) { int *MAX.DIM) ). } Ecrire un programme pour tester les trois fonctions: #include <stdio. *P. int MAX2 (int *TAB. int N) { . . int *MAX3(int *TAB. } int MAX2(int *TAB. int NMAX) { . return 0. . . return MAX. 147 WAFAE SABBAR . printf("MAX3 : %d \n". . 100).DIM) ). void LIRE_TAB (int *TAB. DIM). } int MAX1(int *TAB. printf("MAX2 : %d \n". int N) { . ECRIRE_TAB (T. . . . MAX1(T. int *N. /* pointeurs d'aide */ MAX=TAB. void ECRIRE_TAB (int *TAB. T[MAX2(T. } void LIRE_TAB (int *TAB. int *N. /* Tableau d'entiers */ int DIM. } int *MAX3(int *TAB. &DIM. int N). *MAX3(T.h> main() { /* Prototypes des fonctions appelées */ int MAX1 (int *TAB. int NMAX). printf("Tableau donné : \n"). int N). int N).} c) la fonction MAX3 retourne l'adresse de l'élément maximal int *MAX3(int *TAB. /* Variables locales */ int T[100]. P<TAB+N. /* Dimension du tableau */ /* Traitements */ LIRE_TAB (T. printf("MAX1 : %d \n".DIM)] ). P++) if (*MAX < *P) MAX=P. . int N) { . int N). for (P=TAB.

int NMAX) { . . I<N-1 . I++) PERMUTER(T+I. /* rang à partir duquel T n'est pas trié */ /* Tri par sélection directe du maximum */ for (I=0 . int N). DIM). .h> main() { /* Prototypes des fonctions appelées */ void TRI_SELECTION(int *T.N-I) ). int N) { . int N) { . int *B) { . int NMAX). . . ECRIRE_TAB (T. MAX3(T+I. printf("Tableau donné : \n").} void ECRIRE_TAB (int *TAB. . printf("Tableau trié : \n"). . int *B).19 Tri par sélection #include <stdio. int N) { /* Prototypes des fonctions appelées */ void PERMUTER(int *A. /* Variables locales */ int T[100]. 100). DIM). } void LIRE_TAB (int *TAB. TRI_SELECTION(T. /* Variables locales */ int I. } int *MAX3(int *TAB. int *N. &DIM. /* Dimension du tableau */ /* Traitements */ LIRE_TAB (T. /* Tableau d'entiers */ int DIM. return 0. int N). DIM). } Exercice 9. void LIRE_TAB (int *TAB. . } void PERMUTER(int *A. ECRIRE_TAB (T. int *N. void ECRIRE_TAB (int *TAB. } 148 WAFAE SABBAR . int N). int *MAX3(int *TAB. . } void TRI_SELECTION(int *T.

I>0 && *(T+I-1)>X . . } Exercice 9. /* Dimension du tableau */ int A. T. */ for (I=*N . return 0. void LIRE_TAB (int *TAB. DIM). int NMAX) { . ECRIRE_TAB (T. . /* Tableau d'entiers */ int DIM. /* X est copié à la position du dernier élément déplacé */ *(T+I)=X. int *N. . . scanf("%d". int N) { . } void INSERER(int X. printf("Tableau donné : \n"). DIM). int N). void ECRIRE_TAB (int *TAB. /* Insertion de X dans le tableau T supposé trié: */ /* Déplacer les éléments plus grands que X d'une */ /* position vers l'arrière. I--) *(T+I) = *(T+I-1). . &DIM).h> main() { /* Prototypes des fonctions appelées */ void INSERER(int X. 100). INSERER(A. int N) { . ECRIRE_TAB (T. int *N. } void ECRIRE_TAB (int *TAB. &DIM. int NMAX). int *T.void ECRIRE_TAB (int *TAB. int *T. &A). . /* Nouvelle dimension du tableau: */ (*N)++.20 #include <stdio. /* Attention aux parenthèses ! */ } void LIRE_TAB (int *TAB. int *N). int *N) { /* Variables locales */ int I. printf("Tableau résultat : \n"). printf("Introduire le nombre à insérer : "). /* Variables locales */ int T[100]. /* Nombre à insérer */ /* Traitements */ LIRE_TAB (T. } 149 WAFAE SABBAR .

ECRIRE_TAB (T. . void LIRE_TAB (int *TAB. /* Variables locales */ int T[100]. printf("Tableau donné : \n"). int NMAX). . /* Variables locales */ int I. . int N). int NMAX) { . } void TRI_INSERTION(int *T. int *T. int *N. 150 WAFAE SABBAR . printf("Tableau trié : \n"). } void ECRIRE_TAB (int *TAB.h> main() { /* Prototypes des fonctions appelées */ void TRI_INSERTION(int *T. int N). . DIM). } Exercice 9. &DIM. void ECRIRE_TAB (int *TAB. } void LIRE_TAB (int *TAB. int *N). /* Tableau d'entiers */ int DIM.Exercice 9. T. int N) { . } void INSERER(int X. /* Dimension du tableau */ /* Traitements */ LIRE_TAB (T. . while (I<N) INSERER(*(T+I). &I).21 Tri par insertion #include <stdio. int *Y) { int AIDE. DIM). int *N. ECRIRE_TAB (T. DIM). int N) { void INSERER(int X. . if (*X>*Y) { AIDE = *X. return 0. 100). int *T. int *N) { . TRI_INSERTION(T. /* indice courant */ /* Tri de T par insertion */ I=1.22 int RANGER(int *X.

&DIM. int N). /* Tableau d'entiers */ int DIM. 100). I=FIN) { FIN=0.23 Tri par propagation #include <stdio. */ /* Tri de T par propagation de l'élément maximal */ for (I=N-1 . *Y = AIDE. . } void ECRIRE_TAB (int *TAB. int N) { /* Prototypes des fonctions appelées */ int RANGER(int *X. ECRIRE_TAB (T. /* Dimension du tableau */ /* Traitements */ LIRE_TAB (T. /* Variables locales */ int T[100]. } 151 WAFAE SABBAR . ECRIRE_TAB (T. J++) if (RANGER(T+J. int *Y). } void LIRE_TAB (int *TAB. } void TRI_BULLE(int *T. J<I. for (J=0. /* position où la dernière permutation a eu lieu */ /* permet de ne pas trier un sous-ensemble déjà trié. return 1. int *Y) { . return 0. int N). /* indices courants */ int FIN. int NMAX) { . TRI_BULLE(T. DIM). } else return 0. printf("Tableau donné : \n"). /* Variables locales */ int I. int *N. . void TRI_BULLE(int *T. I>0 .J. } Exercice 9. . printf("Tableau trié : \n"). void ECRIRE_TAB (int *TAB. T+J+1)) FIN = J.h> main() { /* Prototypes des fonctions appelées */ void LIRE_TAB (int *TAB. int *N. } } int RANGER(int *X.*X = *Y. . int NMAX). DIM). int N) { . . DIM). .

M). printf("Tableau B trié : \n"). N). void LIRE_TAB (int *TAB.FUS.B. TRI_BULLE(A. while ((IA<N) && (IB<M)) if (*(A+IA)<*(B+IB)) { *(FUS+IFUS)=*(A+IA). int *N. ECRIRE_TAB (B. } void FUSION(int *A.M). int *B. LIRE_TAB (B. int M) { /* Variables locales */ /* Indices courants dans A. int NMAX). printf("*** Tableau B ***\n"). /* Variables locales */ /* Les tableaux et leurs dimensions */ int A[100].IFUS. int N. IB=0. &N. alors */ /* copier le reste de l'autre tableau. FUS[200]. } else { FUS[IFUS]=B[IB]. int *FUS. ECRIRE_TAB (FUS. M. B et FUS */ int IA. int N.24 Fusion de tableaux triés #include <stdio. int *B.h> main() { /* Prototypes des fonctions appelées */ void FUSION(int *A. ECRIRE_TAB (A. N). */ while (IA<N) { *(FUS+IFUS)=*(A+IA). int N). int N. IFUS++. printf("Tableau FUS : \n"). M). /* Fusion de A et B dans FUS */ IA=0. B[100]. void ECRIRE_TAB (int *TAB. IB++. void TRI_BULLE(int *T. 100). IA++. IFUS++. } /* Si A ou B sont arrivés à la fin. IFUS++.N. return 0. printf("Tableau A trié : \n"). 152 WAFAE SABBAR . FUSION(A. LIRE_TAB (A. IFUS=0. int *FUS. 100). /* Traitements */ printf("*** Tableau A ***\n"). TRI_BULLE(B. int M). int N).Exercice 9.IB. N+M). &M.

int N) { . } int RANGER(int *X. int NMAX) { . . /* terminer la chaîne CH1 */ 153 WAFAE SABBAR . . } Exercice 9. . } Exercice 9. *CH. while (*CH2) /* copier CH2 à la fin de CH1 */ { *CH1 = *CH2. int *Y). . . CH1++. . . return P-CH. CH++) if (*CH>='a' && *CH<='z') *CH = *CH-'a'+'A'. CH2++. } *CH1='###BOT_TEXT###'. for (P=CH . *P. } void LIRE_TAB (int *TAB. .26 void MAJ_CH(char *CH) { for ( .IA++. } } void TRI_BULLE(int *T. } while (IB<M) { *(FUS+IFUS)=*(B+IB). int *Y) { . int *N. IFUS++. char *CH2) { while (*CH1) /* chercher la fin de CH1 */ CH1++. int N) { /* Prototypes des fonctions appelées */ int RANGER(int *X. . IB++. } void ECRIRE_TAB (int *TAB.25 int LONG_CH(char *CH) { char *P. } Exercice 9. P++) .27 void AJOUTE_CH(char *CH1.

Exercice 9. I++. . I<J .29 #include <ctype. } return N. /* Variables locales */ int I.J. } int LONG_CH(char *CH) { . *CH. } Comme la conditon d'arrêt est évaluée lors de l'affectation. } void PERMUTER_CH(char *A. else if (!DANS_MOT) { DANS_MOT=1. 154 WAFAE SABBAR .28 void INVERSER_CH (char *CH) { /* Prototypes des fonctions appelées */ int LONG_CH(char *CH). CH1++. /* Inverser la chaîne par permutations successives */ J = LONG_CH(CH)-1. for ( .J--) PERMUTER_CH(CH+I. char *B). for (I=0 . *CH1 = *CH2 . /* indicateur logique : */ /* vrai si CH pointe à l'intérieur d'un mot */ DANS_MOT=0.h> int NMOTS_CH(char *CH) { /* Variables locales */ int N. CH+J). char *CH2) { for ( . char *B) { char AIDE.} Solution plus compacte : void AJOUTE_CH(char *CH1. *CH1 . for (N=0. CH1++) . *A = *B. /* nombre de mots */ int DANS_MOT. CH2++) . } Exercice 9. CH++) if (isspace(*CH)) DANS_MOT=0. le symbole de fin de chaîne est aussi copié. AIDE = *A. . N++. void PERMUTER_CH(char *A. *B = AIDE.

char *CH2) { while (--N && *CH1==*CH2) { CH1++.30 #include <ctype.h> char *MOT_CH(int N. /* Variables locales */ int L. . } Exercice 9. char *CH1. } int LONG_CH(char *CH) { . } return (*CH1==*CH2).} Exercice 9. char *CH1. CH2)) CH2++. N--. char *CH2) { /* Prototypes des fonctions appelées */ int LONG_CH(char *CH). char *CH2). /* Pour réajuster l'effet de l'incrémentation */ } return CH. . CH++) if (isspace(*CH)) DANS_MOT=0. N>0 && *CH . char *CH) { /* Variables locales */ int DANS_MOT. CH1. char *CH2) { .32 char *CHERCHE_CH(char *CH1. while (*CH2 && !EGAL_N_CH(L. . char *CH1. } Exercice 9. else if (!DANS_MOT) { DANS_MOT=1. int EGAL_N_CH(int N.31 int EGAL_N_CH(int N. for ( . CH--. /* indicateur logique : */ /* vrai si CH pointe à l'intérieur d'un mot */ DANS_MOT=0. return CH2. /* Recherche de CH1 dans CH2 */ L=LONG_CH(CH1). 155 WAFAE SABBAR . . CH2++. } int EGAL_N_CH(int N.

/* Traitement des positions derrière le point décimal */ for (DEC=0.0 + (*CH-'0'). if (*CH=='-' || *CH=='+') CH++. if (*CH=='-' || *CH=='+') CH++. char *CH) { 156 WAFAE SABBAR . isdigit(*CH).33 long CH_ENTIER(char *CH) { /* Variables locales */ long N. /* Positions devant le point décimal */ for ( . int SIGNE. CH++) { N = N*10. /* résultat numérique */ int SIGNE. SIGNE = 1. /* Traitement du signe */ SIGNE = 1. isdigit(*CH). *CH>='0' && *CH<='9' .35 #include <stdio.h> double CH_DOUBLE(char *CH) { /* Variables locales */ double N. } /* Calcul de la valeur à partir du signe et */ /* du nombre de décimales. return SIGNE*N.0 + (*CH-'0'). if (*CH=='-') SIGNE = -1. DEC++. */ return SIGNE*N/pow(10.h> void ENTIER_CH(long N.') CH++. } Exercice 10.h> #include <math. /* signe de la valeur rationnelle */ int DEC. } Exercice 10. CH++) N = N*10 + (*CH-'0').34 #include <ctype.DEC). /* Traitement du point décimal */ if (*CH=='.0. /* Traitement du signe */ if (*CH=='-') SIGNE = -1. CH++) N = N*10. /* Conversion des chiffres */ for (N=0 .} Exercice 9. /* positions derrière la virgule */ /* Initialisation des variables */ N = 0.

. . void PERMUTER_CH(char *A.36 Solution: 157 WAFAE SABBAR . /* Conversion des chiffres (à rebours) */ I=0. } /* Terminer la chaîne */ *(CH+I)='###BOT_TEXT###'. . } while ((N/=10) > 0). I++. /* Variables locales */ int I. } void INVERSER_CH (char *CH) { /* Prototypes des fonctions appelées */ int LONG_CH(char *CH). char *B) { . . /* Inverser la chaîne */ INVERSER_CH(CH). /* Traitement du signe */ SIGNE = (N<0) ? -1 : 1. if (N<0) N=-N. do { *(CH+I) = N % 10 + '0'. } Exercice 10. } int LONG_CH(char *CH) { . . . } void PERMUTER_CH(char *A./* Prototypes des fonctions appelées */ void INVERSER_CH(char *CH). int SIGNE. I++. /* Ajouter le signe à la fin de la chaîne */ if (SIGNE<0) { *(CH+I)='-'. . char *B).

L. I>=L-4. char *B). char *CH) { /* Prototypes des fonctions appelées */ void INVERSER_CH(char *CH). . /* Variables locales */ int I.void DOUBLE_CH(double N. } int LONG_CH(char *CH) { . /* Conversion forcée est facultative */ L=LONG_CH(CH). .'. /* Conversion */ N *= 10000. } void INVERSER_CH (char *CH) { /* Prototypes des fonctions appelées */ int LONG_CH(char *CH). void PERMUTER_CH(char *A. CH). } void ENTIER_CH(long N. } void PERMUTER_CH(char *A. for (I=L.37 void LIRE_DIM (int *L. . I--) /* Libérer une position pour le */ *(CH+I+1) = *(CH+I). int *C. . } Exercice 10. . char *B) { . char *CH). int LMAX. */ *(CH+L-4)='. /* point décimal. char *CH) { /* Prototypes des fonctions appelées */ int LONG_CH(char *CH). . . ENTIER_CH((long)N. . . int CMAX) { 158 WAFAE SABBAR .0. . void ENTIER_CH(long N.

I<L. CMAX). scanf("%d". int C. CMAX). int L. void ECRIRE_MATRICE (int *MAT. int L. } } Exercice 9. int *C. void LIRE_DIM (int *L. int C. CMAX). J++) printf("%7d". int CMAX) { /* Variables locales */ int I. } while (*C<0 || *C>CMAX). I++) for (J=0. L. int L. C). *(MAT + I*CMAX + J)).%d) : ". et CMAX qui lit les composantes d'une matrice MAT du type int et de dimensions L et C. int L. void LIRE_MATRICE (int *MAT.J. } } Exercice 9. int C. I<L. L). /* Saisie des composantes de la matrice */ for (I=0. scanf("%d".38 void ECRIRE_MATRICE (int *MAT. int C. do { printf("Nombre de colonnes de la matrice (max. int CMAX) { /* Variables locales */ int I. } b) Ecrire la fonction LIRE_MATRICE à quatre paramètres MAT. J<C. int int int int CMAX). I++) { for (J=0. int C. int LMAX.J.39 #include <stdio. int L.%d) : ". C.LMAX).h> main() { /* Prototypes des fonctions appelées */ long SOMME_MATRICE (int *MAT. /* Affichage des composantes de la matrice */ for (I=0./* Saisie des dimensions de la matrice */ do { printf("Nombre de lignes de la matrice (max. MAT + I*CMAX + J). } while (*L<0 || *L>LMAX). I. scanf("%d". J<C. J++) { printf("Elément[%d][%d] : ".CMAX). void LIRE_MATRICE (int *MAT. J). printf("\n"). /* Variables locales */ 159 WAFAE SABBAR .

int *MAT2. int *C. /* Calcul de la somme */ for (I=0. int L. L. I<L. } void LIRE_DIM (int *L. void ECRIRE_MATRICE (int *MAT. ECRIRE_MATRICE ( (int*)M. long SOMME = 0.C.C. LIRE_MATRICE ( (int*)M. 30). 160 WAFAE SABBAR . /* Matrice d'entiers */ int L. int C. .L. /* Dimensions de la matrice */ /* Traitements */ LIRE_DIM (&L. J<C. L. . 30. SOMME_MATRICE( (int*)M.30). LIRE_MATRICE ((int*)M1. printf("*** Matrice 2 ***\n"). int CMAX). CMAX). &C. M2[30][30]. int L. } long SOMME_MATRICE(int *MAT. C. printf("*** Matrice 1 ***\n").30). int CMAX) { .C. int *C. . int CMAX) { . int LMAX. int L. L. } void LIRE_MATRICE (int *MAT. return 0.C. int C.int M[30][30]. int C.30)). int L. return SOMME. int LMAX.h> main() { /* Prototypes des fonctions appelées */ void ADDITION_MATRICE (int *MAT1. .30.&C. int CMAX) { . . C. int CMAX) { /* Variables locales */ int I. int C. } void ECRIRE_MATRICE (int *MAT. CMAX). CMAX). J++) SOMME += *(MAT + I*CMAX + J). /* Variables locales */ /* Les matrices et leurs dimensions */ int M1[30][30]. /* Traitements */ LIRE_DIM (&L. printf("Matrice donnée : \n"). void LIRE_DIM (int *L.J. printf("Somme des éléments de la matrice : %ld\n". int C.30). . int C.40 #include <stdio. void LIRE_MATRICE (int *MAT.30 ). int L. } Exercice 9. int int int int L. I++) for (J=0. int L.

int CMAX). int L. } void LIRE_DIM (int *L. printf("Matrice donnée : \n").L.C. printf("Matrice donnée 1 : \n"). /* Variables locales */ int M[30][30]. int L. I++) for (J=0. int C. int CMAX) { . } void ECRIRE_MATRICE (int *MAT.L. ECRIRE_MATRICE ((int*)M. int C.30). scanf("%d". int C. int CMAX) { . . &X). printf("Matrice donnée 2 : \n"). } void LIRE_MATRICE (int *MAT. int LMAX. . void ECRIRE_MATRICE (int *MAT.30 ).30. int *C. int CMAX). /* Dimensions de la matrice */ int X.L.30 ).L.C.L.30).30).J. J++) *(MAT1+I*CMAX+J) += *(MAT2+I*CMAX+J). /* Ajouter les éléments de MAT2 à MAT1 */ for (I=0. /* Traitements */ LIRE_DIM (&L.C. int C.C.30). printf("Introduire le multiplicateur (entier) : "). } Exercice 9. . int *MAT. void LIRE_DIM (int *L. int L. ECRIRE_MATRICE ((int*)M2. int *MAT2. void LIRE_MATRICE (int *MAT.C.&C.L. . int CMAX). ECRIRE_MATRICE ((int*)M1.41 #include <stdio. int CMAX). LIRE_MATRICE ((int*)M.C. int C.30).LIRE_MATRICE ((int*)M2. C. int CMAX) { /* Variables locales */ int I. int LMAX. . return 0. (int*)M2 . printf("Matrice résultat : \n").30). I<L. 161 WAFAE SABBAR . J<C. . } void ADDITION_MATRICE (int *MAT1.h> main() { /* Prototypes des fonctions appelées */ void MULTI_MATRICE(int X. int *C. int L. ADDITION_MATRICE( (int*)M1 . int L.C. int CMAX) { . int C. int L. ECRIRE_MATRICE ((int*)M1. /* Matrice d'entiers */ int L.L.

int LMAX. .&C. void ECRIRE_MATRICE (int *MAT. int *L. int CMAX) { . int L. int C.MULTI_MATRICE (X. int C. int CMAX) { /* Variables locales */ int I. /* Variables locales */ int M[30][30]. int CMAX). .(int*)M.L. int CMAX).J. int C. if (TRANSPO_MATRICE ((int*)M. int *C.L.C.30). } void LIRE_MATRICE (int *MAT. int C. int CMAX) { . int L.L. int *C.30). int L. int CMAX).42 #include <stdio.L. void LIRE_MATRICE (int *MAT. printf("Matrice donnée : \n").30.30). ECRIRE_MATRICE ((int*)M.C. printf("Matrice résultat : \n"). int LMAX. return 0. . LIRE_MATRICE ((int*)M. } 162 WAFAE SABBAR . int LMAX. } void LIRE_DIM (int *L. /* Matrice d'entiers */ int L. void LIRE_DIM (int *L. ECRIRE_MATRICE ((int*)M. . . } void ECRIRE_MATRICE (int *MAT. C.30).&L. J++) *(MAT+I*CMAX+J) *= X.C.&C. int *C.C. /* Dimensions de la matrice */ /* Traitements */ LIRE_DIM (&L. int L.30 ).C. I<L.L. } void MULTI_MATRICE(int X. int CMAX).30). int C. /* Multiplication des éléments */ for (I=0.h> main() { /* Prototypes des fonctions appelées */ int TRANSPO_MATRICE (int *MAT. int *MAT. return 0.30)) { printf("Matrice transposée : \n"). } else printf("\aLa matrice n'a pas pu être transposée\n").30. int L. . ECRIRE_MATRICE ((int*)M. I++) for (J=0. int CMAX) { . } Exercice 9. J<C.

. M3[30][30]. M. int CMAX). } void ECRIRE_MATRICE (int *MAT. else { DMAX = (*L>*C) ? *L : *C. int *B). . . /* la plus grande des deux dimensions */ /* Transposition de la matrice */ if (*L>CMAX || *C>LMAX) return 0. int CMAX) { . int *MAT3. int L. int LMAX.C). MAT+J*CMAX+I). } Exercice 9. int LMAX. int *L. int DUMMY. int L. I++) for (J=0. . . } } void PERMUTER(int *A. int C. int CMAX) { /* Prototypes des fonctions appelées */ void PERMUTER(int *A. int *C. int DMAX. int *MAT2. M2[30][30]. } void LIRE_MATRICE (int *MAT. for (I=0. int C. . int *C. int CMAX). /* pour la lecture de la première dimension de */ 163 WAFAE SABBAR . int CMAX) { . int C. J<I. int N. /* Variables locales */ /* Les matrices et leurs dimensions */ int M1[30][30]. int P. int LMAX.int TRANSPO_MATRICE (int *MAT. I<DMAX. int N. J++) PERMUTER (MAT+I*CMAX+J. int *B) { . int M. int *C. PERMUTER(L. int CMAX). void LIRE_DIM (int *L. int L. /* Variables locales */ int I. void LIRE_MATRICE (int *MAT.h> main() { /* Prototypes des fonctions appelées */ void MULTI_2_MATRICES (int *MAT1.J. void ECRIRE_MATRICE (int *MAT. . } void LIRE_DIM (int *L. int L. . /* échanger les dimensions */ return 1. P.43 #include <stdio. int CMAX) { . int CMAX). int C.

/* MAT2 à l'aide de LIRE_DIM. int CMAX) { . } } void LIRE_DIM (int *L. I<N.30). int M. int CMAX) { /* Variables locales */ int I.N.30). int *MAT2. (int*)M2 . I++) for (J=0. printf("Matrice résultat : \n").P. ECRIRE_MATRICE ((int*)M2.30). . J++) { *(MAT3+I*CMAX+J)=0. int *MAT3. . LIRE_MATRICE ((int*)M1. .30). J<P. return 0. ECRIRE_MATRICE ((int*)M1.J. . /* Multiplier MAT1 et MAT2 en affectant le résultat à MAT3 */ for (I=0.30.30). LIRE_MATRICE ((int*)M2.M.30 ).M. int L.P. */ /* Traitements */ printf("*** Matrice 1 ***\n"). .P. int CMAX) { . int C.30 ).N.&M. int LMAX.N.30. } void MULTI_2_MATRICES (int *MAT1. K++) *(MAT3+I*CMAX+J) += *(MAT1+I*CMAX+K) * *(MAT2+K*CMAX+J). (int*)M3 . LIRE_DIM (&DUMMY. } void LIRE_MATRICE (int *MAT. printf("*** Matrice 2 ***\n").K. for (K=0. N. . int *C.M. int P. } void ECRIRE_MATRICE (int *MAT.M.&P. int CMAX) { .M. int L. printf("Matrice donnée 1 : \n"). MULTI_2_MATRICES ((int*)M1 .P. ECRIRE_MATRICE ((int*)M3. int C. printf("Matrice donnée 2 : \n"). int N. K<M. LIRE_DIM (&N. } 164 WAFAE SABBAR .30).

NOM.\n". PRENOM). "%d\n%s\n%s\n". printf("Nombre d'enregistrements à créer : "). PRENOM). PRENOM[30]. } /* Saisie des données et création du fichier */ printf("*** Création du fichier %s ***\n". while (!feof(FICHIER)) { fscanf(FICHIER. scanf("%d". scanf("%s". NOM_FICH). } /* Fermeture du fichier */ fclose(FICHIER). /* Autres variables */ char NOM[30].PRENOM). NOM. MATRICULE). I<=N_ENR. for (I=1. } /* Affichage du fichier */ printf("*** Contenu du fichier %s ***\n".&MATRICULE). MATRICULE. /* Ouverture du fichier en lecture */ FICHIER = fopen(NOM_FICH.10 . if (!FICHIER) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.NOM). printf("Numéro de matricule : "). printf("Nom : "). "%d\n%s\n%s\n". int MATRICULE. exit(-1).h> #include <stdlib. NOM_FICH). int I. NOM_FICH). /* Ouverture du nouveau fichier en écriture */ FICHIER = fopen(NOM_FICH. scanf("%d". LES FICHIERS SEQUENTIELS Exercice 10.h> main() { /* Déclarations : */ /* Nom du fichier et pointeur de référence */ char NOM_FICH[] = "A:\INFORM. I). "w"). &MATRICULE. scanf("%s".&N_ENR). if (!FICHIER) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. "r"). I++) { printf("Enregistrement No: %d \n". FILE *FICHIER. exit(-1). fprintf(FICHIER.1 #include <stdio.N_ENR. 165 WAFAE SABBAR . printf("Prénom : ").TXT".\n". NOM_FICH). printf("Matricule : %d\t".

PRENOM[30]. } /* Copie de tous les enregistrements */ while (!feof(INFILE)) { fscanf (INFILE.2 #include <stdio. char NOUVEAU[] = "A:\INFBIS.TXT". } Exercice 10. return 0. PRENOM). "w"). &MATRICULE. } /* Fermeture des fichiers */ fclose(OUTFILE). fclose(INFILE). FILE *INFILE.TXT". } Exercice 10.h> main() { /* Déclarations : */ /* Noms des fichiers et pointeurs de référence */ char ANCIEN[] = "A:\INFORM. return 0. PRENOM). 166 WAFAE SABBAR . fprintf(OUTFILE.h> #include <stdlib. "%d\n%s\n%s\n". MATRICULE. exit(-1). int MATRICULE. ANCIEN). *OUTFILE.\n". "r"). } /* Fermeture du fichier */ fclose(FICHIER).h> main() { /* Déclarations : */ /* Noms des fichiers et pointeurs de référence */ char ANCIEN[] = "A:\INFORM. /* Ouverture de l'ancien fichier en lecture */ INFILE = fopen(ANCIEN.h> #include <stdlib.TXT". NOM.\n". NOUVEAU).printf("Nom et prénom : %s %s\n". NOM. if (!INFILE) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. } /* Ouverture du nouveau fichier en écriture */ OUTFILE = fopen(NOUVEAU. if (!OUTFILE) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. exit(-1). PRENOM). "%d\n%s\n%s\n". /* Autres variables */ char NOM[30].3 #include <stdio. NOM.

PRE_NOUV[30].4 #include <stdio. fprintf(OUTFILE. /* Autres variables */ char NOM[30].MATRI_NOUV. /* Fermeture des fichiers */ fclose(OUTFILE).TXT".\n".NOM_NOUV). if (!OUTFILE) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. scanf("%d". return 0.PRE_NOUV). MATRICULE. /* Ouverture de l'ancien fichier en lecture */ INFILE = fopen(ANCIEN. printf("Numéro de matricule : ").h> #include <string. *OUTFILE. if (!INFILE) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. exit(-1).TXT". FILE *INFILE. "%d\n%s\n%s\n". NOM. FILE *INFILE. printf("Prénom : "). "r"). "%d\n%s\n%s\n". int MATRICULE. PRENOM). *OUTFILE.h> main() { /* Déclarations : */ /* Noms des fichiers et pointeurs de référence */ char ANCIEN[] = "A:\INFORM."%d\n%s\n%s\n".h> #include <stdlib. PRENOM[30]. printf("Nom : "). } /* Saisie de l'enregistrement à ajouter */ printf("Enregistrement à ajouter : \n"). PRENOM). /* Copie des enregistrements de l'ancien fichier */ while (!feof(INFILE)) { fscanf (INFILE. } Exercice 10.PRE_NOUV).&MATRI_NOUV). fclose(INFILE). NOUVEAU). scanf("%s".char NOUVEAU[] = "A:\INFBIS.NOM_NOUV.TXT". int MATRI_NOUV. char NOM_NOUV[30]. } /* Ecriture du nouvel enregistrement à la fin du fichier */ fprintf(OUTFILE.\n". NOM. scanf("%s". "w"). char NOUVEAU[] = "A:\INFBIS. } /* Ouverture du nouveau fichier en écriture */ OUTFILE = fopen(NOUVEAU. ANCIEN). 167 WAFAE SABBAR . exit(-1). &MATRICULE.

/* Autres variables */ char NOM[30].\n"."%d\n%s\n%s\n". int MATRICULE. NOM. */ fprintf(OUTFILE. scanf("%d". "%d\n%s\n%s\n".NOM. if (strcmp(NOM.\n". int TROUVE. */ if (TROUVE) fprintf(OUTFILE. "%d\n%s\n%s\n". PRENOM).NOM_NOUV). NOM. printf("Prénom : "). celui à insérer.PRE_NOUV). printf("Numéro de matricule : "). /* Copie des enregistrements dont le nom */ /* précéde lexicogr. while (!feof(INFILE) && !TROUVE) { fscanf (INFILE. NOM_NOUV) > 0) TROUVE = 1. scanf("%s". int MATRI_NOUV. } /* Ecriture du nouvel enregistrement. MATRICULE. PRENOM[30]. &MATRICULE. exit(-1). NOM.NOM_NOUV. NOM.PRENOM). } 168 WAFAE SABBAR . /* et du dernier enregistrement lu. printf("Nom : ").&MATRI_NOUV). PRE_NOUV[30].PRE_NOUV). char NOM_NOUV[30]. "r"). MATRICULE. ANCIEN). "w").MATRI_NOUV. if (!INFILE) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. PRENOM). &MATRICULE. if (!OUTFILE) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. /* Ouverture de l'ancien fichier en lecture */ INFILE = fopen(ANCIEN. /* Copie du reste des enregistrements */ while (!feof(INFILE)) { fscanf (INFILE. */ TROUVE = 0. exit(-1). else fprintf(OUTFILE. "%d\n%s\n%s\n". } /* Ouverture du nouveau fichier en écriture */ OUTFILE = fopen(NOUVEAU. "%d\n%s\n%s\n". PRENOM). } /* Saisie de l'enregistrement à insérer */ printf("Enregistrement à ajouter : \n"). NOUVEAU). scanf("%s". PRENOM). "%d\n%s\n%s\n". MATRICULE. fprintf(OUTFILE.

fclose(INFILE). "%d\n%s\n%s\n". NOUVEAU). *OUTFILE. } b) Supprimer les enregistrements. exit(-1). } /* Fermeture des fichiers */ fclose(OUTFILE). &MATRICULE. /* Autres variables */ char NOM[30].\n". if (MATRICULE%10 != 8) fprintf(OUTFILE. /* Ouverture de l'ancien fichier en lecture */ INFILE = fopen(ANCIEN.\n". char NOUVEAU[] = "A:\INFBIS. MATRICULE. return 0. int MATRICULE. "r"). if (!INFILE) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.PRENOM). dont le numéro de matricule se termine par 8 #include <stdio. dont le prénom est "Paul" (utiliser strcmp) #include <stdio. "%d\n%s\n%s\n". PRENOM[30]. NOM. } /* Ouverture du nouveau fichier en écriture */ OUTFILE = fopen(NOUVEAU. ANCIEN). if (!OUTFILE) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. fclose(INFILE). return 0. "w"). */ while (!feof(INFILE)) { fscanf (INFILE.TXT".NOM./* Fermeture des fichiers */ fclose(OUTFILE).h> #include <stdlib.h> #include <stdlib. exit(-1).TXT".h> 169 WAFAE SABBAR .h> main() { /* Déclarations : */ /* Noms des fichiers et pointeurs de référence */ char ANCIEN[] = "A:\INFORM. } /* Copie de tous les enregistrements à l'exception */ /* de ceux dont le numéro de matricule se termine */ /* par 8.5 a) Supprimer les enregistrements. } Exercice 10. FILE *INFILE. PRENOM).

NOM. . . */ while (!feof(INFILE)) { fscanf (INFILE.PRENOM). CH<CH2. MATRICULE. /* Déclarations */ . /* Copie de tous les enregistrements à l'exception */ /* des palindromes. . . } /* Fermeture des fichiers */ . "%d\n%s\n%s\n". /* Ouverture du nouveau fichier en écriture */ . /* Contrôler si la chaîne désignée par CH est un palindrome */ for (. CH2--. PRENOM). "%d\n%s\n%s\n". &MATRICULE. } c) Supprimer les enregistrements. sinon la valeur zéro.PRENOM). . /* Ouverture du nouveau fichier en écriture */ .CH2--) 170 WAFAE SABBAR ."Paul") != 0) fprintf(OUTFILE. CH2++) . } /* Fermeture des fichiers */ .NOM. #include <stdio. MATRICULE. . CH++.h> main() { /* Déclarations */ . . /* Ouverture de l'ancien fichier en lecture */ . . */ while (!feof(INFILE)) { fscanf (INFILE. . dont le nom est un palindrome. . . if (strcmp(PRENOM. if (!PALI(NOM)) fprintf(OUTFILE. /* Copie de tous les enregistrements à l'exception */ /* de ceux dont le prénom est 'Paul'. *CH2. "%d\n%s\n%s\n". Définir une fonction d'aide PALI qui fournit le résultat 1 si la chaîne transmise comme paramètre est un palindrome. . } int PALI(char *CH) { /* Variable locale */ char *CH2. . . "%d\n%s\n%s\n".#include <string. . NOM. /* Placer CH2 à la fin de la chaîne */ for (CH2=CH. &MATRICULE. .h> #include <stdlib.h> main() { /* Prototype de la fonction PALI */ int PALI(char *CH). NOM. /* Ouverture de l'ancien fichier en lecture */ . PRENOM).

6 #include <stdio. scanf("%s". NOM). &N_ENFANTS). scanf("%s". return 1. scanf("%s". printf("Nombre d'enfants : ").TXT". enfant : ". PERE.&N_ENR). } /* Saisie des données et création du fichier */ printf("*** Création du fichier %s ***\n". printf("Nom de famille : ").if (*CH != *CH2) return 0. "w"). NOM_FICH). if (!FICHIER) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n". ENFANT). printf("Nombre d'enregistrements à créer : "). /* Réouverture du fichier */ FICHIER = fopen(NOM_FICH. /* Autres variables */ char NOM[30]. MERE[30]. J<=N_ENFANTS. } } /* Fermeture du fichier */ fclose(FICHIER). for (J=1.h> #include <stdlib. scanf("%d". } Exercice 10. FILE *FICHIER. "%s\n%s\n%s\n%d\n". int I. I). /* Ouverture du nouveau fichier en écriture */ FICHIER = fopen(NOM_FICH. printf("Prénom de la mère : "). N_ENFANTS). fprintf(FICHIER.N_ENFANTS. for (I=1. if (!FICHIER) { 171 WAFAE SABBAR . printf("Prénom du père : "). J++) { printf("Prénom %d. MERE). PERE[30]. J). I<=N_ENR. NOM_FICH). fprintf(FICHIER. "%s\n". "r"). ENFANT[30]. scanf("%d".N_ENR. exit(-1). ENFANT). scanf("%s". int J. NOM. MERE. I++) { printf("Enregistrement No: %d \n".h> main() { /* Déclarations : */ /* Nom du fichier et pointeur de référence */ char NOM_FICH[] = "A:\FAMILLE. PERE).

ENFANT. CHAINE). } /* Saisie des données et création du fichier */ printf("*** Création du fichier %s ***\n".\n". } while (CHAINE[0] != '*'). printf("Noms des enfants : \n". NOM_FICH).h> main() { /* Déclarations : */ /* Nom du fichier et pointeur de référence */ char NOM_FICH[] = "A:\MOTS. PERE. scanf("%s". } Exercice 10. NOM_FICH). CHAINE). /* Fermeture du fichier */ fclose(FICHIER). J<=N_ENFANTS. if (CHAINE[0] != '*') fprintf(FICHIER. J. /* Ouverture du nouveau fichier en écriture */ FICHIER = fopen(NOM_FICH. exit(-1). "%s\n". do { printf("Entrez un mot ('*' pour finir) : "). while (!feof(FICHIER)) { fscanf (FICHIER. PERE. N_ENFANTS). for (J=1. if (!FICHIER) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. NOM_FICH). MERE. NOM). NOM). printf("Nom de la mère : %s %s\n". MERE. printf("Nom du père : %s %s\n". "%s\n". "w"). NOM. } } /* Fermeture du fichier */ fclose(FICHIER). 172 WAFAE SABBAR . NOM). NOM).TXT". printf("\n"). /* Autres variables */ char CHAINE[50]. : %s %s\n". } /* Affichage du fichier */ printf("*** Contenu du fichier %s ***\n". J++) { fscanf(FICHIER. "%s\n%s\n%s\n%d\n". &N_ENFANTS). ENFANT).\n". printf("Nom de famille : %s\n".h> #include <stdlib.7 #include <stdio. printf("\t%d. NOM_FICH). exit(-1). return 0.printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. FILE *FICHIER.

/* nombre de palindromes */ int N_MOTS. N_MOTS=0. while (!feof(FICHIER)) { fscanf(FICHIER. N_PALI += PALI(CHAINE). /* Placer CH2 à la fin de la chaîne */ for (CH2=CH. /* Déclarations : */ /* Nom du fichier et pointeur de référence */ char NOM_FICH[] = "A:\MOTS. "%s\n". int N_PALI.1f \tcaractères et\n". printf("\t%. NOM_FICH). FILE *FICHIER. N_MOTS).\n". /* nombre de mots */ int L_TOT. exit(-1). /* longueur totale de tous les mots */ /* Ouverture du nouveau fichier en écriture */ FICHIER = fopen(NOM_FICH. } int PALI(char *CH) { /* Variable locale */ char *CH2. int LONG_CH(char *CH).TXT". /* Autres variables */ char CHAINE[50]. *CH2. /* Affichage des résultats */ printf("Le fichier %s contient :\n". } /* Compter les palindromes et accumuler */ /* les longueurs des mots.h> main() { /* Prototypes des fonctions appelées */ int PALI(char *CH). CHAINE). */ L_TOT =0. N_PALI). } /* Fermeture du fichier */ fclose(FICHIER).8 #include <stdio. (float)L_TOT/N_MOTS). return 0. "r"). N_MOTS++. printf("\t%d \tmots d'une longueur moyenne de :\n". } Exercice 10.return 0. CH2++) 173 WAFAE SABBAR . L_TOT += LONG_CH(CHAINE). printf("\t%d \tpalindromes\n". NOM_FICH). if (!FICHIER) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.h> #include <stdlib. N_PALI=0.

char NOUVEAU[] = "A:\MOTS_TRI. CHAINE). P++) .h> #include <stdlib. /* nombre de mots du fichier */ int I. /* Contrôler si la chaîne désignée par CH est un palindrome */ for (. CH++.CH2--) if (*CH != *CH2) return 0. return 1. "r").TXT". /* pour la permutation */ int N_MOTS. /* Autres variables */ char CHAINE[50]. } int LONG_CH(char *CH) { char *P. FILE *INFILE. /* indice courant */ int FIN. for (P=CH . /* ligne à partir de laquelle TAB est trié */ int J. else 174 WAFAE SABBAR .h> #include <string. CH<CH2. if (!INFILE) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. /* ligne où la dernière permutation a eu lieu */ /* permet de ne pas trier un sous-ensemble déjà trié */ /* Ouverture de l'ancien fichier en lecture */ INFILE = fopen(ANCIEN. /* Tableau de pointeurs */ char *TAB[50]. *P. char *AIDE.9 #include <stdio. ANCIEN). if (TAB[N_MOTS]) strcpy(TAB[N_MOTS]. /* Réservation de la mémoire */ TAB[N_MOTS] = malloc(strlen(CHAINE)+1).. /* Lecture du fichier dans la mémoire centrale */ while (!feof(INFILE)) { fscanf (INFILE. *OUTFILE. "%s\n".\n".TXT". CH2--.h> main() { /* Déclarations : */ /* Noms des fichiers et pointeurs de référence */ char ANCIEN[] = "A:\MOTS. exit(-1). return P-CH. CHAINE). } /* Initialisation du du compteur des mots */ N_MOTS = 0. } Exercice 10.

exit(-1). I<N_MOTS. /* somme des nombres */ /* Ouverture de l'ancien fichier en lecture */ FICHIER = fopen(NOM_FICH. NOM_FICH). if (!FICHIER) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.h> #include <stdlib. */ for (I=N_MOTS-1 . "w"). } /* Copie du tableau dans le nouveau fichier */ for (I=0. NOUVEAU).\n". /* Tri du tableau par propagation de l'élément maximal.\n". for (J=0.TXT". } /* Fermeture du fichier */ fclose(INFILE). /* nombre actuel lu dans le fichier */ int N. 175 WAFAE SABBAR . "r"). I>0 . return 0. J++) if (strcmp(TAB[J].h> main() { /* Déclarations : */ /* Noms des fichiers et pointeurs de référence */ char NOM_FICH[] = "A:\NOMBRES. TAB[J] = TAB[J+1]. AIDE = TAB[J].10 #include <stdio. TAB[I]). exit(-1). if (!OUTFILE) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. } Exercice 10. FILE *FICHIER. "%s\n". I++) fprintf(OUTFILE. } } /* Ouverture du nouveau fichier en écriture */ OUTFILE = fopen(NOUVEAU. } N_MOTS++. J<I. I=FIN) { FIN=0. exit(-1). /* Fermeture du fichier */ fclose(OUTFILE). /* Autres variables */ int NOMBRE.TAB[J+1])>0) { FIN=J.{ printf("\aPas assez de mémoire \n"). /* compteur des nombres */ long SOMME. TAB[J+1] = AIDE.

INFILE = fopen(ANCIEN. while (!feof(FICHIER)) { fscanf (FICHIER. NOUVEAU). NOUVEAU). printf("La moyenne des nombres est : %f\n".} /* Lecture du fichier et comptabilité */ N=0. &NOMBRE). SOMME += NOMBRE. (float)SOMME/N). ANCIEN). *OUTFILE. ANCIEN).\n". "%d\n". SOMME=0.\n". /* Copier tous les caractères et remplacer le */ /* premier retour à la ligne d'une suite par */ 176 WAFAE SABBAR . /* Autres variables */ char C. return 0. N). FILE *INFILE. OUTFILE = fopen(NOUVEAU. NOM_FICH.h> main() { /* Déclarations : */ /* Noms des fichiers et pointeurs de référence */ char ANCIEN[30]. if (!INFILE) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. N++. } /* Fermeture du fichier */ fclose(FICHIER). "r"). SOMME). /* Compteur des retours à la ligne consécutifs */ /* Ouverture de l'ancien fichier en lecture */ do { printf("Nom du fichier source : "). } while (!OUTFILE). if (!OUTFILE) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. } Exercice 10. scanf("%s". } while (!INFILE).11 #include <stdio. /* Ouverture du nouveau fichier en écriture */ do { printf("Nom du nouveau fichier : "). printf("La somme des nombres est : %ld\n".\n". scanf("%s". /* caractère lu dans le fichier */ char N_RET. NOUVEAU[30]. /* Affichage des résultats */ printf("Le fichier %s contient %d nombres. "w").

fclose(INFILE). else fputc(' '. /* Déclarations : */ 177 WAFAE SABBAR . . . } } Il est possible de réunir plusieurs instructions dans le bloc conditionnel de la structure while. Nous obtenons ainsi une construction un peu lourde: while (!feof(INFILE)) { C=fgetc(INFILE). return 0. fputc(C./* un espace. if (!feof(INFILE)) { . on retrouve cette solution souvent pour éviter des constructions inutilement lourdes: while (C=fgetc(INFILE).h> main() { /* Prototype de la fonction FIN_PHRASE */ int FIN_PHRASE(char C). . } } } /* Fermeture des fichiers */ fclose(OUTFILE). OUTFILE). if (N_RET > 1) fputc('\n'. } else { N_RET=0. OUTFILE). En pratique. en les séparant par des virgules. } Exercice 10. if (!feof(INFILE)) { if (C == '\n') { N_RET++.12 #include <stdio. while (!feof(INFILE)) { C=fgetc(INFILE). */ N_RET=0. . !feof(INFILE)) { . OUTFILE). } Remarque : Après la lecture par fgetc. il faut s'assurer encore une fois que le caractère lu est différent de EOF.

/* Noms des fichiers et pointeurs de référence */ char NOM_FICH[30]; FILE *FICHIER; /* Autres variables */ char C; /* caractère lu dans le fichier */ char NP; /* Compteur de phrases */ /* Ouverture de l'ancien fichier en lecture */ do { printf("Nom du fichier texte : "); scanf("%s", NOM_FICH); FICHIER = fopen(NOM_FICH, "r"); if (!FICHIER) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", NOM_FICH); } while (!FICHIER); /* Compter les symboles de fin de phrase */ NP=0; while (!feof(FICHIER)) NP += FIN_PHRASE(fgetc(FICHIER)); /* Fermeture du fichier */ fclose(FICHIER); /* Affichage du résultat */ printf("Le fichier %s contient %d phrases.\n", NOM_FICH, NP); return 0; } int FIN_PHRASE(char C) { return (C=='.' || C=='!' || C=='?'); }

Exercice 10.13
#include <stdio.h> main() { /* Prototype de la fonction FIN_PHRASE */ int SEPA(char C); /* Déclarations : */ /* Noms des fichiers et pointeurs de référence */ char NOM_FICH[30]; FILE *FICHIER; /* Autres variables */ char C; /* caractère lu dans le fichier */ int ABC[26]; /* compteurs des lettres de l'alphabet */ int NTOT; /* nombre total des caractères */ int NAUTRES; /* nombre des caractères qui ne font pas partie de l'alphabet */ int NMOTS; /* nombre des mots */ int NPARA; /* nombre de paragraphes (retours à la ligne) */ int I; /* indice d'aide */ int DANS_MOT; /* indicateur logique: */ /* vrai si la tête de lecture se trouve */ /* actuellement à l'intérieur d'un mot. */

178

WAFAE SABBAR

/* Ouverture de l'ancien fichier en lecture */ do { printf("Nom du fichier texte : "); scanf("%s", NOM_FICH); FICHIER = fopen(NOM_FICH, "r"); if (!FICHIER) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", NOM_FICH); } while (!FICHIER); /* Initialisations des variables */ for (I=0; I<26; I++) ABC[I]=0; NTOT =0; NAUTRES =0; NMOTS =0; NPARA =0; DANS_MOT=0; /* Examination des caractères du fichier */ while (!feof(FICHIER)) { C=fgetc(FICHIER); if (!feof(FICHIER)) { /* Comptage au niveau caractères */ if (C=='\n') NPARA++; else { NTOT++; if (C>='a' && C<='z') ABC[C-'a']++; else if (C>='A' && C<='Z') ABC[C-'A']++; else NAUTRES++; }

/* Comptage des mots */ if (SEPA(C)) { if (DANS_MOT) { NMOTS++; DANS_MOT=0; } } else DANS_MOT=1; } } /* Fermeture du fichier */ fclose(FICHIER); /* Affichage du résultat */ printf("Votre fichier contient :\n"); printf("\t%d paragraphes\n", NPARA);

179

WAFAE SABBAR

printf("\t%d mots\n", NMOTS); printf("\t%d caractères\ndont\n", NTOT); for (I=0; I<26; I++) printf("\t%d fois la lettre %c\n", ABC[I], 'a'+I); printf("et %d autres caractères\n", NAUTRES); return 0; }

int SEPA(char C) { /* Tableau contenant tous les séparateurs de mots */ char SEP[12] = { '\n', ' ', ',', ';', '.', ':', '?', '!', '(', ')', '"', '

Centres d'intérêt liés

' }; int I; /* Comparaison de C avec tous les éléments du tableau */ for (I=0 ; C!=SEP[I] && I<12 ; I++) ; if (I==12) return 0; else return 1; /* ou bien simplement : */ /* return (I != 12); */

Exercice 10.14
#include <stdio.h> main() { /* Noms des fichiers et pointeurs de référence */ char NOM_FICH[30]; FILE *FICHIER; /* Autres variables */ char C; /* caractère actuel */ int NLIGNE, NCOLO; /* position actuelle sur l'écran */ /* Ouverture de l'ancien fichier en lecture */ do { printf("Nom du fichier texte : "); scanf("%s", NOM_FICH); FICHIER = fopen(NOM_FICH, "r"); if (!FICHIER) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s.\n", NOM_FICH); } while (!FICHIER) ; getchar(); /* Initialisations des variables */ NLIGNE = 0; NCOLO = 0; /* Affichage du fichier */ while (!feof(FICHIER)) { C=fgetc(FICHIER); if (!feof(FICHIER)) { NCOLO++; if (NCOLO==80 || C=='\n') /* fin de la ligne */

180

WAFAE SABBAR

CONTROLE). &COMPTE. } */ */ */ */ 181 WAFAE SABBAR . exit(-1). */ while (!feof(FICHIER)) { fscanf (FICHIER. NOM_FICH).C). FILE *FICHIER. } printf("%c". "r").\n". /* Déclarations : */ /* Noms des fichiers et pointeurs de référence */ char NOM_FICH[] = "A:\CCP. /* nombre du compte CCP */ int CONTROLE. } else printf("%c". return 0. "%ld-%d\n". } } /* Fermeture du fichier */ fclose(FICHIER). if (!FICHIER) { printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. NLIGNE=1. if (NLIGNE==25) /* fin de l'écran */ { getchar(). les convertit en long resp. &CONTROLE).15 #include <stdio. } /* Fermeture du fichier */ fclose(FICHIER).h> #include <stdlib. /* Autres variables */ long COMPTE.{ NLIGNE++. /* en int et affecte les résultats aux variables COMPTE /* et CONTROLE. } Exercice 10. scanf lit les deux /* parties du nombre de CCP.h> main() { /* Prototype de la fonction CCP_TEST */ void CCP_TEST(long COMPTE.C). } /* Lecture des nombres et appel de la fonction CCP_TEST /* A l'aide de la chaîne de format.TXT en lecture */ FICHIER = fopen(NOM_FICH. int CONTROLE). CCP_TEST(COMPTE. return 0.TXT". /* nombre de contrôle */ /* Ouverture du fichier CCP. NCOLO=1.

} while (!FA). FICH_FUS[30]. } Exercice 10. int *B. COMPTE.h> main() { /* Prototype de la fonction FUSION */ void FUSION(int *A. /* Détection de la longueur de FA */ for (LA=0. exit(-1). LB. /* Allocation de la mémoire pour TABA */ TABA = malloc (LA*sizeof(int)). scanf("%s". FICH_A). /* pointeurs pour les tableaux */ int LA. *TFUS. *FB. CONTROLE). LA++) fscanf(FA. /* Autres variables */ int *TABA. FA = fopen(FICH_A.\n"."%d\n". /* Nombre lu ou écrit dans un fichier */ int I. if (!FA) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. "r"). if (!TABA) { printf("\a Pas assez de mémoire pour TABA\n"). int N. /* Déclarations : */ /* Noms des fichiers et pointeurs de référence */ char FICH_A[30]. &N). if (RESTE == CONTROLE) printf ("Le nombre CCP %ld-%d est valide\n". *TABB. COMPTE. int CONTROLE) { int RESTE. /* Longueurs de FA et FB */ int N. } 182 WAFAE SABBAR . FICH_B[30]. FICH_A). else printf ("Le nombre CCP %ld-%d n'est pas valide\n". RESTE = COMPTE % 97. CONTROLE). if (RESTE == 0) RESTE = 97.h> #include <stdlib. /* Fermeture du fichier FA */ fclose(FA). FILE *FA.void CCP_TEST(long COMPTE. *FFUS. !feof(FA). /* Indice d'aide */ /* Ouverture du fichier FA en lecture */ do { printf("Nom du fichier FA : ").16 #include <stdio. int *FUS. int M).

} while (!FB). I++) fscanf(FA. scanf("%s". /* Copie du contenu de FA dans TABA */ for (I=0.\n". /* Copie du contenu de FB dans TABB */ for (I=0. } /* Réouverture du fichier FB en lecture */ FB = fopen(FICH_B. I<LB."%d\n". "r"). } /* Fusion des tableaux TA et TB dans TFUS */ FUSION (TABA. "r"). /* Mêmes opérations pour FB : */ /* Ouverture du fichier FB en lecture */ do { printf("Nom du fichier FB : "). FB = fopen(FICH_B. LB). TABB+I). "w"). LB++) fscanf(FB. if (!FB) printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. I++) fscanf(FB."%d\n". &N). FICH_FUS). TFUS. /* Fermeture du fichier FA */ fclose(FA). if (!TABB) { printf("\a Pas assez de mémoire pour TABB\n"). TABA+I). /* Ouverture du fichier FFUS en écriture */ do { printf("Nom du fichier FFUS : "). LA./* Réouverture du fichier FA en lecture */ FA = fopen(FICH_A. /* Fermeture du fichier FB */ fclose(FB). scanf("%s". /* Allocation de la mémoire pour TABB */ TABB = malloc (LB*sizeof(int)). if (!TFUS) { printf("\a Pas assez de mémoire pour TFUS\n"). /* Fermeture du fichier FB */ fclose(FB). if (!FFUS) 183 WAFAE SABBAR . FFUS = fopen(FICH_FUS. I<LA. /* Détection de la longueur de FB */ for (LB=0. !feof(FB). /* Allocation de la mémoire pour TFUS */ TFUS = malloc ((LA+LB)*sizeof(int)). FICH_B). TABB."%d\n". FICH_B). exit(-1). exit(-1). "r").

IFUS=0. *(TFUS+I)). int *FUS. IFUS++. /* Fermeture du fichier FFUS */ fclose(FFUS). FICH_FUS). } else { FUS[IFUS]=B[IB]. IB++. /* Copier le contenu de TFUS dans FFUS */ for (I=0."%d\n". int *B. /* Fusion de A et B dans FUS */ IA=0. } } 184 WAFAE SABBAR . IA++.\n".printf("\aERREUR: Impossible d'ouvrir " "le fichier: %s. I<(LA+LB). IFUS++. */ while (IA<N) { *(FUS+IFUS)=*(A+IA). } while (!FFUS). IB++. IB=0. I++) fprintf(FFUS. return 0. alors */ /* copier le reste de l'autre tableau. IFUS++. } void FUSION(int *A. } while (IB<M) { *(FUS+IFUS)=*(B+IB). IA++.IB. B et FUS */ int IA. int M) { /* Variables locales */ /* Indices courants dans A. } /* Si A ou B sont arrivés à la fin. IFUS++. int N. while ((IA<N) && (IB<M)) if (*(A+IA)<*(B+IB)) { *(FUS+IFUS)=*(A+IA).IFUS.

Centres d'intérêt liés

'. 'c'}. /* compteur des lettres 'e' */ int AIDE. printf("Entrez 5 mots. /* b) Compter les lettres 'e' dans le texte */ C=0. */ /* a) Compter les caractères */ /* La marque de fin de chaîne '###BOT_TEXT###' est */ /* utilisée comme condition d'arrêt. il faut aussi indiquer le symbole de fin de chaîne. M2.M5. Espace: 4 octets i) char i[4] = "'o'". printf("Le texte contient %d lettres ","doc_promotions_enabled":false,"static_promo_banner_cta_url":""},"eligible_for_exclusive_trial_roadblock":false,"eligible_for_seo_roadblock":false,"exclusive_free_trial_roadblock_props_path":"/doc-page/exclusive-free-trial-props/40628794","flashes":[],"footer_props":{"urls":{"about":"/about","press":"/press","blog":"http://literally.scribd.com/","careers":"/careers","contact":"/contact","plans_landing":"/subscribe","referrals":"/referrals?source=footer","giftcards":"/giftcards","faq":"/faq","accessibility":"/accessibility-policy","faq_paths":{"accounts":"https://support.scribd.com/hc/sections/202246346","announcements":"https://support.scribd.com/hc/sections/202246066","copyright":"https://support.scribd.com/hc/sections/202246086","downloading":"https://support.scribd.com/hc/articles/210135046","publishing":"https://support.scribd.com/hc/sections/202246366","reading":"https://support.scribd.com/hc/sections/202246406","selling":"https://support.scribd.com/hc/sections/202246326","store":"https://support.scribd.com/hc/sections/202246306","status":"https://support.scribd.com/hc/en-us/articles/360001202872","terms":"https://support.scribd.com/hc/sections/202246126","writing":"https://support.scribd.com/hc/sections/202246366","adchoices":"https://support.scribd.com/hc/articles/210129366","paid_features":"https://support.scribd.com/hc/sections/202246306","failed_uploads":"https://support.scribd.com/hc/en-us/articles/210134586-Troubleshooting-uploads-and-conversions","copyright_infringement":"https://support.scribd.com/hc/en-us/articles/210128946-DMCA-copyright-infringement-takedown-notification-policy","end_user_license":"https://support.scribd.com/hc/en-us/articles/210129486","terms_of_use":"https://support.scribd.com/hc/en-us/articles/210129326-General-Terms-of-Use"},"publishers":"/publishers","static_terms":"/terms","static_privacy":"/privacy","copyright":"/copyright","ios_app":"https://itunes.apple.com/us/app/scribd-worlds-largest-online/id542557212?mt=8&uo=4&at=11lGEE","android_app":"https://play.google.com/store/apps/details?id=com.scribd.app.reader0&hl=en","books":"/books","sitemap":"/directory"}},"global_nav_props":{"header_props":{"logo_src":"/images/landing/home2_landing/scribd_logo_horiz_small.svg","root_url":"https://www.scribd.com/","search_term":"","small_logo_src":"/images/logos/scribd_s_logo.png","uploads_url":"/upload-document","search_props":{"redirect_to_app":true,"search_url":"/search","query":"","search_page":false}},"user_menu_props":null,"sidebar_props":{"urls":{"bestsellers":"https://www.scribd.com/bestsellers","home":"https://www.scribd.com/","saved":"/saved","subscribe":"/archive/pmp_checkout?doc=40628794&metadata=%7B%22context%22%3A%22pmp%22%2C%22action%22%3A%22start_trial%22%2C%22logged_in%22%3Afalse%2C%22platform%22%3A%22web%22%7D","top_charts":"/bestsellers","upload":"https://www.scribd.com/upload-document"},"categories":{"book":{"icon":"icon-ic_book","icon_filled":"icon-ic_book_fill","url":"https://fr.scribd.com/books","name":"Books","type":"book"},"news":{"icon":"icon-ic_articles","icon_filled":"icon-ic_articles_fill","url":"https://fr.scribd.com/news","name":"News","type":"news"},"audiobook":{"icon":"icon-ic_audiobook","icon_filled":"icon-ic_audiobook_fill","url":"https://fr.scribd.com/audiobooks","name":"Audiobooks","type":"audiobook"},"magazine":{"icon":"icon-ic_magazine","icon_filled":"icon-ic_magazine_fill","url":"https://fr.scribd.com/magazines","name":"Magazines","type":"magazine"},"document":{"icon":"icon-ic_document","icon_filled":"icon-ic_document_fill","url":"https://fr.scribd.com/docs","name":"Documents","type":"document"},"sheet_music":{"icon":"icon-ic_songbook","icon_filled":"icon-ic_songbook_fill","url":"https://fr.scribd.com/sheetmusic","name":"Sheet Music","type":"sheet_music"}},"categories_array":["mixed","book","audiobook","magazine","news","document","sheet_music"],"selected_content_type":"mixed","username":"","search_overlay_props":{"search_input_props":{"focused":false,"keep_suggestions_on_blur":false}}}},"recommenders":{"related_titles_recommender":{"ids":[85173522,194398795,40733109,181673944,13323026,76315896,40478996,28109089,78513805,26076235,130452344,26074801,199928992,22408817,16546003,86058065,52187138,14190148,23465912,29329554,19221855,68913674,19222095,90562555,199928984,65053934,70118160,179569527,199929060,244157917,212863738,253264900,263504218,282766939,239488191,163646054,224419023,224369806,224355300,238704340,225916486,224258670,293461549,224410295,182553141,211302755,202691564,239588474,224426877,224326250,224349281,234028503,224306619,337536061,249309502,254039238,182565115,273582508,273440534,182546874,249308781,224270540,163580087,235411767,224252178,224285255,235583696,250006950,224248577,231689346,246897514,163579056,182560283,224248520,163564256,249308236,182522032,216442529,224266633,163647832,163603389,249309690],"title_link":null,"title":null,"track_opts":{"compilation_id":"uR+JAccuyzOwv0gU2iX3nf4cLLs=","module_id":"3Us76y2mbn8XGw/u32b5/oLYdR4=","widget_name":"right sidebar","track_id":"flattened_recommender"}},"footer_recommenders":{"recommenders":[{"ids":[85173522,194398795,40733109,181673944,13323026,76315896,40478996,28109089,78513805,26076235,130452344,26074801,199928992,22408817,16546003,86058065,52187138,14190148,23465912,29329554,19221855,68913674,19222095,90562555,199928984,65053934,70118160,179569527,199929060],"title_link":null,"title":"Documents Similar To Exercices Résolus en c[5NOVEMBRE2007]","track_opts":{"compilation_id":"uR+JAccuyzOwv0gU2iX3nf4cLLs=","module_id":"N1yd5rHSnD/co7FeJI/RMPcusPE=","widget_name":"document_carousel"}}]},"seo_new_docs_recommenders":{"recommenders":[]},"documents":{"13323026":{"type":"document","id":13323026,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/13323026/108x144/8b888e5519/1374933166?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/13323026/216x288/aa107c20f9/1374933166?v=1","title":"exercices du C","short_title":"exercices du C","author":"Ihsan Mokhlisse","tracking":{"object_type":"document","object_id":13323026,"track":"flattened_recommender","doc_uuid":"g99ok2h7kXNnl34Own7CaifTfxg="},"url":"https://www.scribd.com/document/13323026/exercices-du-C"},"14190148":{"type":"document","id":14190148,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/14190148/108x144/01dc36d14c/1515791096?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/14190148/216x288/f640c5f71e/1515791096?v=1","title":"série 5(sous programmes)","short_title":"série 5(sous programmes)","author":"benzaied","tracking":{"object_type":"document","object_id":14190148,"track":"flattened_recommender","doc_uuid":"GDmOkIlQI0hQ5DMRPhoJSTZ4TaY="},"url":"https://www.scribd.com/doc/14190148/serie-5-sous-programmes"},"16546003":{"type":"document","id":16546003,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/16546003/108x144/74e9a45136/1497822469?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/16546003/216x288/0ff9c0c6ab/1497822469?v=1","title":"langage c","short_title":"langage c","author":"oughriss012353","tracking":{"object_type":"document","object_id":16546003,"track":"flattened_recommender","doc_uuid":"NAaRNgmK+WrdhenFSh9BCeiDu1I="},"url":"https://www.scribd.com/document/16546003/langage-c"},"19221855":{"type":"document","id":19221855,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/19221855/108x144/8371a5be83/1525446392?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/19221855/216x288/7e77e115e2/1525446392?v=1","title":"exercices corrigés d'algorithmique","short_title":"exercices corrigés d'algorithmique","author":"OverDoc","tracking":{"object_type":"document","object_id":19221855,"track":"flattened_recommender","doc_uuid":"HIBoLNKKDji4eDtaW3cWpKNGHP8="},"url":"https://www.scribd.com/document/19221855/exercices-corriges-d-algorithmique"},"19222095":{"type":"document","id":19222095,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/19222095/108x144/8fdbe7a204/1520197883?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/19222095/216x288/1ce1cbf58b/1520197883?v=1","title":"travaux dirigés en algorithmique (exercices corrigés)","short_title":"travaux dirigés en algorithmique (exercices corrigés)","author":"OverDoc","tracking":{"object_type":"document","object_id":19222095,"track":"flattened_recommender","doc_uuid":"okk+xZ4x9FnVBH7NFXHhebi2cVQ="},"url":"https://www.scribd.com/document/19222095/travaux-diriges-en-algorithmique-exercices-corriges"},"22408817":{"type":"document","id":22408817,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/22408817/108x144/29a18e0c39/1509758837?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/22408817/216x288/3199e721f4/1509758837?v=1","title":"Cours Et Excercice en Algorithme","short_title":"Cours Et Excercice en Algorithme","author":"Ouamer Khalid","tracking":{"object_type":"document","object_id":22408817,"track":"flattened_recommender","doc_uuid":"U6j+nBkQ9BzZsWNVkv8p80JT8xU="},"url":"https://www.scribd.com/doc/22408817/Cours-Et-Excercice-en-Algorithme"},"23465912":{"type":"document","id":23465912,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/23465912/108x144/683822c56d/1496412771?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/23465912/216x288/011eecb64b/1496412771?v=1","title":"cours d'algorithme","short_title":"cours d'algorithme","author":"api-19915745","tracking":{"object_type":"document","object_id":23465912,"track":"flattened_recommender","doc_uuid":"mXf1RfmV2T9uqN7I6edPfm4nIEw="},"url":"https://www.scribd.com/doc/23465912/cours-d-algorithme"},"26074801":{"type":"document","id":26074801,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/26074801/108x144/8295f088a9/1514501262?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/26074801/216x288/286ecefee1/1514501262?v=1","title":"Les Fichiers En Langage C","short_title":"Les Fichiers En Langage C","author":"Gogol Plex","tracking":{"object_type":"document","object_id":26074801,"track":"flattened_recommender","doc_uuid":"A9EcLecbwj6vahvWTaUywtqMmgk="},"url":"https://www.scribd.com/doc/26074801/Les-Fichiers-En-Langage-C"},"26076235":{"type":"document","id":26076235,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/26076235/108x144/6a57967c62/1522098803?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/26076235/216x288/27fa1f22ac/1522098803?v=1","title":"Langage C: Les Différents Algorithmes de Tri","short_title":"Langage C","author":"Gogol Plex","tracking":{"object_type":"document","object_id":26076235,"track":"flattened_recommender","doc_uuid":"LmdMtwCvfGlXjwkgiET9jWfYcFQ="},"url":"https://www.scribd.com/doc/26076235/Langage-C-Les-Differents-Algorithmes-de-Tri"},"28109089":{"type":"document","id":28109089,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/28109089/108x144/e93dfacda8/1518559431?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/28109089/216x288/af30fd3ea1/1518559431?v=1","title":"100exercices en Pascal &amp; C","short_title":"100exercices en Pascal &amp; C","author":"kadour2005","tracking":{"object_type":"document","object_id":28109089,"track":"flattened_recommender","doc_uuid":"jQ6M3CnogeMMgi67LX61oxuoJG8="},"url":"https://www.scribd.com/doc/28109089/100exercices-en-Pascal-amp-C"},"29329554":{"type":"document","id":29329554,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/29329554/108x144/1e95a55b86/1520509986?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/29329554/216x288/169ee4e7af/1520509986?v=1","title":"Correction exercices algorithme","short_title":"Correction exercices algorithme","author":"Ouamer Khalid","tracking":{"object_type":"document","object_id":29329554,"track":"flattened_recommender","doc_uuid":"/+kdBQVZStrHpHwDUqo9B+4iLZ8="},"url":"https://www.scribd.com/doc/29329554/Correction-exercices-algorithme"},"40478996":{"type":"document","id":40478996,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/40478996/108x144/619ceb78c9/1514840166?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/40478996/216x288/1fe3895a34/1514840166?v=1","title":"Serie d'Algorithme(50 Exercice)","short_title":"Serie d'Algorithme(50 Exercice)","author":"Molka Metalleuse","tracking":{"object_type":"document","object_id":40478996,"track":"flattened_recommender","doc_uuid":"dgahkR9yPB1S49AcC3zXcBq37BQ="},"url":"https://www.scribd.com/doc/40478996/Serie-d-Algorithme-50-Exercice"},"40733109":{"type":"document","id":40733109,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/40733109/108x144/15a2ebabab/1412542888?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/40733109/216x288/50c300ab1b/1412542888?v=1","title":"corr_td_algo","short_title":"corr_td_algo","author":"Ilhem Zabi","tracking":{"object_type":"document","object_id":40733109,"track":"flattened_recommender","doc_uuid":"67KziLF8eyoIOxVnTeJv86NxvXg="},"url":"https://www.scribd.com/doc/40733109/corr-td-algo"},"52187138":{"type":"document","id":52187138,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/52187138/108x144/fa151a7968/1485211086?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/52187138/216x288/8bf1ea4513/1485211086?v=1","title":"idQN","short_title":"idQN","author":"أبو عبد الرحمان زهير","tracking":{"object_type":"document","object_id":52187138,"track":"flattened_recommender","doc_uuid":"8wijtIiZ8wIUdOa01SJMcoTKavw="},"url":"https://www.scribd.com/document/52187138/idQN"},"65053934":{"type":"document","id":65053934,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/65053934/108x144/c3a4bb25a8/1513792301?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/65053934/216x288/d62cde9b17/1513792301?v=1","title":"Exercices Sur Les Nombres","short_title":"Exercices Sur Les Nombres","author":"الحركة التلمذية بالشابة","tracking":{"object_type":"document","object_id":65053934,"track":"flattened_recommender","doc_uuid":"HmrI0Kxc8GEE8ZRJO7HcwDum2gk="},"url":"https://www.scribd.com/doc/65053934/Exercices-Sur-Les-Nombres"},"68913674":{"type":"document","id":68913674,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/68913674/108x144/f916c26dce/1511355790?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/68913674/216x288/e6f6259353/1511355790?v=1","title":"Exercices en Langage C Delannoy","short_title":"Exercices en Langage C Delannoy","author":"fred7106","tracking":{"object_type":"document","object_id":68913674,"track":"flattened_recommender","doc_uuid":"2YDA51f055M7Y/GSh64SIbt/9BA="},"url":"https://www.scribd.com/document/68913674/Exercices-en-Langage-C-Delannoy"},"70118160":{"type":"document","id":70118160,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/70118160/108x144/7ec24bbb91/1520630900?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/70118160/216x288/12b118e2ad/1520630900?v=1","title":"Exercices de révision","short_title":"Exercices de révision","author":"Teka Akram","tracking":{"object_type":"document","object_id":70118160,"track":"flattened_recommender","doc_uuid":"52zTX7tReKnad8qUzoZ2+S5oDfw="},"url":"https://www.scribd.com/doc/70118160/Exercices-de-revision"},"76315896":{"type":"document","id":76315896,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/76315896/108x144/980325548d/1530096130?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/76315896/216x288/df631fb819/1530096130?v=1","title":"Programmation C- Exercices","short_title":"Programmation C- Exercices","author":"Abdel","tracking":{"object_type":"document","object_id":76315896,"track":"flattened_recommender","doc_uuid":"/HObk7RMn/IftuXKshGHihit7sQ="},"url":"https://www.scribd.com/doc/76315896/Programmation-C-Exercices"},"78513805":{"type":"document","id":78513805,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/78513805/108x144/658e1182f2/1404847304?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/78513805/216x288/f042b86065/1404847304?v=1","title":"Exercices corrigés en C","short_title":"Exercices corrigés en C","author":"Zouhir Wydad","tracking":{"object_type":"document","object_id":78513805,"track":"flattened_recommender","doc_uuid":"rHaVX6afhLHgYrCDPPmZVEeeRj0="},"url":"https://www.scribd.com/doc/78513805/Exercices-corriges-en-C"},"85173522":{"type":"document","id":85173522,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/85173522/108x144/1ac3145009/1494121065?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/85173522/216x288/96213bde83/1494121065?v=1","title":"Exercices complets mo9atil","short_title":"Exercices complets mo9atil","author":"Ash' Mouhssine","tracking":{"object_type":"document","object_id":85173522,"track":"flattened_recommender","doc_uuid":"dCxWfr2VYxzrHIieH0HX7uhiRao="},"url":"https://www.scribd.com/document/85173522/Exercices-complets-mo9atil"},"86058065":{"type":"document","id":86058065,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/86058065/108x144/12cd788f09/1529419894?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/86058065/216x288/86d760a40a/1529419894?v=1","title":"24 Sujets corrigés (Ridha NAIRI)","short_title":"24 Sujets corrigés (Ridha NAIRI)","author":"Saadi Badis","tracking":{"object_type":"document","object_id":86058065,"track":"flattened_recommender","doc_uuid":"MSADtPpZ6f+k76Rzugv3sYyBRKc="},"url":"https://www.scribd.com/doc/86058065/24-Sujets-corriges-Ridha-NAIRI"},"90562555":{"type":"document","id":90562555,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/90562555/108x144/bc1aac328c/1419979935?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/90562555/216x288/86dd1a9ba9/1419979935?v=1","title":"Exercices en c++","short_title":"Exercices en c++","author":"Talai Younes","tracking":{"object_type":"document","object_id":90562555,"track":"flattened_recommender","doc_uuid":"nRD5GS1UuH7HV2droNZbxFLtLuc="},"url":"https://www.scribd.com/doc/90562555/Exercices-en-c"},"130452344":{"type":"document","id":130452344,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/130452344/108x144/6fe1f7c32a/1522182479?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/130452344/216x288/29f3b51a9c/1522182479?v=1","title":"Exrcices en Turbo Pascal.pdf","short_title":"Exrcices en Turbo Pascal.pdf","author":"Marøøen Bouabid","tracking":{"object_type":"document","object_id":130452344,"track":"flattened_recommender","doc_uuid":"sGu3450quEH84ABv88dTZviqVnM="},"url":"https://www.scribd.com/doc/130452344/Exrcices-en-Turbo-Pascal-pdf"},"163564256":{"type":"book","id":163564256,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163564256/108x144/19b813ddea/1537782067?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163564256/216x288/50918b57c9/1537782067?v=1","title":"Beautiful Ruins: A Novel","short_title":"Beautiful Ruins","author":"Jess Walter","tracking":{"object_type":"document","object_id":163564256,"track":"flattened_recommender","doc_uuid":"kwzTzK4AeRw71/l4k+tEfXL9i1g="},"url":"https://www.scribd.com/book/163564256/Beautiful-Ruins-A-Novel"},"163579056":{"type":"book","id":163579056,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/163579056/108x144/b0cc4a522d/1537785274?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163579056/216x288/cc1bed9752/1537785274?v=1","title":"The Art of Racing in the Rain: A Novel","short_title":"The Art of Racing in the Rain","author":"Garth Stein","tracking":{"object_type":"document","object_id":163579056,"track":"flattened_recommender","doc_uuid":"KbkTqiRI5Tm6hsRRE6/1Mfnl2KE="},"url":"https://www.scribd.com/book/163579056/The-Art-of-Racing-in-the-Rain-A-Novel"},"163580087":{"type":"book","id":163580087,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/163580087/108x144/865888b820/1537786991?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/163580087/216x288/a50ec4d378/1537786991?v=1","title":"Bel Canto","short_title":"Bel Canto","author":"Ann Patchett","tracking":{"object_type":"document","object_id":163580087,"track":"flattened_recommender","doc_uuid":"Jtb6NFXZ5txPOR0OYMPvr8a+Vx0="},"url":"https://www.scribd.com/book/163580087/Bel-Canto"},"163603389":{"type":"book","id":163603389,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/163603389/108x144/9281c90791/1537790825?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163603389/216x288/a0de7e7dea/1537790825?v=1","title":"A Prayer for Owen Meany: A Novel","short_title":"A Prayer for Owen Meany","author":"John Irving","tracking":{"object_type":"document","object_id":163603389,"track":"flattened_recommender","doc_uuid":"JK3A93vgzi7etY3P1y1BZN3ZwYc="},"url":"https://www.scribd.com/book/163603389/A-Prayer-for-Owen-Meany-A-Novel"},"163646054":{"type":"book","id":163646054,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163646054/108x144/c8eb9eae18/1537782033?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/163646054/216x288/d6d700f05f/1537782033?v=1","title":"Devil in the Grove: Thurgood Marshall, the Groveland Boys, and the Dawn of a New America","short_title":"Devil in the Grove","author":"Gilbert King","tracking":{"object_type":"document","object_id":163646054,"track":"flattened_recommender","doc_uuid":"detAh2wyVe6BbGtS1hk1Dv7efeQ="},"url":"https://www.scribd.com/book/163646054/Devil-in-the-Grove-Thurgood-Marshall-the-Groveland-Boys-and-the-Dawn-of-a-New-America"},"163647832":{"type":"book","id":163647832,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/163647832/108x144/9f4ce0c73a/1537784720?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/163647832/216x288/c8974e0a45/1537784720?v=1","title":"The Cider House Rules","short_title":"The Cider House Rules","author":"John Irving","tracking":{"object_type":"document","object_id":163647832,"track":"flattened_recommender","doc_uuid":"y8rlISU5+pfiuspE/H3N2nWVf/U="},"url":"https://www.scribd.com/book/163647832/The-Cider-House-Rules"},"179569527":{"type":"document","id":179569527,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/179569527/108x144/c3d06713c1/1450976087?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/179569527/216x288/5bc6eafb19/1450976087?v=1","title":"Exercices Pascal Fenni","short_title":"Exercices Pascal Fenni","author":"djidosse","tracking":{"object_type":"document","object_id":179569527,"track":"flattened_recommender","doc_uuid":"jO8qcR0qOniDDtYIAADJdbsTBSg="},"url":"https://www.scribd.com/doc/179569527/Exercices-Pascal-Fenni"},"181673944":{"type":"document","id":181673944,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/181673944/108x144/56853cabfb/1449611948?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/181673944/216x288/664eb0eb50/1449611948?v=1","title":"Serie Langage C","short_title":"Serie Langage C","author":"Imane Bourous","tracking":{"object_type":"document","object_id":181673944,"track":"flattened_recommender","doc_uuid":"dRaYY+whNCuCSAm/hSTiIkdrF8w="},"url":"https://www.scribd.com/doc/181673944/Serie-Langage-C"},"182522032":{"type":"book","id":182522032,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/182522032/108x144/671b9a055b/1537779594?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/182522032/216x288/ec6eb5c88b/1537779594?v=1","title":"The Bonfire of the Vanities: A Novel","short_title":"The Bonfire of the Vanities","author":"Tom Wolfe","tracking":{"object_type":"document","object_id":182522032,"track":"flattened_recommender","doc_uuid":"NW3a9BMlkQD3X+wLBu0pMY5/gTc="},"url":"https://www.scribd.com/book/182522032/The-Bonfire-of-the-Vanities-A-Novel"},"182546874":{"type":"book","id":182546874,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/182546874/108x144/817bab2149/1537786992?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/182546874/216x288/a6b6573207/1537786992?v=1","title":"The Love Affairs of Nathaniel P.: A Novel","short_title":"The Love Affairs of Nathaniel P.","author":"Adelle Waldman","tracking":{"object_type":"document","object_id":182546874,"track":"flattened_recommender","doc_uuid":"9Or+B5quH18II0tI13kq/7eOIfQ="},"url":"https://www.scribd.com/book/182546874/The-Love-Affairs-of-Nathaniel-P-A-Novel"},"182553141":{"type":"book","id":182553141,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/182553141/108x144/1b40063d80/1537785503?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/182553141/216x288/098f7f1651/1537785503?v=1","title":"The World Is Flat 3.0: A Brief History of the Twenty-first Century","short_title":"The World Is Flat 3.0","author":"Thomas L. Friedman","tracking":{"object_type":"document","object_id":182553141,"track":"flattened_recommender","doc_uuid":"kx5a2vUJiHCvcOnyDh9aT6d7xFc="},"url":"https://www.scribd.com/book/182553141/The-World-Is-Flat-3-0-A-Brief-History-of-the-Twenty-first-Century"},"182560283":{"type":"book","id":182560283,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/182560283/108x144/229169a793/1537783845?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/word_document/182560283/216x288/fc0b9ebffa/1537783845?v=1","title":"Wolf Hall: A Novel","short_title":"Wolf Hall","author":"Hilary Mantel","tracking":{"object_type":"document","object_id":182560283,"track":"flattened_recommender","doc_uuid":"p2vx/OvoKYXb9kP0KXIjJ5PMUaE="},"url":"https://www.scribd.com/book/182560283/Wolf-Hall-A-Novel"},"182565115":{"type":"book","id":182565115,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/182565115/108x144/50e3fc9eb2/1537784443?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/word_document/182565115/216x288/8bbf81282a/1537784443?v=1","title":"The Silver Linings Playbook: A Novel","short_title":"The Silver Linings Playbook","author":"Matthew Quick","tracking":{"object_type":"document","object_id":182565115,"track":"flattened_recommender","doc_uuid":"T3opeSLteqm7z91AXNZ7bctIv+Y="},"url":"https://www.scribd.com/book/182565115/The-Silver-Linings-Playbook-A-Novel"},"194398795":{"type":"document","id":194398795,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/194398795/108x144/277ddbf7f3/1492112043?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/194398795/216x288/9a78a30606/1492112043?v=1","title":"Exercices en Langage C","short_title":"Exercices en Langage C","author":"Neda Rwn","tracking":{"object_type":"document","object_id":194398795,"track":"flattened_recommender","doc_uuid":"eZp/4vsjFgCcUnH2UDE9c0VPaKw="},"url":"https://www.scribd.com/document/194398795/Exercices-en-Langage-C"},"199928984":{"type":"document","id":199928984,"thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/199928984/108x144/beb9ba3a79/1521663954?v=1","retina_thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/199928984/216x288/a1f94f27fc/1521663954?v=1","title":"Langage C Série 1","short_title":"Langage C Série 1","author":"cours4maroc","tracking":{"object_type":"document","object_id":199928984,"track":"flattened_recommender","doc_uuid":"MLsEN8ZcygnMI4Z6ETfS1gVM8EM="},"url":"https://www.scribd.com/document/199928984/Langage-C-Serie-1"},"199928992":{"type":"document","id":199928992,"thumb_url":"https://imgv2-2-f.scribdassets.com/img/document/199928992/108x144/9281972a60/1511479321?v=1","retina_thumb_url":"https://imgv2-1-f.scribdassets.com/img/document/199928992/216x288/36fb504386/1511479321?v=1","title":"Langage C Série 2","short_title":"Langage C Série 2","author":"cours4maroc","tracking":{"object_type":"document","object_id":199928992,"track":"flattened_recommender","doc_uuid":"8efvqpruv5fxdGOFxFt5JdxYLxo="},"url":"https://www.scrib