Exercice lanuage c

Page 1

ECOLE HASSANIA DES TRAVAUX PUBLICS

CLUB EHTPEC

LANGAGE C POUR INGENIEURS

C

D.A.A

EXERCICES RESOLUS


CLUB EHTPEC

Langage C

.

´solus Langage C : Exercices re

Nous tenons a` remercier, toutes celles et ceux qui voudrons nous faire parvenir leurs critiques, remarques ainsi que leurs suggestions afin d’am´eliorer le contenu de ce document. CLUB EHTPEC : ehtpec.ehtp@gmail.com

al abdali Abdelhamid

2

EHTP


CLUB EHTPEC

Langage C

al abdali Abdelhamid

3

EHTP


CLUB EHTPEC

Langage C

SOMMAIRE : 1

Lire et e´ crire les donn´ees ´ 1.1 Enonc´ e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 R´ecr´eation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7 7 13 26

2

ˆ conditionnelle Structure de controle ´ 2.1 Enonc´e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28 28 31

3

Les structures it´eratives ´ 3.1 Enonc´ e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41 41 49

4

Les tableaux ´ 4.1 Enonc´ e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 R´ecr´eation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63 63 72 90

5

Les fonctions ´ 5.1 Enonc´ e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

92 92 97

6

La r´ecursivit´e 111 ´ 6.1 Enonc´e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 6.2 R´ecr´eation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 6.3 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

7

Le tri 119 ´ 7.1 Enonc´e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 7.2 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

8

Les structures 125 ´ 8.1 Enonc´e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 8.2 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

9

Les chaˆınes de caract`eres 136 ´ 9.1 Enonc´e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 9.2 R´ecr´eation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 9.3 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

10 Pointeurs et allocation dynamique 141 ´ 10.1 Enonc´e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 10.2 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

al abdali Abdelhamid

4

EHTP


CLUB EHTPEC

Langage C

11 Les fichiers textes 155 ´ 11.1 Enonc´ e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 11.2 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 12 Les fichiers binaires 158 ´ 12.1 Enonc´ e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 12.2 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 13 Les listes chaˆın´ees 162 ´ 13.1 Enonc´e des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 13.2 Solution des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 14 Probl`emes divers 174 ´ 14.1 Enonc´e des probl`emes et solutions . . . . . . . . . . . . . . . . . . . . . . . . . 174

al abdali Abdelhamid

5

EHTP


CLUB EHTPEC

Langage C

Citations − Un bon langage aujourd’hui vaut mieux qu’un langage parfait demain. − Doubler le nombre de programmeurs sur un projet en retard ne fait que doubler le retard. − Les ordinateurs ne sont pas fiables; mais les ˆetres humains sont encore moins fiables. − Dix grammes d’abstraction valent des tonnes de bricolage. − Langage sans m´ethode n’est que ruine de la soci´et´e de service. − Le logiciel est la seule branche de l’industrie o` u l’on trouve normal de supprimer les dispositifs de s´ecurit´e pour am´eliorer les performances. − Un bon programme ne comporte pas de commentaire algorithmique. Un commentaire dans un algorithme est un aveu que le code n’est pas ´ecrit de fa¸con suffisamment lisible. − Il ne faut jamais tenter de faire marcher un programme contre sa volont´e. S’il r´esiste, c’est qu’il y a un probl`eme de conception. − On ne construit pas un pont sur un estuaire en extrapolant une passerelle sur une rivi`ere. − Rien n’est plus difficile que de faire simple. − Le nombre de touches frapp´ees pour faire marcher un programme mal ´ecrit peut ˆetre sup´erieur `a celui n´ecessaire pour le r´e´ecrire proprement. Mais on ne va pas jeter ce qu’on a d´ej`a ´ecrit... − Les s´emaphores sont a` la programmation parall`ele ce que le GOTO est `a la programmation s´equentielle.

al abdali Abdelhamid

6

EHTP


CLUB EHTPEC

Langage C

Lire et e´ crire les donn´ees

1 1.1

´ Enonc´ e des exercices

Exercice 1: ´ Ecrire un programme qui affiche le message suivant : Qui ne pr epare pas la r eussite, pr epare l' echec !

Exercice 2: ´ Ecrire un programme qui demande `a l’utilisateur d’entrer un nombre puis il l’affiche . Exercice 3: ´ Ecrire un programme permettant d’afficher le mot ”EHTP” . Exercice 4: ´ Soient A, B et C trois entiers. Ecrire le programme permettant de faire les instructions suivantes ,puis d´eterminer le r´esultat qui sera affich´e a` l’´ecran: Algorithme 1 A ←− 1; B ←− 7 + A; A ←− B − 2; C ←− A; A ←− 2 ∗ B + C; C ←− A ∗ 12; A ←− B + C/2; B ←− A; A ←− B;

Algorithme 2 A ←− 5; B ←− 3; A ←− A + B; A ←− 2; C ←− 5; B ←− C ∗ (−1); A ←− −3; B ←− 2;

Exercice 5: ´ Soient X et somme deux entiers. Ecrire le programme permettant de faire les instructions suivantes ,puis d´eterminer le r´esultat qui sera affich´e a` l’´ecran: Variables X, somme : entier D´ ebut somme ←− 0; X ←− 2; somme ←− somme + X + 3; X ←− 3 ∗ somme − 50; X ←− somme/2; somme ←− somme − X ∗ 4; Fin al abdali Abdelhamid

7

EHTP


CLUB EHTPEC

Langage C

Exercice 6: ´ Ecrire un programme qui permet l’´echange des deux valeurs a et b . Exercice 7: ´ Ecrire un programme qui convertit les degr´es Fahrenheit en degr´es centigrades. Formule : θC = 95 (θF − 32). Exercice 8: ´ Ecrire un programme qui convertit les kilom`etres en miles (1 mile = 1,609 km). Exercice 9: ´ Ecrire un programme qui calcule le volume d’un cube de cot´e a. Exercice 10: ´ 1. Ecrire un programme qui calcule la surface d’une sph`ere de rayon R. 2. Trouver l’erreur dans le programme suivant afin de calculer correctement le volume d’une 4πR3 sph`ere de rayon R . V = 3 Code C 0 % & = P A E } 9 0\ 00 0% 0& 0= 0P 0A 0E

)include <stdioyh> )include <stdlibyh> )define pi &y0=0P :VUn programme permettant de calculer la surface et le volume dRune sphereyV: int main,S { float R9S9V; puts,(taper le rayon de la sphere R:\n(S; scanf,({f(98RS; S==VpiV,RVRS; V=,=:&SVpiV,RVRVRS; printf,(la surface de la sphere S est:{f\n(9SS; printf,(le volume da la sphere V est:{f\n (9VS; system,(PAUSE(S; return \; }

Exercice 11:

al abdali Abdelhamid

8

EHTP


CLUB EHTPEC

Langage C

´ Ecrire des programme permettant de : 1. Calculer la surface d’un carr´e de cot´e a. 2. Calculer la surface d’un rectangle d’une longueur L et d’une largeur l. 3. Calculer la surface d’un disque de rayon R . 4. Calculer la surface d’un triangle d’une hauteur h et d’une base b. 5. Calculer le p´erim`etre d’un cercle de rayon R. 6. Calculer le p´erim`etre d’un rectangle d’une longueur L et d’une largeur l. Exercice 12: ´ Ecrire un programme permettant de calculer le volume d’un cylindre de rayon r et de hauteur h.(V = πr2 h) Exercice 13: ´ Ecrire un programme permettant de demander a` l’utilisateur d’entrer une valeur puis il affiche cette valeur incr´ement´ee d’une unit´e. Exercice 14: ´ Ecrire un programme permettant de calculer la moyenne des notes des trois mati`eres: le maths,la physique et le fran¸cais , selon la formule suivante : M oyenne =

2 × Maths + 2 × Physique + 1 × fran¸cais 5

Exercice 15: ´ Ecrire un programme qui permet de calculer le prix TCC a` partir du prix net et de la TVA Exercice 16: ´ Ecrire un programme qui permet de calculer le prix net PNET `a partir du TTC et la TVA Exercice 17: ´ Ecrire un Un programme qui fait les quatre op´erations ´el´ementaires : la somme,la soustraction ,la multiplication et la division deux entiers entr´es par l’utilisateur. Exercice 18: ´ Ecrire un programme qui demande a` l’utilisateur d’entrer une valeur de type entier puis il la converti en h ,min et secondes.Par exemple si la valeur entr´ee par l’utilisateur est 17845, al abdali Abdelhamid

9

EHTP


CLUB EHTPEC

Langage C

le programme affiche : 4h 57min 25sec Exercice 19: ´ Ecrire un programme qui demande `a l’utilisateur d’entrer l’heure actuelle puis il l’heure incr´ement´ee de 25 sec .Par exemple si l’heure est 11:36:43 le programme affiche : −→ Ici de 25 secondes il sera 11:37:08 Exercice 20: ´ Ecrire un un programme permettant de calculer l’image d’une valeur x entr´ee par l’utilisateur par les fonctions: 1. cos et sin . 2. racine carr´e. 3. x 7−→ xn . On pourra utiliser la biblioth`eque math.h via l’instruction #include<math.h> Exercice 21: ´ Ecrire un un programme permettant de calculer l’image d’une valeur x entr´ee par l’utilisateur par la fonction, f (x) = 2x2 − 7x + 1 . Exercice 22: Reprendre le mˆeme exercice mais cette fois avec la fonction: √ f (x) = e−x − 7 x −

1 cos (x2 )

Exercice 23: Un nombre complexe peut toujours s’´ecrire sous la forme z = a + ib avec z ∈ C et a, b ∈ R. ´ Ecrire un programme qui demande a` l’utilisateur de saisir deux nombres complexes puis il affiche leur somme ,leur produit, leur diff´erence et leur division. Exercice 24: Soient i = 3 et j = 4.Quelle est la valeur de j apr`es l’ex´ecution des instructions suivantes: . j = i + 1; . j =i++ ; . j =++i ; al abdali Abdelhamid

10

EHTP


CLUB EHTPEC Les op´erations j = i , i + + et ´equivalentes.

Langage C ´ + +j s’appellent comment? Ecrire des instructions

Exercice 25: En utilisant 5 entiers i = 2, j = 1, k = 3, l = −1 et n.Donner `a chaque ´etape les valeurs de ces derniers.puis v´erifier vos r´esultats a` l’aide d’un programme . . n = k + + + j + + − i; . n = + + k − i + +; . n = j; . n = − − j + − − i; . n = k + + + j + + − + + i; . n = + + k + l − − + i; . n = 3 ∗ + + j + l ∗ i − −; R´e´ecrire les instructions pr´ec´edentes en utilisant les parenth`eses. Exercice 26: Soient i, j, n et m trois entiers tels que : i = 2, j = 5, m = 1 et n = 1.Donner `a chaque ´etape les valeurs de ces derniers.puis v´erifier vos r´esultats a` l’aide d’un programme . . n = n + i; . m+ = i; . m∗ = j; . n/ = i; . m = j%i; ´ Que fait l’op´eration j%i ? Ecrire des instructions ´equivalentes. Exercice 27: Dans un programme, d´eclarer les variables suivantes: − un entier n = 40. − un r´eel x = 3.25. − un caract`ere c =0 c0 . − un double d = 25.23. al abdali Abdelhamid

11

EHTP


CLUB EHTPEC

Langage C

− un entier non sign´e e = 7. Que donnent les incrustions suivantes: 1. n/e + d ∗ n + x; 2. 10.0/3.0 ∗ n + x + c; 3. (char)n + c; 4. (float)n+(int)x + n/3; Exercice 28: ´ Ecrire un programme permettant de calculer la distance entre deux points A et B dans l’espace. q AB = (xB − xA )2 + (yB − yA )2 + (zB − zA )2 Exercice 29: ´ Ecrire un programme permettant de calculer la moyenne des notes de trois ´etudiants.Modifier le programme pour calculer la moyenne des notes de toute une classe contenant 30 ´etudiants?

al abdali Abdelhamid

12

EHTP


CLUB EHTPEC

1.2

Langage C

Solution des exercices

Solution 1: Le programme suivant permet d’afficher le message Qui ne pr´ epare pas le r´ eussite, pr´ epare l’´ echec !.Mais le probl`eme c’est que le ”´ e ” ne s’affiche pas ! Voir ce que fera la septi`eme instruction. Code C 1 2 3 4 5 6 7 8 9

,include <stdio.h> ,include <stdlib.h> int main%0 { printf%é \n Qui ne prépare pas la réussite} prépare l7échec Q\n\né0; printf%é Qui ne pr!cpare pas la r!cussite} pr!cpare l7!cchec Q\n é}130}130}130}1300; return 0; }

. 130 est le code d’ASCI du caract`ere e ´. Solution 2: Code C 0 v z y P A S E } 0& 00 0v 0z

(include <stdio%h> (include <stdlib%h> ," Un programme qui demande à l7utulisateur d7entrer un réel puis il l7affiche ", int main;8 { float a; puts ;5taper un reel :\n58; scanf ;56f5\{a8; printf;5vous avez taper:6f\n5\a8; system;5PAUSE58; return &; }

Solution 3:

al abdali Abdelhamid

13

EHTP


CLUB EHTPEC

Langage C

Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

*include <stdio.h> *include <stdlib.h> int main() { printf(7\n\n\n\n\n7); printf(7 ************ printf(7 ************ printf(7 *** printf(7 *** printf(7 ************ printf(7 ************ printf(7 *** printf(7 *** printf(7 ************ printf(7 ************ printf(7\n\n\n\n\n7); return 0; }

*** *** *** *** *** *** *** *** *************** *************** *** *** *** *** *** *** *** ***

************** ************** *** *** *** *** *** *** *** ***

*************** **************** *** *** *** *** *** *** **************** *************** *** *** ***

\n7); \n7); \n7); \n7); \n7); \n7); \n7); \n7); \n7); \n7);

Solution 4: 1.La programmation de l’algorithme 1 : Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

vinclude <stdio*h> vinclude <stdlib*h> int main/= { int a+b+c; puts/r\n entrer la vaaleur de a\nr=; scanf/rfdr+%a=;}}a=1 printf/ra=fd \nr+a=;}}a=1 b=70a; printf/ra=fd b=fd \nr+a+b=;}}a=1 b=8 a=b-2; printf/ra=fd b=fd \nr+a+b=; }}a=6 b=8 c=a; printf/ra=fd b=fd c=fd \nr+a+b+c=; }}a=6 b=8 c=6 a=29b0c; printf/ra=fd b=fd c=fd \nr+a+b+c=; }}a=22 b=8 c=6 c=a912; printf/ra=fd b=fd c=fd \nr+a+b+c=; }}a=22 b=8 c=264 a=b0c}2; printf/ra=fd b=fd c=fd \nr+a+b+c=; }}a=140 b=8 c=264 b=a; printf/ra=fd b=fd c=fd \nr+a+b+c=; }}a=140 b=140 c=264 a=b; printf/ra=fd b=fd c=fd \nr+a+b+c=; }}a=140 b=140 c=264 return 0; }

2.La programmation de l’algorithme 2 :

al abdali Abdelhamid

14

EHTP


CLUB EHTPEC

Langage C

Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

finclude <stdio.h> finclude <stdlib.h> int main*9 { int a-b-c; a=5; printf*ra=%d b=3; printf*ra=%d a=a+b; printf*ra=%d a=2; printf*ra=%d c=5; printf*ra=%d b=c0*}19; printf*ra=%d a=}3; printf*ra=%d b=2; printf*ra=%d return 0; }

\nr-a9;/0a=50/ b=%d

\nr-a-b9;/0a=5

b=%d

\nr-a-b9; /0a=8

b=30/ b=30/

b=%d

c=%d \nr-a-b-c9; /0a=2

b=3

0/

b=%d

c=%d \nr-a-b-c9; /0a=2

b=3

c=50/

b=%d

c=%d \nr-a-b-c9; /0a=2

b=}5

b=%d

c=%d \nr-a-b-c9;

b=%d

c=%d \nr-a-b-c9; /0a=}3

/0a=}3

b=}5 b=2

c=50/ c=50/ c=50/

Solution 5: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

pinclude <stdio}h> pinclude <stdlib}h> int main\/ { int x+som; som=0; printf\8som=fd x=2; printf\8som=fd som=som9x*3; printf\8som=fd x=3*som-50; printf\8som=fd x=som/2; printf\8som=fd som=som-x*4; printf\8som=fd return 0; }

\n8+som/;/*som=0*/ x=fd

\n8+som+x/;/*som=0

x=2*/

x=fd

\n8+som+x/;/*som=6

x=2*/

x=fd

\n8+som+x/;

x=fd

\n8+som+x/;/*som=6

x=fd

\n8+som+x/;/*som=-6

x=3*/ x=3*/

Solution 6:

al abdali Abdelhamid

15

EHTP


CLUB EHTPEC

Langage C

Code C 1 2 3 4 5 6 7 8 9 1} 11 12 13 14 15 16 17 18 19

vinclude <stdiogh> vinclude <stdlibgh> int main89 { int aAbAc; printf8EEntrer la valeur de a \nE9; scanf8E7dEA%a9; printf8EEntrer la valeur de b \nE9; scanf8E7dEA%b9; printf8E'''''Avant l&echange'''''\nE9; printf8Ea= 7d b= 7d \nEAaAb9; c=a; a=b; b=c; printf8E'''''Apres l&echange'''''\nE9; printf8Ea= 7d b= 7d \nEAaAb9; return }; }

Solution 7: Code C * 0 } 5 6 7 8 9 -= --*

finclude <stdio&h> finclude <stdlib&h> 99Un programme de converstin d;une temperatre a une autre 99 int main7" { float T8F; puts76entrer la valeur de la temperature en fahr:\n6"; scanf76,f68FF"; T=7F%0*":599; printf76la temeperature en degree celcius est:,f\n68T"; return =; }

Solution 9: Code C * 0 y P A S E } 9 *= ** *0 *y

finclude <stdio&h> finclude <stdlib&h> 99Un programme permet de calculer le volume d7un cube& int main"é { float a8V; puts"6taper la coté du cube:\n6é; scanf"6Vf68;aé; V=a:a:a; printf"6le volume du cube est:Vf\n 68Vé; system"6PAUSE6é; return =; }

al abdali Abdelhamid

16

EHTP


CLUB EHTPEC

Langage C

Solution 10: 1. Voir l’´enonc´e. 2. Il ne faut pas coder la division 4 ÷ 3 par 4/3 , qui vaut 1 en langage C. La bonne codification est 4.0/3.0 Solution 11: 1. Code C 0 = y P A E } 8 9 0& 00 0= 0y 0P

)include <stdio9h> )include <stdlib9h> %8Un programme qui permet de calculer la surface d,un carré en lui donnant la coté a98% int mainS; { float a:S; putsS(entrer la coté a:\n(;; scanfS({f(:7a;; S=a8a; printfS(la surface du carré est:{f(:S;; systemS(PAUSE(;; return &; }

2. Code C = \ y P A E } 8 9 =& == =\ =y =P =A =E =}

)include <stdio0h> )include <stdlib0h> %; Un programme qui permet de nous donner la surface dLun rectangle en lui donnat la longueur et la largeur0;% int main,S { float L"l"S; puts,(entrer la largeur l:(S; scanf,({f("8lS; puts,(entrer la longueur l:(S; scanf,({f("8LS; S=l;L; printf,(La surface du rectangle est:{f\n("SS; system,(PAUSE(S; return &; }

3.

al abdali Abdelhamid

17

EHTP


CLUB EHTPEC

Langage C

Code C : 0 % & = \ A U E :" :: :0 :% :& := :\

( include <stdio;h> ( include <stdlib;h> ( define pi %;:& 9{ Programme qui permet de calculer la surface d]un disque en lui donnant le rayon;{9 int main)int argcRchar{argv[]7 { float RRS; puts)6entrer le rayon R}67; scanf)6vf6R[R7; S=pi{R{R; printf)6la surface est} vf\n6RS7; system)6PAUSE67; return "; }

4. Code C = y P A E } 7 8 9 =0 == =y =P =A =E =}

6include <stdio%h> 6include <stdlib%h> &" Un programme qui permet de calculer la surface dSun triangle en lui donnant la base et la hauteur%"& int main;8 { float b\h\S; puts;)entrer la base b:\n )8; scanf;)7f)\,b8; puts;)entrer la hauteur h:\n)8; scanf;)7f)\,h8; S=;b"h8&y; printf;)le surface du triangle est:7f\n )\S8; system;)PAUSE)8; return 0; }

5. Code C % & = A S E } 8 9 %0 %% %& %= %A %S

(include <stdio:h> (include <stdlib:h> (define pi =:%A \PUn programme permettant de calculer le perimètre d8un cercle en lui donnant le rayon du cercleP\ int mainR, { float R9P; putsR6entrer le rayon R:\n 6,; scanfR67f69{R,; P=&PRpiPR,; printfR6le perimètre du cercle est :7f\n 69P,; system R6PAUSE6,; return 0; }

6.

al abdali Abdelhamid

18

EHTP


CLUB EHTPEC

Langage C

Code C & 0 = + y A S E } &% && &0 &= &+ &y &A &S

6include <stdio\h> 6include <stdlib\h> 98 Un programme permettant de calculer le pèrimètre d,un recangle en lui donnant la largeur l et la longueur L\89 int mainP; { float lvLvP; putsP)entrer la valeur de la largeur l:\n);; scanfP)7f)vfl;; putsP)entrer la valeur de la longueur L:\n);; scanfP)7f)vfL;; P=08Pl"L;; printfP)le perimètre du rectangle est :7f\n )vP;; systemP)PAUSE);; return %; }

Solution 12: Code C = * : P A S E } 9 =0 == =* =: =P =A =S

6include <stdio%h> 6include <stdlib%h> 6define pi :%=P=A &&Un programme permettant de calculer le volume dVun cylindre&& int main;D { float r\h\V;&&Declaration des variables r\h et V&& puts;)taper le rayon du cylindre r\n)D; scanf;)7f)\,rD; puts;)taper la hauteur du cylindre h\n)D; scanf;)7f)\,hD; V=pi8;r8r8hD; printf;)le volume du cylindre est:7f\n )\VD; system;)PAUSE)D; return 0; }

Solution 13: Code C 1 2 3 4 5 6 7 8 9 10 11 12

vinclude <stdio.h> vinclude <stdlib.h> int main&9 { int a0b; printf&"donner la valeur de a :\n"9; scanf&"\d"08a9; b=a+1; printf&"la valeur de b est:\d\n"0b9; return 0; }

al abdali Abdelhamid

19

EHTP


CLUB EHTPEC

Langage C

Solution 14: Code C ' : A U S E } 8 9 '/ '' ': 'A 'U 'S 'E '}

;include <stdio*h> ;include <stdlib*h> int main8% { float noteMath0notePhys0noteFr0moyenne; printf8rtaper la noteMath\n r%; scanf8rpfr0"noteMath%; printf8rtaper la notePhys\n r%; scanf8rpfr0"notePhys%; printf8rtaper la noteFr\n r%; scanf8rpfr0"noteFr%; moyenne=8:&noteMath9:&notePhys 9noteFr%+S; printf8rla moyenne d\acces est:pf\nr0moyenne%; system8rPAUSEr%; return /; }

Solution 15: Code C * / x : y U S E } *+ ** */ *x *: *y *U

Ainclude <stdio0h> Ainclude <stdlib0h> int mainr" { int PNet; float TVA%PTTC; printfrVtaper PNet\n V"; scanfrVCdV%8PNet"; printfrVtaper TVA\n V"; scanfrVCfV%8TVA"; PTTC=PNet9PNet\rTVA=*++"; printfrVle prix PTTC est :Cf\nV%PTTC"; systemrVPAUSEV"; return +; }

Solution 16:

al abdali Abdelhamid

20

EHTP


CLUB EHTPEC

Langage C

Code C % & 0 = * + : y S %9 %% %& %0 %=

{include <stdio"h> {include <stdlib"h> \\ Un programme qui calcule le prix PNet\\ int main,; { float PTTCAPNet} int TVA} printf,5taper PTTC et TVA \n 5;} scanf,5ff ff5ATPTTCATTVA;} PNet=%997PTTC\,%99VTVA;} printf,5le prix PNet est Eff\n5APNet;} system,5PAUSE5;} return 9} }

Solution 17: Code C 0 + = } 6 7 8 9 0& 00 0+ 0= 00} 06 07

xinclude <stdio9h> xinclude <stdlib9h> %;Un programme qui fait les quatres opérations élémentaires : la somme"la soustraction "la multiplication et la division deux entiers ;% int main{7 { int a"b; puts{ventree la valeur de a:\n v7; scanf{v(dv")a7; puts{ventrer la valeur de b:\nv7; scanf{v(dv")b7; printf{v (d 8 (d = (d \nv"a"b"a8b7; printf{v (d \ (d = (d \nv"a"b"a\b7; printf{v (d ; (d = (d \nv"a"b"a;b7; printf{v (d % (d = (d \nv"a"b"a%b7; return{&7; }

Solution 18: Code C P A S E } 6 7 8 9 P= PP PA PS PE P} P6

)include <stdio&h> )include <stdlib&h> 0"Un programme demande a l;utulisateur une valeur de type entier puis il a converti au h 9min et secandes"0 int main8f { int val 9h9aide9mint9s; printf8(entrer une valeur \n (f; scanf8({d(97valf; h=val0S6==; aide=val{S6==; mint=aide06=; s=aide{6=; printf8( h={d \t min={d \t s={d \n(9h9mint9sf; system8(PAUSE(f; }

Solution 19: al abdali Abdelhamid

21

EHTP


CLUB EHTPEC

Langage C

Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

:include <stdio/h> :include <stdlib/h> int main&9 { int a*b*h*mint*sec; puts&'entrer l%heure actuelle:\n '9; scanf&'8d'*fh9; puts&'entrer la minute actuelle:\n '9; scanf&'8d'*fmint9; puts&'entrer le seconde actuelle:\n '9; scanf&'8d'*fsec9; a=36000h=600mint=sec=1; printf&'le nombre de seconde totale est 8d:\n'*a9; h=&a}36009824; printf&' 8d\n '*h9; b=a83600; printf&' 8d\n '*b9; mint=b}60; printf&' 8d\n '*mint9; sec=b860; printf&' 8d\n '*sec9; printf&'dans une secande il sera 8d\t 8d\t 8d\t'*h*mint*sec9; return 0; }

Solution 20: Code C 0 } 3 4 5 6 7 8 9 0= 00 0} 03

xinclude <stdio&h> xinclude <stdlib&h> 99Un programme permettant de calculer le cosinus et le sinus dvun reel99 int main7" { float x8cosinus8sinus;99 Declaration des variable x8cosinus8sinus99 puts 7ftaper un reel: x\nf"; scanf7f;ff8Dx"; cosinus=cos7x" ; sinus=sin7x"; printf 7fle cos de ;f est egale a :;f\nf8x8cosinus"; printf7fle sinus de ;f est egale a :;f\nf8x8sinus"; }

Code C & = q A U S E } 9 &, && &= &q &A &U

7include <stdio0h> 7include <stdlib0h> 7include <math0h> %%Programme de calcul de la racine carree dvun nombre positif%% int mainy8 { float a;%% DĂŠclaration de la variable de type entier a %% float racin;%%Declaration de la variable racin0 putsy{taper un nombre positif a:\n{8; scanfy{Df{:ĂŠa8; racin=sqrt ya8; printfy{ la racine de Df est :Df\n{:a:racin8; systemy{PAUSE{8; return ,; }

al abdali Abdelhamid

22

EHTP


CLUB EHTPEC

Langage C

Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

"include <stdio}h> "include <stdlib}h> "include <math}h> int main%& { float x=a; int n; puts%ptaper le reel x:\np&; scanf%p:fp=\x&; puts%ptaper l9entier n:p&; scanf%p:dp=\n&; a = pow %x=n&; printf%ple resultat est::f\np=a&; return 0; }

Solution 21: Code C = * + 0 A P S E =9 == =* =-

6include <stdio%h> 6include <stdlib%h> &&Un programme permettant de calculer les valeur d;une fonction&& int mainD7 { float x\ y;&&Declaration des variables x et la fonction g&& putsD{taper le reel x }\n{7; scanfD{,f{\yx7; y=*"Dx"x78DP"x7:=; printfD{l;image de ,f par la fonction g est },f\n{\x\ y7;&&Afichage du resultat&& systemD{PAUSE{7; return 9; }

Solution 22: Code C 0 = * q + ^ A P 0& 00 0= 00*

{include }stdio9h> {include }stdlib9h> {include }math9h9h> %%Un programme permettant de calculer les valeur dyune fonction%% int main;D { float x: yE%%Declaration des variables x et la fonction g%% puts;6taper le reel x S\n6DE scanf;6xf6:,xDE y=exp;\xD\;^8sqrt;xDD"0%;cos;x^=DDE printf;6lyimage de xf par la fonction g est Sxf\n6:x: yDE%%Afichage du resultat%% system;6PAUSE6DE return &E }

Solution 23: al abdali Abdelhamid

23

EHTP


CLUB EHTPEC

Langage C

Code C = S M * v / } 8 9 =] == =S =M =* =v =/ =} =8 =9 S] S= SS SM

:include <stdio[h> :include <stdlib[h> int main8g { int a-b-c-d-n; printf8xentrer la partie reele du premier nombre complexe:\nxg ; scanf8x7dx-%ag; printf8xentrer la partie imaginaire du premier nombre complexe:\nxg ; scanf8x7dx-%bg; printf8xentrer la partie reele du deuxieme nombre complexe:\nxg ; scanf8x7dx-%cg; printf8xentrer la partie imaginaire du deuxieme nombre complexe:\nxg ; scanf8x7dx-%dg; printf8x=AAddition:\nxg; printf8x[7d07di]0[7d07di]=7d07di\nx-a-b-c-d-a0c-b0dg; printf8xSASoustraction\nxg; printf8x[7d07di]A[7d07di]=7d07di\nx-a-b-c-d-aAc-bAdg; printf8xMAMultuplication\nxg; printf8x[7d07di]9[7d07di]=7d07di\nx-a-b-c-d-8a9cgA8b9dg-8b9cg08a9dgg; printf8x*Adivision \nxg; printf8x[7d07di]+[7d07di]=[7d07di]+[7d]\nx-a-b-c-d-8a9cg08b9dg-8b9cgA8a9dg-c9c0d9dg; return ]; }

Solution 24: 1.

. j = i + 1 → i = 3, j = 4 . . j = i + + → i = 4, j = 3 . . j = + + i → i = 5, j = 5 . . L’op´eration j = i : une affectation . . L’op´eration j = j + 1 : une incr´ementation . . L’op´eration i + + : une post incr´ementation . . L’op´eration + + i : une pr´e incr´ementation . . L’op´eration i − − : une post d´ecr´ementation . . L’op´eration − − i : une pr´e d´ecr´ementation .

2. Les instructions ´equivalentes `a la post incr´ementation i + + et a` la pr´e incr´ementation + + i: 1 i = i+1 1 j = i et j = + + i ⇐⇒ j = i + + ⇐⇒ 2 i = i+1 2 j = i Remarque: De mˆeme pour la post d´ecr´ementation et la pr´e d´ecr´ementation. Solution 25: Pour ex´ecuter ces instructions, il faut connaˆıtre au pr´ealable la priorit´e des op´erateurs qui sont donn´es par le tableau ci-apr`es.

al abdali Abdelhamid

24

EHTP


CLUB EHTPEC L’ordre 1 2 3 4 5 6 7

Langage C L’instruction i= j= k= l= n= n = k + + + j + + − i; 2 2 4 −1 2 n = + + k − i + +; 3 2 5 −1 3 n = j; 3 2 5 −1 2 n = − − j + − − i; 2 1 5 −1 3 n = k + + + j + + + +i; 3 2 6 −1 9 n = + + k + l + i; 3 2 7 −2 3 n = 3 ∗ + + j + l ∗ i; 2 3 7 −2 3

table de priorit´e des op´erateurs

Solution 26: . n = n + i −→ i = 2, j = 5, m = 1, n = 3 . . m+ = i −→ i = 2, j = 5, m = 3, n = 3 . . m = m ∗ i −→ i = 2, j = 5, m = 15, n = 3 . . n/ = i −→ i = 2, j = 5, m = 15, n = 1 . . m = j%i −→ i = 2, j = 5, m = 15, n = 1 . . L’op´eration j%i : permet de trouver le reste de la division euclidienne de j par i . al abdali Abdelhamid

25

EHTP


CLUB EHTPEC

Langage C

Solution 27: Code C y P A U S E } 8 9 yT yy yP yA yU yS yE y} y8 y9 PT Py PP PA

1.3

8include <stdio*h> 8include <stdlib*h> int mainp" { char c=zcz; int n=UT; unsigned int e=}; float x=A*PS; double z=PS*PA ; printfpgxld \ng, n\c\p"; printfpgx*Pf \ng,P%x\c"; printfpgxc \ng,pchar"n\c"; printfpgx*Pf \n\ng,pfloat"z\pint"x\n/P"; printfpgTaille de char = xd \ng,sizeofpchar""; printfpgTaille de short int = xd \ng,sizeofpshort int""; printfpgTaille de int = xd \ng,sizeofpint""; printfpgTaille de long int = xd \ng,sizeofplong int""; printfpgTaille de float = xd \ng,sizeofpfloat""; printfpgTaille de double = xd \ng,sizeofpdouble""; printfpgTaille de long double = xd \ng,sizeofplong double""; systempgPAUSEg"; return T; }

R´ecr´eation

Ami lecteur, si vous avez fait tous ces exercices jusqu’au bout de ce chapitre indigeste, vous m´eritez un divertissement.

al abdali Abdelhamid

26

EHTP


CLUB EHTPEC

Langage C

− ∗ − − − − ∗ − − − − ∗ − − − − ∗−

al abdali Abdelhamid

27

EHTP


CLUB EHTPEC

Langage C

ˆ conditionnelle Structure de controle

2 2.1

´ Enonc´ e des exercices

Exercice 1: ´ Ecrire un programme qui demande `a l’utilisateur de saisir l’heure puis il affiche selon la cas bonjour ou bonsoir Exercice 2: ´ Ecrire un programme qui teste la parit´e d’un entier fourni par l’utilisateur. Exercice 3: ´ Ecrire un programme qui lit un nombre et qui d´etermine s’il appartient `a l’intervalle [−9, 15].

Exercice 4: ´ Ecrire un programme qui calcul la valeur absolue d’un r´eel ensuite il calcul la racine carr´ee de sa valeur absolue. Exercice 5: ´ Ecrire un programme qui lit les trois cot´es d’un triangle et qui d´etermine s’il est triangle rectangle. Exercice 6: ´ Ecrire un programme qui teste le signe d’un nombre fourni par l’utilisateur. Exercice 7: ´ Ecrire un programme qui demande deux nombres a` l’utilisateur et l’informe ensuite si le produit est n´egatif, positif ou nul. Remarque : on ne doit pas calculer le produit. Exercice 8: ´ Ecrire un programme qui teste l’´egalit´e de deux nombres fournis par l’utilisateur . Exercice 9: ´ Ecrire un programme qui teste si l’ann´ee est bissextile. Exercice 10: al abdali Abdelhamid

28

EHTP


CLUB EHTPEC

Langage C

´ Ecrire un programme qui permet la r´esolution d’une ´equation du premier degr´e ax + b = 0.

Exercice 11: ´ Ecrire le programme de r´esolution d’une ´equation du second degr´e ax2 + bx + c = 0 dont les coefficients r´eels a, b et c sont entr´es au clavier .Des affichages permettront de faciliter l’utilisation du programme par un utilisateur. Exercice 12: L’objectif de cette exercice est d’´ecrire l’´equation de deuxi`eme degr´e ax2 + bx + c sous la forme de produit de deux polynˆomes lin´eaires.C’est a` dire, il faut trouver, si possible, trois coefficients α, β et λ tels que ax2 + bx + c = α (x − β) (x − λ) . Pour cela, on a besoin de r´esoudre l’´equation ax2 +bx+c = 0.Voici quelques points a` prendre en consid´eration: 1. La variable x ainsi que les coefficients a, b et c sont des r´eels. 2. Essayer d’imaginer les diff´erentes situations pour a, b et c. 3. Les coefficients a, b et c sont entr´es par l’utilisateur au moment de l’ex´ecution. 4. Si la solution est impossible dans l’ensemble R, un message devra s’afficher a` l’utilisateur. Exercice 13: ´ Ecrire un programme qui fait les quatre op´erations ´el´ementaires du calcul selon le choix de l’utilisateur. Exercice 14: Reprendre le mˆeme exercice pr´ec´edent, mais cette fois ci avec switch case .A votre avis quelle est la diff´erence entre les deux programmes ? Exercice 15: ´ Ecrire un programme qui affiche le jour selon le num´ero du jour fourni par l’utilisateur. Exercice 16: ´ Ecrire un programme qui affiche si le caract`ere fourni par l’utilisateur est un chiffre, une voyelle ou une consonne. Exercice 17:

al abdali Abdelhamid

29

EHTP


CLUB EHTPEC

Langage C

´ Ecrire un programme qui permet de saisir un num´ero de mois et un num´ero du jour et d’afficher la p´eriode correspondante selon le tableau suivant : P´ eriode DU AU Vacances d’´et´e 1/7 15/9 Premier trimestre 16/9 19/12 Vacances d’hiver 20/12 3/1 Deuxi`eme trimestre 4/1 19/3 Vacances de printemps 20/3 3/4 Troisi`eme trimestre 4/4 30/6 Exercice 18: Un transporteur routier vous demande d’´ecrire un programme qui lui permettre de calculer les frais de transport des colis qu’il v´ehicule sachant que : ∗ La taxe de base applicable a` tous coulis est de 50 Dh. ∗ Si le colis p`ese plus de 60 kg,une surtaxe de 10 Dh par kilo suppl´ementaire est ajout´ee. ∗ Si une des dimensions (largeur,longueur,hauteur) du colis d´epasse 1 m`etre,20 Dh sont per¸cus . ∗ 10% du total obtenu sont ajout´es pour tout trajet sup´erieur `a 100 km. ´ Etant donn´es la largeur, la hauteur, la longueur , le poids du colis et la distance `a parcourir,´ecrire un programme qui calcule le prix a` payer pour le transport d’un colis.

− ∗ − − − − ∗ − − − − ∗ − − − − ∗−

al abdali Abdelhamid

30

EHTP


CLUB EHTPEC

2.2

Langage C

Solution des exercices

Solution 1: Code C 0 } 3 4 5 6 7 8 9 0= 00 0} 03 04 05 06

6include <stdio&h> 6include <stdlib&h> 99Un programme qui affiche bnjour o bonsoir selon les cas99 int main-? { int h; puts-{quelle l'heure est,il?\n{?; scanf-{7d{%"h? ; if -h<=09? { printf-{bonjour\n{?; } else { printf-{bonsoir{?; } return =; }

Solution 2: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

7include <stdio.h> 7include <stdlib.h> 7include<math.h> int main=0 { int n; printf=\entrer un entier: \n\0; scanf=\,d\,&n0; if =n,2==00 { printf=\pair\n\0; } else { printf=\impair\n\0; } return 0; }

Solution 3:

al abdali Abdelhamid

31

EHTP


CLUB EHTPEC

Langage C

Code C f " D z \ % & 0 y f8 ff f" fD fz f\ f%

-include Sstdioxh} -include Sstdlibxh} ;6 Programme qui lit un nombre et qui détermine s]il appartient à l]intervalle [=y7f\] 6; int main() { int aE=y7 bEf\7 x U printf([Donnez un entier \n[)U scanf([,d[7 5x)U if((aSEx)55(xSEb)) printf([,d appartient a [,d7 ,d] \n[7 x7 a7 b)U else printf([,d n]appartient pas a [,d7 ,d] \n[7 x7 a7 b)U system([PAUSE[)U return 8U }

Solution 4: Code C 0 % & = | G R y 0\ 00 0% 0& 0= 00| 0G 0R 0y

)include EstdioDh> )includeEstlibDh> z; Programme qui calcul la valeur absolue dfun entier ensuite il calcul la racine carrée de sa valeur absolue ;z int mainA, { float Ap absAp racineAS printfA(Donnez un réel \n(,S scanfA({f(p 8A,S ifAAE\, absA}"AS else absA}AS printfA(|{lG|}{lG \n(p Ap absA ,S printfA(RacineA{lG,}{lG \n(p absAp sqrtAabsA, ,S systemA(PAUSE(,S return \S }

Solution 5:

al abdali Abdelhamid

32

EHTP


CLUB EHTPEC

Langage C

Code C * + g } ' P U S E *= ** *+ *g *} *' *P *U *S *E += +* ++ +g

;include <stdio9h> ;include <stdlib9h> int mainv: { float AB%AC%BC%x%y; putsvyentrer la valeur de AB:\ny:; scanfvypfy%"AB:; putsvyentrer la valeur de Ac:\ny:; scanfvypfy%"AC:; putsvyentrer la valeur de BC:\ny:; scanfvypfy%"BC:; x=vAB\AB:8vAC\AC:; y=BC\BC; if vx==y: { printfvyle triangle ABC est rectange\ny:; } else { printfvyle triangle ABC nrest pas rectangle\ny:; } systemvyPAUSEy:; return =; }

Solution 6: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

\include<stdioéh> \include<stdlibéh> int main%, { int a; printf%gProgramme de signe\ng,; printf%gEntrer l8entier\tg,; scanf%gEdg='a,; if %a==0, printf%gl8entier est nulg,; else if %a>0, printf%gl8entier est positifg,; else printf%gl8entier est négatifg,; return 0; }

Solution 7:

al abdali Abdelhamid

33

EHTP


CLUB EHTPEC

Langage C

Code C 0 % & | y A U S E 0\ 00 0% 0& 0| 0y 0A 0U 0S 0E

,include <stdioDh> ,include <stdlibDh> z8 Programme qui demande deux nombres à l)utilisateur et l)informe ensuite si le produit est négatif9 positif ou nul sans calculer le produit8z int main7{ { float a9 b; printf7éDonnez deux nombres \né{; scanf7é6f6fé9 (a9 (b{; if777a<\{((7b<\{{||77a>\{((7b>\{{{ printf7épositif\né{; else if777a<\{((7b>\{{||77a>\{((7b<\{{{ printf7énégatif\né{; else printf7énul\né{; system7éPAUSEé{; return \; }

Solution 8: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

\include<stdioéh> \include<stdlibéh> int main%, { int a; printf%gProgramme de signe\ng,; printf%gEntrer l8entier\tg,; scanf%gEdg='a,; if %a==0, printf%gl8entier est nulg,; else if %a>0, printf%gl8entier est positifg,; else printf%gl8entier est négatifg,; return 0; }

Solution 9:

al abdali Abdelhamid

34

EHTP


CLUB EHTPEC

Langage C

Code C } 2 3 4 5 6 7 8 9 }L }} }2 }3 }4 }5 }6 }7 }8 }9 2L

binclude<stdio=h> binclude<conio=h> int main:8 { int a; printf:'Programme de test dEannees bissextiles\n\n'8; printf:'Entrer lEannee:\t'8; scanf:'\d'&7a8; if :a\4==L8 if :a\}LL==L8 if :a\4LL==L8 printf:'LEannee est bissextile'8; else printf:'LEannee est non bissextile'8; else printf:'LEannee est bissextile'8; else printf:'LEannee est non bissextile'8; return L; }

Solution 10: Code C ! ' q } 5 6 7 8 9 !/ !! !' !q !} !5 !6 !7 !8 !9 '/ '!

"include <stdio+h> "include <stdlib+h> int main%& { float a=b=x=y; puts %pentrer le reel a:\np&; scanf%p:fp=\a&; puts%pentrer le reel b:\np&; scanf%p:fp=\b&; y=a9x0b; y=/; x=*b-a; if %a7=/& { printf%pla solution de l8equation :fx0:f=/ est::f\np=a=b=x&; } else printf%ppas de solution\np&; return /; }

Solution 11:

al abdali Abdelhamid

35

EHTP


CLUB EHTPEC

Langage C

Code C / + } 4 5 6 7 8 9 /q // /+ /} /4 /5 /6 /7 /8 /9 +q +/ ++ +} +4 +5 +6 +7 +8 +9 }q }/ }+ }}

pinclude <stdio-h> pinclude <stdlib-h> pinclude <math-h> int main9% { float a=b=c=d=e=f=g=h=x; puts98entrer le reel a:\n8%; scanf98rf8=:a%; puts98entrer le reel b:\n8%; scanf98rf8=:b%; puts98entrer le reel c:\n8%; scanf98rf8=:c%; d=b&b*4&a&c; if 9a ;= q%{ if 9d>q% { e=sqrt9d%; f=9*b*e%!9+&a%; g=9*b0e%!9+&a%; printf98les solutions de cette equation est:rf et rf\n8=f=g%; } else if 9d<q% { printf98 pas de solutions reels\n8%; } else { h=9*b%!9+&a%; printf98cette equation admet une racine double:rf\n8=h%; } } else printf 98pas de solution8%; return q; }

Solution 12:

al abdali Abdelhamid

36

EHTP


CLUB EHTPEC

Langage C

Code C / + R } ^ 6 7 8 9 /q // /+ /R /} /^ /6 /7 /8 /9 +q +/ ++ +R +} +^ +6 +7 +8 +9 Rq R/ R+ RR R} R^ R6 R7 R8 R9 }q }/

pinclude <stdio-h> pinclude <stdlib-h> pinclude<math-h> int main9% { float a=b=c=d=e=f=g=h=X; puts98entrer le reel a:\n8%; scanf98rf8=:a%; puts98entrer le reel b:\n8%; scanf98rf8=:b%; puts98entrer le reel c:\n8%; scanf98rf8=:c%; d=b&b*}&a&c; X==X; if 9a ;= q% { if 9d>q% {e=sqrt9d%; f=9*b*e%!9+&a%; g=9*b0e%!9+&a%; if9f>=q :: g >=q% {printf98la factorisation dans R est:rf9X*rf%9X*rf %\n8=a=f=g%;} if9f>=q :: g <=q% {printf98la factorisation dans R est:rf9X*rf%9X0rf %\n8=a=f=g%;} if9f<=q :: g >=q% {printf98la factorisation dans R est:rf9X0rf%9X*rf %\n8=a=*f=g%;} if9f<=q :: g <=q% {printf98la factorisation dans R est:rf9X0rf%9X0rf %\n8=a=*f=*g%;} } else {if 9d<q% { printf98 impossible de transformer dans R\n8%; } else { h=9*b%!9+&a%; printf98la factorisation dans R est:rf9X*rf%^+\n8=a=h%; } } } else { printf 98la transformation dans R est: rf9X0rf% \n8=b=c!b%;} }return q;

Solution 13:

al abdali Abdelhamid

37

EHTP


CLUB EHTPEC

Langage C

Code C C H I X % & + } CR CC CH CI CX C% C& C+ C} CHR HC HH HI HX H% H& H+ H} HIR IC IH II IX I%

=include <stdioOh> =include <stdlibOh> =include<mathOh> int main\8 { int avbvn/ printf\"============MENU=============\n"8/ printf\"la somme n=C \n"8/ printf\"la soustraction n=H \n"8/ printf\"la multiplication n=I\n"8/ printf\"la division n=X\n"8/ printf\"==============================\n"8/ printf\"VOTRE CHOIX \n"8/ scanf\"Ed"vNn8/ printf\"entrer Un nombre \n"8/ scanf\"Ed"vNa8/ printf\"entrer Un nombre \n"8/ scanf\"Ed"vNb8/ if \n==C8 { printf\"Ed0Ed=Ed\n"vavbva0b8/ } if \n==H8 { printf\"EdVEd=Ed\n"vavbvaVb8/ } if \n==I8 { printf\"Ed9Ed=Ed\n"vavbva9b8/ } if \n==X8 { printf\"Ed0Ed=Ed\n"vavbvaTb8/ } }

Solution 14:

al abdali Abdelhamid

38

EHTP


CLUB EHTPEC

Langage C

Code C C H I X % & w : + CR CC CH CI CX C% C& Cw C: C+ HR HC HH HI HX H% H& Hw H: H+ IR IC IH

"include *stdioOh} "include *stdlibOh} "include*mathOh} int mainU\ { int avbvnprintfUf////////////MENU/////////////\nf\printfUfla somme n/C \nf\printfUfla soustraction n/H \nf\printfUfle produit n/I\nf\printfUfla division n/X\nf\printfUf//////////////////////////////\nf\printfUfVOTRE CHOIX \nf\scanfUfMdfvEn\printfUfentrer Un nombre \nf\scanfUfMdfvEa\printfUfentrer Un nombre \nf\scanfUfMdfvEb\switch Un\ {case CkprintfUfMd0Md/Md\nfvavbva0b\breakcase Hk printfUfMdVMd/Md\nfvavbvaVb\breakcase IkprintfUfMd9Md/Md\nfvavbva9b\breakcase Xk printfUfMd0Md/Md\nfvavbvaTb\breakdefaultk {printfUferreurf\-} } return R}

Solution 15: Code C : \ 9 % , & 0 w k :z :: :\ :9 :% :, :& :0 :w :k \z \: \\ \9

vinclude Vstdio"h! vinclude Vstdlib"h! DN Programme qui affiche le nom du jour à partir d6un chiffre entré au clavier ND int main{7 { int NumJour M printf{éDonnez le numéro du jourL\né7M scanf{é(dé; )NumJour7M switch{NumJour7 { case : L printf{éDimanche\né7M breakM case \ L printf{éLundi\né7M breakM case 9 L printf{éMardi\né7M breakM case % L printf{éMercredi\né7M breakM case , L printf{éJeudi\né7M breakM case & L printf{éVendredi\né7M breakM case 0 L printf{éSamedi\né7M breakM default L printf{éerreur'\né7M } system{éPAUSEé7M return zM }

Solution 16:

al abdali Abdelhamid

39

EHTP


CLUB EHTPEC

Langage C

Code C p " D : \ % & w k p; pp p" pD p: p\ p% p& pw pk "; "p ""

(include Ustdio{hE 8x Programme qui demande à l9utilisateur d9entrer un caractère et qui affiche en retour si le caractère entré est une voyelle 5a6 e6 i6 o6 u6 yb6 un chiffre 5;6 p6 "6 {{{6 kb6 une consonne 5b6 c6 d6 f6 g6 h6 {{{6 t6 v6 x6 zb6 ou autre x8 int main5b { char car A printf5yDonnez un caractère}\nybA scanf5y)cy6 0carbA switch5carb { case 9;9 } case 9p9 } case 9"9 } case 9D9 } case 9:9 } case 9\9 } case 9%9 } case 9&9 } case 9w9 } case 9k9 } printf5ychiffre\nybA break A case 9a9 } case 9e9 } case 9i9 } case 9o9 } case 9u9 } case 9y9 } printf5yvoyelle\nybA break A default } printf5yconsonne\ autre caractère\nybA } system5yPAUSEybA return ;A }

Solution 17: Code C ! } = V ' v x è T !P !! !} != !V !' !v !x !è !T }P }! }} }= }V }' }v }x }è }T =P =! =} == =V ='

;include Ustdio0hE ;include Ustdlib0hE || numéro de mois et un numéro du jour et afficher la période correspondante int main:\ { int mois& jour A printf:,Donnez le numéro du moisy\n,\A scanf:,"d,& Dmois\A printf:,Donnez le numéro du joury\n,\A scanf:,"d,& Djour\A if:::moisU!\ || :moisE!}\\||::moisU!\ || :moisE!}\\\ { Printf:,erreur de saisie 6\n,\A } else {if::moisSSx\|| :moisSSè\||::moisSST\DD :jourUS!'\\\ printf:,Vacances dzété\n, \A else if:::moisSST\DD :jourES!v\\||:moisSS!P\||:moisSS!!\||::moisSS!}\DD :jourUS!T\\\ printf:,Premier trimestre\n, \A else if:::moisSS!}\DD :jourES}P\\||::moisSS!\DD :jourUS=\\\ printf:,Vacances dzhiver\n, \A else if:::moisSS!\DD :jourESV\\||:moisSS}\||::moisSS=\DD :jourUS!T\\\ printf:,Deuxième trimestre\n, \A else if:::moisSS=\DD :jourES}P\\||::moisSSV\DD :jourUS=\\\ printf:,Vacances de printemps\n, \A else printf:,Troisième trimestre\n, \A } system:,PAUSE,\A return PA }

al abdali Abdelhamid

40

EHTP


CLUB EHTPEC

Langage C

Les structures it´eratives

3 3.1

´ Enonc´ e des exercices

Exercice 1: ´ Ecrire un programme qui affiche la valeur du compteur a` chaque it´eration. Exercice 2: ´ Ecrire un programme qui demande un nombre de d´epart, et qui ensuite affiche les dix nombres suivants.Par exemple, si l’utilisateur entre le nombre 17, le programme affichera les nombres de 18 a` 27. Exercice 3: ´ Ecrire un programme qui affiche la moyenne d’une suite d’entiers positifs saisie par l’utilisateur se terminant par z´ero. Exercice 4: ´ Ecrire un programme qui qui demande un nombre de d´epart, et qui calcule la somme des entiers jusqu’`a ce nombre. N X S= k k=0

NB : on souhaite afficher uniquement le r´esultat, pas la d´ecomposition du calcul. Exercice 5: ´ Ecrire un programme qui d´etermine le premier nombre entier N tel que la somme de 1 `a N d´epasse strictement 100. Exercice 6: Le calcul de la factoriel d’un entier positif se fait en appliquant la formule suivante: n! = 1 , n = 0 n! = n × (n − 1) × · · · × 3 × 2 × 1 , n ≥ 1 ´ Ecrire un programme qui demande un nombre de d´epart, et qui calcule sa factorielle. Exercice 7: ´ Ecrire un programme qui demande a` l’utilisateur de saisir un r´eel et un entier positif puis il calcule it´erativement la puissance xn d’un r´eel.(xn+1 = x × xn )

al abdali Abdelhamid

41

EHTP


CLUB EHTPEC

Langage C

Exercice 8: Le d´eveloppement de Taylor de la fonction f (x) = formule suivante: N +∞ X X 1 n xn f (x) = = x = lim N −→+∞ 1 − x n=0 n=0

1 1−x

autour de 0 est donn´e par la

, |x| ≺ 1

(∗)

´ Ecrire un programme qui permet de calculer une approximation de la somme (*).les valeurs de N sont donn´ees par l’utilisateur.Modifier le programme pour simuler une approximation de la fonction g(x) = sin(x) autour de 0 ? g(x) = sin(x) = x −

x3 x5 x7 + − + ... + (x) 3! 5! 7!

, x∈R

Exercice 9: ´ Ecrire un programme fait la multiplication de deux entiers positifs a et b par additions successives. Exercice 10: ´ Ecrire un programme qui demande `a l’utilisateur d’entrer un entier N et qui v´erifier si N est un carr´e parfait ou non. 1. Assurez-vous lors de l’introduction de N que N ≼ 0 (utilisez if ). 2. Utiliser une boucle index´e avec un compteur i de 0 jusqu’`a N . 3. Interrompez la boucle avec break lorsque i Ă— i = N (carr´e parfait) ou lorsque i Ă— i > N (n’est pas un carr´e parfait). Exercice 11: Le calcul num´erique de la racine n-i`eme d’un r´eel strictement positif a est obtenu en r´esolvant num´eriquement par la m´ethode de Newton l’´equation f (x) = xn − a = 0.Bien entendu que n est un entier naturel strictement sup´erieur a` 1 ,et on rappelle que la m´ethode de Newton √ n consiste `a construire une suite des r´eels convergente vers a telle que :  = a  u0 f (uk ) 1 a ,k > 0 (∗∗) = (n − 1) uk + n−1  uk+1 = uk − 0 f (uk ) n uk ´ Ecrire alors un programme qui calcule la racine n-i`eme d’un r´eel strictement positif par approximations successives .Le r´eel x et l’entier n sont fournis par l’utilisateur.On souhaite afficher une approximation de la racine n-i`eme a` chaque it´eration, et les it´erations s’arrˆetent lorsque |uk+1 − uk | < epsilon, la pr´ecision epsilon est ´egalement fourni par l’utilisateur. al abdali Abdelhamid

42

EHTP


CLUB EHTPEC

Langage C

Exercice 12: L’algorithme d’Euclide permet de calculer le pgcd de deux nombres entiers, c’est a` dire le plus grand entier positif divisant ces deux nombres,par des divisons successives. Voici le d´eroulement de cet algorithme pour le calcul le pgcd de a = 119 et b = 544 119 544 119 68 51

= 544 Ă— 0 + 119 = 119 Ă— 4 + 68 = 68 Ă— 1 + 51 = 51 Ă— 1 + 17 = 17 Ă— 3 + 0

´ Ecrire alors un programme qui permet de d´eterminer le pgcd de deux entiers pr´ealablement entr´es par l’utilisateur. Exercice 13: ´ Ecrire un programme qui affiche le tableau de code d’ASCI. Exercice 14: ´ Ecrire un programme qui calcule une valeur approch´ee de l’int´egrale de la fonction f (x) = x2 entre a et b en utilisant la m´ethode des trap`ezes : " ! # Z b n−1 X b−a b−a f (x0 ) + 2 f (xi ) + f (xn ) + (x) , xi = a + i Ă— I= f (x)dx = 2n n a i=1 Exercice 15: L’exponentielle d’un r´eel x peut se faire grˆace a` la s´erie enti`ere : x

e =

+∞ k X x k=0

k!

=1+x+

x 2 x3 xn + + .... + + ... 2! 3! n!

en n´egligeant les termes inf´erieurs en valeurs absolue a` . ´ 1. M´ ethode 1: Ecrie un programme qui recalcule `a chaque fois le terme

xk k!

2. M´ ethode 2: On utilise le principe de calcul d’une somme en remarquant de plus que l’on k xk+1 x passe du k-`eme terme au (k + 1)-`eme terme apr`es une multiplication (k+1)! = xk! Ă— k+1 . 3. Donner le coˆ ut de chaque m´ethode Exercice 16: On appelle nombre d’Armstrong les nombre entiers tels que la somme des cubes de leurs chiffres (en base 10) est ´egale au nombre lui mˆeme.Exemple 33 + 73 + 13 = 371. ´ Ecrire un programme qui affiche tous les nombres d’Armstrong inf´erieurs a` 999999999.

al abdali Abdelhamid

43

EHTP


CLUB EHTPEC

Langage C

Exercice 17: ´ Ecrire un programme qui affiche entr´e par l’utilisateur. Exemple : n = 8 8 × 0 8 × 1 8 × 2 8 × 3 8 × 4

le tableau de multiplication d’un entier n pr´ealablement

8 8 8 8 8

= 0 = 8 = 16 = 24 = 32

× × × × ×

5 6 7 8 9

= = = = =

40 48 56 64 72

Exercice 18: On souhaite d’afficher le tableau de multiplication des enfants suivant : × 0 1 2 3 4 5 6 7 8 9 10

0 1 2 3 4 0 0 0 0 0 0 1 2 3 4 0 2 4 6 8 0 3 6 9 12 0 4 8 12 16 0 5 10 15 20 0 6 12 18 24 0 7 14 21 28 0 8 16 24 32 0 9 18 27 36 0 10 20 30 40

5 0 5 10 15 20 25 30 35 40 45 50

6 0 6 12 18 24 30 36 42 48 54 60

7 0 7 14 21 28 35 42 49 65 63 70

8 0 8 16 24 32 40 48 56 64 72 80

9 0 9 18 27 36 45 54 63 72 81 90

Exercice 19: ´ Ecrire un programme qui affiche le tableau de code d’ASCI. Exercice 20: ´ Ecrire un programme qui calcule an avec a r´eel et n entier positif en appliquant l’algorithme suivant :  si n = 0  1 2 n n/2 a = a si n est pair  n−1 a·a si n est impair Exercice 21: ´ Ecrire un programme qui calcule le nombre de combinaison d´efinie par :  n!  si 0≤k≤n k Cn = k! (n − k)!  0 sinon Exercice 22:

al abdali Abdelhamid

44

EHTP


CLUB EHTPEC

Langage C

Optimiser le programme de l’exercice pr´ec´edent pour calculer le nombre de combinaison Ckn en utilisant une seule boucle . Exercice 23: ´ Ecrire un programme qui calcule it´erativement le n−i`eme terme de la suite de Fibonacci d´efinie par : n si 0 ≤ n ≤ 1 un = un−1 + un−2 si n ≥ 2 Exercice 24: Modifier le programme de l’exercice pr´ec´edent afin de calculer it´erativement le n−i`eme terme d’une suite r´ecurrente lin´eaire d’ordre 2 d´efinie par : u0 , u1 donn´es un+2 = αun+1 + βun avec α, β ∈ R Exercice 25: ´ Ecrire un programme qui permet a` un utilisateur de deviner un nombre inf´erieur a` 100 , d´ej`a inscrit en constante dans le programme (donc d´ej`a pr´ed´efini).L’utilisateur entre un nombre au clavier , puis l’ordinateur lui indique si cette valeur est plus grande,plus petite ou ´egale au nombre pr´e-d´efini.Lorsque l’utilisateur a devin´e de quel nombre il s’agit , le programme affiche le nombre d’essais qui ont ´et´e n´ecessaire a` l’utilisateur pour d´ecouvrir la solution .Modifier le programme pour que le nombre d’essais autoris´es soit 10 . Exercice 26: Nombre de MUNCHHAUSEN On appelle nombre de MUNCHHAUSEN en anglais Perfect Digit-to-Digit Invariant (PDDI), relativement a` une base de num´eration donn´ee b, un entier naturel qui est ´egal a` la somme de ses chiffres dans cette base, chacun ´elev´e a` la puissance de ce mˆeme chiffre (en convenant ici que 00 = 0) 0 0 X X dn n= dn = dn bn n=k

n=k

Dans une base donn´ee, il n’existe qu’un nombre fini de PDDI, dont on peut programmer le calcul. En base 10 : 3435 = 3 × 103 + 4 × 102 + 3 × 101 + 5 × 100 est un PDDI : 33 + 44 + 33 + 55 = 3435. ´ 1. Ecrire un sous programme qui calcul k k . ´ 2. Ecrire un programme qui nous informe si un nombre entr´e par l’utilisateur un PDDI ou non. ´ 3. Ecrire un programme d’essai pour chercher les nombres MUNCHHAUSEN inf´erieur a` 999999999. al abdali Abdelhamid

45

EHTP


CLUB EHTPEC

Langage C

Exercice 27: Suite bizzare ´ Ecrire un programme qui calcule it´erativement le n−i`eme terme de la suite d´efinie par : 1/6 si n = 0 un = 7un−1 − 1 si n ≥ 1 Tester pour n = 100. Quel est le r´esultat th´eorique ? Expliquer l’´ecart Exercice 28: Que fait ce programme ? Discuter de son int´erˆet. Code C 1 2 3 4 5 6 7 8 9 10

5include <stdio9h> long a=10000" b" c=840" d" e" f[841]" g; int main /7 { for /;b%c;7 f[bpp]=a}5; for /;d=0"g=c*2;c%=14"printf/{-94d{"epd}a7"e=d-a7 for /b=c;dp=f[b]*a"f[b]=d-%%g" d}=g%%"%%b;d*=b7; return 0; }

Exercice 29: ´ Ecrire un programme qui permet de rentrer des valeurs de r´esistances ´electriques r´eelles et qui calcule la r´esistance ´equivalente en parall`ele au fur et a` mesure de la saisie.Le programme s’arrˆete lorsque qu’une valeur n´egative est entr´ee (non prise en compte) Rappel: N X 1 1 = R Ri i=1 Exercice 30: On veut ´ecrire un programme de machine a` voter.On fait voter des utilisateurs tant qu’il y en a entre un candidat A et un candidat B .A chaque fois,l’ordinateur demande s’il doit continuer .A la fin , l’ordinateur doit afficher les pourcentages de voix et le vainqueur.Le programme doit ˆetre fiable 100% et ne doit pas permettre d’erreur de saisie.

al abdali Abdelhamid

46

EHTP


CLUB EHTPEC

Langage C

Exercice 31: send+more=money est un cryptarithme publi´e en juillet 1924 dans The Strand Magazine, est dˆ u a` Henry Dudeney : + =

S E N D M O R E M O N E Y

Chaque lettre repr´esente un seul chiffre et le chiffre le plus significatif est diff´erent de z´ero. Id´ealement, le casse-tˆete doit avoir une solution unique. S 6= E 6= N 6= M 6= O 6= R 6= Y Voici les plus beaux exemples en fran¸cais (compil´es par Naoyuki Tamura 1 ) : . HUIT+HUIT=SEIZE (8253 + 8253 = 16506 et 9254 + 9254 = 18508) . UN+UN+NEUF=ONZE (81+81+1987=2149) . CINQ+CINQ+VINGT=TRENTE (6483+6483+94851=107817) Le but de cet exercice est de d´ echiffrer le cryptarithme send+more=money: 1. R´esoudre manuellement ce probl`eme.C’est a` dire trouver manuellement les valeurs de S, E, N, D, M, O, R et Y ? 2. Proposer un programme utilisant uniquement des boucles qui permet de r´esoudre ce probl`eme. Exercice 32: L’algorithme CORDIC ´ Comment les calculatrices calculent les fonctions trigonometriques ? Contrairement a` l’opinion commune, la grande majorit´e des calculatrices et des logiciels de calcul formel n’utilisent ni d´eveloppement en s´erie ni approximation polynomiale pour calculer les fonctions trigonom´etriques. Bien que l’on puisse utiliser les formules de Taylor – convergentes – qui donnent par ailleurs de tr`es bonnes approximations, cette technique est ´evit´ee car elle n´ecessite un grand nombre de multiplications assez coˆ uteuses en temps. C’est pourquoi l’algorithme Cordic – acronyme de COordinate Rotation DIgital Computer –, d´evelopp´e par Jack Volder en 1959, est pr´ef´er´e. L’id´ee remonterait cependant au math´ematicien anglais Henri Briggs (1561−1630), l’un des inventeurs du logarithme d´ecimal, encore appel´e logarithme Briggsien . Le site ci-dessous contient le principe de l’algorithme . http://www.trigofacile.com/maths/trigo/calcul/cordic/cordic.htm Voici l’algorithme en pseudo-code : 1

Naoyuki Tamura, Cryptarithmetic Puzzle Solver

al abdali Abdelhamid

47

EHTP


CLUB EHTPEC

Langage C

1. Initialisation des variables utilis´ ees : θ, l’angle donn´e par l’utilisateur, que l’on ram`ene `a 0 ≤ θ ≤ Ď€/2 si besoin est, en mettant en m´emoire la transformation simple finale a` appliquer pour obtenir le bon r´esultat . le tableau des θk k â†?− 0, qui d´efinit le plus grand angle courant de rotation θk possible X â†?− 1, abscisse du point Mj courant Y â†?− 0, ordonn´ee du point Mj courant â†?− 10−15 , pr´ecision voulue sur l’angle θ. 2. Tant que θ ≼ Tant que θ < θk on incr´emente k d’une unit´e ; θ â†?− θ − θk ; temp â†?− X; X â†?− X − 10−k ¡ Y ; Y â†?− Y − 10−k ¡ temp; 3. On renvoie

Y , valeur de tan(θ). X

´ Ecrire un programme permettant de calculer la tangente d’un angle θ fourni par l’utilisateur en utilisant l’algorithme de Cordic ?

Calculatrice HP−35

al abdali Abdelhamid

48

EHTP


CLUB EHTPEC

3.2

Langage C

Solution des exercices

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13

8include <stdio.h> 8include <stdlib.h> int mainv% { int compteur = 0; while vcompteur < 3% { printfvwLa variable compteur vaut fd\nw+ compteur%; compteur,,; } return 0 ; }

Solution 2: Code C 0 % & w + : } 8 9 0\ 00 0% 0& 0w 0+ 0: 0} 08

'include <stdio9h> 'include <stdlib9h> ") un programme qui demande un nombre de départ; et qui ensuite affiche les dix nombres suivants9Par exemple; si làutilisateur entre le nombre 0}; le programme affichera les nombres de 08 à %}9)" int main6( { int n ; i ; i=0; printf6P entrer un nombre \nP(; scanf6P7dP;8n(; while 6i<=0\( { n{{; i{{; printf6Pla valeur suivante est : 7d\n\nP;n(; } return \; }

Solution 3:

al abdali Abdelhamid

49

EHTP


CLUB EHTPEC

Langage C

Code C : \ % & } + w A U :D :: :\ :% :& :} :+ :w :A :U \D

(include <stdio9h> "= Programme qui affiche la moyenne d7une suite d7entiers positifs saisie par l7utilisateur se terminant par zéro=" int mainv, { int var; compteur=D; som=D E float moyE do{ printfv5Donnez un entier positifS\n5,E scanfv56d5; {var,E ifvvar<=D,{continueE} som0=varE compteur00E }whilevvar,E moy=som"compteurE printfv5moy=69\f\n5;moy,E systemv5PAUSE5,E return DE }

Solution 4: Code C 0 " \ % & w + } 9 0; 00 0" 0\ 0% 0& 0w 0+ 0} 09 ";

5include <stdio9h> 5include <stdlib9h> =(Un algorithme qui demande un nombre de départ8 et qui calcule la somme des entiers jusqu’à ce nombre9 NB : on souhaite afficher uniquement le résultat8 pas la décomposition du calcul9(= int main67 { int n8 i=0 8somme; somme=;; printf6àentrer un nombre\nà7; scanf6àBdà8:n7; while 6i<=n7 { somme=somme)i; i)); } printf6àla somme de 0 a Bd est:Bd\nà8n8somme7; return ;; }

Solution 5:

al abdali Abdelhamid

50

EHTP


CLUB EHTPEC

Langage C

Code C \ , 3 4 5 6 7 8 9 \% \\ \, \3 \4 \5

{include <stdioLh> {include <stdlibLh> v+un programme qui determine le premier nombre entier N tel que la somme de \ a N depasse strictement \%%L+v int main9w { int i = %; int somme = %; while 9somme <= \%%w { i}}; somme=somme}i; } printf96La la valeur de N vaut =d\n6f iw; return %; }

Solution 6: Code C " \ % & w + v } 9 "0 "" "\ "% "& "w "+ "v "} "9

:include <stdio8h> :include <stdlib8h> 9)Un algorithme qui demande un nombre de départ7 et qui calcule sa factorielle8 NB : la factorielle de +7 notée + N= " x \ x % x & x w x + )9 int main5( { int n7 i7f; i="; f="; printf5Bentrer un nombre\nB(; scanf5B!dB7=n(; while 5i<=n( { f=f)i; i{{;99incrémenter la valeur de " } printf5Bla factorielle de !d est:!d\nB7n7f(; return 0; }

Solution 7:

al abdali Abdelhamid

51

EHTP


CLUB EHTPEC

Langage C

Code C * } 3 4 5 6 7 8 9 *+ ** *} *3 *4 *5

finclude <stdio9h> finclude <stdlib9h> 00Calcul de x^n00 int main": { unsigned long int n%i; float x%p=*; printf"6entrer x:\n6:; scanf"6=f6%7x:; printf"6entrer n:\n6:; scanf"6=lu6%7n:; for "i=*;i<=n;i88: {p=p\x;} printf"6 =f^=lu==f \n6%x%n%p:; return +; }

Solution 8: Code C / + * } 6 7 8 9 /: // //+ /* /} /6 /7 /8 /9 -: -/ --

8include <stdioCh> 8include <stdlibCh> 8include<mathCh> int mainr" { float y%x%somme; unsigned int i% n; y = /; somme=:; printfrgentrer Un reel \ng"; scanfrg9fg%0x"; printfrgentrer n\ng"; scanfrg9dg%0n"; printfrgen CalculaTrice: 9f \n\ng%/Tr/&x""; forri=:;i<=n;i\\" { somme=somme\y; y=xUy; } printfrgn=9d \t 9f \n\ng%n%somme"; return :; }

Solution 8 bis:

al abdali Abdelhamid

52

EHTP


CLUB EHTPEC

Langage C

Code C + " E ' \ % & } U +++ +" +E +' +\ +% +& +} +U ""+ "" "E "' "\

pinclude <stdio9h> pinclude <stdlib9h> int mainév { double res=-9-8x" = xàx8mem_puiss8mem_fact; gàx" = xàx évite de recalculer xàx à chaque tour àg gà mem_puiss dernière puissance calculée àg gà mem_fact dernière factorielle calculée àg int i8n8signe = +; gàsigne vaudra alternativement è+ et q+ àg mem_puiss=x; mem_fact=+9-; x"=xàx; printfé_Entrer le nombre d/itération max \n_v; scanfé_;d_87nv; for éi=+;i<=n;iq="v{ resq=signeàmem_puissgmem_fact; signe=èsigne; mem_puissà=x"; mem_factà=éiq+vàéiq"v; } printfé_Une approximation de x par le sinus est : ;lf \n_8resv ; return -; }

Solution 9: Code C + } 3 4 5 6 7 8 9 +w ++ +} +3 +4 +5 +6 +7 +8 +9

{include <stdio%h> {include <stdlib%h> &0Ce programme nous calcule le produit de deux nombre sans faire le produit entre eux mais en utulisant selement la somme 0& int main=8 { int n"k; int i = +; int s =w; printf=6entrer le nombre n\n68; scanf=6kd6";n8; printf=6entrer le nombre k\n68; scanf=6kd6";k8; while =i <=k8 { s=s9n; i99; } printf=6le produit de kd 0 kd = kd\n6"n"k" s8; return w; }

Solution 10:

al abdali Abdelhamid

53

EHTP


CLUB EHTPEC

Langage C

Code C % & 8 9 x b k } + %7 %% %& %8 %9 %x %b %k %} %+ &7 &%

(include AstdiozhS \; Programme qui demande à l,utilisateur d,entrer un entier N et qui vérifié si N est un carrée parfait ou nonz;\ int main=0 { int n" iU7y printf=4Donnez un entier S7\n40y scanf=45d4"{n0y if=nSU70 {do{ if=i;iUUn0{ printf=45d est un carré parfait\n4"n0y printf=45d U 5d x 5d\n4"n"i"i0y breaky } if=i;iSn0 { printf=45d n,est pas un carré parfait\n4"n0y breaky} i66y }while=iAn0 y system=4PAUSE40y return 7y } }

Solution 12: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

finclude <stdio.h> finclude <stdlib.h> finclude<math.h> int main%& { int awbwr; printf%pentrer a:\np&; scanf%p:dpw\a&; printf%pentrer b:\np&; scanf%p:dpw\b&; r=a:b; do { a=b; b=r; } while %r==0&; printf%ple pgcd est :d:\npwb&; return 0; }

Solution 13:

al abdali Abdelhamid

54

EHTP


CLUB EHTPEC

Langage C

Code C pinclude <stdio.h> pinclude <stdlib.h> /xAffichage du Code d,ASCIx/ int main3+ { int i=0; char c ; c=,A,; printf3rdecimal=%d ASCI=%c\nr1c1c+; for3i=0;i<300;i}}+ { printf3r%c %d %o %x \nr1i1i1i1i+; } printf3r pr%csent %c\nr11301133+; return 0; }

Solution 13: Code C pinclude <stdio.h> pinclude <stdlib.h> /xAffichage du Code d,ASCIx/ int main3+ { int i=0; char c ; c=,A,; printf3rdecimal=%d ASCI=%c\nr1c1c+; for3i=0;i<300;i}}+ { printf3r%c %d %o %x \nr1i1i1i1i+; } printf3r pr%csent %c\nr11301133+; return 0; }

Solution 14: Code C L x 3 4 5 6 7 8 9 L} LL Lx L3 L4 L5 L6 L7 L8

*include <stdio'h> *include <stdlib'h> int mainr" { double s; int i%n; float a%b; s=ra:a\b:b"gx; printfr=entrer n : \n="; scanfr=/d=%0n"; printfr=entrer les bornes dpintegration a et b : scanfr=/f/f=%0a%0b"; forri=L;i<n;i\\" {s=s\ra\rb a":ign":ra\rb a":ign";} printfr=Lpintgrale de x:x entre a et b est : =%s"; return }; }

al abdali Abdelhamid

55

\n=";

EHTP


CLUB EHTPEC

Langage C

Solution 17: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13

6include <stdio*h> 6include <stdlib*h> }}tableau de la multiplication d7un nombre }} int main%& {int i = 09n; printf%;entrer un nombre\n;&; scanf%;"d;9\n&; while % i <= 20& { iww; printf%; "d8"d="d \n;9n9i9n8i&; } return 0; }

Solution 18: Code C * } 3 4 5 6 7 8 9 *+ ** *} *3 *4 *5 *6 *7 *8 *9

7include <stdio0h> 7include <stdlib0h> int main8% { ==Tableau de multuplication des int n[i[j; printf8;entrer n:\n;%; scanf8;"d;[:n%; int tab[n][n]; for 8i=+ ; i<=n; i99% { for 8j=+ ; j<=n; j99% { printf8;"d \t;[i&j%; } printf8;\n\n;%; } return +; }

enfants ==

Solution 20:

al abdali Abdelhamid

56

EHTP


CLUB EHTPEC

Langage C

Code C 2 3 4 5 6 7 8 9 -} --2 -3 -4 -5 -6 -7 -8 -9 2} 222 23 24 25 26 27 28 29 3}

vinclude <stdio*h> vinclude <stdlib*h> int main&9 { float aw resultatwtemp; int n; printf&" entrer la valeur de n :\n"9; scanf&"\d"w8n9; printf&"entrer la valeur de a :\n"9; scanf&"\f"w8a9; temp = -; resultat = a; while & n 7= -9 { if & n\2 == } 9 { resultat = resultat0resultat; n = n/2; printf&" \d\n"w n9; printf&" \f\n"w resultat9; } else { temp = temp0resultat; n = n!- ; printf&" \f\n"w resultat9; } } resultat = resultat0temp; printf&"la valeur de resultat vaut : \d\n"w resultat9; return }; }

Solution 21: Code C ! / } 4 5 6 7 8 9 !!! !/ !} !4 !5 !6 !7 !8 !9 //!

pinclude <stdio*h> pinclude <stdlib*h> int main8% { long unsigned int n0g0h0j0k0l0f0i; printf87entrer l\entier n\n7%; scanf87"lu70'n%; printf87entrer l\entier k\n7%; scanf87"lu70'k%; for 8 i = ! 0 f = ! ; i <= n ; f &= i 0 i99 %; for 8 j = ! 0 g = !; j <=k ; g &= j 0 j99 %; for 8l = ! 0 h = !; l <=n=k ; h &= l 0 l99 %; printf87"lu ; = "lu \n70n0f%; printf87"lu ; = "lu \n70k0g%; printf87"lu ; = "lu \n70n=k0h%; f=f+h; f=f+g; printf87le nombre de combinaison est "lu\n 70f%; return -; }

Solution 22:

al abdali Abdelhamid

57

EHTP


CLUB EHTPEC

Langage C

Code C 0 + } C 6 7 8 9 09 00 00+ 0} 0C 06 07 08 09 -9

6include <stdio%h> 6include <stdlib%h> &7Un programme qui calcule le coefficient avec une seule boucle 7& int mainj; { long unsigned int n\k\i\a=0\b=0\j; printfj)entrer n\n); ; scanfj),lu)\kn;; printfj)entrer k\n); ; scanfj),lu)\kk;; if jk<n&-; k=n8k; for ji=0; i<=k ;i""; { a=a7jn8k"i;; b=b7i; } a=a&b; printfj)\tC=,lu\n)\a; ; return 9; }

binomial

Solution 23: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

'include <stdio.h> 'include <stdlib.h> int main&9 { int a+b+c+i+n; printf &"entrer l%entier n :\n"9; scanf &"\d"+8n9; a=0; b=1; for &i=2;i<=n;i009 { c=b0a; a=b; b=c; } printf& "le \d ieme terme de la suite de fibonacci est \d:\n"+n+c9; return 0; }

Solution 25:

al abdali Abdelhamid

58

EHTP


CLUB EHTPEC

Langage C

Code C : 2 3 4 5 6 7 8 9 :' :: :2 :3 :4 :5 :6 :7 :8 :9 2' 2: 22 23 24 25 26 27 28 29 3' 3: 32 33 34 35

finclude <stdio}h> finclude <stdlib}h> int main,& { int i='; int m = 5; int n; printf,rentrer un nombre\nr&; scanf,r\drv9n&; if , n>=: 99 n<=:'& { while , n p= m& { if , n < m& { printf,rvous avez entre un nombre inferieur\nr&; } else { printf,rvous avez entre un nombre superieur \nr&; } printf,rentrer un nombre\nr&; scanf,r\drv9n&; if ,n=m& { printf,r bravo \nr&; } i!!; } } else { printf,rerreur\nr&; } printf,rle nombre d%essai est :\d\nrvi&; return '; }

Solution 26: Code C U S E 4 5 6 7 8 9 UA UU US UE U4 U5 U6 U7 U8 U9 SA SU

9include <stdioyh> 9include <mathyh> int main%w { int n" b=UA; int r" for%n=A; n<=999999999; n}}w { test_pddi=A; nb=n; do {r=nb8b; test_pddi}=pow%r"rw; nb=%intwnbPb; }while%nbw; if%test_pddi==nw printf%f8d\nf" nw; } system%fPAUSEfw; return A; }

al abdali Abdelhamid

59

EHTP


CLUB EHTPEC

Langage C

Solution 27: Code C 1 2 3 4 5 6 7 8 9 1} 11 12 13 14 15

pinclude <stdio*h> pinclude <stdlib*h> int main\8 { int i9n; float u=1*}-6*}; printf\7Entrer n : scanf\7"d79En8; for\i=};i<=n;i&&8 { u=7%u+1; printf\7\ti= "d } return }; }

\n78;

u="f

\n 79i9u8;

Explication C’est une suite bizarre, en la testant, on constate que u54 est ´evalu´e a` 15013812348486557644890077921830404096.0,ce qui conduirait a` penser que la limite de la suite serait +∞. Mais un simple calcul montre que la suite est constante et reste ´egale `a 1/6 et donc que le r´esultat est faux. L’explication vient du fait que les calculs se font `a une pr´ecision limit´ee et que les erreurs de calcul sur les derniers chiffres significatifs s’accumulent. En analyse num´erique;la suite un+1 = g (un ) converge si |g 0 (x)| < 1 autour de la limite , ce qui n’est pas le cas ici (g(x) = 7x − 1 et g 0 (x) = 7 > 1). Tout le monde peut construire une suite bizarre.En effet, le premier terme de la suite u0 = 1/6 n’est que le point fixe de la fonction g (α = g (α)) .Th´eoriquement, c’est une suite convergente , mais num´eriquement il faut la programmer avec pr´ecaution .Voici une bonne programmation de la suite ( en ´evitant les fractions) : vn = 6un =⇒ vn+1 = 7vn − 6

,

v0 = 1

Solution 28: Il calcule π. Sans commentaire, illisible, incompr´ehensible, jetable. Bref, a` ´eviter absolument. Solution 29:

al abdali Abdelhamid

60

EHTP


CLUB EHTPEC

Langage C

Code C / } 3 4 5 6 7 8 9 /+ // /} /3 /4 /5 /6 /7

0include <stdio&h> 0include <stdlib&h> int main"' { double eqv9R; eqv=+ ; printf"=entrer la valeur dfune resistance:\n='; scanf"=plf=9rR'; while"R>+' { eqv\=/wR; printf"=la resistances equivalente est Req=p&/+lf\n=9/weqv'; printf"=entrer la valeur dfune resistance:\n='; scanf"=plf=9rR'; } return +; }

Solution 30: Code C B Q U I T E R v ? B9 BB BQ BU BI BT BE BR Bv B? Q9 QB QQ QU QI QT QE QR Qv Q? U9 UB UQ UU UI UT UE UR Uv U? I9 IB IQ IU II

6include :stdioAhk 6include :stdlibAhk int mainw! { int choix"i+9"j+9"logique+B& float pourcentage& whilewlogiqueq+CB! { printfw;BAAAAAAAAAPandidat*\n ;!& printfw;QAAAAAAAAAPandidat/\n ;!& printfw;UAAAAAAAAAQUITTOR\n ;!& printfw;Quelle est votre choix }\n\n;!& scanfw;pd;"rchoix!& switch wchoix! {case B% i88& break& case Q% j88& break& case U% logique+CB& break& default% logique+CB& printfw;Orreur\n;!& } } if wiq+9 || jq+9! { pourcentage+wB99-i!\wi8j!& printfw;le pourcentge des voix est%\n;!& printfw;le candidat * %pf\n;"pourcentage!& printfw;le candidat / %pf\n;"B99Cpourcentage!& ifwpourcentagek T9 ! {printfw;le vainqueur est est le candidat *\n;!&} else ifwpourcentage++ T9 ! {printfw;Pas de vainqueur refaire le VOTO\n;!&} else {printfw;le vainqueur est est le candidat /\n\n;!&} } return 9& }

al abdali Abdelhamid

61

EHTP


CLUB EHTPEC

Langage C

Solution 31: Code C M O R Y \ } 7 8 9 M% MM MO MR MY M\ M} M7 M8 M9 O% OM OO OR OY O\ O} O7 O8 O9 R% RM

0include <stdioNh> 0include <stdlibNh> int main&! { int sendSmoreSmoney; for&int s=%;s<=9;s""! { for&int e=%;e<=9;e""! { for&int n=%;n<=9;n""! { for&int d=%;d<=9;d""! { for&int m=%;m<=9;m""! { for&int o=%;o<=9;o""! { for&int r=%;r<=9;r""! { for&int y=%;y<=9;y""! { send=spM%%%"epM%%"npM%"dpM; more=mpM%%%"opM%%"rpM%"epM; money=mpM%%%%"opM%%%"npM%%"epM%"ypM; if&&send"more==money!88&sf=e!88&sf=n!88&sf=d!88&sf=m!88&sf=o!88&sf=r!88&sf=y!88&ef= { printf&=SEND=+d MORE=+d MONEY=+d\n=SsendSmoreSmoney!; } } } } } } } } } }

al abdali Abdelhamid

62

EHTP


CLUB EHTPEC

Langage C

Les tableaux

4 4.1

´ Enonc´ e des exercices

Exercice 1: ´ Ecrire un programme qui affiche le tableau suivant: 10 73 705

9

Exercice 2: ´ Ecrire un programme qui calcule et affiche la moyenne des notes , de 6 ´etudiants ,stock´es dans un tableau . Exercice 3: ´ Ecrire un programme permettant `a l’utilisateur de remplir un tableau de n ≤ 100 valeurs enti`eres, ensuite d’afficher le nombre de valeurs multiples de 2 et celui des multiples de 5 contenues dans ledit tableau. Exercice 4: ´ Ecrire un programme permettant d’afficher le tableau suivant dans le sens inverse: 1 2 3 4

5

Exercice 5: ´ Ecrire un programme qui d´eclare un tableau, qui le remplisse et qui : 1. permet d’inverser le contenu du premier tableau dans un deuxi`eme tableau. 2. permet d’afficher le contenu du premier tableau dans l’ordre inverse. 3. permet d’inverser le contenu du premier tableau. Exercice 6: Un palindrome est un tableau de caract`eres qui se lit de la mˆeme fa¸con dans les deux sens (ex: elle,radar,aziza).Puisque on a pas vu encore les chaˆınes de caract`eres, on va utiliser un tableau de nombres.Le tableau suivant est un palindrome 5 2 3 2 -1

6 11 6 -1 2 3

2 5

´ Ecrire alors un programme qui teste si un tableau est palindrome ou non. Exercice 7:

al abdali Abdelhamid

63

EHTP


CLUB EHTPEC

Langage C

´ Ecrire un programme constituant un tableau , a` partir de deux tableaux de mˆeme longueur pr´ealablement saisis.Le nouveau tableau sera la multiplication des ´el´ements du premier tableau par les ´el´ements du secondes pris dans le sens inverse. Exercice 8: En utilisant la notion du tableau,´ecrire un programme qui calcule le n−i`eme terme de la suite de Fibonacci d´efinie par : n si 0 ≤ n ≤ 1 un = un−1 + un−2 si n ≥ 2 Exercice 9: Modifier le programme de l’exercice pr´ec´edent afin de calculer le n−i`eme terme d’une suite r´ecurrente lin´eaire d’ordre 2 d´efinie par : u0 , u1 donn´es un+2 = αun+1 + βun avec α, β ∈ R Exercice 10: ´ Ecrire un programme remplissant un tableau et qui d´etermine le maximum parmi les ´el´ements constituant le tableau ainsi que sa position dans ledit tableau. Exercice 11: ´ Ecrire un programme qui calcule le module d’un vecteur appartenant a` l’espace Rn .La dimension de l’espace n est fourni par l’utilisateur.Exemple n = 5 : 2 → − − − − v = (2, −1, 14, 7. − 5)T =⇒ k→ vk =→ v ·→ v = 22 + (−1)2 + 142 + 72 + (−5)2 = 275

Les composantes du vecteur seront inscrites dans un tableau dont la taille est ´egale `a la dimension de l’espace d’´etude. Exercice 12: ´ Ecrire un programme qui calcule le produit scalaire de deux vecteurs appartenant a` l’espace R .La dimension de l’espace n est fourni par l’utilisateur. n

→ − − u ·→ v =

n X

xi y i

i=1

Les composantes de chaque vecteur seront inscrites dans un tableau dont la taille est ´egale `a la dimension de l’espace d’´etude.Puis tester si les deux vecteurs sont orthogonaux entre eux. Exercice 13:

al abdali Abdelhamid

64

EHTP


CLUB EHTPEC

Langage C

´ Ecrire un programme qui calcule les coefficients de la somme de deux polynˆomes de degr´e finie quelconque.Si par exemple les deux polynˆomes sont respectivement :P (x) = an xn + ... + a1 x + a0 et Q (x) = bm xm + ... + b1 x + b0 .Alors la somme est d´efinie par : S (x) = P (x) + Q(x) =

n X

k

ak x +

k=0

m X

max(n,m) k

bk x =

k=0

X

ck x k

k=0

Les coefficients de chaque polynˆome seront inscrits dans un tableau dont la taille est ´egale au max(n, m). Exemple: P (x) = −x3 + 2x − 2 et Q (x) = x4 + 3x2 + x + 7 =⇒ S (x) = x4 − x3 + 3x2 + 3x + 5 Soit par les tableaux: 0 -1 0 2 -2 + 1 0 3 1

7 = 1

-1 3 3 5

Exercice 14: Reprendre le mˆeme exercice mais cette fois pour d´eterminer les coefficients du polynˆome produit. Rappel : ! ! n+m n m k X X X X k k k π (x) = P (x) · Q(x) = ak x × bk x = ck x avec ck = ai bk−i k=0

k=0

i=0

k=0

Exemple: P (x) = −x3 +2x−2 et Q (x) = x4 +3x2 +x+7 =⇒ π (x) = −x4 −3x5 −5x4 −x3 −4x2 +12x−14 Soit par les tableaux: 0

-1 0 2 -2 × 1 0 3 1 7 = -1 0 -3

-5 -1 -4 12 -14

Exercice 15: On souhaite ´evaluer la valeur d’un polynˆome de degr´e n ,dont les coefficients sont pr´ealablement saisis dans un tableau, en un point x donn´e par l’utilisateur .Plusieurs sc´enarios sont possibles: ´ 1. Ecrire programme qui ´evalue le polynˆome en x en sommant ak xk . 2. Y a-t-il mieux?.La r´eponse d’ Horner est oui,il a propos´e l’algorithme ci-apr`es que vous devez le traduire en Langage C: Donn´ ees: les ai , le x et le degr´e n. Sortie: pn (x) = an xn + ... + a1 x + a0 pn ←− an ; Pour i allant de n jusqu’`a 1 faire : pn ←− ai−1 + pn x; Fin pour Fin

al abdali Abdelhamid

65

EHTP


CLUB EHTPEC

Langage C

Exercice 16: On appelle polynˆome de Newton un polynˆome de degr´e n qui s’´ecrit sous la forme: pn (x) = a0 + a1 (x − x0 ) + a1 (x − x0 ) (x − x1 ) + ... + an (x − x0 ) (x − x1 ) × ... × (x − xn ) La particularit´e de ce polynˆome c’est qu’il est construit pour qu’il passe exactement par n points deux `a deux distinct (xi , f (xi )) pour i variant de 1 jusqu’`a n .Ces points, et les coefficient ai du polynˆome sont fournis par l’utilisateur .En s’inspirant de l’algorithme de Horner,proposer un programme permettant d’´evaluer ce polynˆome en un point donn´e y. Exercice 17: ´ Ecrire un programme permettant de calculer la droite de la r´egression lin´eaire d’un nuage de points {(xi , yi )}1≤k≤n .On rappelle que la droite de r´egression est d´efinie par y = ax + b avec : n

a=

1X cov(x, y) , b=y−a·x , x= xi , cov(x, y) = x · y − x · y , v(x) = cov(x, x) v(x) n i=1

Exercice 18: ´ Soit un tableau T a` deux dimensions (N × N ) pr´ealablement rempli de valeurs num´eriques.Ecrire un programme qui: 1. Affiche les ´el´ements se trouvant sur la diagonale principale et qui calcule leur somme. 2. Multiplie les ´el´ements se trouvant sur la sub-diagonale principale par 2. 3. Cherche les ´el´ements pairs, qui affiche leurs positions respectives et qui compte de surcroˆıt leurs nombre. 4. Calcule le transpos´e du tableau T . Exercice 19: ´ Ecrire un programme qui permet de calculer la trace d’une matrice donn´ee. Rappel : trace(A) = a11 + a22 + ... + ann . Exemple :   −1 1 −3 1  −2 2 −3 2   A= , trace(A) = 1 + 2 + 6 − 4 = 5  4 −9 6 3  −3 5 5 −4 Exercice 20:

al abdali Abdelhamid

66

EHTP


CLUB EHTPEC

Langage C

´ Ecrire un programme qui permet de calculer la somme de tous les ´el´ements d’une matrice donn´ee. Exemple :   1 −3 1 −1 4 X 4 X  −2 2 −3 2    A= , somme = aij = 4 4 −9 6 3  i=1 j=1 −3 5 5 −4 Exercice 21: ´ Ecrire un programme permettant la r´esolution d’un syst`eme lin´eaire d’ordre 2. On rappelle que la solution d’un syst`eme lin´eaire d’ordre deux selon la m´ethode de Cramer est donn´e par :  ed − f b   x = a b x e ad − bc ad − bc 6= 0 = =⇒ af − ec c d y f   y = ad − bc Exercice 22: ´ Ecrire un programme permettant de calculer la somme de deux matrices de mˆeme taille saisies par l’utilisateur. Exercice 23: On consid`ere la suite de Fibonacci vue dans un exercice pr´ec´edent un+2 = un+1 + un avec les conditions initiales(u0 , u1 ) = (0, 1).Une autre m´ethode pour calculer le n−`eme terme de cette suite consiste a` d´efinir le vecteur: 0 1 un un+1 un+1 un = = =⇒ Xn+1 = Xn = un+1 un+1 + un 1 1 un+2 un+1 Soit: Xn+1 = AXn

ou

Xn = An X0

Donc le calcul du n-`eme terme en fonction de n revient `a calculer la puissance n-`eme de la matrice A . Plusieurs sc´enarios sont possible: ´ 1. Ecrire un programme permettant de calculer la puissance n-`eme de la matrice A. 2. G´en´eralement, le calcul de An est plus coˆ uteux par la m´ethode vue dans la premi`ere question.Pour rem´edier ce probl`eme ,on calcule pour ce genre des suite lin´eaires r´ecurrentes le polynˆome caract´eristique de la matrice A ET ´ecrire un dans la base de l’espace vectoriel associ´e aux valeurs propres de ladite matrice.qui est d´efini par X 2 = X + 1 Un calcul simple montre que : " √ !n √ !n # 1 1+ 5 1− 5 un = √ − 2 2 5 ´ Ecrire alors un programme permettant de calculer correctement un sachant que un est entier ? al abdali Abdelhamid

67

EHTP


CLUB EHTPEC

Langage C

Exercice 24: ´ Ecrire un programme permet de faire le produit entre une matrice de taille n × n et un vecteur de taille n entr´es par l’utilisateur . On rappelle que les composantes du vecteur r´esultat → − − u , `a partir une matrice A et un vecteur → v ,sont donn´e par : ui =

n X

aij vj

i, j ∈ {1, 2, ..., n}

j=1

Exercice 25: ´ Ecrire un programme qui permet de construire une matrice M , de taille n × n, obtenue a` partir de deux tableaux unidimensionnels A et B de taille n o` u M [i][j] = A[i] × B[j] avec i, j ∈ {1, 2, ..., n} .On suppose que les donn´ees sont de type entier .Le programme doit respecter les conditions ci-dessous: 1. Les deux tableaux doivent ˆetre de la mˆeme taille n. La valeur de n est entr´ee par l’utilisateur. 2. La sortie du programme doit afficher le contenu de la matrice de telle sorte que chaque ligne de la matrice soit sur une seule ligne . Exercice 26: ´ Ecrire un programme permet de faire le produit entre deux matrices de mˆeme taille n × n entr´ees par l’utilisateur . On rappelle que les coefficients de la matrice produit sont donn´es par cij =

n X

aik bkj

i, j ∈ {1, 2, ..., n}

k=1

Exercice 27: ´ Ecrire un programme qui permet de calculer la puissance n-`eme d’une matrice A de taille n × n entr´ee par l’utilisateur . Exercice 28: Proposer un programme permettant d’afficher le triangle de Pascal bas´e sur l’identit´e de k+1 ce dernier Cnk + Cnk+1 = Cn+1 .La taille n du tableau est fourni par l’utilisateur.Le tableau correspondant `a n = 5 est le suivant: 1 1 1 1 1 1

al abdali Abdelhamid

1 2 3 4 5

1 3 1 6 4 1 10 10 5 68

1

EHTP


CLUB EHTPEC

Langage C

Exercice 29: Modifier le programme pr´ec´edent pour que le tableau affich´e soit de la forme suivante : 1 1 1

2

1 1 1

1 1

3 4

5

3 6

10

1 4

10

1 5

1

Exercice 30: En utilisant uniquement deux tableaux unidimensionnel : 1. Proposer un programme permettant d’afficher la derni`ere ligne du tableau de Pascal . 2. Am´eliorer le programme pour qu’il affiche la formule de binˆome de Newton : n

(a + b) =

n X

Ckn ak bn−k

avec a, b ∈ R

k=0

Exercice 31: La m´ethode de Crout est une m´ethode permettant d’´ecrire une matrice A sous la forme d’un produit de deux matrices; l’une est triangulaire inf´erieur L (lii = 1 , i ∈ {1, 2, ..., n}) ,et l’autre est triangulaire sup´erieurs U . Exemple :      1 0 0 0 2 −3 1 −1 2 −3 1 −1  −2 2 −3 2   −1 1 0 0   0 −1 −2 1      A=  4 −9 −2 3  =  2 3 1 0  0 0 2 2  −2 5 5 −4 −1 −2 1 1 0 0 0 −5 En effectuant le produit des deux matrices L et U : ´ 1. Ecrire un programme permettant de d´ecomposer,si possible, un matrice donn´ee selon la m´ethode de Crout. 2. Am´eliorer votre programme pour qu’il puisse calculer le d´eterminant de la matrice a` d´ecomposer . 3. Comparer cette m´ethode avec la m´ethode ordinaire de calcul du d´eterminant ?

al abdali Abdelhamid

69

EHTP


CLUB EHTPEC

Langage C

Exercice 32: Dans domaine du g´enie civil,et plus pr´ecis´ement dans le calcul des structures,il y une m´ethode ,s’appelle la m´ethode des Foyers ,pour calculer les moments sur n + 1 appuis d’une poutre hyperstatique continue.Voici un descriptif de la m´ethode: 1. La poutre est compos´ee de n trav´ees (poutres), chaque trav´ee a pour caract´eristiques m´ecaniques : (a) Le module de Young E . (b) La longueur ` (c) Le moment d’inertie I 2. Les appuis interm´ediaires sont tous des appuis doubles.Tandis que les appuis en extr´emit´e sont soit appui double ,soit encastrement . 3. La trav´ee N◦ i est situ´e entre l’appui i − 1 et l’appui i . 4. On s’int´eresse uniquement a` la trav´ee N◦ i , et consid`ere qu’elle est la seule qui est charg´ee.Le chargement,d’ailleurs, s’il est appliqu´e ,il introduira des petites rotations θA et θB de la trav´ee au niveau des appuis. 5. Le calcul des moments Mi−1 et Mi se fait par les deux relations: Mi−1 =

−ϕ0i ϕi θA + θB ϕi θA + ϕ0i θB · · et M = i bi 1 − ϕi ϕ0i bi 1 − ϕi ϕ0i

,1 ≤ i ≤ n − 1

6. Les ϕi s’appellent les foyers de gauche.Tandis que les ϕ0i s’appellent les foyers de droite : ϕi+1 = −

bi+1 bi+1 Mi Mi = et ϕ0i = − = Mi+1 ci + ai+1 − bi ϕi Mi−1 ci + ai+1 − bi+1 ϕ0i+1

7. Les ϕi sont initialis´ees par ϕ0 .Tandis que les ϕ0i sont initialis´ees par ϕn . 8. Les initialisations de ϕi et de ϕ0i sont 0 dans le cas d’un appui double , et 1/2 dans le cas d’un encastrement. 9. Les coefficients ai , bi et ci s’appellent les coefficients de souplesse de la trav´ee i : 2 2 Z `i Z `i Z `i 1 x 1 x x 1 x ai = 1− dx bi = 1− dx ci = dx `i `i `i `i 0 EI 0 EI 0 EI 10. Si la caract´eristique m´ecanique EI de la trav´ee i est constance, les coefficients de souplesse sont donn´es par: `i `i `i ai = bi = ci = 3EI 6EI 3EI ´ Ecrire un programme respectant les conditions suivantes: − Le nombre des trav´ees n est fournis par l’utilisateur. al abdali Abdelhamid

70

EHTP


CLUB EHTPEC

Langage C

− Les rotations θA et θB sont aussi donn´ees par l’utilisateur. − La nature des appuis en extr´emit´e doit ˆetre fournis par l’utilisateur,ainsi les caract´eristiques m´ecaniques de chaque trav´ee. − Les foyers de gauche , les foyers de droite ,les caract´eristiques m´ecaniques et les moment sont stock´es dans un tableau chacune. y

x

l2

l1

l3

q(x)

p(x)

l4

l5

Encastrement

A0

A1

A2

A3

A4

A5 Appui double

´es Figure 1: Exemple d’une poutre hyperstatique continue de 5 trave

al abdali Abdelhamid

71

EHTP


CLUB EHTPEC

4.2

Langage C

Solution des exercices

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

8include <stdio.h> 8include <stdlib.h> int mainp" { int tableau[4]} i = 0; tableau[0] = 10; tableau[1] = 73; tableau[2] = 705; tableau[3] = 9; for pi = 0 ; i < 4 ; i\\" { printfp7fd\t7} tableau[i]"; } return 0; }

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

8include <stdio}h> 8include <stdlib}h> int main+p { int t[6]\i; float moyenne\somme; somme = 0 ; for +i=1; i<=6; i%%p { printf+y entrer la note 0d \ny\ip; scanf+y0dy\9t[i]p; } for +i=1 ;i<=6; i%%p { somme=somme%t[i]; } moyenne = +somme/6p; printf+y la moyenne est 0fy\moyennep; return 0; }

Solution 1:

al abdali Abdelhamid

72

EHTP


CLUB EHTPEC

Langage C

Code C } A v 4 5 6 7 8 9 }g }} }A }v }4 }5 }6 }7 }8 }9 Ag A} AA Av A4 A5 A6 A7 A8 A9 vg

8include <stdio/h> 8include <stdlib/h> int main:\ { int t[}gg]; int a=g&b=g&i&n; printf:,entrer la taille du tableau :\n,\; scanf:,rd,&fn\; for:i=g;i<n;i%%\RRRemplissage du tableau { printf:, t[rd]=,&i\; scanf:,rd,&ft[i]\; } for:i=g;i<n;i%%\RRAffichage du tableau { printf:, rd\t,&t[i]\; } printf:,\n,\; for:i=g;i<n;i%%\ { if:t[i]rA==g\ {a%%;} if:t[i]r5==g\ { b%%;} } printf:,le nombre de valeurs multiple de A est:rd\n,&a\; printf:,le nombre de valeurs multiple de 5 est:rd\n,&b\; return g; }

Solution 1: Code C \ 3 4 5 6 7 8 9 \% \\

[include <stdioph> [include <stdlibph> int main;7 { "" affichage d}un tableau au sens inverse"" int Mat[5]={\+-+3+4+5}; int i; for ;i=% ; i<5; i007 {printf;M=d \tM+Mat[49i]7;} return %; }

Solution 1:

al abdali Abdelhamid

73

EHTP


CLUB EHTPEC

Langage C

Code C } / v x è 7 8 9 }' }} }/ }v }x }è }}7 }8 }9 /' /} // /v /x /è //7

8include <stdio=h> 8include <stdlib=h> int mainE: { int a[è']%b[è']; int n%i%j; printfEjEntrer la taille du tableau: \nj:; scanfEjrdj%fn:; forEi=';i<n;i99: { printfEjEntrer l"elemnt rd : \nj%i9}:; scanfEjrdj%fa[i]:; } ++inverser le contenu du premier tableau dans un deuxième tableau= forEi=';i<n;i99: { b[i]=a[n&}&i]; } ++afficher le contenu du premier tableau dans l"ordre inverse= forEi=';i<n;i99: { printf Ej rd j%a[n&}&i]:; ++inverser le contenu du premier tableau forEi=';i<n+/;i99: { a[i]=a[n&}&i]; } return '; }

Solution 1: Code C } / ! k N P 8 9 }' }} }/ }! }}k }N }P }8 }9 /' /} // /! /-

8include <stdio=h> 8include <stdlib=h> int mainE: { int t[k']; int n%i%j; printfEjEntrer la taille du tableau: \nj:; scanfEjrdj%fn:; forEi=';i<n;i99: { printfEjEntrer l"elemnt rd : \nj%i9} scanfEjrdj%ft[i]:; } forEi=';i<n+/;i99: { ifEt[i],=t[n&}&i]: break; } ifEi<n+/: printfEjN"est pas palindrome \nj:; else printfEjPalindrome\nj:; return '; }

Solution 1:

al abdali Abdelhamid

74

EHTP


CLUB EHTPEC

Langage C

Code C = + } x * 7 8 9 =g == =+ =} =x ==* =7 =8 =9 +g += ++ +} +x ++* +7 +8 +9

,include <stdio&h> ,include <stdlib&h> 99Produit d7un tableau avec son inverse 99 int mainf" { int t[=gg]8tab[=gg]8prod[=gg]; int a8b8i8n; printff]entrer la taille du tableau :\n]"; scanff];d]86n"; printff]remplissage du premier tableau:\n]"; forfi=g;i<n;i\\" { printff] t[;d]=]8i"; scanff];d]86t[i]"; } printff]remplissage du deuxieme tableau:\n]"; forfi=g;i<n;i\\" { printff] tab[;d]=]8i"; scanff];d]86tab[i]"; } printff]resultat:\n]"; forfi=g;i<n;i\\" { prod[i]=tab[n%=%i]:t[i]; printff] ;d\t]8prod[i]"; } printff]\n]"; return g; }

Solution 1: Code C x 2 3 4 5 6 7 8 9 xv xx x2 x3 x4 x5 x6 x7 x8 x9 2v 2x 22 23 24

;include <stdio&h> ;include <stdlib&h> ;include<math&h> int main+9 { int t[xv]%i%k%p; for+i=v;i<xv;i::9 { printf+pentrer le nombre numero:fd scanf+pfdp%rt[i]9; } k=v; for+i=x;i<=xv;i::9 { if +t[i]>t[k]9 { p=t[i:x]; k=i; } } printf+pla valeur maximal est fd\np%t[k]9; printf+psa position est fd\np%k:x9; }

al abdali Abdelhamid

75

\np%i:x9;

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C : 2 3 4 5 6 7 8 9 :} :: :2 :3 :4 :5 :6 :7 :8 :9 2}

"include <stdio+h> "include <stdlib+h> int main&9 { long unsigned int n0i ; printf &fentrer l%entier n \nf9; scanf&f\luf08n9; long unsigned int t[n] ; t[}]=}; t[:]=:; for &i=2;i<=n;i]]9 { t[i]=t[i=:]]t[i=2]; printf& f\lu\nf0t[i]9; } printf& fle \lu ieme terme de la suite de fibonacci est \lu:\nf0n0t[n]9; return }; }

Solution 1: Code C | q 3 4 5 6 7 8 9 |} || |q |3 |4 |5 |6 |7 |8 |9 q}

finclude <stdio+h> finclude <stdlib+h> finclude <math+h+h> int main"E { int u[|}}]; int n%i; float s=}; printf"8 Entrer la taille du vecteur\n8E; scanf"89d8%pnE; for"i=};i<n;i\\E { printf"8u[9d]= 8%iE; scanf"89d8%pu[i]E; s=s\u[i]vu[i]; printf"8\n8E; } printf"8||u||= 9f\n8%sqrt"sEE; return }; }

Solution 1:

al abdali Abdelhamid

76

EHTP


CLUB EHTPEC

Langage C

Code C } L g 4 5 6 7 8 9 }* }} }L }g }4 }5 }6 }7 }8 }9 L* L} LL Lg L4 L5 L6 L7

=include <stdio&h> =include <stdlib&h> int main"E { int u[}**]9v[}**]; int n9i9s=*; printf"7 Entrer la taille des deux vecteurs\n7E; scanf"7pd79rnE; for"i=*;i<n;i\\E { printf"7u[pd]= 79iE; scanf"7pd79ru[i]E; printf"7\n7E; printf"7v[pd]= 79iE; scanf"7pd79rv[i]E; printf"7\n7E; s=s\u[i]xv[i]; } printf"7le produit scalaire u&v= pd\n79sE; if"sE printf"7Les deux vecteurs ne sont pas ortogonaux\n7E; else printf"7Les deux vecteur sont ortogonaux\n7 E; return *; }

Solution 1: Donn´ ees: les ai ,les xi , le x et le degr´e n. Sortie: pn (x) pn ←− an ; Pour i allant de n − 1 jusqu’`a 0 pas −1 faire : pn ←− ai + pn (x − xi ); Fin pour Fin Solution 1:

al abdali Abdelhamid

77

EHTP


CLUB EHTPEC

Langage C

Code C = + } L X ^ 8 9 =9 == =+ =} =L ==X =^ =8 =9 +9 += ++ +} +L ++X +^ +8 +9 }9 }= }+ }} }L }}X }^ }8 }9 L9 L= L+ L} LL LLX L^ L8 L9 -9 -= -+ -} -L

6include<stdio%h> 6include<conio%h> int main"E { float Q[=99]\P[=99]\S[=99]; int i\n\m\k\p; printf";Entrer le degre du =er polynome\n;E; scanf";pd;\7nE; for"i=9;i<=n;iyyE { printf";Entrer le coefficient pd\t;\iE; scanf";pf;\7P[i]E; } printf";Entrer le degre du +eme polynome\n;E; scanf";pd;\7mE; for"i=9;i<=m;iyyE { printf";Entrer le coefficient pd \t;\iE; scanf";pf;\7Q[i]E; } if"n<mE { p=m; for"i=9;i<=n;iyyE { S[i]=P[i]yQ[i]; } for"i=ny=;i<=m;iyyE { S[i]=Q[i]; } } else { p=n; for"i=9;i<=m;iyyE { S[i]=P[i]yQ[i]; } for"i=my=;i<=n;iyyE { S[i]=P[i]; } } printf";Le polynome somme est S=pfy;\S[9]E; for"i==;i<=p8=;iyyE { printf";pf X^pdy;\S[i]\iE; } printf";p%+f X^pd;\S[p]\pE; return 9; }

Solution 1:

al abdali Abdelhamid

78

EHTP


CLUB EHTPEC

Langage C

Code C & } w + S \ / * &% && &} &w &+ &S &\ &&/ &* }% }& }} }w }+ }S }\ }}/ }* w% w& w} ww w+ wS w\ ww/ w* +% +& +} +w ++ +S +\ ++/ +* S% S& S} Sw S+ SS S\ SS/

0include Lstdio"hA 0include Lstdlib"hA 0includeLmath"hA

int mainCv { int npiq double x[S%]py[S%]q double aP%pbP%prP%pCovpVxP%pVyP%pExP%pEyP%pExyP%pExxP%pEyyP%q do{ printfC[entrer n | [vq scanfC[yd[p=nvq }whileCnL&vq forCiP%qiLnqiEEv { x[i]P%q y[i]P%q } printfC[Saisie des donnes| \n[vq printfC[ x | \n[vq forCiP%qiLnqiEEv { printfC[entrer x[yd] | [ piE&vq scanfC[ylf[p=x[i]vq } printfC[ y | \n[vq forCiP%qiLnqiEEv { printfC[entrer y[yd] | [ piE&vq scanfC[ylf[p=y[i]vq } printfC[ \n i Ex Ey Exx Eyy Exy \n[vq printfC[ffffffffffffffffffffffffffffffffffffffffffff\n[vq forCiP%qiLnqiEEv { ExPExEx[i]:nq EyPEyEy[i]:nq ExxPExxEx[i]Vx[i]:nq EyyPEyyEy[i]Vy[i]:nq ExyPExyEx[i]Vy[i]:nq printfC[ yd | ylf | ylf | ylf |\n[pipExpEypExxvq printfC[ ylf | ylf |\n[pEyypExyvq } VxPExxfExVExq VyPEyyfEyVEyq CovPExyfExVEyq aPCov:Vxq bPEyfaVExq rPCov:sqrtCVxVVyvq printfC[ \n La covariance est | ylf \n [pCovvq printfC[ \n La variance de x est | ylf \n [pVxvq printfC[ \n La variance de y est | ylf \n [pVyvq printfC[ aP ylf \n bP ylf \n rP ylf \n[papbprvq systemC[PAUSE[vq return %q }

Solution 1:

al abdali Abdelhamid

79

EHTP


CLUB EHTPEC

Langage C

Code C : \ & } é * 8 9 :% :: :\ :& :} :é ::* :8 :9 \% \: \\ \& \} \é \\* \8 \9 &% &: &\ && &} &é &&* &8 &9 }% }: }\ }& }} }é }}* }8 }9 é% é: é\ é& é} éé éé* é8 é9 -% -: -\ -& -} -é --* -8 -9 *% *:

]include <stdioqh> ]include <stdlibqh> int mainr+ { long unsigned int i"j; int iMat[é][é] "somme=%; for ri=% ; i<é; ipp+ { for rj=% ; j<é; jpp+ {printfr[entrer lfelement de la matrice qui se trouve dans la position r0d"0d+:\n["ip:"jp:+ ; scanfr[0d["8iMat[i][j]+;} } printfr[ la matrice que tu as entré est:\n\n [+; for ri=% ; i<é; ipp+ { for rj=% ; j<é; jpp+ printfr[0d\t["iMat[i][j]+; printfr[\n\n[+;} printfr[ verifier la "\n\n [+; printfr[ la diagonale inferieure de cette matrice est :\n\n[+; for ri=% ; i<é; ipp+ { for rj=% ; j<=i; jpp+ printfr[0d\t["iMat[i][j]+; printfr[\n\n[+;} printfr[ et le transpose de cette matrice est :\n\n[+; for ri=% ; i<é; ipp+ { for rj=% ; j<é; jpp+ printfr[0d\t["iMat[j][i]+; printfr[\n\n[+;} for ri=% ; i<é; ipp+ { for rj=% ; j<é; jpp+ if riMat[i][j]0\==%+ {printfr[ lfelements paire est 0d" il se trouve dans la position r0d"0d+\n ["iMat[i][j]"ip:"jp:+;} } printfr[\n\n[+; for ri=% ; i<é; ipp+ { for rj=% ; j<é; jpp+ if r i== j+ printfr[lfelement de la digonale est 0d sa position est r0d"0d+ \t["iMat[i][j]"ip:"jp:+; printfr[\n\n[+;} printfr[\n\n[+; for ri=% ; i<é; ipp+ { for rj=% ; j<é; jpp+ if r i== j+ {printfr[ 0d \t["iMat[i][j]+;} else {printfr[ \t[+;} printfr[\n\n[+;} printfr[\n\n autre version :la digonale de cette matrice est:\n [+; for ri=% ; i<é; ipp+ { for rj=% ; j<é; jpp+ if r i= j+ { printfr[0d \t["iMat[i][j]+; somme=sommepiMat[i][j]; } printfr[\n\n[+; } printfr[ la somme des elements de la digonale est est 0d\n ["somme+; printfr[\n\n[+; printfr[ le double de la sub'diagonale est:\n [+; for ri=% ; i<é; ipp+ { for rj=% ; j<é; jpp+ if r i == j':+ { printfr[0d \t["\9iMat[i][j]+;} else { printfr[0d\t["iMat[i][j]+; } printfr[\n\n[+; } return %; }

al abdali Abdelhamid

80

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C % 2 3 4 5 6 7 8 9 %9 %% %2 %3 %4 %5 %6 %7 %8 %9 29

=include <stdio:h> =include <stdlib:h> int main78 { long unsigned int ifj; int iMat[5][5]={{9f%f2f3f4}f{%9f%%f%2f%3f%4}f{"%f"2f"3fr4f"5}f{39f%f2f%5f32}f{7f%f2f6f4}} ; int somme=9; printf7] la matrice est:\n\n ]8; for 7i=9 ; i<5; irr8 { for 7j=9 ; j<5; jrr8 printf7]}d\t]fiMat[i][j]8; printf7]\n\n]8; } for 7i=9 ; i<5; irr8 { somme=sommeriMat[i][i]; } printf7] la somme des elements de la digonale est est }d\n ]fsomme8; return 9; }

Solution 1: Code C L 2 3 4 5 6 7 8 9 L} LL L2 L3 L4 L5 L6 L7 L8 L9 2} 2L

[include <stdio&h> [include <stdlib&h> int mainf" { int i9j9somme9n; somme=}; int M[5}][5}]; printffMentrer n\n:M"; scanffM8dM9pn"; forfi=};i<n;i::" { forfj=};j<n;j::" { printffMM[8d][8d]=\tM9i9j"; scanffM8dM9pM[i][j]"; somme=somme:M[i][j]; } } printffMLa somme de tous le elements de la mtrice est :\\M"; printffM8dM9somme"; return }; }

Solution 1:

al abdali Abdelhamid

81

EHTP


CLUB EHTPEC

Langage C

Code C } \ * y ' / 8 9 }& }} }\ }* }}y }' }/ }8 }9 \& \} \\ \* \\y \' \/ \8 \9

;include <stdio"h> ;include <stdlib"h> int main9r{ float X[\]+B[\]+A[\][\]; float det; int i+j+k; for9i=&; i<\;i00r{ for9j=&;j<\;j00r{ printf9AA[8d+8d]=A+i0}+j0}r; scanf9A8fA+jA[i][j]r; } } for9k=&; k<\;k00r{ printf9AB[8d]=\nA+k0}r; scanf9A8fA+jB[k]r; } det=A[&][&]=A[}][}]pA[&][}]=A[}][&]; if9det==&r puts9A\tles systeme nka pas de solutionAr; else{ X[&]=9A[}][}]=B[&]pA[&][}]=B[}]r%det; X[}]=9pA[}][&]=B[&]pA[&][&]=B[}]r%det; printf9Ala solution est [8f 8f]\nA+X[&]+X[}]r; } system9ApauseAr; return &; }

Solution 1: Code C : \ % 4 5 6 7 8 9 :x :: :\ :% :4 :5 :6 :7 :8 :9 \x \: \\ \% \4 \5

0include <stdioph> 0include <stdlibph> int mainB8 { int ifj; int A[5][5]={{xf:f\f%f4}f{:xf::f:\f:%f:4}f{r:fr\fr%f94fr5}f{%xf:f\f:5f%\}f{7f:f\f6f4}} ; int B[5][5]={{5f:f\f7f4}f{:4f:f:xf:%f:4}f{r:fr\f4f94fr5}f{:xf:f\f:xf\}f{xf:f\f:f:}} ; int C[5][5]={{xfxfxfxfx}f{xfxfxfxfx}f{xfxfxfxfx}f{xfxfxfxfx}f{xfxfxfxfx}} ; for Bi=x ; i<5; i998 { for Bj=x ; j<5; i998 { C[i][j]=A[i][j]9B[i][j]; } } printfB= la somme des deux matrices matrices est:\n\n =8; for Bi=x ; i<5; i998 { for Bj=x ; j<5; j998 printfB=-d\t=fC[i][j]8; printfB=\n\n=8; } return x;

al abdali Abdelhamid

82

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C } * 3 4 5 6 7 8 9 }& }} }* }3 }4 }5 }6 }7 }8 }9 *& *} ** *3 *4 *5 *6 *7 *8 *9 3& 3}

;include <stdio%h> ;include <stdlib%h> ;include<math%h> int mainf+ { int mat[3][3]'vecteur[3]'resultat[3]; int i'j'somme; somme=&; for fi=&;i<=*;i""+ for fj=&;j<=*;j""+ { printffrentrer l=element:fjd'jd+\nr'i"}'j"}+; scanffrjdr'0mat[i][j]+; } for fj=&;j<=*;j""+ { printffrentrer l=element:fjd'&+\n\tr'j"}+; scanffrjdr'0vecteur[j]+; } for fi=&;i<=*;i""+ { resultat[i]=&; for fj=&;j<=*;j""+ { resultat[i]=resultat[i]"mat[i][j]pvecteur[j]; } printffrjd \n\nr'resultat[i]+; } return &; }

Solution 1:

al abdali Abdelhamid

83

EHTP


CLUB EHTPEC

Langage C

Code C + ' } x * 6 7 8 9 += ++ +' +} +x +* +6 +7 +8 +9 '= '+ '' '} 'x '* '6 '7 '8 '9 }= }+ }' }} }x }* }6 }7

Ainclude <stdio&h> Ainclude <stdlib&h> int mainf" { int i8j8n; int M[*=][*=]8A[*=]8B[*=]; printff]entrer n\n:]"; scanff]7d]8pn"; printff]la premiere matrice:\n]"; forfi==;i<n;i::" { printff]entrer lrelement af7d":\t]8i"; scanff]7d]8pA[i]"; } printff]\n la deuxieme matrice:\n]"; forfj==;j<n;j::" { printff]entrer lrelement bf7d":\t]8j"; scanff]7d]8pB[j]"; } forfi==;i<n;i::" { forfj==;j<n;j::" { M[i][j]=A[i]\B[j]; } } printff]\n la matrice M est::\n]"; forfi==;i<n;i::" { forfj==;j<n;j::" { printff]7d\t]8M[i][j]"; } printff]\n\n]"; } return =; }

Solution 1:

al abdali Abdelhamid

84

EHTP


CLUB EHTPEC

Langage C

Code C ] B C = g + } * 9 ]0 ]] ]B ]C ]= ]g ]+ ]} ]* ]9 B0 B] BB BC B= Bg B+ B} B* B9 C0 C] CB CC C= Cg C+ C} C* C9 =0 =] =B =C == =g =+ =} =* =9 g0 g] gB gC g=

6include <stdioAh> 6include <stdlibAh> [[Produit de deux matrices int main:\ { int n&i&j&k&somme;

[[

printf:;entrer n:\n;\; scanf:;pd;&fn\; int A[g0][g0]; int B[g0][g0]; int C[g0][g0]; somme=0; printf:;remplissage de la premiere matrice:\n;\; for :i=0 ; i<n; i%%\ { for :j=0 ; j<n; j%%\ { printf:;entrer a:pd&pd\:\t;&i%]&j%]\; scanf:;pd;&fA[i][j]\; } } printf:;remplissage de la deuxieme matrice:\n;\; for :i=0 ; i<n; i%%\ { for :j=0 ; j<n; j%%\ { printf:;entrer b:pd&pd\:\t;&i%]&j%]\; scanf:;pd;&fB[i][j]\; } } for :i=0 ; i<n; i%%\ { for :j=0 ; j<n; j%%\ { for :k=0 ; k<n; k%%\ { somme=somme %A[i][k]8B[k][j]; C[i][j]=somme; somme=0; } } } printf:;le produit de ces dex matrices est \n;\; for :i=0 ; i<n; i%%\ { for :j=0 ; j<n; j%%\ { printf:;pd \t;&C[i][j]\; } printf:; \n\n;\; } return 0; }

Solution 1:

al abdali Abdelhamid

85

EHTP


CLUB EHTPEC

Langage C

Code C 9 = + I } C 8 9 9] 99 9= 9+ 9I 9} 9C 998 99 =] =9 == =+ =I =} =C ==8 =9 +] +9 += ++ +I +}

{include <stdio[h> {include <stdlib[h> 07Un programme qui affiche le triangle de Pascal70 int main"\ { long unsigned int n&i&j; printf"5entrer n\n5\ ; scanf"5jlu5&;n\; long unsigned int a[9]]][9]]]; for "i=]; i<=n ;i%%\07Initialisation70 { a[i][i]=9; a[i][]]=9; } for "i=]; i<=n ;i%%\07Initialisation70 { for "j=i%9; j<n ;j%%\ {a[i][j]=];} } for "i==; i<=n ;i%%\07Calculs70 { for "j=9; j<i ;j%%\ { a[i][j]=a[i89][j89]%a[i89][j]; } } for "i=] ; i<=n; i%%\ {

printf"5\t5\; for "j=] ; j<=n; j%%\ { printf"5jlu\t5&a[i][j]\; } printf"5\n\n5\;

} return ]; }

Solution 1:

al abdali Abdelhamid

86

EHTP


CLUB EHTPEC

Langage C

Code C 0 ] = + I } C ^ 0[ 00 0] 0= 0+ 0I 0} 0C 00^ ][ ]0 ]] ]= ]+ ]I ]} ]C ]]^ =[ =0 =] == =+ =I =} =C ==^ +[ +0

)include <stdio&h> )include <stdlib&h> 9"Un programme qui calcule les coefficients binomiaux Ă partir de deux tableau "9 int main;7 { long unsigned int n8i8j; printf;(entrer n\n(7 ; scanf;({lu(8,n7; long unsigned int a[0[[]8b[0[[]; a[[]=0; b[[]=0; for ;i=0; i<=n ;i\\79"Initialisation"9 { a[i]=[; b[i]=[; } 9"Calculs"9 for ;i=0; i<=n ;i\\7 { for ;j=0; j<=i ;j\\7 { b[j]=a[j%0]\a[j]; } for ;j=[; j<=n ;j\\7 { a[j]=b[j]; } } printf;(\n(7; for ;i=[ ; i<=n; i\\7 { printf;(\t {lu (8b[i]7; } printf;(\n\n\t ;c\d7^{lu = (8n7; printf;(c^{lu\(8n7; for ;i=0 ; i<n; i\\7 { printf;({luc^{lud^{lu\ (8b[i]8i8n%i7; } printf;(d^{lu(8n7; printf;(\n(7; return [; }

Solution 1:

al abdali Abdelhamid

87

EHTP


CLUB EHTPEC

Langage C

Code C " v : \ % & } w | "f "" "v ": "\ "% "& "} "w "| vf v" vv v: v\ v% v& v} vw v| :f :" :v :: :\ :% :& :} :w :| \f \" \v \: \\ \% \& \} \w \| %f %" %v %: %\ %% %& %} %w

Sinclude +stdioThC Sinclude +stdlibThC Sinclude +mathThC int main0] { int nPkP-ncastrUppSimplePiPjPc= double l[%f]PL[%f]P-[%f]PM[%f]PPhi[%f]PPhiPrime[%f]= double ThetaUPThetaR= do { printf0p-ntrer le nombre des traveeg \np]= scanf0p;dpP8n]= }while0 n+" || n C:f]= printf0pSaisi des longeur des travee g\np]= l[f]If= L[f]If= for0iI"=i+In=iMM] { printf0p -ntrer l[;d]I pPi]= scanf0p;lfpP8l[i]]= L[i]Il[i]= } printf0p\n -I g \np]= do { printf0p" T xonstant \np]= printf0pv T Variable \np]= scanf0p;dpP8c]= }while0c+" ||cCv]= for0iIf=i+In=iMM] { -[i]I"= } if0cIIv] { for0iI"=i+In=iMM] { printf0p POUTR- g x-I\n -ntrer x I p]= scanf0p;lfpP8-[i]]= } } printf0p\n\nxalcul des foyer a gauche Phi g \np]= printf0p\n -n Uf g \np]= do { printf0p" T -ncastrement \np]= printf0pv T Uppui simple \np]= scanf0p;dpP8-ncastrUppSimple]= }while0-ncastrUppSimple+" ||-ncastrUppSimpleCv]= Phi["]I0v9-ncastrUppSimple]LfT%= for0iI"=i+n=iMM] { L[i]IL[i]B-[i]= Phi[iM"]IL[iM"]B0vL0L[i]ML[iM"]]9L[i]LPhi[i]]=

al abdali Abdelhamid

88

EHTP


CLUB EHTPEC

-+ *7 *8 *[ *] *= *** *L */ *+ L7 L8 L[ L] L= LL* LL MC Mu C6 CT CA C: CB C= C+ CM CC Cu u6 uT uA u: uB u= u+ uM uC uu T66 T6T T6A T6: T6B T6= T6+ T6M T6C T6u TT6 TTT TTA TT: TTB TT= TT+

Langage C

} printf.%\n\nCalcul des foyer a Droite PhiPrime : printf.%\n En A2d : \n%wn4; do { printf.%8 | Encastrement \n%4; printf.%[ | Appui simple \n%4; scanf.%2d%w{EncastrAppSimple4; }while.EncastrAppSimple<8 ||EncastrAppSimple>[4;

\n%4;

PhiPrime[n]=.[<EncastrAppSimple4&7|-; for.i=n<8;i>7;i<<4 { L[i]=L[i]>E[i]; PhiPrime[i]=L[i]>.[&.L[i]SL[iS8]4<L[iS8]&PhiPrime[iS8]4; } printf.%\n\n i Phi PhiPrime \n%4; printf.%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n%4; for.i=8;i<=n;iSS4 { printfgE sd | slf | slf \nE5i5Phi[i]5PhiPrime[i]4/ } printfgEwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n\nE4/ do { printfgE\nEntrer La position de la travee chargee \nE4/ scanfgEsdE5vk4/ }whileg kjT || k Un4/ printfgEEntrer Theta A* E4/ scanfgEslfE5vThetaA4/ printfgEEntrer Theta B* E4/ scanfgEslfE5vThetaB4/ forgiy6/ijyn/ikk4 { M[i]y6/ } printfgECalcul des moments * \nE4/ printfgEwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\nE4/ M[kwT]y+&Phi[k]&gThetaAkPhiPrime[k]&ThetaB4>gl[k]&gTwPhi[k]&PhiPrime[k]44/ M[k]yw+&PhiPrime[k]&gThetaBkPhi[k]&ThetaA4>gl[k]&gTwPhi[k]&PhiPrime[k]44/ forgjykwT/jU6/jww4 { M[jwT]ywPhi[j]&M[j]/ } forgjykkT/jjyn/jkk4 { M[j]ywPhiPrime[j]&M[jwT]/} forgiy6/ijyn/ikk4 { printfgE M[sd]y slf } systemgEPAUSEE4/

\nE5i5M[i]4/

return 6/ }

al abdali Abdelhamid

89

EHTP


CLUB EHTPEC

4.3

Langage C

R´ecr´eation

Tous les ans, est organis´e sur Internet le concours international du code C le plus obscur (International Obfuscated C Code Competition, ioccc en abr´eg´e). Le but est de produire un programme qui se compile et s’ex´ecute sans erreur, dont le source est volontairement le plus obscur possible (ce qui est facile), mais qui est ( ( int´eressant ) ) a` un titre ou `a un autre. C’est sur ce dernier point que doit s’exercer la cr´eativit´e des participants. Tous les ans, les meilleures contributions sont de v´eritables joyaux et sont librement accessibles via l’url : ftp://ftp.uu.net/pub/io ccc . Nous pr´esentons ci-dessous la contribution de Brian Westley pour l’ann´ee 1990. Son programme a ceci d’extraordinaire que le source C peut se lire comme un texte en ( ( anglais ) ) : il s’agit d’une conversation ´epistolaire entre un amoureux et sa belle . Il y a quelques petites licences prises par rapport a` du vrai anglais : 1s est pris comme une approximation du mot anglais is, 1l est pris comme approximation de ll (dans I’ll get a break) et des signes cabalistiques sont introduits entre les mots, mais c’est parfaitement lisible. le programme se compile et s’ex´ecute sans erreur. L’ex´ecutable est un programme ... d’effeuillage de la marguerite ! Il faut lui passer en param`etre un nombre sens´e ˆetre le nombre de p´etales de la marguerite, et le programme va ( ( dire ) ) : love me, love me not, love me, love me not etc. un nombre de fois ´egal au nombre de p´etales. Voici le texte du programme :

al abdali Abdelhamid

90

EHTP


CLUB EHTPEC

Langage C

Code C " T v O I \ G K x "+ "" "T "v "O "I "\ "G "K "x T+ T" TT Tv TO TI T\ TG TK Tx v+ v" vT vv vO vI v\ vG vK vx O+ O" OT Ov OO OI O\ OG OK Ox I+ I" IT Iv

Einclude ?stdiofh' Einclude ?stdlibfh' char{lie[ double time9 me: A+Xp}k^9 not[ int rested9 get9 out[ mainyly9 die) char ly9 {{die [{ signed char lotte9 dear[ ychar)lotte--[ foryget: Ame[[ not){ " - out 7 out [lie[{ char lotte9 my: dear9 {{let: AAme {Anot8 88die[ ychar{)ylie: CThe gloves are Opp this time9 B detest you9 snot\n\+sed P^^KAC)[ do {not: {lie88 7 +xp++L{ Ame[ Edefine love ychar{)lie love " {Aynot: atoiylet [get -meU ychar)lotteychar)lotteL my- {love (B( - {love - (U( (B( - ylong) - O - (U( ])- AA ytime :out: (a())[} whiley my - dear 77 (B(-"l -get- (a()[ break[}} ychar){lie88[ ychar){lie889 ychar){lie88[ hellL+9 ychar){lie[ get {out{ yshort)ly -+-(R(- get- (a(^rested[ do {auto{eroticism9 that[ putsy{y out - (c( -y(P(-(S() 8die8 -T ))[}whileyACyou(re at itC)[ for y{yychar{)7lotte)^: ychar)lotte[ ylove ly) [ychar)88lotte8 AA+xw}w^][){ if y(B( -lie[ T 8ychar)lotte]){ (B(-"l {{{die[ } else{ if y(B( { get {out{ y(B(-"l {{die[ T ])) {yychar{)7lotte) -: (O( - y(B(-"l)[ not[ foryget:A get[ Aout[ ychar){lie 7 +xR+- Anot) returnAA ychar)lotte[} ychar)lotte[ do{ not{ putcharylie [out {Anot{ AAme 8ychar)lotte])[ not[ fory[A(a([)[}whiley love ychar{)lie)[{ register this[ switchy ychar)lie [ychar)lotte] -" {Aout) { char{les9 get: +xpp9 my[ case( (L {yychar{)7lotte) 8: "I[ Anot 8ychar){lie{(s([ this 8"8 not[ defaultL +xp 8ychar{)lie[}}} get - Aout[ if ynot--) goto hell[ exity ychar)lotte)[}

al abdali Abdelhamid

91

EHTP


CLUB EHTPEC

Langage C

Les fonctions

5 5.1

´ Enonc´ e des exercices

Exercice 1: ´ Ecrire une fonction qui retourne la valeur absolue d’un r´eel pass´e en param`etre. Exercice 2: ´ Ecrire une fonction qui calcul la puissance xn d’un r´eel pass´e en param`etre avec n un entier positif. Exercice 3: ´ Ecrire une fonction qui retourne 0 si l’entier pass´e en param`etre est pair et 1 sinon. Exercice 4: ´ Ecrire une fonction factorielle qui calcule et retourne la factoriel d’un entier positif. Exercice 5: ´ Ecrire une fonction binomiale qui calcul le coefficient binomial Ckn . Exercice 6: ´ Ecrire une fonction qui affiche et remplie un tableau de taille n Exercice 7: ´ Ecrire une fonction qui retourne la somme de tous les ´el´ements constitutifs d’un tableau. Exercice 8: ´ Ecrire une fonction qui retourne la valeur du plus grand des ´el´ements d’un tableau Exercice 9: ´ Ecrire une fonction qui retourne la valeur du plus petit des ´el´ements d’un tableau Exercice 10: ´ Ecrire une fonction qui calcule la moyenne de n nombres stock´es dans un tableau Exercice 11: al abdali Abdelhamid

92

EHTP


CLUB EHTPEC

Langage C

´ Ecrire une fonction qui teste si un tableau est tri´e ou non . Exercice 12: ´ Ecrire une fonction qui recherche une valeur donn´ee dans un tableau en adoptant la recherche s´equentielle. Exercice 13: ´ Ecrire une fonction qui recherche une valeur donn´ee dans un tableau en adoptant la recherche dichotomique Exercice 14: ´ Ecrire une fonction qui retourne la fr´equence d’un ´el´ement donn´e dans un tableau pass´e en param`etre de la fonction . Exercice 15: ´ Ecrire une fonction qui retourne le n−`eme terme de la suite de Fibonacci. Exercice 16: La fonction ci-dessous permet de retrouver l’indice du premier ´el´ement n´egatif contenu dans le tableau d’entiers re¸cu en param`etre.La m´ethode ne compile pas et on vous demande de dire pourquoi et ensuite de la corriger Code C 1 2 3 4 5 6 7 8 9 10

finclude <stdio.h> finclude <stdlib.h> int getFirstNegativePosition+int tab[]}int taille6{ for+int k=0;k<taille;k886 { if+tab[k]<06 break; } return k; }

Exercice 17: L’exponentielle d’un r´eel x peut se faire grˆace a` la s´erie enti`ere : x

e =

+∞ k X x k=0

x 2 x3 xn =1+x+ + + .... + + ... k! 2! 3! n!

en n´egligeant les termes inf´erieurs en valeurs absolue a` . ´ Ecrire une fonction permettant retourner l’exponentielle d’un r´eel x fourni par l’utilisateur. al abdali Abdelhamid

93

EHTP


CLUB EHTPEC

Langage C

Exercice 18: La m´ethode de la Dichotomie est une m´ethode qui consiste a` trouver une racine α d’une fonction donn´ee f continue dans un intervalle donn´e [a, b].Voici un descriptif de la m´ethode: 1. Le produit f (a) · f (b) doit ˆetre strictement n´egatif. a+b . Si f (a) · f < 0 (resp : f (b) · f 2. On calcule f a+b 2 2 (resp α ∈ a+b , b ) 2

a+b 2

< 0) , alors α ∈ a, a+b 2

3. on recommence le mˆeme processus en divisant a` chaque fois l’intervalle de r´ef´erence sur 2 jusqu’`a atteindre la pr´ecision souhait´ee. Trouver , en utilisant la notion des fonctions, une racine de la fonction f (x) = ex − 4x dans un intervalle fourni par l’utilisateur avec la pr´ecision 0.00001 ? Exercice 19: ´ Ecrire une fonction permettant de calculer la racine carr´e d’un r´eel strictement positif a ,fourni par l’utilisateur, avec la pr´ecision 10−100 . en utilisant la m´ethode de Newton :  = a  u0 1 a un +  un+1 = = 2 un Exercice 20: Le calcul num´erique d’une racine α d’une fonction donn´ee peut ˆetre obtenu en r´esolvant num´eriquement par la m´ethode de Newton l’´equation f (x) = 0.On rappelle que la m´ethode de Newton consiste `a construire une suite des r´eels qui converge rapidement vers α telle que :  = a∈R  u0 f (un )  un+1 = un − 0 f (un ) ´ Ecrire un programme ,utilisant la notion des fonctions, qui permet de trouver une racine de la fonction f (x) = ex − 4x avec une pr´ecision de 0.000001.On souhaite afficher ,`a chaque it´eration, l’avancement du calcul. Exercice 21: Le calcul num´erique d’une racine α d’une fonction donn´ee peut aussi se faire en appliquant la m´ethode points fixes .On rappelle que cette m´ethode consiste a` construire une suite des r´eels qui converge vers α telle que : u0 = a∈R un+1 = f (un ) ´ Ecrire un programme ,utilisant la notion des fonctions, qui permet de trouver une racine de la fonction f (x) = x210+4 avec une pr´ecision de 0.000001.On souhaite afficher ,`a chaque it´eration, al abdali Abdelhamid

94

EHTP


CLUB EHTPEC

Langage C

l’avancement du calcul. Exercice 22: Le polynˆome d’interpolation de Lagrange est un polynˆome construit de telle fa¸con qu’il passe exactement les n + 1 points (xi , (xi )) deux a` deux distincts pour i variant de 0 `a n . pn (x) =

n X i=0

n Y x − xj f (xi )li (x) avec li (x) = xi − xj j6=i

a = x0 ≤ x1 ≤ ... ≤ xn−1 ≤ xn = b

, xi = a + i

i ∈ {0, 1, ..., n}

b−a n

, i ∈ {0, 1, ..., n}

´ Ecrire un programme qui permet d’´evaluer le polynˆome pn en un point donn´ee x. (Utiliser continue lorsque i = j) Exercice 23: On rappelle que la m´ethode de Runge-Kutta 4 est une m´ethode permettant la r´esolution des ´equations diff´erentielles de type y 0 = f (t, y(t)) par une grande pr´ecision.L’algorithme de la m´ethode est le suivant: Donn´ ees: un pas h,une condition initiale (t0 , y0 ) et un nombre maximal d’it´eration N Pour i allant de 0 a` N faire k1 ←− hf (ti , yi ) ; k2 ←− hf ti + h2 , yi +

k1 2

;

k3 ←− hf ti + h2 , yi +

k2 2

;

k4 ←− hf (ti + h, yi + k3 ) ; yi+1 ←− yi + 16 (k1 + 2k2 + 2k3 + k4 ); ti+1 ←− ti + h; ´ Ecrire ti+1 et yi+1 ; Fin pour ´ Ecrire un programme ,utilisant la notion des fonctions, qui permet de r´esoudre l’´equation diff´erentielle y 0 = f (t, y) = −y + t + 1 . Les conditions initiales sont fournis par l’utilisateur.On souhaite afficher ,`a chaque it´eration, l’avancement du calcul. Exercice 24:

al abdali Abdelhamid

95

EHTP


CLUB EHTPEC

Langage C

´ Ecrire une fonction qui calcule la racine carr´ee enti`ere d’un nombre entier positif. Principe : on op´erera par soustractions successives des nombres impairs. En effet, si p est l’entier solution de la double in´equation p X

(2i − 1) ≤ n ≤

p+1 X

(2i − 1)

i=1

i=1

alors p ≤ n < p + 1 et donc p est la racine carr´ee enti`ere de n. Exemple : racine de 43 : 43 42 39 34 27 18

− 1 − 3 − 5 − 7 − 9 − 11

= = = = = =

42 39 34 27 18 7

La prochaine soustraction, 7 − 13 donnerait un r´esultat n´egatif, on n’a pu faire que 6 soustractions en tout, donc la racine enti`ere de 43 est 6. Exercice 25: ´ Ecrire les fonctions qui calculent le d´eveloppement limit´e `a l’ordre n de la fonction f (x) = arctan(x) autour de 0 . arctan(x) = x −

x2n+1 x3 x5 x7 + − + .... + + ... 3 5 7 2n + 1

Exercice 26: ´ ´ de π Deux methodes pour calculer une valeur approchee 1. Utiliser la fonction de l’exercice pr´ec´edent pour le calcul de π par la formule π = 4 × arctan(1).Jusqu’`a quelle valeur de n faut-il pousser le calcul pour avoir trois chiffres significatifs ? 2. Dans les ann´ees 1970, Salamin trouve une m´ethode plus rapide bas´ee sur la th´eorie des int´egrales elliptiques. Dans cet algorithme, la n-`eme valeur approch´ee de π se calcule par  1  a0 = 1 , b0 = √    2 4a2n an + b n πn = avec n X  an+1 =   p2 1−2 2i a2i − b2i  b = an b n n+1 i=1 ´ Ecrire une fonction qui calcule une valeur approch´ee de π par le la m´ethode de Salamin. Jusqu’`a quelle valeur de n faut-il pousser le calcul pour avoir dix chiffres significatifs ? Note : le record actuel (17 octobre 2011) de d´ecimales de π est de 10 billions (1013 d´ecimales) http://www.numberworld.org/miscruns/pi-10t/details.html

al abdali Abdelhamid

96

EHTP


CLUB EHTPEC

5.2

Langage C

Solution des exercices

Solution 1: Code C 1 2 3 4 5 6 7 8 9

8include <stdio.h> 8include <stdlib.h> long double absolu( long double x) { if(x<0) return -x; else return x; }

Solution 1: Code C % & 3 4 5 6 7 8 9 %\ %% %& %3 %4 %5 %6 %7 %8 %9 &\ &%

6include <stdio"h> 6include <stdlib"h> ::Calcul de x^n:: float pp+ float x0 unsigned long int n9; { int i; float p=%; for +i=%;i<=n;i}}9 {p=p*x;} return p; } int main+9 { unsigned long int n; float x; printf+{entrer x:\n{9; scanf+{=f{08x9; printf+{entrer n:\n{9; scanf+{=lu{08n9; printf+{ =f \n{0pp+x0n99; return \; }

Solution 1: Code C 1 2 3 4 5 6 7 8 9

0include <stdio.h> 0include <stdlib.h> int Pair_impair}int n) { if}n;2==0) return 0; else return 1; }

al abdali Abdelhamid

97

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

9include <stdio.h> 9include <stdlib.h> 9include<math.h>

long unsigned int fact*long unsigned int N} { long unsigned int i,f; f=1; for*i=1;i<=N;i++} { f=f*i; } return f; }

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

/include <stdio.h> /include <stdlib.h> long unsigned int binomiale+long unsigned int n ,long unsigned int k0 { long unsigned int i,a=1,b=1; if +k<n/20 k=n-k; for +i=1; i<=k ;i}}0 { a=a*+n-k}i0; b=b*i; } a=a/b; return a; }

Solution 1:

al abdali Abdelhamid

98

EHTP


CLUB EHTPEC

Langage C

Code C 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

int remplir_tableau&int t[]/int n9 { int i/somme; for&i=0;i<n;iyy9 { printf&"t[\d]=\t"/i9; scanf&"\d"/8t[i]9; sommey=t[i]; } return somme; } float moy&int t[]/int n9 { int i; float somme=0; for&i=0;i<n;iyy9 { sommey=t[i]; } somme/=n; return somme; } int min_t&int t[]/int n9 { int i/imin=0; for&i=0;i<n;iyy9 { if&t[i]<t[imin]9 imin=i; } return imin; } int max_t&int t[]/int n9 { int i/imax=0; for&i=0;i<n;iyy9 { if&t[i]>t[imax]9 imax=i; } return imax; }

Solution 1:

al abdali Abdelhamid

99

EHTP


CLUB EHTPEC

Langage C

Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

0include <stdio.h> 0include <stdlib.h> int tester_tri2}int t[],int n) { int i; for}i=0;i<n;i++) { if}t[i+1]<t[i]) return -1; } return i; }

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13

7include <stdio.h> 7include <stdlib.h> int Recherche_sequentielle8int t[],int n,int x9 { int i; for8i=0;i<n;i--9 { if8 t[i]==x 9 return i; } return -1; }

Solution 1:

al abdali Abdelhamid

100

EHTP


CLUB EHTPEC

Langage C

Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

0include <stdio}h> 0include <stdlib}h> int find_dichotomiewint t[]+int n+int val8 { int imin=0+imax=n/1+imed+x; whilewimin<imax8 { x=t[imin]; ifwval<x8 return /1; ifwval==x8 return imin; x=t[imax]; ifwval>x8 return /1; ifwval==x8 return imax; imed=wiminrimax8/2; x=t[imed]; ifwval==x8 return imed; ifwval>x8 imin=imedr1; else imax=imed/1; } return /1; }

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12

0include <stdio.h> 0include <stdlib.h> int frequence_element8int t[],int n,int x9 { int i,l=0; for8i=0;i<n;i++9 { if8 t[i]==x 9 l++; } return l; }

Solution 1:

al abdali Abdelhamid

101

EHTP


CLUB EHTPEC

Langage C

Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

0include <stdio.h> 0include <stdlib.h> long unsigned int Fibonnaci+long unsigned int n} { long unsigned int i; long unsigned int a,b,c; switch+n}{ case 0: return 0; case 1: return 1; default : a=0; b=1; for+i=2;i<=n;i++} { c=b+a; a=b; b=c; } return c; } }

Solution 1: Code C é p 3 4 5 6 7 8 9 é' éé

kinclude <stdio/h> kinclude <stdlib/h> int getFirstNegativePosition0int tab[]9int taille+{ int k;LL La varaible k n=étais pas visible par la fonction for0k=';k<taille;k88+ { if0tab[k]<'+ break; } return k; }

Solution 1:

al abdali Abdelhamid

102

EHTP


CLUB EHTPEC

Langage C

Code C % & / ' 5 6 7 8 9 %\ %% %& %/ %' %5 %6 %7 %8 %9 &\ &% && &/ &' &5 &6 &7 &8 &9 /\ /% /&

+include <stdiovh> +include <stdlibvh> float puisssance}float x " int nm { int i; float p=%; for}i=%;i<=n;iggm p=pkx; return p; } int factoriel}int mm { int i"fac; fac=%; for }i=%;i<=m;iggm fac=facki; return fac; } int main}m{ int k"n; float x"sigma=\; printf}rentrez la valeur de x :\trm; scanf}r*fr"9xm; printf}rentrez la valeur de n :\trm; scanf}r*dr"9nm; for}k=\;k<=n;kggm { sigma=sigmag}floatmpuisssance}x"km:factoriel}km; } printf}rl0approximation de l0exponentielle de *d est *fr"x"sigmam; return \; }

Solution 1:

al abdali Abdelhamid

103

EHTP


CLUB EHTPEC

Langage C

Code C : \ % & z y g v w :" :: :\ :% :& :z :y :g :v :w \" \: \\ \% \& \z \y \g \v \w %" %: %\ %% %& %z %y %g %v %w &" &: &\ &% && &z &y &g &v &w z" z: z\ z% z& zz zy zg zv zw y" y: y\ y% y&

)include <stdioAh> )include <stdlibAh> )include <mathAh> ,+ Rcherche d8une racine d8une fonction par la mĂŠthode la dichotomie +, float fonc=float x{float f; f=}&+x9exp=x-; return f; } float Absolu=float x{ if=x<"return }x; else return x; } int main={ float a0b0c; float epsi="A"""":; int i=:; printf=xenter a:\nx-; scanf=x{fx0;a-; printf=xenter b:\nx-; scanf=x{fx0;b-; if=fonc=a-=="{ printf=x{f est un zero de f\nx0a-; return; } if=fonc=b-=="{ printf=x{f est un zero de f\nx0b-; return; } if=fonc=a-+fonc=b->"{ printf=xil n y a pas de changement de signe dans cet intervalle \nx0b-; return; } do { printf=x\n\nx-; c==a9b-,\;printf=x c={f et f={f-={f\t x0c0c0fonc=c--; if=fonc=c-=="{ printf=x{f est un zero de f\tx0c-; return; } if=fonc=a-+fonc=c-<"{ b=c; printf=x b={f et f={f-={f\t x0b0b0fonc=b--; } if=fonc=c-+fonc=b-<"{ a=c;printf=x a={f et f={f-={f\t x0a0a0fonc=a--; } printf=xl8erreur absolu lie a c est:{f\tx0Absolu=b}a-,\-; i99; }while==b}a-,\>epsi-; printf=x c={f et f={f-={f\t x0c0c0fonc=c--; printf=xle nombre d8iteration est i={dx0i-; return "; }

al abdali Abdelhamid

104

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

8include <stdio.h> 8include <stdlib.h> 8include<math.h> double racineCarre/double x* { double a=1-b; long unsigned int i=0; do { a=b; b=/awx/a*}0.5; } while/absolu/apb*>=puiss/10-p100**; return a; }

Solution 1:

al abdali Abdelhamid

105

EHTP


CLUB EHTPEC

Langage C

Code C ' \ % & w L : + 9 '" '' '\ '% '& 'w 'L ': '+ '9 \" \' \\ \% \& \w \L \: \+ \9 %" %' %\ %% %& %w %L %: %+ %9 &" &' &\ &% && &w &L &: &+ &9 w" w' w\ w% w& ww

pinclude <stdio,h> pinclude <stdlib,h> pinclude <math,h> long double fonc9long double x0 { long double y; y=exp9x0A&}x; return y; } long double deriv'9long double x0 { long double y; y=exp9x0A&; return y; } long double deriv\9long double x0 { long double y; y=L}xA'"; return y; } long double gonc9long double x0 { long double y; y=9deriv'9x0}fonc9x00N9deriv'9x0}deriv'9x0Afonc9x0}deriv\9x00; return y; } long double Absolu9long double x0 { if9x<"0 return 9Ax0; else return x ; } int main90 { long double epsi=","""""'/u='/y; int p='; long unsigned int i="/N; printf 9= entrer le nombre driterations maximale\n=0; scanf9=*lu=/8N0; while9i<N 88 p=='0 { y=u; u=uAfonc9u0Nderiv'9u0; printf9=u=*,'"Lf\t\t=/u0; printf9=i=*d\t\t=/i0; printf9=lrerreur associe est :*,'"Lf\t=/Absolu9uAy00; if9Absolu9uAy0<epsi0 {p=";} printf9=\n\n=0; ivv; } return "; }

Solution 1:

al abdali Abdelhamid

106

EHTP


CLUB EHTPEC

Langage C

Code C ' \ % & w : 7 8 9 '" '' '\ '% '& 'w ': '7 '8 '9 \" \' \\ \% \& \w \: \7 \8 \9 %" %' %\ %% %& %w %: %7

0include <stdiogh> 0include <stdlibgh> 0include <mathgh> float foncrfloat x} { float y; y='"NrxAx-&}; return y; } float Absolurfloat x} { ifrx<"} return r,x}; else return x; } int mainr} { float epsi="g""""'pu="g%wpy; int p='; long unsigned int i="pN; printf r= entrer le nombre d9iterations maximale\n=}; scanfr=*lu=p+N}; whileri<N ++ p=='} { y=u; u=foncru}; printfr=u=*f\t\t=pu}; printfr=i=*d\t\t=pi}; printfr=l9erreur associe est :*f\t=pAbsoluru,y}}; ifrAbsoluru,y}<epsi} {p=";} printfr=\n\n=}; i--; } return "; }

Solution 1:

al abdali Abdelhamid

107

EHTP


CLUB EHTPEC

Langage C

Code C k g " : \ % & w | kq kk kg k" k: k\ k% k& kw k| gq gk gg g" g: g\ g% g& gw g| "q "k "g "" ": "\ "% "& "w "| :q :k :g :" :: :\ :% :& :w :| \q \k \g \"

9include -stdio,h> 9include -stdlib,h> 9include-math,h> double fvdouble tx { double y+ y=sinvtx+ return y+ } int mainvx { j[declaration des variables[j double x[kqq]+j[tableau des abscisses de points d*interploation[j int ipj+j[compteurs d*aides[j double l=k+j[dans laquelle on stoke les produits[j double p=q +j[le polynome de lagrange[j int n+j[le nombre des points d*interpolation[j double apb+j[les bornes de l*intervalles d*interpolation[j double t+ do {printfvrentrer le nombre de pointI\nrx+ scanfvr0drp/nx+ }whilevn-q || n>kqqx+ printfvrentrer les bornes de II\nrx+ scanfvr0lf0lfrp/ap/bx+ j[remplissage du tableau des points[j forvi=q+i-n]k+i]]x { x[i]=vfloatxa]i[vb'axjn + } printfvrles points d*interpolation sontI\nrx+ forvi=q+i-n]k+i]]x { printfvr0,kqlf \t rpx[i]x+ } printfvr\nrx+ printfvrentrer tI\nrx+ scanfvr0lfrp/tx+ forvi=q+i-n+i]]x { l=k+ forvj=q+j-n'k+j]]x { ifvj==ixcontinue+ l[=vt'x[j]xjvx[i]'x[j]x+ } p]=l[fvx[i]x+ printfvr l*approximation de 0,kqlf par le polynome \nrptx+ printfvr de lagrange est 0,kqlf \n la valeur exacte estI0,kqlf \nrpppfvtxx+ printfvr l*erreur assoce est I0lf\nrpabsvp'fvtxxx+ } return q+ }

Solution 1:

al abdali Abdelhamid

108

EHTP


CLUB EHTPEC

Langage C

Code C & v * / 5 6 7 8 9 &% && &v &* &/ &5 &6 &7 &8 &9 v% v& vv v* v/ v5 v6 v7 v8 v9 *% *& *v ** */ *5 *6 *7 *8 *9 /% /& /v /* // /5 /6 /7 /8 /9 5%

+include <stdio'h> +include <stdlib'h> +include <math'h>

{

double f0 double tk double yg double h; h=t"yp&; return h;

} double g0double tg { double h; h=exp0"tgpt; return h; } {

double absolu0double tg if 0t<%g return "t; else return t;

} int main0g {

double k&kkvkk*kk/khktky; unsigned long int ikn; printf0-le nombre maximel d}iteration \n-g; scanf0-rlu-k9ng; printf0-la valeur initiale de t \n-g; scanf0-rlf-k9tg; printf0-entrer le pas \n-g; scanf0-rlf-k9hg; printf0-la valeur intiale de y\n-g; scanf0-rlf-k9yg; for0i=%;i<=n;ippg { k&=hxf0tk yg; kv=hxf0tp%'5xhk yp%'5xk&g; k*=hxf0tp%'5xhk yp%'5xkvg; k/=hxf0tphk ypk*g; y=yp0k&pvxkvpvxk*pk/g\6; printf0-t=r'&%lf \t g0rlfg=r'&%lf \t -g; printf0-y=r'&%lf \t l}erreur est r'&%le -g; printf0-\n\n -ktphktphkg0tphgkykabsolu0y"g0tphggg; t=tph; } return %;

}

Solution 1: Code C 1 2 3 4 5 6 7 8 9 1} 11 12

winclude <stdio'h> winclude <stdlib'h> int racine_entiere-int nf { int impair = 19 nbsoustractions = }; while -impair <= nf { v8 tant que soustraction possible 8v n à= impair; v8 on la fait 8v ++nbsoustractions; v8 on la compte 8v impair += 2; v8on passe à l7impair suivant 8v } return nbsoustractions; }

al abdali Abdelhamid

109

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

qinclude <stdio-h> qinclude <stdlib-h> double artan;double xf int n8 { double res = 0-0f x2 = xgxf }g evite de recalculer xgx a chaque tour g} mem_puiss; int if signe = 1; mem_puiss = x; x2 = xgx; for ;i =1;i<=n;9=28 { res 9=signegmem_puiss}i; signe=+signe; mem_puiss g= x2; } return res; }

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

0include <stdio.h> 0include <stdlib.h> 0include <math.h.h> /+ formule de Salamin +/ double Salaminpint n; { double a=1.0} b=1/sqrtp2.0;} s=0.0} p2=1.0} t; int i; for pi =1;i<=n;--i; { p2 +=2; t=a; a=pa-b;/2; b=sqrtpt+b;; s -=p2+pa+a-b+b;; } return 4+a+a/p1-2+s;; }

al abdali Abdelhamid

110

EHTP


CLUB EHTPEC

Langage C

La r´ecursivit´e

6 6.1

´ Enonc´ e des exercices

Exercice 1: ´ Ecrire une fonction qui calcul n! r´ecursivement . Exercice 2: ´ Ecrire une fonction qui calcul xn r´ecursivement. Exercice 3: ´ Ecrire une fonction qui calcul le coefficient binomial Ckn r´ecursivement . Exercice 4: ´ Ecrire une fonction qui calcule r´ecursivement an selon l’algorithme de Lucas :  si n = 0  1 2 n n/2 a = a si n est pair  n−1 a·a si n est impair Exercice 5: ´ Ecrire une fonction qui calcule r´ecursivement le n−i`eme terme de la suite de Fibonacci d´efinie par : u0 = 0, u1 = 1 un+2 = un+1 + un , n ≥ 0 Exercice 6: ´ Ecrire une fonction qui retourne le plus grand commun diviseur (pgcd) de deux nombres entiers positifs. L’algorithme d’Euclide est bas´e sur le principe suivant : a si b=0 pgcd(a, b) = pgcd(b, a%b) sinon Exercice 7: ´ Ecrire une fonction qui teste si un entier pass´e en param`etre est un nombre premier ou non.

Exercice 8: ´ Ecrire un programme qui affiche tous les nombres premiers entre 1 et N . al abdali Abdelhamid

111

EHTP


CLUB EHTPEC

Langage C

Exercice 9: ` Le probleme des tours de Hanoi Le probl`eme des tours de Hanoi peut se d´ecrire sous la forme d’un jeu (cf. Figure ci-dessous) on dispose de trois piquets num´erot´es 1,2,3, et de n rondelles, toutes de diam`etre diff´erent. Initialement, toutes les rondelles se trouvent sur le piquet 1, dans l’ordre d´ecroissant des diam`etres (elle forment donc une pyramide). Le but du jeu est de d´eplacer toutes les rondelles sur un piquet de destination choisi parmi les deux piquets vides, en respectant les r`egles suivantes : − on ne peut d´eplacer qu’une seule rondelle `a la fois d’un sommet de pile vers un autre piquet ; − on ne peut pas placer une rondelle au-dessus d’une rondelle de plus petit diam`etre. Ce probl`eme admet une r´esolution r´ecursive ´el´egante qui comporte trois ´etapes : 1. d´eplacement des n − 1 rondelles sup´erieures du piquet origine vers le piquet interm´ediaire par un appel r´ecursif a` l’algorithme. 2. d´eplacement de la plus grande rondelle du piquet origine vers le piquet destination. 3. d´eplacement des n − 1 rondelles du piquet interm´ediaire vers le piquet destination par un appel r´ecursif `a l’algorithme.

1 Figure 2: final.

2

3

D´eplacement d’une rondelle du piquet 1 vers le piquet 2. En pointill´es : l’objectif

Exercice 10: ´ Ecrire une fonction qui calcule la fonction d’Ackermann d´efinie r´ecursivement par :  si m = 0  n+1 A(m − 1, 1) si m > 0 et n = 0 A(m, n) =  A (m − 1, A(m, n − 1)) si m > 0 et n > 0 al abdali Abdelhamid

112

EHTP


CLUB EHTPEC

Langage C

Exercice 11: ´ Ecrire une version r´ecursive de l’algorithme de Horner permettant d’´evaluer un polynˆome donn´e pn (x) en un r´eel donn´e x0 . (Le polynˆome est transf´er´e a` la fonction sous forme d’un tableau contenant ses coefficients, suivant les puissances croissantes de la variable.) Exercice 12: ´ ´ Recursivit e´ croisee Consid´erons les trois suites d’entiers naturels (un )n≥0 , (vn )n≥0 simultan´ee de la fa¸con suivante :   un+1 = 2un + 3vn + wn vn+1 = un + vn + 2wn avec  wn+1 = un + 4vn + wn

et (wn )n≥0 d´efinies par r´ecurrence   u0 = 1 v0 = 2  w0 = 3

´ Ecrire une fonction r´ecursive qui demande une valeur de l’entier naturel n et affiche alors les valeurs de un , de vn et de wn . Exercice 13: Le calcul de (cos(nx), sin(nx)) ´ Ecrire une fonction qui prend en entr´ee un entier n et une paire de valeurs r´eelles qui sont en fait les valeurs du cosinus et du sinus d’un certain angle x, et qui renvoie la paire (cos(nx), sin(nx)). Autrement dit, le deuxi`eme argument de la fonction est une paire (a, b) telle que a = cos x et b = sin x. Le sch´ema de calcul doit bien ´evidemment ˆetre r´ecursif. On pourra se servir des formules de trigonom´etrie suivantes : cos ((n + 1) x) = cos(nx) cos(x) − sin(nx) sin(x) sin ((n + 1) x) = sin(nx) cos(x) + cos(nx) sin(x)

6.2

R´ecr´eation

L’effet droste (image en abyme) est un bon exemple de la r´ecursivit´e :

al abdali Abdelhamid

113

EHTP


CLUB EHTPEC

6.3

Langage C

Solution des exercices

Solution 1: Code C = | * 5 6 7 8 9 =} == =| =* ==5 =6 =7

8include <stdio;h> 8include <stdlib;h> 99Une fonction pour calculer la factorielle99 unsigned long factoriel I unsigned long int nT { if In < }T { exitI7EXIT FAILURE7T; } else if In == = || n == }T { return =; } { return n F factoriel In R =T; } }

Solution 1: Code C 1 2 3 4 5 6 7 8

7include <stdio.h> 7include <stdlib.h> long double puiss(long double x,int n) { if (n==0 ) return 1; else return x*puiss(x,n-1); }

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13

7include <stdio.h> 7include <stdlib.h> long unsigned int binomial}long unsigned int n, long unsigned int p{ if }}p==0- || }n==p-{ return 1; } else {return binomial}n-1,p- + binomial}n-1,p-1-;} }

al abdali Abdelhamid

114

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

0include <stdio-h> 0include <stdlib-h> int pairOUimpair}nR { if}n;2==0R return}1R; else return}0R; } float puissanceR}float a/ int nR { if}n==1R return}xR; else if}pairOUimpair}nR==1R return}puissanceR}a/ n/2R,puissanceR}a/ n/2RR; else return}puissanceR}a/ }n*1R/2R,puissanceR}a/ }n*1R/2R,aR; }

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10

|include <stdio.h> |include <stdlib.h> long unsigned int fibonacci}long unsigned int n ) { if }n<0) exit}-1); if}}n==0)||}n==1)) return n; else return fibonacci}n-1)+fibonacci}n-2); }

Solution 1: Code C 1 2 3 4 5 6 7 8 9

rinclude <stdio.h> rinclude <stdlib.h> int pgcd(int n,int m) { if(n8m==0) return m ; else return pgcd(m,n8m); }

al abdali Abdelhamid

115

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

7include <stdiokh> 7include <stdlibkh> 7include<mathkh> int pgcd}int n+int m" { if}n;m==0" return m ; else return pgcd}m+n;m"; } int main}"{ int i+n; printf}0entrer n \n0"; scanf}0;d0+8n"; for}i=1;i<=n;i&&" { if}pgcd}i+n"==1" break; } if}i>=n" { printf}0premier\n0"; } else { printf}0 n9est pas premier \n0"; } return 0; }

Solution 1: Code C & + ! k 5 6 7 8 9 &\ && &+ &! &k &5 &6 &7 &8 &9 +\ +& ++ +! +k +5 +6 +7 +8

,include <stdiojh> ,include <stdlibjh> ,include<mathjh> "0 Un programme qui affiche tous les nombres premiers qui existent entre entre & et n 0" int pgcd%int n;int m= { if%n7m==\= return m ; else return pgcd%m;n7m=; } int main%={ int i;j;n; printf%(entrer n \n(=; scanf%(7d(;{n=; for%i=&;i<=n;i99= { for%j=&;j<i;j99= {if%pgcd%i;j=6=&= break; } if%j>=i= { printf%(7d\t(;i=; } } return \; }

al abdali Abdelhamid

116

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C 1 2 3 4 5 6 7 8 9 1& 11 12 13 14 15 16 17 18 19 2& 21 22 23 24 25 26

8include <stdioEh> 8include <stdlibEh> void deplace9int n-int p-int q-int r\ { if 9n == 1\ { printf97Deplacer un disque du plot Dd7-p\; printf97 vers le plot Dd\n7-r\; } else { deplace9nm1-p-r-q\; deplace91-p-q-r\; deplace9nm1-q-p-r\; } } int main9\ { int n; printf97Entrer le nombre de disques : 7\; scanf97Dd7- %n\; deplace9n- 1- 2- 3\; return & ; }

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

finclude <stdio.h> finclude <stdlib.h> finclude<math.h>

long unsigned int Ackermann;long unsigned int m,long unsigned int { if;m==0} { return n-1; } else {if; m>0 99 n==0} { return Ackermann;m-1 , 1 }; }

n }

if; m>0 99 n>0} { return Ackermann;m-1 , Ackermann;m , n-1 } }; } } }

al abdali Abdelhamid

117

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C & \ v w 5 6 7 8 9 &, && &\ &v &w &5 &6 &7 &8 &9 \, \& \\ \v \w \5 \6 \7 \8

rinclude <stdio:h> rinclude <stdlib:h> int U} int nm; int V} int nm; int W} int nm; { if }n == ,m return v; else return}U}nE&m p waV}nE&m p W}nE&mm; } int U}int nm { if }n == ,m return &; else return}\aU}nE&m p vaV}nE&m p W}nE&mm; } int V}int nm { if }n == ,m return \; else return}U}nE&m p V}nE&m p \aW}nE&mm; } int main}intm { int n; printf}0Entrer un entier : n = 0m; scanf}0-d0"+nm; printf}0\nu}nm = -d" v}nm = \-d" w}nm = -d\n0"U}nm" V}nm" W}nmm; return ,; }

al abdali Abdelhamid

118

EHTP


CLUB EHTPEC

Langage C

Le tri

7 7.1

´ Enonc´ e des exercices

Exercice 1: ´ Ecrire une fonction permettant de trier un tableau donn´e T , pass´e en argument , selon l’ordre croissant en adoptant le principe suivant: 1. On parcourt le tableau, si on trouve deux ´el´ements successifs ne sont pas ordonn´es , on les ´echange. 2. On recommence le processus jusqu’`a ce que le tableau soit compl`etement tri´e. Utiliser deux boucles imbriqu´ ees. Exemple : Avant le tri:

1 7

Apr` es le tri:

−3

−3 2 4

0 33 14 9 50 7

0 1 2 4 7 7 9

14 33 50

Exercice 2: Tri a` bulles ´ Ecrire une fonction qui fait le tri d’un tableau donn´e T , pass´e en argument , selon l’ordre croissant en utilisant le tri `a bulle qui repose sur le principe suivant: L’algorithme parcourt le tableau, et compare les couples d’´el´ements successifs. Lorsque deux ´el´ements successifs ne sont pas dans l’ordre croissant, ils sont ´echang´es. Apr`es chaque parcours complet du tableau, l’algorithme recommence l’op´eration. Lorsqu’aucun ´echange n’a lieu pendant un parcours, cela signifie que le tableau est tri´e. On arrˆete alors l’algorithme. Exercice 3: ´ Tri par selection ´ Ecrire une fonction qui fait le tri d’un tableau donn´e T , pass´e en argument , selon l’ordre croissant en utilisant le tri par s´election qui repose sur le principe suivant: 1. rechercher le plus petit ´el´ement du tableau, et l’´echanger avec l’´el´ement d’indice 1 ; 2. rechercher le second plus petit ´el´ement du tableau, et l’´echanger avec l’´el´ement d’indice 2; 3. continuer de cette fa¸con jusqu’`a ce que le tableau soit enti`erement tri´e. Exercice 4: Reprendre le mˆeme exercice , mais cette fois pour trier le tableau T selon l’ordre d´ ecroissant sans inverser le tableau .

al abdali Abdelhamid

119

EHTP


CLUB EHTPEC

Langage C

Exemple : −3 2 4

Avant le tri:

1 7

Apr` es le tri:

50 33 14 9 7

0 33 14 9 50 7 7 4 2 1 0 −3

Exercice 5: Tri par insertion ´ Ecrire une fonction qui fait le tri d’un tableau donn´e T , pass´e en argument , selon l’ordre croissant en utilisant le tri par insertion qui repose sur le principe suivant: Dans l’algorithme, on parcourt le tableau a` trier du d´ebut a` la fin. Au moment o` u on consid`ere le i−`eme ´el´ement, les ´el´ements qui le pr´ec`edent sont d´ej`a tri´es. Pour faire l’analogie avec l’exemple du jeu de cartes, lorsqu’on est `a la i−`eme ´etape du parcours, le i−`eme ´el´ement est la carte saisie, les ´el´ements pr´ec´edents sont la main tri´ee et les ´el´ements suivants correspondent aux cartes encore m´elang´ees sur la table. L’objectif d’une ´etape est d’ins´erer le i−`eme ´el´ement `a sa place parmi ceux qui pr´ec`edent. Il faut pour cela trouver o` u l’´el´ement doit ˆetre ins´er´e en le comparant aux autres, puis d´ecaler les ´el´ements afin de pouvoir effectuer l’insertion. En pratique, ces deux actions sont fr´equemment effectu´ees en une passe, qui consiste a` faire remonter l’´el´ement au fur et a` mesure jusqu’`a rencontrer un ´el´ement plus petit. Exercice 6: Tri fusion ´ Ecrire une fonction qui fait le tri d’un tableau donn´e T , pass´e en argument , selon l’ordre croissant en utilisant le tri fusion qui repose sur le principe suivant: L’algorithme est naturellement d´ecrit r´ecursivement. Deux points de vue sont possibles. Voici le premier, particuli`erement efficace pour trier les listes : 1. On trie les ´el´ements deux a` deux, ce qui donne de petites listes tri´ees de 2 ´el´ements chacune 2. On fusionne ces listes deux `a deux, ce qui donne de nouvelles listes tri´ees et deux fois plus grandes 3. On r´eit`ere l’op´eration pr´ec´edente jusqu’`a obtenir une seule liste. Le second point de vue est tout aussi efficace pour le tri des tableaux, mais d´econseill´e pour les listes : 1. On coupe en deux parties `a peu pr`es ´egales les donn´ees a` trier 2. On trie les donn´ees de chaque partie (pour cela, on coupe chaque partie en deux et on trie chacune) 3. On fusionne les deux parties

al abdali Abdelhamid

120

EHTP


CLUB EHTPEC

7.2

Langage C

Solution des exercices

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

=include <stdio-h> =include <stdlib-h> void TriClassique;int t[]8int n7 { int i=08j=08temp; for;i=0;i<n;i++7 { for;j=1;j<n;j++7 { if;t[j]<t[j91]7 { temp=t[j91]; t[j91]=t[j]; t[j]=temp; } } } }

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

0include <stdio.h> 0include <stdlib.h> void triBulles9int t[]}int nf { int i}temp} trouve=0; while9trouve==0f { trouve=1; for9i=0;i<n-1;i++f { if9t[i]>t[i+1]f { temp=t[i]; t[i]=t[i+1]; t[i+1]=temp; trouve=0; } } } }

Solution 1:

al abdali Abdelhamid

121

EHTP


CLUB EHTPEC

Langage C

Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

0include <stdio.h> 0include <stdlib.h> void triBulles9int t[]}int nf { int i}temp} trouve=0; while9trouve==0f { trouve=1; for9i=0;i<n-1;i++f { if9t[i]>t[i+1]f { temp=t[i]; t[i]=t[i+1]; t[i+1]=temp; trouve=0; } } } }

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

;include <stdioph> ;include <stdlibph> Void Tri_selecion-int t[]}int n+ { int i}j}imin; for-i=0;i<n!1;i99+ { imin=i; for-j=i91;j<n;j99+ { if-t[j]<t[imin]+ { { imin=j; } } if-ij=imin+ temp=t[i]; { t[i]=t[imin]; t[imin]=temp; } } }

Solution 1:

al abdali Abdelhamid

122

EHTP


CLUB EHTPEC

Langage C

Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

ainclude <stdio}h> ainclude <stdlib}h> void triSelectionDecroifint t[]8int n= { int i8j8imax8temp; forfi=0;i<n;i++= { imax=i; forfj=i+1;j<n;j++= { ifft[j]>t[imax]= { imax=j; } } iffimaxj=i= { temp=t[i]; t[i]=t[imax]; t[imax]=t[i]; } } }

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

7include <stdio.h> 7include <stdlib.h> void tri_insertion8int t[]&int n9 { int i&j&x; for8i=1;i<=n}1;iww9 {x=t[i]; j=i; while8j>0 -- t[j}1]>x9 { t[j]=t[j}1]; j=j}1; } t[j]=x; } }

Solution 1:

al abdali Abdelhamid

123

EHTP


CLUB EHTPEC

Langage C

Code C q k j _ ! g 7 8 9 q' qq qk qj q_ q! qg q7 q8 q9 k' kq kk kj k_ k! kg k7 k8 k9 j' jq jk jj j_ j! jg j7 j8 j9 _' _q _k _j __ _! _g _7 _8 _9 !' !q !k !j !_ !! !g !7 !8 !9 g' gq gk gj g_

=include <stdioéh> =include <stdlibéh> void fusion9int tableau[]/int debq/int finq/int fink0 { int -tableq; int debk=finqzq; int comptq=debq; int comptk=debk; int i; tableq=9int-0malloc99finqrdebqzq0-sizeof9int00; }}on recopie les éléments du début du tableau for9i=debq;i<=finq;izz0 { tableq[irdebq]=tableau[i]; } for9i=debq;i<=fink;izz0 { if 9comptq==debk0 }}cpest que tous les éléments du premier tableau ont été utilisés { break; }}tous les éléments ont donc été classés } else if 9comptk==9finkzq00 }}cpest que tous les éléments du second tableau ont été utilisés { tableau[i]=tableq[comptqrdebq]; }}on ajoute les éléments restants du premier tableau comptqzz; } else if 9tableq[comptqrdebq]<tableau[comptk]0 { tableau[i]=tableq[comptqrdebq]; }}on ajoute un élément du premier tableau comptqzz; } else { tableau[i]=tableau[comptk]; }}on ajoute un élément du second tableau comptkzz; } } free9tableq0; } void tri_fusion_bis9int tableau[]/int deb/int fin0 { if 9deb;=fin0 { int milieu=9finzdeb0}k; tri_fusion_bis9tableau/deb/milieu0; tri_fusion_bis9tableau/milieuzq/fin0; fusion9tableau/deb/milieu/fin0; } } void tri_fusion9int tableau[]/int longueur0 { if 9longueur>'0 { tri_fusion_bis9tableau/'/longueurrq0; } }

al abdali Abdelhamid

124

EHTP


CLUB EHTPEC

Langage C

Les structures

8 8.1

´ Enonc´ e des exercices

Exercice 1: Les points dans le plan R2 peuvent ˆetre manipul´es en Langage C comme ´etant un seul objet en utilisant la notion des structures: typedef struct { float x; float y; }point;

´ Ecrire les fonctions suivantes : 1. Saisie d’un point 2. Affichage d’un point 3. Calcul de la distance entre deux points 4. Projection d’un point sur l’axe des abscisses ´ 5. Ecrire ensuite un programme principal qui demande la saisie de deux points, calcul la distance entre ces deux points et fait leurs projections et affiche les r´esultats. Exercice 2: Les polynˆomes de degr´e finie peuvent ˆetre manipul´es en Langage C comme ´etant un seul objet en utilisant la notion des structures. 1. Cr´eer une structure d´efinissant un polynˆome par ses coefficient et son degr´e. ´ 2. Ecrire une fonction qui : (a) fait la Saisie de deux polynˆomes. (b) affiche des polynˆomes saisie. (c) calcule la d´eriv´ee k−`eme d’un polynˆome pass´e en param`etre. Rappel: la d´eriv´ee k−`eme d’un polynˆome P (x) =

n X

ap xp = a0 + a1 x + a2 x2 + ... + an xn

p=0

est d´efinie par : [P (x)](k) =

n X

!(k) ap x p

p=0

al abdali Abdelhamid

125

= k!

n X

! ap Ckp xp−k

p=k

EHTP


CLUB EHTPEC

Langage C

´ 3. Ecrire ensuite un programme principal qui demande la saisie de deux polynˆomes, et affiches ces derniers. Exercice 3: Soit T un tableau contenant N nombre complexes (N ≤ 50) ´ 1. Ecrire une fonction qui remplit le tableau T par des nombre complexes. ´ 2. Ecrire une fonction qui affiche tous les nombre complexes du tableau T . ´ 3. Ecrire une fonction qui retourne la somme de tous les nombres complexes du tableau T . ´ 4. Ecrire une fonction qui retourne le produit de tous ´el´ements du dit tableau. ´ 5. Ecrire le programme principal qui pr´esente un menu pour l’utilisateur. Exercice 4: Soit T un tableau contenant N nombre rationnels appartenant `a l’ensemble Q (N ≤ 100) n o a Q= r= tel que (a, b) ∈ Z × Z∗ et a ∧ b = 1 b ´ Ecrire les fonctions qui : 1. Somme de deux rationnels. 2. Produit de deux rationnels. 3. Inverse d’un rationnel. 4. Quotient de deux rationnels . 5. Remplissage d’un tableaux des rationnels. ´ 6. Ecrire le programme principal qui fait l’appel a` tous les fonctions d´ecrites ci-dessus. 7. Application: calculer la valeur exacte des sommes suivantes : S1 =

45 X 1 k=1

k

S2 =

NB : Il faut ´ecrire le r´esultats final S =

45 X 1 k2 k=1

S3 =

45 X (−1)k k=1

k

a en simplifiant avec p =pgcd(a, b) b

Exemple On souhaite afficher les r´esultats comme suit : 2 5 23 + = 3 4 12

1+

1 1 49 + = 4 9 36

4 1 2 × = 3 2 3

2 −115 8 ÷ =− 7 20 161

Exercice 5: Soit le programme en langage C suivant : al abdali Abdelhamid

126

EHTP


CLUB EHTPEC

Langage C #include <stdio.h> #include <stdlib.h> typedef struct etudiant { char nom[10]; char sexe ; float Moy; }etd;

1. Soit la structure etd d´eclar´e ci-dessus , on d´esire traiter un tableau de type etd , de dimension N = 100 .Donner la fonction rempli tab qui remplit le tableau. 2. Donner la fonction afficher tab qui affiche le contenu du tableau. ´ 3. Ecrire une fonction Moy qui retourne la moyenne de tous les ´etudiants enregistr´e dans le tableau. ´ 4. Ecrire une fonction NBehtp qui retourne le nombre de filles qui ont une moyenne sup´erieur a` la moyenne de tous les ´etudiants. ´ 5. Ecrire le programme principal qui fait appel `a toutes les fonctions ci-dessus. Exercice 6: On d´esire stocker dans un tableau de dimension 155 cases, les pays reconnus par les nations unis. On suppose que chaque pays est identifi´e par les donn´ees suivantes: − Nom. − Capitale. − Nombre d’habitants. − Superficie. 1. D´eclarer en langage C la structure du pays et par la suite le tableau des pays. ´ 2. Ecrire une fonction qui effectue la saisie de toutes les donn´ees des pays dans un tableau. ´ 3. Ecrire une fonction qui affiche de tous les pays . ´ 4. Ecrire une fonction qui recherche si un pays existe dans le tableau ou non. ´ 5. Ecrire une fonction qui affiche tous les pays dont le nombre d’habitants est inf´erieur a` NB (une valeur donn´ee en param`etre de la fonction ) et dont la superficie est sup´erieur `a S (une valeur ´egalement donn´ee en param`etre de la fonction ). 6. Faire le programme principal qui appelle les fonctions ci-dessus en pr´esentant un choix a` l’utilisateur. al abdali Abdelhamid

127

EHTP


CLUB EHTPEC

Langage C

Exercice 7: ´ Ecrire une fonction permettant de retourner en mˆeme temps le min ,le max et la moyenne de N notes stock´es dans un tableau pass´e en argument de ladite fonction. Exercice 8: D´efinir une structure de donn´ees Heure permettant de repr´esenter une heure au format hh/mm/ss, puis ´ecrire les fonctions suivantes : 1. saisie d’un ´el´ement de type heure. 2. affichage d’un ´el´ement de type heure. 3. addition de deux ´el´ements de type Heure. 4. comparaison de deux ´el´ement de type heure. Exercice 9: On veut d´evelopper un agenda t´el´ephonique de 155 personnes,compos´e pour chaque enregistrement d’un pr´enom,nom et num´ero de t´el´ephone. 1. D´eclarer la structure de donn´es agenda. ´ 2. Ecrire une fonction qui permet de saisir N personnes dans l’agenda. ´ 3. Ecrire une fonction qui permet d’afficher toutes les personnes de l’agenda. ´ 4. Ecrire une fonction qui prend en argument un pr´enom et affiche tous les num´eros de t´el´ephone (et nom) correspondant a` ce pr´enom. ´ 5. Ecrire une fonction qui modifie le num´ero de t´el´ephone correspondant a` un pr´enom et un nom (unique) donn´e. 6. Faire le programme principal en proposant un menu.

al abdali Abdelhamid

128

EHTP


CLUB EHTPEC

8.2

Langage C

Solution des exercices

Solution 1: Code C A g = G Q q w + A& AA Ag A= AG AQ Aq Aw AA+ g& gA gg g= gG gQ gq gw gg+ =& =A =g == =G =Q =q =w ==+ G& GA Gg G= GG GQ Gq Gw G-

9include <stdio%h> 9include <stdlib%h> 9include 8math%h8 typedef struct { float x; float y; } point ; point Saisievvoid) { point P; printfv8donnez un point \n8); printfv8donnez x j 8);scanfv80f8\SP%x); printfv8donnez y j 8); scanfv80f8\SP%y); returnvP); } void Affichagevpoint P) { printfv8\n point= v0lG\ 0lG)\n8\ P%x\ P%y ); } float distancevpoint P\ point Q) { returnvsqrtvpowvP%x:Q%x\g)zpowvP%y:Q%y\g))); } point Projectionvpoint P) { P%y=&; returnvP); } int main v ) { point a\ b ; a = Saisiev); b = Saisiev); printfv8\ndistance entre\n8); Affichageva) ; printfv8\net\n8); Affichagevb) ; printfv8\nest egale a 0lG\n8\ distanceva\ b) ); printfv8\nProjection\n8); AffichagevProjectionva)); AffichagevProjectionvb)); return &; }

Solution 1:

al abdali Abdelhamid

129

EHTP


CLUB EHTPEC

Langage C

Code C S " z é % & j = + SP SS S" Sz Sé S% S& Sj S= S+ "P "S "" "z "é "% "& "j "= "+ zP zS z" zz zé z% z& zj z= z+ éP éS é" éz éé é%

;includekstdio)hQ ;includekstdlib)hQ ;includekconio)hQ ;define N SPP AAprogramme de sommation de deux polynomes int minivi:AAVariables globales typedef struct{int d: float coeff[SPP]: }tpolynome: void saisiedecoefs[tpolynome a]: void affichagedecoefs[tpolynome A]: int main[]{ AAsaisie des polynomes tpolynome PvS: puts[,entrez le degré du polynome premier P,]: scanf[,7d,v{P)d]: for[int j\P:jk\P)d:j}}]{ printf[,le coefficient d8ordre 7d est',vj]: scanf[,7f,v{P)coeff[j]]:} for[int k\P:kk\P)d:k}}] printf[,le coef 7d est 7)f\n,vkvP)coeff[k]]: system[,pause,]: } void saisiedecoefs[void]{ int j: puts[,entrez le degré du polynome premier,]: scanf[,7d,v{P)d]: for[j\P:jk\P)d:j}}]{ printf[,le coefficient d8ordre 7d est',vj]: scanf[,7f,v{P)coeff[j]]: return P: puts[,entrez le degré du deuxieme polynome Q,]: scanf[,7d,v{Q)d]: Q\saisiedecoefs[Q]: affichagedecoefs[Q]: system[,pause,]: return P:} } void affichagedecoefs[tpolynome A]{ for[int k\P:kk\A)d:k}}] {printf[,le coef 7d est 7)f\n,vkvA)coeff[k]]:} }

Solution 1:

al abdali Abdelhamid

130

EHTP


CLUB EHTPEC

Langage C

Code C 4 5 6 7 8 9 bh bb b* bb4 b5 b6 b7 b8 b9 *h *b ** **4 *5 *6 *7 *8 *9 -h -b -* --4 -5 -6 -7 -8 -9 4h 4b 4* 444 45 46 47 48 49 5h 5b 5* 554 55 56 57 58 59 6h 6b 6* 664 65

struct complexe { float reel; float imag; }; typedef struct complexe cmplx ; cmplx sommeb<cmplx T[]" int N+ { int i=h; cmplx s={h"h}; for<i=h;i<N;ivv+ { s\reelv= T[i]\reel; s\imagv=T[i]\imag; } return s; } void remplissage<cmplx T[]" int N+ {int i; for<i=h;i<N;ivv+ { printf<nentrer la partie relle de T[2d]=\nn"i+; scanf<n2fn"=T[i]\reel+ ; printf<nentrer la partie imaginaire de T[2d]=\nn"i+; scanf<n2fn"=T[i]\imag+ ; } } void afficher<cmplx T[]" int N+ {int i; for<i=h;i<N;ivv+ { printf<n T[2d]=2fv2fi\nn"i"T[i]\reel"T[i]\imag+; } } cmplx produit<cmplx a" cmplx b+ { cmplx p; p\reel=a\reel.b\reel%a\imag.b\imag; p\imag=a\reel.b\imagva\imag.b\reel; return p; } int main <+ { cmplx T[5h]; cmplx y={b"h} ; int N"i; printf<nentrer entrer la taille du tableau\nn+; scanf<n2dn"=N+; remplissage<T" N+; afficher<T" N+; printf<n\t2fvi2f \nn"produit<T[h]"T[b]+\reel"produit<T[h]"T[b]+\imag+; printf<n\t2fvi2f\nn"sommeb<T"N+\reel"sommeb<T"N+\imag+; for<i=h;i<N;ivv+ { y =produit<y"T[i]+; } printf<n\t2fvi2f\nn"y\reel"y\imag+; return h; }

al abdali Abdelhamid

131

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C 7 8 9 -] --g -k -/ -5 -6 -7 -8 -9 g] ggg gk g/ g5 g6 g7 g8 g9 k] kkg kk k/ k5 k6 k7 k8 k9 /] //g /k // /5 /6 /7 /8 /9 5] 55g 5k 5/ 55 56 57 58 59 6] 66g 6k 6/ 65 66 67 68 69 7] 77g 7k 7/ 75 76 77

struct rationel { int a; int b; }; typedef struct rationel rationel; rationel sommev rationel x %rationel y! { rationel z; z&a=vx&a!<vy&b!"vx&b!<vy&a!; z&b=vx&b!<vy&b!; return z; } rationel produitv rationel x %rationel y! { rationel z; z&a=vx&a!<vy&a!; z&b=vx&b!<vy&b!; return z; } rationel inversev rationel x ! { rationel z; ifvz&b5=]! {z&a=vx&b!; z&b=vx&a!; return z;} } rationel divisionv rationel x %rationel y! { rationel z; z=produitvx%inversevz!!; return z; } void remplirv rationel <t%int n! { int i; forvi=];i<n;i""! { printfv6entrer le numerateur puis le denominateur =d nombre \n6%i!; scanfv6=d=d6%*t[i]&a%*t[i]&b!; } } rationel productvrationel <t%int n! { int i; rationel z={]}; forvi=];i<n\-;i""! { z&a"=sommevt[i]%t[i"-]!&a; z&b"=sommevt[i]%t[i"-]!&b; } return z; } int mainv! { rationel x={]}%y%e%f%g%k%t[-]]]; int i%n; printfv6entrer le numerateur puis le denominateur prmier nombre\n6!; scanfv6=d=d6%*x&a%*x&b!; printfv6entrer le numerateur puis le denominateur deuxieme nombre\n6!; scanfv6=d=d6%*y&a%*y&b!; printfv6x==d[=d \n6%x&a%x&b!; k=sommevx%y!;

al abdali Abdelhamid

132

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C 5 6 7 8 9 .O .. .2 .3 .4 .5 .6 .7 .8 .9 2O 2. 22 23 24 25 26 27 28 29 3O 3. 32 33 34 35 36 37 38 39 4O 4. 42 43 44 45 46 47 48 49 5O 5. 52 53 54 55 56 57 58 59 6O 6. 62 63 64

typedef { int int int }struc;

struct mini; maxi ; moy;

int remplir_tableau+int t[]&int n" { int i&somme; for+i=O;i<n;i\\" { printf+,t[4d]=\t,&i"; scanf+,4d,&=t[i]"; somme\=t[i]; } sommeM=n; return somme; } float moy+int t[]&int n" { int i; float somme=O; for+i=O;i<n;i\\" { somme\=t[i]; } sommeM=n; return somme; } int min_t+int t[]&int n" { int i&imin=O; for+i=O;i<n;i\\" { if+t[i]<t[imin]" imin=i; } return imin; } int max_t+int t[]&int n" { int i&imax=O; for+i=O;i<n;i\\" { if+t[i]>t[imax]" imax=i; } return imax; } struc Min_Max_MOy+int t[]&int n" { struc s; s>maxi=max_t+int t[]&int n"; s>mini=min_t+int t[]&int n"; s>moy=moy_t+int t[]&int n"; return s; }

al abdali Abdelhamid

133

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C C 3 4 5 6 7 8 9 C, CC CC3 C4 C5 C6 C7 C8 C9 -, -C --3 -4 -5 -6 -7 -8 -9 3, 3C 333 34 35 36 37 38 39 4, 4C 443

0include <stdio%h> 0include <stdlib%h> 0include 9math%h9 typedef struct { int hh; int mm; int ss; } Heure; int HeureEnSecondes(Heure h) { return (h%hh*36,, + h%mm*6, + h%ss); } Heure SecondesEnHeure(int sec) { Heure h; h%hh = secA36,,; sec = secH36,,; h%mm = secA6,; sec = secH6,; h%ss = sec; return h; } Heure AddHeures(Heure hC= Heure h-) { Heure h3; return (SecondesEnHeure(HeureEnSecondes(hC)+HeureEnSecondes(h-))); } int Comparaison(Heure hC= Heure h-) { if(HeureEnSecondes(hC)<HeureEnSecondes(h-)) return /C; else{ if(HeureEnSecondes(hC)==HeureEnSecondes(h-)) return ,; else return C; } }

al abdali Abdelhamid

134

EHTP


CLUB EHTPEC : % N & w | q 8 9 :P :: :% :N :& :w :| :q :8 :9 %P %: %% %N %& %w %| %q %8 %9 NP N: N% NN N& Nw N| Nq N8 N9 &P &: &% &N && &w &| &q &8 &9 wP w: w% wN w& ww w| wq w8 w9 |P |: |% |N |& |w || |q |8 |9 qP q: q% qN

Langage C

9include <stdio"h> 9include <stdlib"h> 9include<string"h> 9include<conio"h> struct agenda { char prenom[%P]; char nom[%P]; char numero[:%]; }; typedef struct agenda agenda ; void intialiser(agenda a[]-int n, { int i; for(i=P;i<=n+:;i==, { printf(8entrer le prenom\n8,; gets(a[i]"prenom,; printf(8entrer le nom\n8,; gets(a[i]"nom,; printf(8entrer le nmero\n8,; gets(a[i]"numero,; printf(8\n8,; } } void afficher(agenda a[]-int n, { int i; for(i=P;i<=n+:;i==, { printf(8Prenom:ys \t Nom:ys \t Numero:ys \n8-a[i]"prenom-a[i]"nom-a[i]"numero,; } } void recherche(char pre[]-agenda a[]-int n, { int i; for(i=P;i<=n+:;i==, { if(strcmp(pre-a[i]"prenom,==P, { printf(8Prenom:ys \t Nom:ys \t Numero:ys \n8-a[i]"prenom-a[i]"nom-a[i]"numero,; } } } void modifier(agenda a[]-int n-agenda pers,; { int i; for(i=P;i<=n+:;i==, { if((strcmp(pers"prenom-a[i]"prenom,==P,ff(strcmp(pers"nom-a[i]"nom,==P,, {printf(8entrer le nmero\n8,; gets(a[i]"numero,; } } } int main(, { agenda t[:PP]; char pre[%P]; int n; do { printf(8entrer n\n8,; scanf(8yd8-fn,; }while(n<P || n>:PP,; intialiser(t-n,; afficher(t-n,; printf(8entrer le prenom que tu cherche \n8,; gets(pre,; recherche(pre-t-n,; return P; }

al abdali Abdelhamid

135

EHTP


CLUB EHTPEC

Langage C

Les chaˆınes de caract`eres

9 9.1

´ Enonc´ e des exercices

Exercice 1: Saisir un texte de taille d´efinie au pr´ealable, exemple: `me le vent,moissonne la tempe ˆte Qui se Ranger les caract`eres en m´emoire.Lire le contenu de la m´emoire et ´ecrire des fonctions, en langage C,qui: 1. Cherche le nombre des mots,d’espace et de caract`eres sp´eciaux. 2. Cr´ee un nouveau texte en inversant la casse(Passer de minuscule a` majuscule et viceversa).La fonction change case assurera cette tache en exploitant le fait que dans la table ASCII,les majuscules et les minuscules sont s´epar´es de 32 caract`eres. 3. Proposer un programme de test permettant de valider au choix les deux fonctions pr´ec´edemment propos´ees. Exercice 2: On appelle palindrome toute suite de caract`eres qui se lit de la mˆeme fa¸con dans les deux sens : et´ e − radar − ressasser − laval − engage le jeu qu je le gagne −... Exemple : ´ ´ Ecrire un petit programme d’essai;permettant de tester aux choix les diff´erentes fonctions. Proposer un traitement,diff´erenciant entre un mot et une phrase, qui a` travers des fonctions distincts : 1. Demande a` l’utilisateur de saisir une chaˆıne de caract`eres et elle l’affiche. 2. Si la chaˆıne pr´esente la structure d’une phrase,alors elle supprime tous ses espaces et tabulations. 3. Qui informe si la chaˆıne saisie constitue un palindrome ou pas. Le programme principal doit faciliter la coordination entre les pr´ec´edentes fonctions,ceci en permettant a` l’utilisateur de choisir entre la conservation de la chaˆıne de d´epart ou bien de la changer compl`etement.

al abdali Abdelhamid

136

EHTP


CLUB EHTPEC

9.2

Langage C

R´ecr´eation Code source palindrome char rahc [ ] = x\n/x , redivider [ ] = xAble was I ere I saw elbAx , f deliver,reviled = 1-1 , niam ; main D o {/f\} \f/ int tni = 0x0 , rahctup,putchar D o ,LACEDx0 = 0xDECAL, rof ; for D;Dinto Dtnio;o Dinto Dtnio = reviled ; deliver = redivider ; for DDintoDtnio--,--reviled;reviledf fdeliver;deliver--,--DintoDtnioo rof = Dinto -1- Dtnio ;reviled--;--deliver; Dtnio = Dinto - 0xDECAL - LACEDx0 rof ; for Dreviled--,Dinto--Dtnio;Dinto Dtnio;Dinto--Dtnio,--delivero rahctup = putchar Dreviledf fdelivero ; rahctup f putchar DDcharo f Drahcoo ;

Exemple d’un palindrome en Arabe

‫ﺑﻠﺢ ﺗﻌﻠﻖ ﲢﺖ ﻗﻠﻌﺔ ﺣﻠﺐ‬ 9.3

Solution des exercices

al abdali Abdelhamid

137

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

#include <stdio.h> #include <stdlib.h> #include <string.h>

/*EXERCICE 1*/ void remplissage(char *t) { printf("taper votre phrase \n"); gets(t); } void affichage(char *t) { printf("tu as tape :%s\n",t); } int recher(char *donnee,char x) { int i=0; for(i=0;i<=strlen(donnee);i++) { if(donnee[i]==x) return 1; } return -1; } void rechMotSpaceCrcSpe(char *t) { int i=0,mot=0,space=0,crcSp=0,logique=0; while(t[i]) { logique=0; while(t[i]!='\0' && ( (t[i]>='a'&& t[i]<='z') || (t[i]>='A'&& t[i]<='Z') || (t[i]>='0'&& t[i]<='9'))) { logique=1; i++; } if( logique==1) { mot++; } if(t[i]==' ' ) { space++; i++; } else { if(t[i]) { crcSp++; i++; } } } printf("le nombre mots est %d \n",mot); printf("le nombre d'espace est %d \n",space); printf("le nombre de caractere speciaux est %d \n",crcSp); }

void changeCase(char *t,char *copie) { /* LA FONCTION QUI CHANGE LE MINUSULE EN MAJUSCULE ET VICE VERSA ,MAIS CETTE FOIS LES RESULTATS SONT ENREGISTRES DANS UN AUTRE TABLEAU*/ int i=0;


76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152

for(i=0;i<=strlen(t);i++) { if (t[i]>='a'&& t[i]<='z') { copie[i]=t[i]-32; } else if (t[i]>='A'&& t[i]<='Z') { copie[i]=t[i]+32; } else { copie[i]=t[i]; } } } /*=========================================================================================*/ /*EXERCICE2*/

int motPhrase(char *t,char *donnee) { int i=0,logique=1; while(t[i] && logique==1) { if(recher(donnee,t[i])==-1) { logique=0; return 0; } i++; } return 1; } void suppSpcCrc(char *t,char *donnee) { int i=0,j=0; if(motPhrase(t,donnee)!=1) { for(i=0;i<=strlen(t);i++) { if(recher(donnee,t[i])==1) { t[j]=t[i]; j++; } } t[j]='\0' ; } } int test_palindrome(char *t) { int i=0,k,logique=1; k=strlen(t); while(i<k && logique==1) { if(t[i]!=t[k-1-i]) { logique=0; printf("%d \n",logique); return 0; } i++; } return 1; }

int main()


153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217

{

/*=====================================================================================*/ /*AFICHER LE CODE ASCI */ /*=====================================================================================*/ /* char a='A'; printf("%d\n",a); for(i=0;i<=100;i++) { printf("le caractere:%c son code ASCI est:%d\n",'A'+i,'A'+i); }*/

/*EXERCICE1=============================================*/ char t[100],copie[100]; remplissage(t); affichage(t); rechMotSpaceCrcSpe(t); changeCase(t,copie); printf("change Case:%s\n",copie); /*EXERCICE2===========================================*/ char donnee[100],t[100]; int choix; strcpy(donnee,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); printf("taper votre phrase \n"); gets(t); printf("tu as tape :%s \n",t); if(motPhrase(t,donnee)==1) printf(" mot \n"); else printf("phrase\n"); if(motPhrase(t,donnee)!=1) { printf("=========MENU================"); printf("1--------conserver la chaine de depart\n"); printf("2--------modifier la chaine de depart \n"); do {printf(" Quel est votre choix ?\n"); scanf("%d",&choix); }while(choix<1 || choix>2); switch(choix) {case 1: printf("hello\n"); break; case 2: suppSpcCrc(t,donnee); printf("la valeur retourne de test palindrem est;%d\n",test_palindrome(t)); if(test_palindrome(t)!=1) printf(" n'est pas un palindrome\n"); else printf(" palindrome\n"); break; 0} }

return 0; }


CLUB EHTPEC

Langage C

Pointeurs et allocation dynamique

10 10.1

´ Enonc´ e des exercices

Exercice 1: ´ Ecrire une fonction qui permet d’´echanger deux valeurs a et b. Exercice 2: ´ Ecrire un programme permettant d’inverser un tableau de type entier . Exercice 3: En utilisant la notion du pointeur, ´ecrire un programme qui fait la saisie et l’affichage d’un tableau unidimensionnel statique. Exercice 4: Reprendre le mˆeme exercice pr´ec´edent pour un tableau dynamique. Exercice 5: ´ Ecrire un programme permettant d’afficher une chaˆıne de caract`eres donn´ee, caract`ere par caract`ere . Exercice 6: ´ Ecrire un programme qui ´elimine tous les occurrences d’un caract`ere donn´e d’une chaˆıne de caract`eres donn´ee. Exercice 7: Quelles valeurs ou adresses fournissant les expressions ci-dessous: int l=1,m=4,n=10; int *p1,*p2; p1=&n; p2=&m; *p1=(*p2)++; p1=p2; p2=&l; *p1=-*p2; ++*p2; *p1*=*p2; l=+*p2**p1; p1=&n; *p2=*p1/=*p2; Exercice 8: ´ Ecrire un programme permettant la saisie et l’affichage d’une matrice donn´ee. Exercice 9: ´ Ecrire un programme qui transf`ere une matrice donn´ee de type n × m dans un tableau unidimensionnel de taille n × m.

al abdali Abdelhamid

141

EHTP


CLUB EHTPEC

Langage C

Exercice 10: Soit la chaˆıne de caract`eres suivante: ”L’erreur est humaine,mais pardonner est hors des capacit´es du syst`eme d’exploitation”. ´ Ecrire des fonctions2 qui aident `a : ℘ Informer sur la longueur du verbe du premier groupe. ℘ Copier la sous-chaˆıne commen¸cant par ”mais” dans une autre chaˆıne de caract`eres. ℘ Calculer la longueur du plus long mots de la phrase. Exercice 11: On souhaite manipuler les ´el´ements se trouvant sur les diagonale de la matrice Mat d’ordre ` cet effet, on ´ecrit les fonctions suivantes: m × n. A 1. Une fonction qui alloue dynamiquement l’espace `a la matrice Mat3 et la remplie par la suite. 2. Une fonction qui affiche les ´el´ements d’une diagonale de la matrice4 . 3. Une fonction qui regroupe les ´el´ements de la diagonale principale dans un vecteur nomm´e Vt DgPc. 4. Une fonction qui affiche les ´el´ements du vecteur ainsi construit. Pr´evoyez un menu qui permet de tester les diff´erentes fonctions. Exercice 12: On vise a` ordonner les mots composant une phrase dans l’ordre lexicographique.En premier, on saisit une phrase compos´ee de N mots.Ensuite on regroupe les N mots dans N chaˆınes de caract`eres distinctes et ensuite on les classes dans l’ordre croissant. Pour ce faire, ´ecrire les fonctions suivantes: 1. La fonction char *Saisie( ) qui permet la saisie de la phrase `a traiter. 2. La fonction int Repart(char **Vect Phras,char *Phras ) 2

Faites usage des fonctions de la biblioth`eque string.h A noter que les dimensions sont ` a pr´eciser par l’utilisateur 4 Les indices du premier ´el´ements de la diagonale `a afficher sont fournis par l’utilisateur 3`

al abdali Abdelhamid

142

EHTP


CLUB EHTPEC

Langage C

qui copie tous les mots de Phras dans la variable Vect Phras. 3. La fonction void Affich(char **Vect Phras,int Nbr Phras ) qui affiche tous les mots initialement regroup´es dans le vecteur Vect Phras. 4. La fonction char **Tri chain(char **Vect Phras,int Nbr Phras ) qui trie dans l’ordre croissant5 les ´el´ements du vecteur Vect Phras. Pr´evoyez un programme main qui orchestre toutes ces fonctions en affichant le r´esultat `a chaque op´eration r´ealis´ee.

5

Le tri se fait dans le sens lexicographique

al abdali Abdelhamid

143

EHTP


CLUB EHTPEC

Langage C

Solution des exercices

10.2

Solution 1: Code C 1 2 3 4 5 6 7 8 9 10 11

;include <stdio.h> ;include <stdlib.h>

void echanger}int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; }

Solution 1: Code C 9 0 } f " \ & % [ 9= 99 90 9} 9f 9" 9\ 9& 9% 9[ 0= 09 00 0} 0f 0" 0\ 0& 0% 0[

ainclude +stdioph> ainclude +stdlibph> int M-88VARIABLE GLOBALE88 void echanger,int 6a7int 6b) { int temptemp=6a6a=6b6b=temp} int main,) { int n7iprintf,ventre la taille du tableau\nv)int 6g=(nscanf,vrdv7g)int t[n]for,i==-i+=nm9-i{{) { printf,vt[rd]=\tv7i)scanf,vrdv7(t[i])} for,i==-i+,nm9)80-i{{) { echanger,(t[i]7(t[nm9mi])} for,i==-i+=nm9-i{{) { printf,vt[rd]=rd\nv7i7t[i])}

Solution 1:

al abdali Abdelhamid

144

EHTP


CLUB EHTPEC

Langage C

Code C w | = + 6 7 8 9 w} ww w| w= w+ ww6 w7 w8 w9 |} |w || |= |+ ||6 |7

*include <stdio%h> *include <stdlib%h> *include<string%h> int main9f { int T[w}}] z "pt; int izn; do { printf9,Entrez n \n , f; scanf9, ;d, z7nf; }while9n<} ||n>w}}f; pt=T; for9i=};i<n;iEEf { printf 9,Entrez T[;d] \n ,zi f; scanf9, ;d, z TEif; } for9i=};i<n;iEEf printf 9, ;d \t,z9TEiff; for9pt=T;pt<TEn;ptEEf { printf 9,Entrez T[;d] \n ,zpt\T f; scanf9, ;d, z ptf; } for9pt=T;pt<TEn;ptEEf {printf 9, ;d \t,z"ptf;} return }; }

Solution 1: Code C U I ' y : + ? } 9 UN UU UI U' Uy U: U+ U? U} U9 IN IU II I' Iy I: I+ I? I} I9 'N 'U

finclude <stdio&h> finclude <stdlib&h> finclude<string&h> int main,9 { z"====La Fonction malloc et la fonction free==="z int "p; int i0n; printf,Fentrer n\nF9; scanf,FpdF0;n9; p=,int "9malloc,n"sizeof,int99; if ,p==NULL9 printf,F Il n8y a pas assez de memoire\nF9; else { printf,F saisie des donnes :\nF9; for,i=N;i<n;i\\9 { printf,Fpd ?\nF0i9; scanf,FpdF0p\i9; } printf,Faffichage du tableau\nF9; for,i=N;i<n;i\\9 { printf,Fp'd F0",p\i99; } printf,F\nF9; } free,p9; getchar,9; return N; }

al abdali Abdelhamid

145

EHTP


CLUB EHTPEC

Langage C

Solution 1: Code C \ % & } w | + / 9 \z \\ \% \& \} \w \| \+ \/ \9 %z %\ %%

Rinclude <stdio9h> Rinclude <stdlib9h> Rinclude<string9h> int mainfT { char t[\zz]="Royaume du Maroc"; float T[\zz] p ,pt; int ipn; do {printff"Entrez n \n " T; scanff" Md" p;nT; }whilefn<z ||n>\zzT; pt=T; forfi=z;i<n;i**T { printf f"Entrez T[Md] \n "pi T; scanff" Mf" p pt*iT; } char ,p=t; forfi=z;,ft*iT;i**T {printf f"Mc"p,ft*iTT;} printff"\n"T;,E return z; }

Solution 1: Code C ; 9 0 [ ] , p = f ;: ;; ;9 ;0 ;[ ;] ;, ;p ;= ;f 9: 9; 99 90 9[ 9] 9,

Binclude vstdio8hw Binclude vstdlib8hw Binclude vstring8hw int mainCP { XOT}%LE}U }VEC POINTEUROX XOEXERCICE"etant donne unne chaine de caracter et un carcatre cz toutes les occurence de c seront elimine du tableau OX char t[;::]Ncz char Opz p\tz printfCAtapez votre phrase\nAPz getsCtPz printfCAentree le cactere a eliminer \nAPz c\getcharCPz whileCOpP { ifCOp\\cP strcpyCpNpI;Pz else pIIz } printfCA\n apres modification \n "EsANtPz return :z }

Solution 1:

al abdali Abdelhamid

146

EHTP


CLUB EHTPEC

Langage C

Code C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

8include <stdio}h> 8include <stdlib}h> int main\9 { int &p1-&p2; int l=1-m=4-n=10; printf\0l=fd m=fd p1="n; printf\0l=fd m=fd p2="m; printf\0l=fd m=fd &p1=\&p29++; printf\0l=fd m=fd p1=p2; printf\0l=fd m=fd p2="l; printf\0l=fd m=fd &p1/=&p2; printf\0l=fd m=fd ++&p2; printf\0l=fd m=fd &p1&=&p2; printf\0l=fd m=fd l=++&p2&&p1; printf\0l=fd m=fd p1="n; &p2=&p1/=&p2; printf\0l=fd m=fd return 0; }

n= fd\n\n0-l-m-n9; n= fd\n\n0-l-m-n9; n= fd\n\n0-l-m-n9; n= fd\n\n0-l-m-n9; n= fd\n\n0-l-m-n9; n= fd\n\n0-l-m-n9; n= fd\n\n0-l-m-n9; n= fd\n\n0-l-m-n9; n= fd\n\n0-l-m-n9; n= fd\n\n0-l-m-n9;

n= fd\n\n0-l-m-n9;

Solution 1:

al abdali Abdelhamid

147

EHTP


CLUB EHTPEC

Langage C

Code C | * = + / A 7 8 9 |w || |* |= |+ |/ |A |7 |8 |9 *w *| ** *= *+ */ *A *7 *8 *9 =w =| =*

0include <stdio&h> 0include <stdlib&h> 0include<string&h> int mainf" { int n\m\i\j; int t[|ww][|ww]; do { printff[tapez le nombre de lignes et le nombre de colonnes: \n["; scanff[8d8d[\9n\9m"; }whileffn<w || n>|ww"||fm<w || m>|ww""; int zp=t; forfi=w;i<n;i::" { forfj=w;j<m;j::" { printff[entrer t[8d][8d]=[\i\j"; scanff[8d[\fint z"t:izm:j"; } } }zAffichage de la matrice :z} forfi=w;i<n;i::" { forfj=w;j<m;j::" { printff[ 8+d [\zffint z"t:izm:j""; } printff[\n["; } return w; }

Solution 1:

al abdali Abdelhamid

148

EHTP


CLUB EHTPEC

Langage C

Code C v ; j " z \ % & } v, vv v; vj v" vz v\ v% v& v} ;, ;v ;; ;j ;" ;z ;\ ;% ;& ;} j, jv j; jj j" jz j\ j% j& j} ", "v

qinclude =stdio[h> qinclude =stdlib[h> qinclude =conio[h> int mainx: { ]8 Ecrire un programme qui transfère un tableau A à deux dimensions n et m xdimensions maximalesw v, lignes et v, colonnes: dans un tableau V à une dimension n8m[8] int A[v,][v,]Vv[v,,]| int iVjVnVm| do { printfxgtapez le nombre de lignes et le nombre de colonnesw \ng:| scanfxgèdèdgVAnVAm:| }whilexxn=, || n>v,,:||xm=, || m>v,,::| printfxgremplissage de la metrice\ng:| forxi+,|i=n|i00: { forxj+,|j=m|j00: { printfxgA[èd][èd]+\tgViVj:| scanfxgèdgVxint8:A0i8m0j:| } printfxg\ng:| } printfxgaffichage de la matrice\ng:| forxi+,|i=n|i00: { forxj+,|j=m|j00: { printfxgè"d gV8xxint8:A0i8m0j::| } printfxg\ng:| } forxi+,|i=n|i00: { forxj+,|j=m|j00: { v[i8m0j]+A[i][j]| } } printfxg la matrice comme vecteur \ng:| forxi+,|i=n8m|i00: printfxgèjdgVv[i]:| printfxg\ng:| return ,| }

Solution 1:

al abdali Abdelhamid

149

EHTP


CLUB EHTPEC & + " % } ! : k &w && &+ &&" &% &} &! &: &k +w +& ++ ++" +% +} +! +: +k -w -& -+ --" -% -} -! -: -k "w "& "+ """ "% "} "! ": "k %w %& %+ %%" %% %} %! %: %k }w }& }+ }}" }% }} }! }: }k

Langage C

*include Lstdio'h> *include Lstdlib'h> *includeLstring'h> *includeLctype'h> *define M :w int verb9char xphrasem { char xp[xpp| int maxDw| char res[+%]| res[w]D;\w;| ppDpDphrase| while9xpm{ for9pDpp|xp,,isalpha9xpm|p==m| if9x9p]&mDD;r; ,, x9p]+mDD;e; m{ maxDp]pp| strncpy9res[pp[maxm| res[max]D;\w;| printf9a\n{sa[resm| return max| } p==| ppDp|} return w| } void mais9char xphrase[char xresm{ char xp[xpp| int m| res[w]D;\w;| ppDpDphrase| while9xpm{ for9pDpp|xp,, xp(D; ;|p==m| mDp]pp| strncpy9res[pp[mm| res[m]D;\w;| if9strcmp9res[amaisamDDwm{ printf9a\n la sous chaine commancant par mais est _ {s\na[ppm| break|} p==| ppDp|} } void plus_long9char xphrase[char xresm { char xp[xpp| int maxDw| char res[+%]| res[w]D;\w;| ppDpDphrase| while9xpm{ for9pDpp|xp,,9isalnum9xpm||xpDD;\;;m|p==m| if9p]pp>maxm{ maxDp]pp| strncpy9res[pp[maxm| res[max]D;\w;|} p==| ppDp| } printf9a\n Le plus long mot est _ {s\na[resm| } int main9m { char phrase[:w][res[:w]| printf9a\n\tDonner une chaine de caracteres _\nam| gets9phrasem| printf9a{da[verbe9phrasemm| mais9phrase[resm| plus_long9phrase[resm| return w| }

al abdali Abdelhamid

150

EHTP


CLUB EHTPEC

Langage C

Solution 1: ] } v A ' : & w ]% ]] ]]} ]v ]A ]' ]: ]& ]w -% -] --} -v -A -' -: -& -w }% }] }}} }v }A }' }: }& }w v% v] vv} vv vA v' v: v& vw A% A] AA} Av AA A' A: A& Aw '%

;include kstdioMh> ;include kstdlibMh> ;includekstringMh> float ++lecturezint m\int n0 { float ++mat\++pI int jI mat=zfloat++0malloczm+sizeofzfloat+00I forzp=matIpkmat"mIp""0 p=calloczn+sizeofzfloat00I printfzp\n Donner la matrice \np0I forzp=matIpkmat"mIp""0 { forzj=%IjknIj""0 { printfzpDonner M[jd][jd]= \np\pDmat"]\j"]0I scanfzpjfp\+p"j0 } } return mat I } int mini zint a\ int b0 { ifzakb0 return aI else return bI } void Adzfloat++mat\int m \int n0 { float ++pI int i\jI do{ printfzpDonner les indices i\j de l=elemnt | p0 scanfzpjdjdp\9i\9j0I }whilezzik%0||zi>=m0||zjk%0||zi>=n00I printfzp\n \t Impression d=une diagonale \np0I forzp=mat"iIpkmat"m 99 j knIp""0 { printfzp\tAM-fp\+z+p"j00I j""I } } void Affiche zfloat ++mat \ int m \int n0{ float ++pI int jI printfzp\n \t Impression de la matrice \np0I forzp=matIpkmat"mIp""0{ forzj=%IjknIj""0 printfzp jAM-f p\+z+p"j00I printfzp\np0I } } float +diagzfloat ++mat\int m\int n\int d0{ int k=minizm\n0I int jI float +v\ +tp I float ++pI p=zfloat+0malloczk+sizeofzfloat00I =v

al abdali Abdelhamid

151

EHTP


CLUB EHTPEC

6& 6M 6N 6w 6b 66 67 68 69 7s 7& 7M 7N 7w 7b 76 77 78 79 8s 8& 8M 8N 8w 8b 86 87 88 89 9s 9& 9M 9N 9w 9b 96 97 98 99 &ss &s& &sM &sN &sw &sb &s6 &s7 &s8 &s9 &&s &&& &&M

Langage C

tp ; j=s; forAp=mat;p<mat:k;p::g{ \tp=\A\p:jg; j::; tp::; } \d=k; return v; } void afficheAfloat \v % int ng{ float \p; printfAiAffichage de la diagonale \nig: forAp=v;p<v:n;p::g{ printfAi lbxMf i%\pg; } } int menuAg { int choix; printfAi\n& Afficher la matrice \nig; printfAi\nM Afficher une diagonale \nig; printfAi\nN Afficher la digonale principale \nig; printfAi\nw fin \nig; printfAiEntrer votre choix ig; scanfAildi%,choixg; return choix ; } int mainAg { float \\Mat; float \v; int M%N%n%choix; printfAiEntrer la taille de la matrice \nig; scanfAildldi%,m%,ng; Mat=lectureAm%ng; switchAchoixg{ case & : AfficheAMat%M%Ng; break; case M : AdAMat%M%Ng; break; case N : v=diagAMat%M%N%,ng; break; case s : printfAi\n fin ig; break; default : printfAi\n erreur ig; break; } return s; }

Solution 1:

al abdali Abdelhamid

152

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include<string.h> #include<ctype.h> #define max 80 #define M 20 char *saisie() { char c,*text,*pc; text=(char*)malloc(80); pc=text; printf("\n Donner la phrase \n"); while(pc-text < max && ((c=getchar())!='\n') ) { *pc=c; pc++; } text[pc-text]='\0'; return text ; } int repart (char **Vect_Phras, char *phras) { char *p,*pp; int i=0; p=phras; while(*p&&(ispunct(*p))||(isspace(*p))) p++; pp=p; while(*p&&i<M) { while(*p&&!(ispunct(*p))||(isspace(*p))) p++; Vect_phras[i]=(char*)malloc(p-pp+1); if(!Vect_phras) { printf(" Memoire insufusante"); exit(0); } strncpy(Vect_phras[i],pp,p-pp); Vect_phras[i][p-pp]='\0'; i++; while(*p&&(ispunct(*p))||(isspace(*p))) p++; pp=p; } return i; } void Affiche(char **Vect_phras, int Nbr_phras) { **p; for(p=Vect_phras;p<Vect_phras+Nbr_phras;p++) { printf("\t mot %d : ",p-Vect_phras+1); puts(*p); } } void echange( char *a, char *b) { char t[max]; strcpy(t,a); strcpy(a,b); strcpy(b,t); } char **tri_chain(char **Vect_phras, int Nbr_phras) { char **p,**D,**pc=Vect_phras; D=(char**)malloc(Nbr_phras*sizeof(char *)); for(p=D;p<D+Nbr_phras;p++) { *p=(char*)malloc(strlen(*pc)+1); strcpy(*p,*pc); pc++; } for(p=D;p<D+Nbr_phras-1;p++) {for(pc=D+Nbr_phras-1;pc>p;pc--)


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

if(strcmp(*pc,*(pc-1))<0) echange(*pc,*(pc-1)); } return D; } int main() { char *phrase;char *Vect_Phras[M];int N; char **D; phrase=saisie(); printf("\n\t Affichage de la phrase: \n"); puts(phrase); N=repart(Vect_Phras,phrase); printf("Affichage du tableau du mots\n"); Affiche(Vect_Phras,N); D=tri_chain(Vect_Phras,N); printf("Apres le tri\n"); Affiche(D,N); return 0; }


CLUB EHTPEC

11 11.1

Langage C

Les fichiers textes ´ Enonc´ e des exercices

Exercice 1: Cr´eer un fichier texte Info.txt qui regroupe un certains nombre d’informations sur tous les participants `a une formation.Ledit fichier doit repr´esenter ces informations comme montre la figure ci-dessous. Mohammed KARIM 34 ans M 56,Bd Quds,LISSASFA ,Casablanca,Maroc 06 52 72 48 16 | ´ Ecrire les fonctions suivantes: 1. Une fonction qui ouvre un fichier6 texte et le remplit par les informations sur tous les participants. 2. Une fonction qui affiche le contenu du fichier. 3. Une fonction qui extrait tous les num´eros de t´el´ephones et les met dans un fichier nomm´e Tel particip.txt Tester ces diff´erentes fonctions en proposant un menu principal. Exercice 2: On souhaite ´etablir, pour un entrepˆot, une application qui tient a` jour la liste de tous les produits dont la quantit´e stock´ee est inf´erieur `a 3 pi`eces.On dispose de deux fichiers textes, un contenant les noms de tous les produits vendus par le magasin et le deuxi`eme fichier comporte les stocks relatifs a` tous les produits dans le premier fichier. ´ Ecrire les fonctions suivantes afin de maintenir `a jour les quantit´es de la marchandise stock´ee dans l’entrepˆot: 1. Une fonction qui remplie deux fichiers distincts, un pour les noms des produits et l’autre pour sauvegarder les stocks leurs sont relatifs. 2. Une fonction qui affiche le contenu d’un fichier. 3. Une fonction qui ´etablit la liste des produits ainsi que leurs stocks et la sauvegarde dans un autre fichier dont le nom du fichier sera compos´e de la combinaison des 4 premiers caract`eres de chacun des deux fichiers de d´epart. 4. Une fonction Main( ) qui g`ere l’op´eration de mise `a jours. 6

Le nom du fichier est livr´e par l’utilisateur

al abdali Abdelhamid

155

EHTP


CLUB EHTPEC

11.2

Langage C

Solution des exercices

Solution 1: " w ! m \ x } + "0 "" "w "! "m "\ "x ""} "+ w0 w" ww w! wm w\ wx ww} w+ !0 !" !w !! !m !\ !x !!} !+ m0 m" mw m! mm m\ mx mm} m+

7include &stdio8h> 7include &stdlib8h> 7include&string8h> void saisie*char prod[]Uchar stok[]Uint nf { FILE=fp=NULL: FILE=fs=NULL: int iUstk: char aide[}"]: fp=fopen*prodU{w{f: if*6fpf { printf*{ouverture du fichier impossible\n{f: exit*;"f: } fs=fopen*stokU{w{f: if*6fsf { printf*{ouverture du fichier impossible\n{f: exit*;"f: } for*i=0:i&n:iNNf { printf*{ produit Id%\n{Uif: printf*{nom% {f: gets*aidef: fprintf*fpU{Is\n{Uaidef: printf*{le stoks%\n{f: scanf*{Id{ULstkf:getchar*f: fprintf*fsU{Id\n{Ustk f: } fclose*fpf: fclose*fsf: } void afficher*char filename[]f { char chaine[}"]: FILE=fich=NULL: fich=fopen*filenameU{r{f: if*6fichf { printf*{ouverture du fichier impossible\n{f: exit*;"f: } while*fgets*chaineU}"Ufichff printf*{Is{Uchainef: }

al abdali Abdelhamid

156

EHTP


CLUB EHTPEC

}v }b }\ }}} }w }g }+ }% wu wv wb w\ ww} ww wg w+ w% gu gv gb g\ gg} gw gg g+ g% +u +v +b +\ ++} +w +g ++ +% %u %v %b %\ %%} %w %g %+ %% vuu vuv vub vu\ vuvu} vuw vug vu+ vu% vvu vvv vvb vv\ vvvv} vvw vvg

Langage C

char 9prodStokechar prod[]"char stok[]8 { FILE9fp=NULL: FILE9fs=NULL: FILE9fps=NULL: char 9nom=NULL: nom=echar98callocev\"sizeofechar88: char aide[+v]: char temp[+v]: strncatenom"prod"-8: nom[-]=u: strncatenom"stok"-8: nom[%]=u: strcatenom"nxtxtn8: fp=fopeneprod"nrn8: ife6fp8 { printfenouverture du fichier impossible\nn8: exite.v8: } fs=fopenestok"nrn8: ife6fs8 { printfenouverture du fichier impossible\nn8: exite.v8: } fps=fopenenom"nwn8: ife6fps8 { printfenouverture du fichier impossible\nn8: exite.v8: } whileefgetseaide"+v"fp88 { fgetsetemp"vu"fs8: 9eaide0estrleneaide8.v88=u: fprintfefps"nls ls\nn"aide"temp8: } fcloseefp8: fcloseefs8: fcloseefps8: return nom: }

int maine8 { int n: char prod[bu]" stok[bu]"nom[bu]: printfenentrer le nombre total des produits\nn8: scanfenldn"in8: getchare8: printfenentrer le nom fichiereproduit8& n8: getseprod8: printfenentrer le nom fichierestok8& n8: getsestok8: 9eprod0strleneprod88=u: 9estok0strlenestok88=u: strcateprod"nxtxtn8: strcatestok"nxtxtn8: saisieeprod"stok" n8: affichereprod8: afficherestok8: affichereprodStoke prod" stok88: return u: }

al abdali Abdelhamid

157

EHTP


CLUB EHTPEC

12 12.1

Langage C

Les fichiers binaires ´ Enonc´ e des exercices

Exercice 1: Soit un fichier binaire PFE.bin contenant une liste de sujets de projets de fin d’´etudes.Chaque projet est caract´eris´e par les informations suivantes:Code du projet,titre du projet et le domaine trait´e.Chaque professeur peut apporter des modifications aux informations de son projet; en donnant uniquement le le code attribu´e pr´ealablement audit projet. ´ Ecrire un programme qui : 1. Remplit le fichier par au moins 3 projets diff´erents. 2. Affiche le contenu du fichier. 3. Apporte des modifications aux informations sur un des projets. 4. Cr´ee autant de fichiers que de domaines trait´es par les projets de fin d’´etudes,en y copiant les codes et les titres respectifs. Exercice 2: On souhaite aider a` la bonne gestion d’une biblioth`eque.Pour cela , on d´efinit une structure Book: typedef struct Biblio { int ref; char titre[30]; char auteur[30]; int theme; }Book;

refermant quelques informations sur un livre, et on se propose de d´efinir des fonctions qui permettent de: 1. Stocker dans un fichier de la description de N livres. 2. Afficher toutes les informations de la totalit´e des livres de la biblioth`eque. 3. V´erifier l’existence d’un livre dans la biblioth`eque. 4. Rapporter dans un autre fichier texte, les titres des livres ´ecrit par un mˆeme auteur, le fichier doit porter le nom de l’auteur. 5. Enfin, ´ecrire un programme qui, au choix, permet a` l’utilisateur de tester la totalit´e de ces fonctions.

12.2

Solution des exercices

Solution 1: al abdali Abdelhamid

158

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include<string.h> #define nom "PFE.bin" typedef struct PFE { int code; char titre[25]; char domaine[25]; }projet; void arret() { printf("echec d'ouverture du fichier\n"); exit(-1); } void remplir() { FILE*fich=NULL; int n,i; projet pfe; fich=fopen(nom,"wb"); if(!fich) arret(); /*lecture sĂŠcurisĂŠ*/ do { printf("entrer le nombre total des projet: scanf("%d",&n);getchar(); }while(n<3); /*remplissage des donnes*/ for(i=0;i<n;i++) { printf("entrer le code: "); scanf("%d",&pfe.code);getchar(); printf("entrer le titre: "); gets(pfe.titre); printf("domaine du projet: "); gets(pfe.domaine); fwrite(&pfe,sizeof(projet),1,fich); } fclose(fich); } int afficher() { FILE*fich=NULL; int n=0; projet pfe; fich=fopen(nom,"rb"); if(!fich) arret(); /*lecture des donnes*/ fread(&pfe,sizeof(projet),1,fich); while(!feof(fich)) { n++; printf("Code: %d \n",pfe.code); printf("Titre: %s \n",pfe.titre); printf("Domaine: %s \n",pfe.domaine); fread(&pfe,sizeof(projet),1,fich); printf("\n"); } fclose(fich); return n; } void modifier(int n) { FILE*fich=NULL; int cod,i; projet pfe; projet pf[80]; fich=fopen(nom,"rb"); if(!fich) arret(); printf("entrer le code a chercher :\n");

");


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

scanf("%d",&cod); for(i=0;i<n;i++) { fread(&pfe,sizeof(projet),1,fich); if(pfe.code!=cod) pf[i]=pfe; else { printf("entrer le nouveau titre: gets(pfe.titre); printf("nouveau domaine du projet: gets(pfe.domaine); pf[i]=pfe; } } fclose(fich); fich=fopen(nom,"wb"); if(!fich) arret(); for(i=0;i<n;i++) fwrite(&pf[i],sizeof(projet),1,fich); fclose(fich);

"); ");

} void trier(projet pf[],int n) { projet temp; int j; int trouve=0; while(trouve==0) trouve=1; {for(j=0;j<n-1;j++) { if(strcmp(pf[j].domaine,pf[j+1].domaine)<0) {temp=pf[j]; pf[j]=pf[j+1]; pf[j+1]=temp; trouve=0; } } } } int cre_dom(int n) { FILE*fich=NULL; FILE*fich1=NULL; int i,nb=1; char aide[30]; projet pfe; projet pf[80]; fich=fopen(nom,"rb"); if(!fich) arret(); for(i=0;i<n;i++) { fread(&pfe,sizeof(projet),1,fich); pf[i]=pfe; } fclose(fich); trier(pf,n); aide[0]=0; strcat(aide,pf[0].domaine); *(aide+strlen(aide))=0; strcat(aide,".txt"); *(aide+strlen(aide))=0; fich1=fopen(aide,"w"); if(!fich1) arret(); for(i=1;i<n;i++) { if(strcmp(pf[i-1].domaine,pf[i].domaine)==0) { fprintf(fich1,"%d\t%s\n",pf[i].code,pf[i].titre); } else { nb++;


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178

fclose(fich1); aide[0]=0; strcat(aide,pf[i].domaine); *(aide+strlen(aide))=0; strcat(aide,".txt"); *(aide+strlen(aide))=0; fich1=fopen(aide,"w"); if(!fich1) arret(); fprintf(fich1,"%d\t%s\n",pf[i].code,pf[i].titre); } } fclose(fich1); return nb; } int main() { int n; remplir(); n=afficher(); printf("le nombre total des projet :%d\n",n); return 0; }


CLUB EHTPEC

13 13.1

Langage C

Les listes chaˆın´ees ´ Enonc´ e des exercices

Exercice 1: (Cr´eation d’une liste simplement chaˆın´ee) ´ Ecrire un programme compos´e de fonctions qui permettent de: 1. Cr´eer une liste simplement chaˆın´ee. 2. Lire un nombre `a la console et l’ajouter7 . 3. Compter le nombre d’´el´ements de la liste. 4. Afficher le contenu de la liste. 5. Supprimer8 un ´el´ement d’une liste simplement chaˆın´ee. Exercice 2: (Insertion dans une liste ordonn´ee) On d´esire mettre `a jour une liste de noms respectant l’ordre lexicographique.Pour cela, on consid`ere une liste chaˆın´ee repr´esent´ee par sa tˆete Lst Nom.Le programme doit, permettre d’ins´erer un nouveau nom Nom Ajou dans la liste a` la place dict´ee par l’ordre lexicographique. ` cette fin, il faut ´ecrire une fonction qui : A 1. Cr´ee une liste simplement chaˆın´ee et la remplit9 par L noms. 2. Acquit un nouveau nom,Nom Ajout, et l’ins`ere `a la place impos´ee par les donn´ees d´ej`a en m´emoire. 3. Afficher le contenu de la liste. 4. Extrait le bloque des noms commen¸cant par une lettre donn´ee, et le met `a la fin de la liste Lst Nom. Proposer un programme principal qui permettra une utilisation libre de toutes ces fonctions via un menu10 . Exercice 3: (Gestion de fichier par le biais de listes simplement chaˆın´ees ) Pour rendre l’acc`es difficile aux donn´ees d’un fichier binaire, on y enregistre successivement et en alternance les informations sur deux diff´erents types de donn´ees.Ainsi, le fichier renferme des informations mod´elis´ees par les deux structures suivantes: 7

Tester les trois mani`eres d’ins´erer un ´el´ement dans une liste: en tˆete, ailleurs et en queue Faire appel au trois m´ethodes de surpression d’une liste :en tˆete, ailleurs et en queue 9 L’insertion doit respecter l’ordre d´ej` a ´etablit dans la liste 10 Penser ` a initialiser l’´ecran apr`es chaque choix effectu´e par l’utilisateur 8

al abdali Abdelhamid

162

EHTP


CLUB EHTPEC

Langage C typedef struct Det_mod { char Nm_mod[30]; float Nt_P1; float Nt_P2; float Nt_TP; }Not_mod;

typedef struct Info_mod { char nom[30]; char prenom[30]; float note; }etudiant;

Pour g´erer ce fichier, un peu particulier, on passe par un certains nombre d’´etapes et qu’on r´esume sous forme de fonctions permettant : 1. Remplir un fichier par les informations sur N structures etudiant en alternance avec les informations sur N structures Nt mod. Remarque: La note du module est calcul´ee selon la formule suivante: Note = 0.4×Nt P1+0.4×Nt P2+0.2×Nt TP 2. Cr´eer une liste simplement chaˆın´ee pour y mettre les informations sur N ´etudiants. 3. Cr´eer une liste simplement chaˆın´ee pour y regrouper le d´etail sur N notes du module. 4. Modifier une des composantes de la note du module d’un ´etudiant. 5. Mettre a` jour le fichier. 6. Afficher le contenu de la premi`ere liste. 7. Extraire les ´etudiants qui ont valid´e le module dans une liste simplement chaˆın´ee et copie les noms et les pr´enoms de mani`ere ordonn´ee dans un fichier texte. Proposer un Menu permettant d’orchestrer toutes ces fonctions afin d’assurer cette op´eration de protection du fichier. Exercice 4: (Inversion d’une liste sans recopie ) ´ On consid`ere une liste, donn´ee par son pointeur de tˆete T1 .Ecrire les instructions qui inverse le sens de parcours de cette liste, sans cr´eation de maillon, et placent en T2 l’adresse de tˆete de la liste renvers´ee. Exercice 5: (Liste doublement chaˆın´ee ) ´ Ecrire un programme compos´e de fonctions qui permettent de : 1. Cr´eer une liste doublement chaˆın´ee d’entiers par une suite d’insertions en tˆete. 2. Cr´eer une liste doublement chaˆın´ee d’entiers par une suite d’insertions en queue. 3. Affiche le contenu d’une liste doublement chaˆın´ee. 4. Supprimer un nombre d’une liste doublement chaˆın´ee. 5. G´erer toutes les autres fonctions.

13.2

Solution des exercices

Solution 1: al abdali Abdelhamid

163

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include<string.h> //

Exercie 2

Liste chainée

struct maillon{ char Nom[15]; struct maillon *suivant; }; struct maillon *nouveau(){ struct maillon *nem; nem=(struct maillon*)malloc(sizeof(struct maillon)); if(!nem){ printf("Espace insufusant!\n"); exit(-1); } nem->suivant=NULL; return nem; } struct maillon *cree(char *nomfich) { struct maillon *liste=NULL,*queue=NULL, *nem; char nom[15]; FILE *f=fopen(nomfich,"r"); if(!f){ printf("Erreur d'ouverture!\n"); exit(-1); } fscanf(f,"%s",nom); if(!feof(f)){ liste=queue=nouveau(); strcpy(liste->Nom,nom); while(fscanf(f,"%s",nom)==1){ nem=nouveau(); strcpy(nem->Nom,nom); queue->suivant=nem; queue=queue->suivant; } } fclose(f); return liste } struct maillon *ins_ordre(struct maillon *liste,char *nom){ struct maillon *nem,*p,*ps; //hyp: liste triée par ordre croissant //Création d'un nouveau maillon nem=nouveau(); strcpy(nem->Nom,nom); /*Cas ou la liste est vide ou le nom à ajouter est < à tous tous les noms de la liste*/ if(liste==NULL || strcmp(nom,liste->Nom) <0){ nem->suivant=liste; liste=nem; } /* Cas ou la liste n'est pas vide et que le nom à ajouter est >= au premier nom de la liste*/ else{ p=liste; ps=p->suivant; while(ps &&strcmp( nom, ps->Nom) >=0){ p=ps; ps=ps->suivant; } ps->suivant=nem; nem->suivant=ps; } return liste; } void affiche( struct maillon *liste){ struct maillon *p; printf("Impression de la liste\n"); if(liste)


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

for(p=liste;p!=NULL;p=p->suivant) printf("%s\n",p->Nom); else printf("Liste vide \n"); } void copier(struct maillon *liste,char *nomfich) { struct maillon *p; FILE *f=fopen(nomfich,"w"); if(!f){ printf("Erreur d'ouverture!\n"); exit(-1); } for(p=liste;p!=NULL;p=p->suivant) fprintf(f,"%s\n",p->Nom); fclose(f); } struct maillon *vider(struct maillon *liste){ struct maillon *p; /*Mode de suppression en tete*/ while(liste){ p=liste; liste=liste->suivant; p->suivant=NULL; free(p); } return liste; } struct maillon *modifier(struct maillon *liste){ char c; struct maillon *p=liste,*pr=NULL,*q,*qr,*dernier; printf("Donner la lettre ") { c=(char)getchar(); }while(c=='\n'); /*Cas ou tous les mots de la liste débutent avec une lettre >c*/ if(liste==NULL || *(liste->Nom)> c) return liste; /*cas ou aucun mot ne débute avec la lettre c */ while(p&& *(liste->Nom)< c){ pr=p; p=p->suivant; } /*Cas ou le reste de la liste débute avec la lettre c*/ if(q==NULL) return liste; /*Cas général*/ dernier=q; while(dernier->suivant) dernier=dernier->suivant; if(p==liste) liste=q; else pr->suivant=q; dernier->suivant=p; qr->suivant=NULL; return liste; } void afficher(char *nomf) { FILE *fichier; char nom[15]; struct maillon *p; fichier=fopen(nomf,"r"); if(!fichier){ printf("Erreur d'ouverture!\n"); exit(-1); } printf("Impression du contenu du fichier fscanf(fichier,"%s\n",nom); while(!feof(fichier)){ printf("%s\n",nom);

\n");


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205

fscanf(fichier,"%s\n",nom); } fclose(fichier); } int menu () { int choix; system("cls"); printf("1 : Creer la liste\n "); printf("2 : Afficher la liste\n "); printf("3 : Ajouter un nouveau nom dans le fichier \n "); printf("4 : Affichier le fichier\n "); printf("5 : Modifier la liste\n "); printf("6 : Quitter\n "); printf("entrer un entier \n"); scanf("%d",&choix); return choix; } int main() { int choix; struct maillon *Lst_Nom=NULL; char Nom_Ajout[15]; do{ choix=menu(); switch(choix) { case 1 : Lst_Nom=cree("chai_Ordon.txt"); case 2 : affiche(Lst_Nom); break; case 3 : printf("donner la chaine Ă ajouter "); scanf("%s",Nom_Ajout); Lst_Nom=ins_ordre(Lst_Nom,Nom_Ajout); copier(Lst_Nom,"chai_Ordon.txt"); case 4 : afficher("chai_Ordon.txt"); break; case 5 : Lst_Nom=modifier(Lst_Nom); affiche(Lst_Nom); Lst_Nom=vider(Lst_Nom); break; case 6 : printf("fin de session\n"); break; default : printf("erreur de saisie\n"); break; } }while(choix!=6); return 0; }


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include<string.h> //Exercice 3 typedef struct Info_mod { char Nom[30]; char Prenom[30]; float Note; }etudiant; typedef struct Det_mod { char Nm_mod[30]; float Nt_P1; float Nt_P2; float Nt_TP; }Not_mod; typedef struct maillon { etudiant etd; struct maillon*suivant; }liste_et; typedef struct maillon2 { Not_mod mod; struct maillon2*suivant; }liste_mod; typedef struct tete { liste_et *tete1; liste_mod *tete2; }tete; void remplirFichier(char *nom) { FILE*fich=NULL; etudiant student; Not_mod module; int i,N;

fich=fopen(nom,"wb"); if(!fich) { printf("Echec d'ouverture du fichier %s\n",nom); exit(-1); }

/*Saisie du nobre d'enresistrement*/ do { printf("entrer le nombre total des etudiant: scanf("%d",&N); }while(N<1);getchar(); for(i=0;i<N;i++) { printf("etudiant numero %d \n ",i); printf("le nom: "); gets(student.Nom); printf("le prenom: "); gets(student.Prenom); do { printf("partiel 1: "); scanf("%f",&module.Nt_P1); }while(module.Nt_P1<0 || module.Nt_P1>20); do

");


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

{ printf("partiel 2: "); scanf("%f",&module.Nt_P2); }while(module.Nt_P2<0 || module.Nt_P2>20); do { printf("TP: "); scanf("%f",&module.Nt_TP); }while(module.Nt_TP<0 || module.Nt_TP>20);getchar(); student.Note=0.4*(module.Nt_P1+module.Nt_P2)+0.2*module.Nt_TP; fwrite(&student,sizeof(student),1,fich); fwrite(&module,sizeof(module),1,fich);

} fclose(fich); } liste_et*nouveau(etudiant t) { liste_et*p=NULL; p=(liste_et*)malloc(sizeof(liste_et)); if(!p) { printf("memoire insufusante\n"); exit(-1); } p->etd=t; p->suivant=NULL; return p; } liste_mod *nouveaut(Not_mod mod) { liste_mod *pt=NULL; pt=(liste_mod *)malloc(sizeof(liste_mod)); if(!pt) { printf("memoire insufusante\n"); exit(-1); } pt->mod=mod; pt->suivant=NULL; return pt; } /*1=============CREATION DES DEUX LISTES SIMULTANEMENT=================*/ tete creation(char * nom,liste_et *l,liste_mod *lt) { liste_et *p=NULL; liste_et *dernier=NULL; liste_mod *pt=NULL; liste_mod *derniert=NULL; etudiant s; Not_mod m; tete tliste; FILE*fich=NULL;

fich=fopen(nom,"rb"); if(!fich) { printf("echec d'ouverture du fichier %s\n",nom); exit(-1); } fread(&s,sizeof(s),1,fich); fread(&m,sizeof(m),1,fich); l=nouveau(s); lt=nouveaut(m); fread(&s,sizeof(s),1,fich); fread(&m,sizeof(m),1,fich); dernier=l; derniert=lt; while(!feof(fich)) { p=nouveau(s);


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231

dernier->suivant=p; dernier=p; pt=nouveaut(m); derniert->suivant=pt; derniert=pt; fread(&s,sizeof(s),1,fich); fread(&m,sizeof(m),1,fich); } fclose(fich); tliste.tete1=l; tliste.tete2=lt; return tliste; } /*2======CREE LA LISTE POUR LES MODULES=======================*/ liste_mod *creationMod(char * nom,liste_mod *lt) {

liste_mod *pt=NULL; liste_mod *derniert=NULL; etudiant s; Not_mod m; FILE*fich=NULL;

fich=fopen(nom,"rb"); if(!fich) { printf("echec d'ouverture du fichier %s\n",nom); exit(-1); } fread(&s,sizeof(s),1,fich); fread(&m,sizeof(m),1,fich); lt=nouveaut(m); derniert=lt; fread(&s,sizeof(s),1,fich); fread(&m,sizeof(m),1,fich);

while(!feof(fich)) { pt=nouveaut(m); derniert->suivant=pt; derniert=pt; fread(&s,sizeof(s),1,fich); fread(&m,sizeof(m),1,fich); } fclose(fich); return lt; } /*MODIFIER UNE DES COMPOSANTS*/ void modifier(liste_et *l,liste_mod *lt) { liste_et *p=NULL; liste_et *pp=NULL; liste_mod *pt=NULL; etudiant s; Not_mod m; int trouve=0; printf("Student's first name : "); gets(s.Prenom); printf("Student's name: "); gets(s.Nom); for(p=l,pt=lt;p&&(trouve==0);p=p->suivant,pt=pt->suivant) { pp=p->suivant; if((strcmp((pp->etd).Nom,s.Nom)==0)&&(strcmp((pp->etd).Prenom,s.Prenom)==0)) trouve=1;


232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308

} if(trouve==0) { do { printf("partiel 1: "); scanf("%f",&m.Nt_P1); }while(m.Nt_P1<0 || m.Nt_P1>20); do { printf("partiel 2: "); scanf("%f",&m.Nt_P2); }while(m.Nt_P2<0 || m.Nt_P2>20); do { printf("TP: "); scanf("%f",&m.Nt_TP); }while(m.Nt_TP<0 || m.Nt_TP>20);getchar(); s.Note=0.4*(m.Nt_P1+m.Nt_P2)+0.2*m.Nt_TP; pp->etd=s; pt=pt->suivant; pt->mod=m;

} } void mettreAjour(char * nom,liste_et *l,liste_mod *lt) { FILE*fich=NULL; liste_et*p=NULL; liste_mod*pt=NULL; etudiant s; Not_mod m;

/*ECRASEMENT DU CENTENU DU ANCIEN FICHIER*/ fich=fopen(nom,"wb"); if(!fich) { printf("echec d'ouverture du fichier \n"); exit(-1); } for(p=l,pt=lt;p;p=p->suivant,pt=pt->suivant) { s=p->etd; m=pt->mod; fwrite(&s,sizeof(s),1,fich); fwrite(&m,sizeof(m),1,fich); } fclose(fich); } /*AFFICHER LE CENTENU DE LA PREMIER LISTE */ void afficher(liste_et *l) { liste_et*p=NULL; int i=1; for(p=l;p;p=p->suivant,i++) { printf("Etudiant numero %d \n",i); printf(" Nom: %s \n",(p->etd).Nom); printf(" Prenom: %s \n",(p->etd).Prenom); printf(" Note: %2.2f \n",(p->etd).Note); } } /*UNE FONCTION QUI SUPPRIMME UN SEUL MAILLON DANS N'IMPORTE QUEL POSISTION(EN TETE ET EN QUEU)*/ liste_et*supprWherether(liste_et *l) { liste_et*p=NULL;


309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385

liste_et*pt=NULL; liste_et*temp=NULL; etudiant s; int trouve; if(l==NULL) { printf("le liste et vide \n"); } else { if((l->etd).Note<10) { temp=l; l=l->suivant; free(temp); } else { for(p=l;(p->suivant)&&(trouve==0);p=p->suivant) { pt=p; s=(p->suivant)->etd; if(s.Note<10) { trouve=1; } } if(trouve==1) { temp=pt->suivant; pt->suivant=(pt->suivant)->suivant; free(temp); }

} } return l; } /*UNE FONCTION QUI SUPPRIME TOUT LES ETUDIANT QUI ONT UNE NOTE INF STRICTEMENT A 10*/ liste_et*suppInfDix(liste_et*l) { liste_et*p=NULL; liste_et*pt=NULL; p=l; p=supprWherether(p); /*ON ARRETTE LA BOUCLE LORSQUE LA FONCTION SUPPRIMWHETHER RENVOI SUCCESSIVEMENT DEUX ADRESSES IDENTIQUE,CA VEUT CA N'EXSITE AUCUN ETUDIANT QUI A UNE NOTE INF A 10*/ while(pt-p) { pt=supprWherether(p); } return pt; } liste_et*trier(liste_et*l) { liste_et*p=NULL; liste_et*pt=NULL; int trouve=0; etudiant s; /*TRI A BULLES*/ while(trouve==0) { trouve=1; for(pt=l,p=l->suivant;p;pt=pt->suivant,p=p->suivant) {


386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433

if(strcmp((pt->etd).Nom,(p->etd).Nom)>0) { s=pt->etd; pt->etd=p->etd; p->etd=s; trouve=1; } } }

return l; }

int menu() { int choix; do { printf("1----modifier\n"); printf("2----mettre a jour\n"); printf("3----afficher \n"); printf("4----extraire les etudiant qui on t valide le module\n"); printf("quel est votre choix?\n"); scanf("%d",&choix);

}while(choix<1||choix >4); return choix; } int main() { liste_et*l=NULL; liste_mod*L=NULL; tete t; char nom[30]; strcpy(nom,"etd.bin"); remplirFichier(nom); t=creation(nom,l,L); l=t.tete1; L=t.tete2; afficher(l); return 0; }


CLUB EHTPEC

Langage C

Solution 1: Le principe d’inversion d’une liste doublement chaˆın´ee: Inversion d’une liste doublement chaˆın´ee :

A

B

C

D

E

E

A

B

C

D

E

D

A

B

C

E

D

C

A

B

E

D

C

B

A

al abdali Abdelhamid

173

EHTP


CLUB EHTPEC

14 14.1

Langage C

Probl`emes divers ´ Enonc´ e des probl`emes et solutions

` Probleme 1: Le syst`eme lmd est bas´e sur des cursus de formation appel´es fili`eres et est fond´e sur un enseignement modulaire.Chaque semestre comprend 4 modules et il est valid´e si la moyenne des notes obtenues dans les modules composant le semestre est au moins ´egale a` 10/20 et si aucune note de l’un de ces modules n’est inf´erieure `a 07/20. Le pr´esent travail consiste a` la gestion de toutes les informations sur l’´etudiant ainsi que les ` cette fin, on adopte une structure notes de tous les modules enseign´es dans ledit semestre.A renferment le nom et le pr´enom d’un ´etudiant ainsi que les notes de tous les modules: typedef struct semestre { char Nom_Pren[30]; float NotModul[4]; }etudiant;

Le travail demand´e consiste en l’´ecriture des fonctions qui: 1. Calcule la moyenne du semestre pour un ´etudiant donn´e. 2. D´ecide de la validit´e du semestre selon les crit`eres susmentionn´es. 3. Attribue la mention `a un ´etudiant en fonction de la moyenne obtenue dans le semestre. 4. Trie la liste des ´etudiants selon la moyenne du semestre. 5. Affiche les ´etudiants ayant une moyenne donn´ee. 6. Affiche toutes les informations sur chacun des ´etudiants. Proposer un menu qui facilite la gestion de cette op´eration.

al abdali Abdelhamid

174

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct semestre { char Nom_Pren[30]; float NotModul[4]; }etudiant; float moyenne(etudiant t[],int i) { int j; float moy=0; for(j=0;j<4;j++) {moy+=t[i].NotModul[j];} return moy/4; } void valider(etudiant t[],int i) { char v[30]; int j,logique=1; float y=moyenne(t,i); for(j=0;j<4;j++) { if(t[i].NotModul[j]<7) logique=0; } if(logique==0) { strcpy(v,"non valide"); printf("%s\n",v); } else if(y>=10) { strcpy(v,"valide"); printf("%s\n",v); } else { strcpy(v,"non valide"); printf("%s\n",v); } }

void mention(etudiant t[],int i) { char ment[20]; float y=moyenne(t,i); if(y>=16) { strcpy(ment,"tres bien"); printf("%s\n",ment); } if(y<16 && y>=14) { strcpy(ment," bien"); printf("%s\n",ment); } if(y<14 && y>=12) { strcpy(ment,"assez bien"); printf("%s\n",ment); } if(y<12 && y>=10) { strcpy(ment,"passable"); printf("%s\n",ment); } /*On n' attribue la mention que dans le cas ou le semestre est validĂŠ,autrement dit la note du semestre est sup a 10*/ /*if(y<10 && y>=8) { strcpy(ment,"mediocre"); printf("%s\n",ment);


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

} if(y<8 && y>=6) { strcpy(ment,"faible"); printf("%s\n",ment); } if(y<6 && y>=4) { strcpy(ment,"tres faible "); printf("%s\n",ment); }*/ } void remplir(etudiant t[],int n) { int i,j; for(i=0;i<n;i++) { printf("entrer le nom et le prenom de l'etudiant:\n"); getchar(); gets( t[i].Nom_Pren ); for(j=0;j<4;j++) {do { printf("entrer la note %d\n",j); scanf("%f",&t[i].NotModul[j]); }while(t[i].NotModul[j]<0 || t[i].NotModul[j]>20); } } } void afficher(etudiant t[],int n) { int i,j; for(i=0;i<n;i++) { printf(" nom prenom :%20s\n",t[i].Nom_Pren); for(j=0;j<4;j++) { printf("la note %.2d: %f\n",j,t[i].NotModul[j]);

} printf("moy:%f\n",moyenne(t,i)); valider(t,i); mention(t,i); } } void tri_selection(etudiant t[],int n) { int i,j,imax; etudiant temp; for(i=0;i<n;i++) { imax=i; for(j=i+1;j<n;j++) {

if(moyenne(t,j)> moyenne(t,imax)) { imax=j; }

} if(imax!=i) { temp=t[i]; t[i]=t[imax]; t[imax]=temp; } } /*il faut eviter d'appeler la fonction moyenne ici plusieur fois; ,la meilleure facon c'est d'enregistrer la moyenne de chaque etudiant dans un tableau appart;mais lors de l'affichage on affiche selon */

la moyenne


154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184

} void aff_moy(etudiant t[],int n,float moydonne) { int i; for(i=0;i<n;i++) { if(moyenne(t,i)==moydonne) printf(" nom prenom :%s\n",t[i].Nom_Pren); } } int main() { etudiant t[100]; int n; do { printf("entrer le nombre des etudiant\n"); scanf("%d",&n); }while(n<0 || n>100); remplir(t,n); printf("\n"); tri_selection(t,n); afficher(t,n); return 0; }


CLUB EHTPEC

Langage C

` Probleme 2: (Manipulation des pointeurs et conjugaison ) 1. Parcours de Tableaux: Afin de s’adapter avec la notation de dualit´e pointeurs/tableaux, on propose le travail suivant: D´eclarer un tableau statique de N entiers. Affecter aux cases impaires la valeur −1, et `a celles paires la valeur de leurs indices respectifs. V´erifier le contenu du tableau ainsi construit en l’affichant sur ´ecran. Le travail a` r´ealiser doit ˆetre faite de trois mani`eres diff´erentes.En principe, les trois alternatives sont exactement ´equivalentes, et doivent fournir le mˆeme r´esultat: Utiliser la notion faisons recours aux crochets afin d’assurer le parcours du tableau. Faites recours `a la notation pointeur, le pointeur doit rester fixe : il faut qu’il pointe toujours sur la premi`ere case du tableau. Faites usage de la notation pointeur en utilisant l’op´erateur d´ef´erencement (*) pour acc´eder aux diff´erentes cases du tableau.Dans ce cas, le pointeur devra se d´eplacer jusqu’`a la case `a traiter. 2. Chaˆınes de caract` eres et pointeurs: On souhaite ´ecrire un programme d’aide `a la conjugaison des verbes du premier groupe, ` cette fin , ´ecrire une fonction11 qui: pour les ´el`eves du ce2.a 1. Demande `a l’utilisateur de saisir un verbe du premier groupe. 2. V´erifie l’appartenance effective du verbe saisi audit groupe. 3. Conjugue le verbe, selon le choix de l’utilisateur, aux temps suivants: Pr´esent. Pass´e compos´e12 . et retourne le r´esultat sous forme d’une seule phrase. Exemple : programme programmes programme programmez programment

programmons

4. Teste la validit´e du r´esultat de l’op´eration conjugaison13 et l’affiche sous l’une des deux formes: 11

N’utiliser aucune fonction appartenant ` a la libraire string.h Demander ` a l’utilisateur de fournir auxiliaire ad´equat 13 En comptant le nombre de mots dans la phrase; qui doit ˆetre ´egale `a 6 mots 12

al abdali Abdelhamid

178

EHTP


CLUB EHTPEC

Langage C ´sent : Pre Je programme Tu programmes Il programme Nous programmons Vous programmez Ils programment

´ compose ´: Passe J’ai programm´e Tu as programm´e Il a programm´e Nous avons programm´e Vous avez programm´e Ils ont programm´e

Proposer un main() qui permet aux ´el`eves de manipuler `a l’aise cette application d’aide `a la conjugaison des verbes du premier groupe.

al abdali Abdelhamid

179

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> int longueur(char t[]) { char *p=t; for(p=t;*p;p++) ; return p-t; } int test(char t[]) { int l=longueur(t); if((t[l-2]=='e')&&(t[l-1]=='r')) return 1; else return 0; } void copie(char dest[],char source[] ) { char *p=source,*pp=dest; for(p=source,pp=dest;*p;p++,pp++) *pp=*p; *pp='\0'; } void ajouter(char dest[],char source[] ) { char *p=source,*pp=dest; int l=longueur(dest); for(p=dest+l,pp=source;*pp;p++,pp++) *p=*pp; *p='\0'; }

int main() { /*===============================================================*/ /*EXERCICE 1 TABLEAU*/ /*===============================================================*/ int t[50]; int i,n,*p; do { printf("entrer la talle du tableau\n"); scanf("%d",&n); }while(n<0 || n>50); for(i=0;i<n;i++) { if(i%2) t[i]=-1; else t[i]=i; } printf("Tableau avec les indices:\n"); for(i=0;i<n;i++) printf("%d \t ",t[i]); /*===============================================================================*/ p=t; for(i=0;i<n;i++) { if(i%2) *(p+i)=-1; else *(p+i)=i; } printf("\nTableau avec Un pointeur fixe:\n"); for(i=0;i<n;i++) printf("%d \t ",*(p+i));


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

/*============================================================================*/

for(p=t;p<t+n;p++) { if((p-t)%2) *p=-1; else *p=p-t; } printf("\nTableau avec Un pointeur qui se deplace:\n"); for(p=t;p<t+n;p++) printf("%d \t ",*p); /*====================================================================*/ /*EXERCICE 2

CONJUGAISON*/

/*====================================================================*/ /* Declarations*/ char verb[40],affi[400]; char term[6][6]={"e","es","e","ons","ez","ent"}; char prn[6][10]={"Je","Tu","Il","Nous","Vous","Ils"}; char etre[6][20]={"Je suis ","Tu es ","Il est ","Nous sommes ","Vous etes","Ils sont"}; char avoir [6][20]={"J'ai","Tu as ","Il a ","Nous avons ","Vous avez ","Ils ont"}; char a[2]; a[0]=(char)130; a[1]='\0'; int i,l,choix; /*Saisie des donnĂŠe*/ printf("entrer un verbe du premier groupe\n\n"); gets(verb); do {printf("-----Menu-----\n"); printf("1-----Etre\n"); printf("2-----Avoir\n"); printf("Quel est votre choix?\n"); scanf("%d",&choix); }while(choix<1 || choix >2); /*Traitement*/

if(test(verb)) printf(" Verbe du premier groupe \n"); else printf(" C'est pas un Verbe du premier groupe \n"); if(test(verb)) { l=longueur(verb); verb[l-2]='\0'; affi[0]='\0'; for(i=0;i<6;i++) { ajouter(affi,verb); ajouter(affi,term[i]); ajouter(affi," "); } printf("%s \n\n",affi); printf(" Pr%csent : switch(choix) { case 1: for(i=0;i<6;i++) { copie(affi,prn[i]);

Pass%c Compos%c:

\n\n",130,130,130);


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193

ajouter(affi," "); ajouter(affi,verb); ajouter(affi,term[i]); ajouter(affi," "); ajouter(affi,etre[i]); ajouter(affi," "); ajouter(affi,verb); ajouter(affi,a); printf("%s \n",affi); affi[0]='\0'; } break; case 2: for(i=0;i<6;i++) { copie(affi,prn[i]); ajouter(affi," "); ajouter(affi,verb); ajouter(affi,term[i]); ajouter(affi," "); ajouter(affi,avoir[i]); ajouter(affi," "); ajouter(affi,verb); ajouter(affi,a); printf("%s \n",affi); affi[0]='\0'; } break; } } return 0; }


CLUB EHTPEC

Langage C

` Probleme 3: Une usine de confection d´esire ouvrir un espace de vente sur son site.Pour une bonne gestion du stock allou´e a` cet espace, elle souhaite acqu´erir une application informatique. Ladite application doit : Saisir le nom du produit, sa cat´egorie et son stock. Attribuer un code, `a chaque produit, construit a` partir de la premi`ere moiti´e de son nom et de la deuxi`eme moiti´e de sa cat´egorie. Mettre `a jour le stock de chaque produit. Donner, `a la demande, l’´etat actuel de l’espace de vente. Pour assurer un bon pilotage de cette application, on propose de faire usage de la structure: typedef struct New { char N_Prod[20]; char N_Categ[20]; int stok; char Cod[20]; }Poin_Vent;

et d’´ecrire par la suite: Travail demand´ e: 1. Une fonction qui saisie N produits en demandant le nom du produit, sa cat´egorie, son stock et d´eduit son code comme indiqu´e au-dessus. void Collect(int N,Poin Vent *Produi) 2. Une fonction qui trie les produits selon leurs codes respectifs. 3. Une fonction qui met `a jour14 , suite `a la demande de l’utilisateur, le stock d’un produit selon son propre code.Il faut s’assurer au pr´ealable de l’existence du produit et que son stock n’a pas ´et´e r´eduit a` nul. void Misaj(int Qant,int N,char Cher cod[],Poin Vent *Produi) 4. Une fonction qui affiche l’information de la totalit´e des produits ayant un stock non nul. Pr´evoir un menu permettant d’orchestrer ces diff´erentes fonctions afin d’assurer un bon fonctionnement du nouveau espace de vente.

14

Ajouter un nouveau stock ` a celui d´ej` a existant, ou bien lui extraire une quantit´e bien d´efinie.

al abdali Abdelhamid

183

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include<string.h> typedef struct New { char N_Prod[20]; char N_categ[20]; int Stok; char Code[20];

}Poin_vent; void collect(Poin_vent *Produit ,int n) { Poin_vent *p; int k,l; char *pp,*pc; for(p=Produit;p<Produit+n;p++) { printf("produit numero %d\n",p-Produit); printf("entrer le nom du produit\n"); scanf("%s",p->N_Prod); printf("entrer la categorie du produit\n"); scanf("%s",p->N_categ); printf("entrer le stok du produit\n"); scanf("%d",&(p->Stok)); *(p->Code)='\0'; k=(int)strlen(p->N_Prod); pc=(p->N_Prod); strncat((p->Code),pc,k/2); printf("%s\n",p->Code); l=strlen(p->N_categ); for(pp=(p->N_categ);pp<(p->N_categ)+l/2;pp++); strcat(p->Code,pp); *((*p).Code+strlen((*p).Code))='\0'; printf("%s\n",p->Code); } } void tri_Code(Poin_vent *Produit ,int n) { int logique=0; Poin_vent *p,*fin ,aide; fin=Produit+n-1; while(!logique) { logique=1; for(p=Produit;p<fin;p++) { if(strcmp(p->Code,(p+1)->Code)>0) { /*strcpy(aide,p); strcpy(p,p+1); strcpy(p+1,aide);*/

aide=*p; *p=*(p+1); *(p+1)=aide; logique=0; } } fin--; } } void afficher(Poin_vent *Produit ,int n) {Poin_vent *p; for(p=Produit;p<Produit+n;p++) { printf("produit numero %d\n",p-Produit); printf("le nom :%s ",p->N_Prod); printf("la categorie :%s \n",p->N_categ);


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

printf("le stok :%d \n",p->Stok); printf("le Code :%s \n",p->Code); printf("\n\n"); } } void Misaj(int Qant,int n, char Cher_Cod[],Poin_vent *Produit) { int inf,sup,milieu,choix; inf=0; sup=n-1; while(inf<=sup) { milieu=(inf+sup)/2; if(strcmp(Cher_Cod,Produit[milieu].Code)<0) sup=milieu; else { if(strcmp(Cher_Cod,Produit[milieu].Code)>0) inf=milieu; else { do { printf("1 Ajouter\n"); printf("2 Soustraire"); scanf("%d",&choix); }while(choix<1||choix>2); switch(choix) { case 1: Produit[milieu].Stok+=Qant; break; case 2: if( Produit[milieu].Stok>Qant) Produit[milieu].Stok-=Qant; else printf("stock indisponible\n"); break; } break; } } }

}

int main() { Poin_vent *produit ; int n; do { printf("entrer le nombre de produit\n"); scanf("%d",&n); }while(n<=0); produit=(Poin_vent*)calloc(n,sizeof(Poin_vent));

collect(produit , n); tri_Code(produit , n); afficher(produit , n);

return 0; }


CLUB EHTPEC

Langage C

` Probleme 4: Soit une application qui permet de saisir simultan´ement toutes les informations sur chacun des employ´es d’une usine de textile.Ainsi, afin de chercher un employ´e selon son pr´enom, il faut extraire tous les pr´enoms dans un ensemble de chaˆınes de caract`eres.Ensuite on proc`ede a` la recherche du pr´enom d´esir´e.Pour mener a` bien cette tache, on propose de proc´eder comme suit : ´ 1. Ecrire une fonction qui permet de saisir s´epar´ement le nom, le pr´enom te la fonction d’un employ´e, et retourne une seule chaˆıne de caract`eres regroupant15 toutes les informations saisies auparavant 16 : void Info Regroup(char *Info Init,int Nb Emp ) ´ 2. Ecrire une fonction qui regroupe tous les pr´enoms dans un groupe de mots Grp Pren17 void Regroup Mo(char *Info Init,char *Grp Pren,int Nb Emp ) ´ 3. Ecrire une fonction qui permet de chercher un pr´enom dans la liste des pr´enoms nouvellement cr´e´ee Grp Pren et qui affiche toutes les informations le concernant. ´ Ecrire un programme principal qui g`ere les fonctions ´ecrites auparavant pour r´ealiser cette recherche.

15

Faites recours ` a la fonction strcat Exemple: Benyassine Ahmed Technicien 17 Utiliser la fonction strncpy 16

al abdali Abdelhamid

186

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include<string.h> void Info_Regroup(char *Info_Init[],int n) { char aide[50]; char **p; /* Info_Init=(char**)malloc(n*sizeof(char*));*/

for(p=Info_Init;p<Info_Init+n;p++) { *p=(char*)malloc(200*sizeof(char)); if(*p!=NULL) { printf("Employ%c n %d : ",138,p-Info_Init); printf("\ntapez le nom de l'emplye: "); scanf("%s",aide); strcpy(*p,aide); strcat(*p," "); printf("\ntapez le prenom de l'emplye: "); scanf("%s",aide); strcat(*p,aide); strcat(*p," "); printf("\ntapez la fonction de l'emplye: "); scanf("%s",aide); strcat(*p,aide); *(*p+strlen(*p))='\0'; *p=realloc(*p,(1+strlen(*p))*sizeof(char)); } else { printf("Memoire insufusante\n"); exit(-1); } } printf("Donne initiale\n"); for(p=Info_Init;p<Info_Init+n;p++) printf("\n%s\n",*p);

} void Regroup_Mot(char *Info_Init[],char *Grp_Pren[],int n) { char *p,*pp,**pc,**gr;

int i=0; for(pc=Info_Init,gr=Grp_Pren;pc<Info_Init+n;pc++,gr++) { pp=*pc; i=0; for(p=*pc;*p;p++) { pp=p; while((*p)&&((*p)!=' ')) p++; if((p-pp)&&((++i)==2)) { *gr=(char*)malloc((1+(p-pp))*sizeof(char)); if(*gr!=NULL) { strncpy(*gr,pp,p-pp); *(*gr+strlen(*gr))='\0'; break; } else


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139

{ printf("Memoire insufusante\n"); exit(-1); } } }

} printf("\nAffichage des donne\n"); for(gr=Grp_Pren;gr<Grp_Pren+n;gr++) { printf("\n%s\n",*gr); } } void Rech_Prenom(char *Info_Init[],char *Grp_Pren[],char prenom[],int n) { char **p,**gr; for(gr=Grp_Pren,p=Info_Init;gr<Grp_Pren+n;gr++,p++) { if(!strcmp(*gr,prenom)) { printf("Employe numero %d \n",gr-Grp_Pren); printf("%s\n",*p); } } }

int main() { char **employe=NULL,**grp_Pren=NULL; char prenom[50]; int m; do { printf("entre le nombre d'employe\n"); scanf("%d",&m); }while(m<0); employe=(char**)malloc(m*sizeof(char*)); grp_Pren=(char**)malloc(m*sizeof(char*)); if(employe&&grp_Pren) {Info_Regroup(employe,m); Regroup_Mot(employe,grp_Pren,m); printf("QUEL prenom vous recherchez?\n"); scanf("%s",prenom); Rech_Prenom( employe,grp_Pren,prenom,m); } else {printf("memoire insufusatne\n"); exit(-1); } return 0; }


CLUB EHTPEC

Langage C

` Probleme 5: (Manipulation des fichiers textes ) Soit un fichier texte, nomm´e CDTH` eque Info.txt,regroupant les informations sur les CD audio contenu dans une CDTH`eque.La figure ci-dessous donne un aper¸cu succinct sur ce contenu: Mod`ele du contenu : Artiste |

Album

Ann´ ee

Stock

On souhaite d´evelopper une petite application qui aide a` la modification des informations sur un album enregistr´e dans le fichier CDTH` eque Info.txt.La d´emarche a` suivre consiste `a: eque Info.txt en respectant le mod`ele donn´e sus1. Ajouter des albums au fichier CDTH` mentionn´e. 2. Afficher le contenu du fichier. 3. Modifier une information relative a` un album donn´e dans le fichier. 3. Supprimer du fichier un album avec toutes les informations li´ees. Penser a` un menu permettant de mener a` bien cette mise `a jour de notre fichier.ces diff´erentes fonctions. −−− −−− −−− −−−

al abdali Abdelhamid

189

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #define nom "CDTheque_Info.txt" #define nmax 91 #include<string.h>

void arret() { printf("echec d'ouverture du fichier\n"); exit(-1); }

void ajouter() { FILE*fich=NULL; char artist[30],album[30]; unsigned int anne,n,i; float stok; fich=fopen(nom,"a"); if(!fich) arret(); printf("entrer le nombre des album\n"); scanf("%d",&n);getchar(); for(i=0;i<n;i++) { printf("nom d'artiste: "); gets(artist); printf("nom d'album: "); gets(album); printf("L'annee: "); scanf("%d",&anne);getchar(); printf("le stok: "); scanf("%f",&stok);getchar(); fprintf(fich,"%s\t%s\t%d\t%6.2f\n",artist,album,anne,stok); } fclose(fich); } void afficher() { FILE*fich=NULL; char chaine[nmax]; char artist[30],album[30]; unsigned int anne; float stok; fich=fopen(nom,"r"); if(!fich) arret(); while(fgets(chaine,nmax-1,fich)) { if(sscanf(chaine,"%s%s%d%f",artist,album,&anne,&stok)==4) { printf("artist: %s\n album: %s\n anne: %d\n stok: %f\n",artist,album,anne,stok); printf("\n"); } } /*OU BIEN AUTRE MANIRE POUR LIRE LE FICHIER AVEC FSCANF*/ /*fscanf(fich,"%s%s%d%f",artist,album,&anne,&stok); while(!feof(fich)) { printf("artist: %s\n album: %s\n anne: %d\n stok: %f\n",artist,album,anne,stok); printf("\n"); fscanf(fich,"%s%s%d%f",artist,album,&anne,&stok); }*/

fclose(fich); }


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

void modifier() { FILE*fich=NULL; FILE*fich2=NULL; char chaine[nmax]; char artist[30],album[30]; unsigned int anne; float stok; char albm[30]; fich=fopen(nom,"r"); if(!fich) arret(); fich2=fopen("aide.txt","w"); if(!fich2) arret(); printf("entrer le nom d l'album a supprimer: gets(albm);

");

while(fgets(chaine,nmax-1,fich)) { if(sscanf(chaine,"%*s%s%*d%*f",album)==1) { if(strcmp(album,albm)!=0) fprintf(fich2,"%s\n",chaine); /*faire ici un choix*/ else { printf("nom d'artiste: "); gets(artist); printf("nom d'album: "); scanf("%d",&anne);getchar(); printf("le stok: "); scanf("%f",&stok);getchar(); fprintf(fich,"%s\t%s\t%d\t%6.2f\n",artist,album,anne,stok); } } } fclose(fich); fclose(fich); remove(nom); rename("aide.txt",nom);

} void supprimer() { FILE*fich=NULL; FILE*fich2=NULL; char chaine[nmax]; char album[30]; char search_albm[30]; fich=fopen(nom,"r"); if(!fich) arret(); fich2=fopen("aide.txt","w"); if(!fich2) arret(); printf("entrer le nom d l'album a supprimer: gets(search_albm);

");


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207

while(fgets(chaine,nmax-1,fich)) { if(sscanf(chaine,"%*s%s%*d%*f",album)==1) { if(strcmp(album,search_albm)!=0) fprintf(fich2,"%s\n",chaine); } } fclose(fich); fclose(fich); remove(nom); rename("aide.txt",nom);

} int {

menu() int choix; do{ printf(" menu \n"); printf("1 ajouter \n"); printf("2 afficher le fichier \n"); printf("3 modifier les information d'un album printf("4 supprimer un album \n"); printf(" quel est votre choix \n"); scanf("%d",&choix); }while(choix<1|| choix>4); return choix ;

} int main() { ajouter(); afficher();

return 0; }

\n");


CLUB EHTPEC

Langage C

` Probleme 6: Soit un fichier binaire regroupant les informations sur les nouveaux n´es d’un service p´ediatrique. Ces informations seront d´ecrites, selon leurs utilisation, par l’une des structures suivantes: typedef struct Nouveau { int moi; char Sex[10]; }New_Nat;

typedef struct maillon { int moi; char Sex[10]; struct maillon *suivant; }List_Ne;

´ 1. Ecrire une fonction qui permet de remplir un fichier binaire par tous les nouveaux n´es d’un service p´ediatrique. ´ 2. Ecrire une fonction qui copie le contenu du fichier binaire dans une liste simplement chaˆın´ee. ´ 3. Ecrire une fonction qui supprime, de la liste nouvellement cr´e´ee, tous les nouveaux n´es de sexe masculin.Ensuite reporte le contenu restant dans un autre fichier et ce par suppression en queue. ´ une fonction qui trie le contenu du fichier relatif au sexe f´eminin en utilisant une 4. Ecrire liste simplement chaˆın´ee. ´ 5. Ecrire une fonction qui ´elimine tous les nouveaux n´es avant un moi donn´e par l’utilisateur. ´ 6. Ecrire une fonction qui affiche le contenu d’une liste. ´ 7. Ecrire un programme principal qui permet de g´erer toutes ces fonctions. ∗−−−∗−−−∗−−−∗−−−∗

al abdali Abdelhamid

193

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include<string.h> #define nomdef "naissance.bin" #define nom1 "fichFem.bin"

typedef struct Nouveau { int moi; char sex[10]; }New_Nat; typedef struct maillon { int moi; char sex[10]; struct maillon *suivant; }List_Ne;

void arret() { printf("Echec d'ouverture du fichier\n"); exit(-1); } /*1/UNE FONCION QUI PERMET DE CREE UN FICHIER BINAIRE*/ void remplir(char *nom) { int i,n; New_Nat bebe; FILE*fich=NULL; fich=fopen(nom,"wb"); if(!fich) arret(); do { printf("entrer le nombre total des nouveaux nee: scanf("%d",&n);getchar(); }while(n<1); for(i=0;i<n;i++) { printf("bebe numero %d\n",i); do { printf("le bebe est nee a quel moi: scanf("%d",&bebe.moi);getchar(); }while((bebe.moi)<1||(bebe.moi)>12); printf("masculin ou feminin: "); gets(bebe.sex);

");

fwrite(&bebe,sizeof(New_Nat),1,fich); } fclose(fich); } /*Une fonction qui copie le contenu complet du fichier binaire dans une liste simplement chainĂŠ;*/

List_Ne*New(New_Nat baby) { List_Ne*p=NULL; p=(List_Ne*)malloc(sizeof(List_Ne)); if(!p) { printf("memoire insufusante\n"); exit(-1); } p->moi=baby.moi; strcpy(p->sex,baby.sex);

");


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

p->suivant=NULL; return p; } List_Ne *copieFichVerListe(char *nom,List_Ne *l) { List_Ne *p=NULL; List_Ne *dernier=NULL; FILE*fich=NULL; New_Nat bebe; fich=fopen(nom,"rb"); if(!fich) arret();

fread(&bebe,sizeof(bebe),1,fich); l=New(bebe); dernier=l; fread(&bebe,sizeof(bebe),1,fich); while(!feof(fich)) { p=New(bebe); dernier->suivant=p; dernier=p; fread(&bebe,sizeof(bebe),1,fich);

} fclose(fich);

return l; } /*Une fonction qui une liste simplement chaine dans une autre */ List_Ne*copieListeDanListe(List_Ne*L) { List_Ne*l=NULL; List_Ne *p,*pr; l=(List_Ne*)malloc(sizeof( List_Ne)); if(!l) { printf("memeoire insufusante\n"); exit(-1); } for(p=L,pr=l;p;p=p->suivant,pr=pr->suivant) { pr->moi=p->moi; strcpy(pr->sex,p->sex); p->suivant=(List_Ne*)malloc(sizeof( List_Ne)); if(p->suivant!=NULL) { printf("memeoire insufusante\n"); exit(-1); } } return l; }

/*Une fonction qui supprime tous les nouveu nee dans une qui sont sexe masculin */

List_Ne *eliminerMasulin(List_Ne*L) {


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231

FILE*fich=NULL; List_Ne*l=NULL; List_Ne *p,*pr,*temp; fich=fopen(nom1,"wb"); if(!fich) arret();

l=copieListeDanListe(L); /*supprumer tous les bebe masculin*/ if(strcmp(l->sex,"masculin")==0) { temp=l; l=l->suivant; free(temp) ; } else { for(pr=l,p=l->suivant;p->suivant;p=p->suivant,pr=p) { if(strcmp(p->sex,"masculin")==0) { pr->suivant=p->suivant; temp=p; free(temp); } } }

/*Sasie des donnee dans un autre fichier*/ for(p=l;p->suivant;p=p->suivant) { fwrite(&p,sizeof(p),1,fich); } fwrite(&p,sizeof(p),1,fich); fclose(fich); return l;

} /*Une fonction qui tri une liste simplement chaine*/ void tri_ListeSimplementChaine(List_Ne*l) { char aide[10]; int trouve=0; List_Ne *p,*pr; /*tri a bulle*/ while(trouve==0) { trouve=1; for(pr=l,p=l->suivant;p;p=p->suivant) { if(strcmp(pr->sex,p->sex)>0) { strcpy(aide,p->sex); strcpy( p->sex,pr->sex); strcpy( pr->sex,aide); trouve=0; }

} } } /*une fonction qui elimine tous bebes qui sont nee avant un moi donne par l'ultulisateur*/ List_Ne* RemoveBabyBeforeTIME(List_Ne*L) {


232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288

List_Ne *p,*pr,*temp; List_Ne*l=NULL; int mois; l=copieListeDanListe(L); do { printf("entrer le moi : scanf("%d",&mois); }while(mois<1||mois>12);

");

if((l->moi)<mois) { temp=l; l=l->suivant; free(temp) ; } else { for(pr=l,p=l->suivant;p->suivant;p=p->suivant,pr=p) { if((p->moi)<mois) { pr->suivant=p->suivant; temp=p; free(temp); } } } return l; } void afficherLaListe(List_Ne*L) { List_Ne *p; for(p=L;p;p=p->suivant) { printf("le bebe est ne en moi :%d\n",p->moi); printf("le bebe est %s \n",p->sex); } }

int main() { List_Ne*L=NULL; remplir(nomdef); L=copieFichVerListe(nomdef,L); afficherLaListe(L); printf("Hello world!\n"); return 0; }


CLUB EHTPEC

Langage C

` Probleme 7: Exercice 1 : (Analyse ) Un polynˆome est une expression form´ee d’une combinaison lin´eaire de produits de puissances enti`eres d’une variable not´ee x . Exemple: P (x) = 1 + 3x − x2 + 2x3 dans le but de mener une action d’aide a` la maˆıtrise des op´erations ´el´ementaires18 sur ces polynˆomes, proposer une application qui permet, `a travers des fonctions, de: 1. Saisir les coefficients d’un polynˆome. 2. Calculer le degr´e d’un polynˆome. 3. Calculer la somme de deux polynˆomes. 4. Calculer le produit de deux polynˆomes. 5. Multiplier un polynˆome par une constante λ. 6. Afficher un polynˆome sous le format: P (x) = 2 + 1.3x − 0.5x ∧ 2 + 0.75x ∧ 3. 7. Calculer la d´eriv´ee d’un polynˆome. 8. Calculer une primitive d’un polynˆome. 9. Calculer k`eme d´eriv´ee d’un polynˆome.O` u l’entier positif k est fourni par l’utilisateur. On se propose de repr´esenter les monˆomes19 par une liste simplement chaˆın´ee o` u l’´el´ement ´el´ementaire la composant `a la forme suivante: typedef struct elet { float coef; int puis; struct maillon *proch; }Monom;

Exercice 2 : Un museum d’histoire naturelle regroupe certaines informations sur son activit´e journali`ere dans un ensemble de fichiers de type binaire, comportant chacun des informations sur les visiteurs de chaque journ´ee, ainsi que d’une famille de fichiers textes renfermant chacun toutes les remarques relev´ees sur chacune des visites effectu´ees.Il est `a noter que les deux fichiers relatifs `a une journ´ee donn´ee, portent le mˆeme nom et ne diff`erent que par l’extension, .bin ou .txt. Les informations stock´ees dans les fichiers binaires ob´eissent a` la repr´esentation suivante: 18 19

Addition, soustraction, multiplication par une constante, d´erivation,... Un monˆ ome est de la forme an xn .

al abdali Abdelhamid

198

EHTP


CLUB EHTPEC

Langage C typedef struct info { char nom[20]; char pren[20]; int age; }visiteur;

alors que celles constituant les fichiers textes sont sous forme de lignes de texte. Le museum poss`ede un grand nombre de fichiers et d´esire acqu´erir une application lui permettant une bonne gestion de ces derniers.Pour cela, on d´efinit une liste simplement chaˆın´ee permettant de regrouper toutes les informations sur tous les fichiers par le biais de la structure ´el´ementaire suivante: typedef struct fich { char No_fich[20]; // No_fich désigne le nom du fichier. char typ; // typ décrit le type du fichier texte ou binaire. struct fich *vois; }Milaf;

L’application, par le bais de fonctions, doit permettre: 1. La cr´eation de M fichiers de type diff´erents et leur remplissage, moiti´e binaire et moiti´e texte. 2. Le remplissage d’une liste simplement chaˆın´ee par les m fichiers pris dans un ordre quelconque. 3. L’affichage du contenu d’un fichier par la donn´ee de son nom. 4. La cr´eation d’une nouvelle liste dont la premiere moiti´e est compos´ee des fichiers binaires et l’autre partie comporte des fichiers textes. 5. La suppression physique d’un fichier occupant une position posit dans la liste. ´ Ecrire une fonction main() regroupant toutes les fonctions pr´ec´edentes.

al abdali Abdelhamid

199

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include<string.h> typedef struct elet { float coef; int puiss; struct elet*proch; }Monom; /*UNE FONCTION QUI CREE UN SEUL MAILLON*/ Monom*nouveau(float coe,int pui) { Monom*p=NULL; p=(Monom*)malloc(sizeof(Monom)); if(!p) { printf("memoire insufusante\n"); exit(-1); } p->coef=coe; p->puiss=pui; p->proch=NULL; return p; } /*UNE FONCTION QUI CREE UNE LITSE SIMPLEMENT CHAINEE QUI REGROUPE TOUS MONOMES D'UN POLYNOME*/ Monom*insertQueu(Monom*l) { Monom*p=NULL; Monom*pt=NULL; float coe; int pui; printf("entrer le coeficient: "); scanf("%f",&coe); printf("entrer le degree correspondant: scanf("%d",&pui);

");

p=nouveau(coe,pui); if(l==NULL) { l=p; } else { for(pt=l;pt->proch;pt=pt->proch) ; pt->proch=p; } return l; } Monom*crePoly(Monom*l) {

int i,N; printf("entrer le nombre total des coefficient a lire\n"); scanf("%d",&N); for(i=0;i<N;i++) { l=insertQueu(l); } return l; } void afficher(Monom*l) { Monom*p=NULL;


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

for(p=l;p;p=p->proch) { printf("coeficient:%.3f\n",p->coef); printf("puissance: %d\n",p->puiss); printf("________________________\n"); } } void afficherNormal(Monom*l) { Monom*p=NULL; printf("\n_____________\n"); if(l) { printf("P(x)=%.3f",l->coef); for(p=l->proch;p;p=p->proch) { printf("+%.3fX^%d",p->coef,p->puiss); } printf("\n_____________\n"); } } /*UNE FONCTION QUI INSERE UN SEUL MAILLON DANS UNE POSITON BIEN DEFINI S'IL N'EXISTE PAS UN SIMILAIRE AJOUTEZ LES COEFICIENT DANS LE CAS CONTRIARE */

Monom*trier(Monom*l) { Monom*p=NULL; Monom*pt=NULL; int trouve=0; int a; float b; while(trouve==0) { trouve=1; for(pt=l,p=l->proch;p;pt=pt->proch,p=p->proch) { if((pt->puiss)>(p->puiss)) { a=pt->puiss; pt->puiss=p->puiss; p->puiss=a; b=pt->coef; pt->coef=p->coef; p->coef=b; trouve=0; } } } return l; }

Monom*somme(Monom*l,Monom*L) { Monom*p=NULL; Monom*dernier=NULL; Monom*temp=NULL;

for(p=l;p->proch;p=p->proch) ; /*Concatenation des deux listes*/ p->proch=L; l=trier(l); if((l->puiss)==((l->proch)->puiss))


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231

{ (l->proch)->coef+=l->coef; temp=l; l=l->proch; free(temp); dernier=l; }

for(p=l->proch;p;p=p->proch) { if((p->puiss)==((p->proch)->puiss)) { p->coef+=(p->proch)->coef; temp=p->proch; p->proch=(p->proch)->proch; free(temp); } } return dernier; }

int polyDegree(Monom*l) { Monom*p=NULL; for(p=l;p->proch;p=p->proch) ; return(p->puiss); } Monom*productByCons(Monom*l) { Monom*p=NULL; float c; printf("vous voulez multpliez le polynome par quelle constante\n"); scanf("%f",&c); for(p=l;p;p=p->proch) { p->coef=c*(p->coef); } return l; } Monom*derivePoly(Monom*l) { Monom*p=NULL; Monom*temp=NULL; if(l!=NULL) { if((l->puiss)==0) { temp=l; l=l->proch; free(temp); } else { (l->coef)=(l->coef)*(l->puiss); (l->puiss)--; } for(p=l->proch;p;p=p->proch) { (p->coef)=(p->coef)*(p->puiss); (p->puiss)--; } } return l; }


232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253

int main() { Monom*L=NULL; Monom*l=NULL; printf("le premier polynome\n"); L=crePoly(L); printf("entrer le deuxieme polynome\n"); l=crePoly(l); afficherNormal(L); afficherNormal(l); printf("le degree de ce polynome est:%d\n",polyDegree(L)); /*L=derivePoly(L); afficherNormal(L); printf("le degree de ce polynome est:%d\n",polyDegree(L)); */ l=somme(l,L); afficherNormal(l); printf("le degree de ce polynome est:%d\n",polyDegree(l)); return 0; }


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct info { char nom[20]; char pren[20]; int age; }visiteur; typedef struct fich { char No_Fich[50]; char typ[4]; struct fich*voisin; }Milaf; void arret() { printf("erreur\n"); exit(-1); } char** creationFichier(int M) { int i,j,N; FILE*fich=NULL; FILE*f=NULL; char **p; visiteur vis; char aide[50];

p=(char**)malloc(M*sizeof(char*)); if(!p) arret();

for(i=0;i<M/2;i++) { printf("JOUR numero: %d ",i); printf("le nom du fichier: "); gets(aide); p[i]=(char*)malloc((1+strlen(aide))*sizeof(char)); if(!p[i]) arret(); strcpy(p[i],aide); strcat(aide,".bin"); fich=fopen(aide,"wb"); if(!fich) arret(); *(aide+(strlen(aide)-4))=0; strcat(aide,".txt"); f=fopen(aide,"w"); if(!f) arret(); do { printf("entrer le nombre des visiteur de cette journee: scanf("%d",&N); }while(N<1); for(j=0;j<N;j++) { printf("visiteur numero:%d ",j); printf("le nom: "); gets(vis.nom); printf("le prenom: "); gets(vis.pren); printf("l'age: "); scanf("%d",&vis.age);getchar(); fwrite(&vis,sizeof(vis),1,fich);

");


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

printf("remarque: "); gets(aide); fprintf(f,"%s\n",aide); } fclose(fich); fclose(f); } return p; } Milaf*nouveau(char*nom,char *typ) { Milaf*p=NULL;

p=(Milaf*)malloc(sizeof(Milaf)); if(!p) arret(); strcpy(p->No_Fich,nom); strcpy(p->typ,typ); p->voisin=NULL; } Milaf*InsertEnQueu(Milaf*l,char*nom,char *typ) { Milaf*p=NULL; Milaf*pr=NULL;

p=nouveau(nom,typ); if(l==NULL) { l=p; } else { for(pr=l;pr->voisin;pr=pr->voisin) ; pr->voisin=p; } return l;

} /*Creation de la liste moitie fichier binaire et moitier fichier text*/ Milaf*creationListe(Milaf*l,char**nom,int M) { Milaf*p=NULL; char aide[50]; char help[50]; int i; p=l; for(i=0;i<M/2;i++) { strcpy(aide,nom[i]); strcpy(help,nom[i]); strcat(aide,".bin"); strcat(help,".txt"); p=InsertEnQueu(p,aide,".bin"); p=InsertEnQueu(p,help,".txt"); }

return p; } /*Afficher le contenu d'un fichier a l'aide de son nom*/ void afficher(char*filename) { FILE*fich=NULL; visiteur v;


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190

fich=fopen(filename,"rb"); if(!fich) arret(); while(fread(&v,sizeof(v),1,fich)) { printf("%s\t%s\t%d\n",v.nom,v.pren,v.age); } fclose(fich);

} /* 4/IL SUFFIT DE PRENDRE UNE COPIE DE LA LISTE PRECEDENTE, ET LA TRIER SELON LE TYPE ET DONC ON AURA MOITIE FICH BINAIRE ET MOITIE FICHIEZ TXT*/ /* 5/LA SUPPRESSION D'UN MAILON DE LA LISTE PUIS LA SUPPRESSION PHYSIQUE EN UTiLISANT LA FONCTION REMOVE APRES AVOIR RECUPERE LE NOM*/ int main() { int M; char **nom; do { printf("entrer le nombre de jour\n"); scanf("%d",&M); }while(M<1);getchar(); nom=creationFichier(M);

return 0; }


CLUB EHTPEC

Langage C

` Probleme 8: Exercice 1 : (Analyse ) Une pharmacie d´esire mettre en place un processus de gestion de ses m´edicaments p´erim´es. Chaque m´edicament est r´epertori´e selon son nom, sa date de mise sur le march´e ainsi que sa date d’expiration.Pour aider `a une meilleure conception de la solution: D´efinissez une structure de donn´ees repr´esentant les informations sur chaque m´edicament mis en vente dans cette pharmacie, et permettant de les stocker dans un fichier binaire. Proposer une repr´esentation de donn´es ad´equate20 , facilitant la gestion du fichier de stock. La solution a` proposer doit pr´evoir: 1. La possibilit´e d’ajout de nouveau(x) m´edicament(s) au fichier du stock. 2. La v´erification de la validit´e d’utilisation des m´edicaments actuellement en stock. 3. La suppression des m´edicaments jug´es n’ˆetre plus valables. Exercice 2 : L’admission aux ´etablissements `a acc`es limit´e, notamment les Facult´es des Sciences et Techniques, passe par un processus a` plusieurs ´etapes:Une pr´e-candidature,une s´election des candidats par ordre de m´erite puis une inscription, en fonction du nombre pr´evu, des candidats des listes d´efinitives. Afin de faciliter cette op´eration, un fichier, renfermant, toutes les informations regroup´ees dans la structure Fac, est livr´e par le minist`ere de tutelle `a ces ´etablissent: typedef struct Info { char nom_Prenom[30]; int CNE; float NotAcc; char Parcour[4]; }Fac;

typedef struct Info_candid { Fac candida struct Info_candid *voisin; }Etud_insc;

Ces informations sont tri´ees dans l’ordre de m´erite selon la note d’acc`es a` la Fac(NotAcc). Le traitement d´esir´e tache de construire deux listes principales, une pour le parcours MIP et l’autre pour le parcours BCG, ainsi que deux autres listes d’attentes.Les 4 listes ainsi construites sont de taille N chacune.Les listes d’attentes servent `a alimenter celles principales et ce apr`es chaque suppression d’un ´etudiant de l’une des deux listes principales. Un candidat fait partie de la liste principale si :    Parcour = MIP  Parcour = BCG et et Choix MIP = ou Choix BCG =   NotAcc ≥ 15 NotAcc ≥ 12 ´ Ecrire une fonction qui : 20

La mise en place d’une liste doublement chaˆın´ees facilitera ´enorm´ement cette mise `a jour.

al abdali Abdelhamid

207

EHTP


CLUB EHTPEC

Langage C

1. Remplit un fichier binaire par les informations sur au moins 4 × N candidats. 2. Trie le fichier ainsi remplit par ordre de m´erite. 3. Remplit, `a partir du fichier, deux listes simplement chaˆın´ees List MIP et List BCG chacune de taille N . 4. Constitue, `a partir du fichier, deux listes simplement chaˆın´ees List att MIP et List att BCG chacune de taille N ; qui vont servir comme listes d’attentes21 . 5. Permet de supprimer un candidat22 selon son CNE et son parcours, d’une des deux listes,List MIP et List BCG, et le remplacer par un autre candidat pris en tˆete de la liste d’attente correspondante. 6. Affiche le contenu d’une liste. Un programme principale doit assurer une bonne gestion de cette op´eration, tout en assurant la mise a` jour des deux listes d’attentes List att MIP et List att BCG.

21 22

Il faut les prendre parmi les candidats n’ayant pas fait partie des deux listes principales List MIP et List BCG Qui a souhait´e retirer son dossier.

al abdali Abdelhamid

208

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include <string.h> #define NOM "stok.bin"

typedef { int int int }date;

struct date jour; moi; anne;

typedef struct medicament { char nom[30]; date deb; date expri; }medicament; /*LISTES DOUBLEMENT CHAINE*/ typedef struct maillon { medicament med; struct maillon*suivant; struct maillon*precedent; }liste; /*le fichier est prealablemnt remplit ,mais ici on na pas de choix on va le remplir avec nos propres mains,nous ne sommes pas des pharmaciens,nous sommes justes des informaticiens*/ /*POUR AJOUTER UN SEUL ELEMENT AU FICHIER ,IL SUFFIT D'APPELEZ LA FONCTION CI-DESSOUS AVEC N=1 */ date saisieDate() { date d; do { printf(" le jour: "); scanf("%d",&d.jour); }while(d.jour<1||d.jour>7); do { printf("le moi: "); scanf("%d",&d.moi); }while(d.moi<1||d.moi>12); do { printf("l'anne: "); scanf("%d",&d.anne); }while(d.anne<2013||d.anne>2020); return d; } void ajouter() { FILE*fich=NULL; int i,N; medicament a; /*OUVERTURE DU FICHIER EN MODE AJOUT*/ fich=fopen(NOM,"ab"); if(!fich) { printf("echec d'ouverture du fichier\n"); exit(-1); } do { printf("entrer le nombre total des medicamne: scanf("%d",&N); }while(N<1);getchar(); for(i=0;i<N;i++)

");


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

{ printf("medicament's name: gets(a.nom); a.deb=saisieDate(); a.expri=saisieDate(); fwrite(&a,sizeof(a),1,fich);

");

} fclose(fich); } /*CREE UN SEUL MAILLON*/ liste*nouveau(medicament m) { liste*p=NULL; p=(liste*)malloc(sizeof(liste)); if(!p) { printf("memoire insufusante\n"); exit(-1); } p->med=m; p->suivant=NULL; p->precedent=NULL; return p; } /*INSERTION EN QUEU*/ liste*InsertEnQueu(liste*l,medicament m) { liste*p=NULL; liste*pr=NULL; p=nouveau(m); if(l==NULL) { l=p; } else { for(pr=l;pr->suivant;pr=pr->suivant) ; pr->precedent=p; p->suivant=pr; } return l; } /*COPIER LE CONTENU DU FICHIER DANS UNE LISTE DOUBLEMENT CHAINE*/ liste*creation(liste*l) { liste*p=NULL; FILE*fich=NULL; medicament m; p=l; fich=fopen(NOM,"rb"); if(!fich) { printf("echec d'ouverture du fichier\n"); exit(-1); } while(fread(&m,sizeof(m),1,fich)) { p=InsertEnQueu(p,m); } fclose(fich); return p; } int verificationDate(liste*l,date a) { liste*p=NULL; int c,k; date d; /*le test le plus économique et efficace*/ for(p=l;p;p=p->suivant) {


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231

d=(p->med).expri; c=d.jour+30*d.moi+365*d.anne; k=a.jour+30*a.moi+365*a.anne; if(c>=k) return -1; } return 1; } liste*suppr(liste*l,date a) { liste*p=NULL; liste*temp=NULL;

if(l!=NULL) { if(verificationDate(l,a)<0) { temp=l; p=l->suivant; if(p!=NULL) { p->precedent=NULL; } l=l->suivant; free(temp); } else { for(p=l->suivant;p;p->suivant) { if(verificationDate(p,a)<0) break; } if(p!=NULL) { if(p->suivant==NULL) { temp=p; (p->precedent)->suivant=NULL; free(temp); } else { temp=p; (p->precedent)->suivant=p->suivant; (p->suivant)->precedent=p->precedent; free(temp); } } } } return l; } liste*suppressionDesMedIndesirable(liste*l) { liste*p=NULL; p=l; date a; a=saisieDate(); while(verificationDate(p,a)<0) { p=suppr(p,a); } return p; } int main() { printf("Hello world!\n"); return 0; }


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include <string.h>

typedef struct Info { char Nom_Prenom[30]; int CNE; float NotAcc; char Parcour[4]; }Fac; typedef struct Info_candid { Fac candida; struct Info_candid*voisin; }liste; /*POUR RETOURNER LES 4 liste LISTE BCG ET MIP*/ typedef struct tete { liste*MipPrin; liste*MipAtte; liste*BcgPrin; liste*BcgAtte; }tete; void remplir(char*nom) { FILE*fich=NULL; int i,N; Fac cand; fich=fopen(nom,"wb"); if(!fich) { printf("echec d'ouverture du fichier\n"); exit(-1); } do { printf("entrer le nombre total des etudiant de chaque liste scanf("%d",&N); }while(N<1);getchar(); for(i=0;i<4*N;i++) { printf("candidat numero %d ",i); printf("le nom puis le prenom: "); gets(cand.Nom_Prenom); printf("le code national de l'etudiant: scanf("%d",&cand.CNE); printf("la note d'access: "); scanf("%f",&cand.NotAcc);getchar(); printf("MIP OU BCG: "); gets(cand.Parcour); fwrite(&cand,sizeof(cand),1,fich);

");

} fclose(fich); } liste*nouveau(Fac c) { liste*p=NULL; p=(liste*)malloc(sizeof(liste)); if(!p) { printf("memoire insufusante\n"); exit(-1); } p->candida=c; p->voisin=NULL; return p; } /*COPIE LE CENTENU DU FICHIER DANS UNE LISTE SIMPLEMET CHAINE*/ liste*InsertEnQueu(liste*l,Fac c)

");


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

{ liste*p=NULL; liste*pr=NULL; p=nouveau(c); if(l==NULL) { l=p; } else { for(pr=l;pr->voisin;pr=pr->voisin) ; pr->voisin=p; } return l; } liste*copierFichDansList(char *nom,liste*l) { FILE*fich=NULL; liste*p=NULL; Fac c; p=l; fich=fopen(nom,"rb"); if(!fich) { printf("echec d'ouverture du fichier\n"); exit(-1); } while(fread(&c,sizeof(c),1,fich)) { p=InsertEnQueu(p,c); } fclose(fich); return p; } /*TRI DE LA LISTE SIMPLEMENT CHAINE*/ /*ON PEUT AUSSI CONTRUIRE UNE SIMPLEMENT CHAINE AU DEPART*/ liste*trierDecroissant(liste*l) { liste*p=NULL; liste*pr=NULL; Fac temp; int trouve=0; while(trouve==0) { trouve=1; for(pr=l,p=l->voisin;p;pr=pr->voisin,p=p->voisin) { if((pr->candida).NotAcc<(p->candida).NotAcc) { temp=pr->candida; pr->candida=p->candida; p->candida=temp; trouve=0; } } } return l; } void remplirEncoreFich(liste*l,char*nom) { FILE*fich=NULL; liste*p=NULL;

fich=fopen(nom,"wb"); if(!fich) { printf("echec d'ouverture du fichier\n"); exit(-1); } for(p=l;p;p=p->voisin)


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231

{ fwrite(&(p->candida),sizeof(p->candida),1,fich); } fclose(fich); } /*MAINTENANT LA LISTE CONTIENNE TOUS LES CANDIDAT DE TOUS LES PARCOURS. IL NE RESTE QU'A CONsTRUIRE LES 4 LISTEs */

tete construireQuatreList(liste*l) { liste*p=NULL; tete t; Fac a; /*On separe tout D'abord les mip et les bcg*/ for(p=l;p;p=p->voisin) { a=p->candida; if(strcmp(a.Parcour,"mip")==0) { t.MipPrin=InsertEnQueu(t.MipPrin,a); } else { t.BcgPrin=InsertEnQueu(t.BcgPrin,a); } } /*Maintenant separer les deux liste principale et d'attente*/ for(p=t.MipPrin;p;p=p->voisin) { a=(p->voisin)->candida; if(a.NotAcc<15) break; } t.MipAtte=(p->voisin); p->voisin=NULL; for(p=t.BcgPrin;p;p=p->voisin) { a=(p->voisin)->candida; if(a.NotAcc<15) break; } t.BcgAtte=p->voisin; p->voisin=NULL; return t; } /*cette fonction permet de supprimer un etudiant ayant une code cne connu.il ne reste a completer le travail*/ liste*suppr(liste*l,int cne) { liste*p=NULL; liste*temp=NULL; Fac a; p=l; if(l!=NULL) { a=p->candida; if(a.CNE==cne) { temp=l; l=l->voisin; free(temp); } else { for(p=l;p;p=p->voisin) { a=(p->voisin)->candida; if(a.CNE==cne) { break; }


232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267

} if(p->voisin!=NULL) { temp=p->voisin; p->voisin=(p->voisin)->voisin; free(temp); } } } return l; } /*UNE FONCTION QUI AFFICHE LE CONTENU D'UNE LISTE SIMPLEMNT CHAINE*/ void afficher(liste*l) { liste*p=NULL; Fac a; for(p=l;p;p=p->voisin) { a=p->candida; printf("le nom:%s\n",a.Nom_Prenom); printf("le CNE %d\n",a.CNE); printf("la note d'acces: %f\n",a.NotAcc); printf("le parcour: %s\n",a.Parcour); printf("____________________________\n"); } }

int main() { printf("Hello world!\n"); return 0; }


CLUB EHTPEC

Langage C

` Probleme 9: Exercice 1 : Soit un fichier texte remplit par un ensemble de chaˆınes de caract`eres repr´esentant les titres de N livres.Le contenu du fichier est initialement tri´e et on souhaite inverser l’ordre de son contenu.A cet effet, on propose d’utiliser l’outil liste simplement chaˆın´ee. 1. D´ecrivez les ´etapes, dans l’ordre, permettent de r´ealiser cette op´eration. 2. Traduisez les ´etapes pr´ec´edentes en un code C. Exercice 2 : Une compagnie a´erienne, soucieuse de la sant´e de ses pilotes, organise chaque ann´ee une op´eration de mesure de la tension art´erielle.Le but ultime de l’op´eration ´etant de fournir la liste des pilotes connaissant des difficult´es de sant´e(c-`a-d) ayant une tension art´erielle comprise entre 13 et 17. Pour ce faire, on mesure le tension de tous les pilotes et on reporte les informations les concernant dans un premier fichier.Pour simplifier cette tache, utiliser la structure suivante: typedef struct Info { char Nom[20]; char Prenom[20]; float Tens_Art; }Pilot;

ensuite, on trie le contenu dudit fichier,selon l’ordre croissant des valeurs, fonction du champ Tens Art. Afin d’extraire la liste tri´ee des noms de ceux pr´esentant des difficult´es au niveau de leurs sant´es, on proc`ede en deux ´etapes: On extrait la liste des noms et pr´enoms de ceux qui pr´esentent des troubles de tension art´erielle dans un fichier. On les trie par ordre lexicographique et on les stocke a` nouveau dans le mˆeme fichier. Pour mener `a bien cette tache, ´ecrire des fonctions qui permettent de : 1. Remplir un fichier binaire par M employ´es23 . 2. Trier le contenu d’un fichier24 , dans l’ordre croissant, selon les valeurs des tensions art´erielles mesur´ees. 3. Extraire les pilotes ayant des tensions art´erielles comprises entre 13 et 17 dans une liste simplement chaˆın´ee. 4. En utilisant la fonction pr´ec´edente, reportez dans un nouveau fichier uniquement les noms et les pr´enoms de la liste qu’elle retourne. 23 24

Respecter la structure propos´ee. En utilisant une repr´esentation de donn´ee en m´emoire `a l’aide de tableau de structure.

al abdali Abdelhamid

216

EHTP


CLUB EHTPEC

Langage C

5. A l’aide d’une structure liste, triez le contenu du fichier selon l’ordre lexicographique. Proposer un menu qui permet, en combinant les fonctions pr´ec´edentes, de fournir les noms et les pr´enoms des employ´es connaissant des difficult´e de sant´e.

al abdali Abdelhamid

217

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include<string.h> typedef struct livre { char titre[30]; char auteur[30]; }book; typedef struct ouvrage { book liv; struct ouvrage*suivant; }liste; /*UNE FONCTION QUI PERMET DE CREE UN SEUL MAILLON ELLE EST PLUS GENERALE ,ELLE EST INDEPENTENTE DE L'INSERTION*/ liste*nouveau(book b) { liste*p=NULL; p=(liste*)malloc(sizeof(liste)); if(!p) { printf("memoire insufusante\n"); exit(-1); } p->liv=b; p->suivant=NULL; return p; } /*INSERTION EN QUEU*/ liste*creation(liste*l) { liste*p=NULL; liste*dernier=NULL; book b; int i,N; do { printf("entrer le nombre scanf("%d",&N); }while(N<1);getchar();

total des livres:

");

printf(" le titre: "); gets(b.titre); printf("l'auteur: "); gets(b.auteur); l=nouveau(b); dernier =l; for(i=1;i<N;i++) { printf(" le titre: "); gets(b.titre); printf("l'auteur: "); gets(b.auteur); p=nouveau(b); dernier->suivant=p; dernier=p; } return l; } /*INSERTION EN TETE*/ liste *creationEnTete(liste*l) { liste*p=NULL; liste*dernier=NULL; int i,N; book b; do { printf("entrer le nombre total des livre: scanf("%d",&N); }while(N<1);getchar();

");


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

printf("entrer le titre : "); gets(b.titre); printf("entrer l'auteur: "); gets(b.auteur); l=nouveau(b); dernier=l; for(i=1;i<N;i++) { printf(" le titre: "); gets(b.titre); printf("l'auteur: "); gets(b.auteur);

p=nouveau(b); p->suivant=dernier; dernier=p; } return dernier; }

void afficher(liste*l) { liste*p=NULL; book b; int i=0; for(p=l;p;p=p->suivant,i++) { b=p->liv; printf("%d\nle titre: %s\n l'auteur:

%s \n",i,b.titre,b.auteur);

} } /*UNE FONCTION QUI COPIE UNE LISTE DANS UNE AUTRE*/ liste*copieListe(liste*l) { liste*p=NULL; liste*dernier=NULL; liste*pt=NULL; liste*L=NULL; L=nouveau(l->liv); dernier=L; for(p=l->suivant;p;p=p->suivant) { pt=nouveau(p->liv); dernier->suivant=pt; dernier=pt; } return L; } /*UNE FONCTION QUI CALCUL LA LOGUEUR D'UNE LISTE SIMPLEMENT CHAINE*/ int longueur(liste*l) { int i=0; liste*p=NULL; for(p=l;p;p=p->suivant,i++) ; return i; } /*UNE FOCTION QUI TRI UNE LISTE SIMPLEMENT CHAINE SELON LE TITRE*/ liste *triListe(liste *l) { liste*p=NULL; liste*pt=NULL; int trouve=0;


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231

book c; while(trouve==0) { trouve=1; for(pt=l,p=l->suivant;p;p=p->suivant,pt=pt->suivant) { if(strcmp((pt->liv).titre,(p->liv).titre)>0) { /*il faut echanger le centenu total de chaque maillon*/ c=(p->liv); (p->liv)=(pt->liv); (pt->liv)=c; trouve=0; } } } return l; } /*INSERER UN MAILLON A UNE POSITION QUELCONQUE LES DONNEES SONT TRIEE*/ liste *insertInPoswherether(liste *l) { liste*p=NULL; liste*dernier=NULL; liste*pt=NULL; book b; printf("entrer le nouvel element: \n "); printf("entrer le titre : "); gets(b.titre); printf("entrer l'auteur: "); gets(b.auteur); dernier=l; p=nouveau(b); if(strcmp((p->liv).titre,(l->liv).titre)<=0) { p->suivant=dernier; dernier=p; } else { for(pt=l;(pt->suivant)&&(strcmp((p->liv).titre,(pt->suivant)->liv.titre)>0);pt=pt->suivant) ; if(!(pt->suivant)) { pt->suivant=p; } else { p->suivant=pt->suivant; pt->suivant=p; } } return dernier; } /*UNE FONCTION QUI SUPPRIME UN ELEMENT DE LA LISTE SOIT EN TETE ,AILLEURS ,OU EN QUEU*/ liste*supprElmWherther(liste*l) { liste*p=NULL; liste*temp=NULL; liste*pt=NULL; int trouve=0; char aide[30]; printf("entrer le titre du livre a supprimer: gets(aide); if(strcmp((l->liv).titre,aide)==0) { temp=l;

");


232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286

l=l->suivant; free(temp); } else { for(p=l;(p->suivant)&&(trouve==0);p=p->suivant) { pt=p; if(strcmp(((p->suivant)->liv).titre,aide)==0) trouve=1; } if(trouve==0) { printf(" votre element n'exsiste pas dans la liste\n "); } else { temp=pt->suivant; pt->suivant=(pt->suivant)->suivant; free(temp); } } return l; }

int main() { liste*l=NULL; liste*L=NULL; l=creation(l); L=copieListe(l); printf("\n\n"); printf("affichage des donne \n"); afficher(l); printf("\n\n"); afficher(L); printf("\n\n"); printf("\nla longueur de la chaine l est :%d\n",longueur(l)); printf("\nla longueur de la chaine L est :%d\n",longueur(L)); /*L=triListe(L); L=insertInPoswherether(L);*/ L=supprElmWherther(L); afficher(L); printf("\nla longueur de la chaine return 0; }

L est :%d\n",longueur(L));


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include <string.h> #define filname "Pilot.bin" #define name "tension.bin" typedef struct Info { char Nom[20]; char Prenom[20]; float Tens_Art; }Pilot; typedef struct maillon { Pilot pil; struct maillon*suivant; }liste;

void remplir() { FILE*fich=NULL; int M,i; Pilot pil;

fich=fopen(filname,"wb"); if(!fich) { printf("memoire insufusante\n"); exit(-1); } do { printf("entrer le nombre total des pilot: scanf("%d",&M); }while(M<1);getchar(); for(i=0;i<M;i++) { printf("le nom du pilot: "); gets(pil.Nom); printf("le prenom du pilot: "); gets(pil.Prenom); printf("la tension du pilot: "); scanf("%f",&pil.Tens_Art);getchar(); fwrite(&pil,sizeof(pil),1,fich); } fclose(fich); } void trier(Pilot t[],int M) { Pilot temp; int trouve=0; int j; while(trouve==0) { trouve=1; for(j=0;j<M-1;j++) { if(t[j].Tens_Art>t[j+1].Tens_Art) { temp=t[j]; t[j]=t[j+1]; t[j+1]=temp; trouve=0; } } }

");


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

} void afficherTab(Pilot t[],int M) { int i; for(i=0;i<M;i++) { printf("%s\t%s\t%f\n",t[i].Nom,t[i].Prenom,t[i].Tens_Art); } } void trierFichier() { FILE*fich=NULL; Pilot t[50]; int i=0; int j=0; fich=fopen(filname,"rb"); if(!fich) { printf("memoire insufusante\n"); exit(-1); } while(fread(&t[i],sizeof(t[i]),1,fich)) { i++; } fclose(fich); afficherTab(t,i); trier(t,i); afficherTab(t,i); fich=fopen(filname,"wb"); if(!fich) { printf("memoire insufusante\n"); exit(-1); } for(j=0;j<i+1;j++) { fwrite(&t[j],sizeof(t[j]),1,fich); } fclose(fich); } liste*nouveau(Pilot aviator) { liste*p=NULL; p=(liste*)malloc(sizeof(liste)); if(!p) { printf("memoire insufusante\n"); exit(-1); } p->pil=aviator; p->suivant=NULL; return p; } liste*InsertEnQueu(liste*l,Pilot a) { liste*pr=NULL; liste*p=NULL;

p=nouveau(a); if(l==NULL) { l=p; } else { for(pr=l;pr->suivant;pr=pr->suivant) ;


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231

pr->suivant=p; } return l; } liste*Extraire(liste*l) { liste*p=NULL; Pilot pil; FILE*fich=NULL; fich=fopen(filname,"rb"); if(!fich) { printf("echec d'ouverture du fichier\n"); exit(-1); } /*LES DONNEES SONT DEJA TRIE SELON LA VALEUR DE LA TENSION DE CHAQUE PILOTE */ while(fread(&pil,sizeof(pil),1,fich)&&(pil.Tens_Art<13)) ; if(!feof(fich)) { /*SI LA FIN DU FICHIER N'EST PAS ATTEINTE*/ p=l; p=InsertEnQueu(p,pil); while(fread(&pil,sizeof(pil),1,fich)&&(pil.Tens_Art<=17)) p=InsertEnQueu(p,pil); } fclose(fich); return p; } void remplirFichTension(liste*l) { liste*p=NULL; FILE*fich=NULL; char nom[20]; char prenom[20]; fich=fopen(name,"wb"); if(!fich) { printf("echec d'ouverture du fichier\n"); exit(-1); } for(p=l;p;p=p->suivant) { strcpy(nom,(p->pil).Nom); strcpy(prenom,(p->pil).Prenom); fwrite(nom,sizeof(nom),20,fich); fwrite(prenom,sizeof(prenom),20,fich); } fclose(fich); }

liste*trierListe(liste*l) { liste*p=NULL; liste*pr=NULL; int trouve=0; Pilot temp; while(trouve==0) { trouve=1; for(pr=l,p=l->suivant;p;pr=pr->suivant,p=p->suivant) { if(strcmp((pr->pil).Nom,(p->pil).Nom)>0) { temp=pr->pil; pr->pil=p->pil; p->pil=temp; trouve=0;


232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247

} } } return l; }

int main() { remplir(); trierFichier(); return 0; }


CLUB EHTPEC

Langage C

` Probleme 10: But : La finalit´e du pr´esent sujet est `a caract`ere double.Primo, c’est mieux assimiler la notion de structure; sous leur forme habituelle autant que type personnalis´e aussi bien que leur superutilisation au niveau des structures de donn´ees au niveau de la d´efinition des listes simplement chaˆın´ees.Secondo, avoir la maˆıtrise du traitement des fichiers, autant que support de sauvegarde de donn´es, par le biais des nouvelles25 structures de donn´ees. Probl´ ematique Concevoir un programme d’aide `a la bonne gestion du personnel d’une entreprise.Pour cela , un fichier Info Personel.bin regroupe toutes les informations sur chacun des employ´es de cette entreprise.Chaque employ´e ´etant identifi´e par son nom, son pr´enom, son num´ero de CIN ainsi que le nombre d’ann´ees pass´es en service. Les informations collect´es, sut tout le personnel de l’entreprise, seront ainsi manipul´es par le biais de type personnalis´e Info pers, et pour une bonne gestion de toutes ces informations26 ,nous utilisons la liste chaˆın´ee Gest pers typedef struct Info_pers { char Nom[20]; char Prenom[20]; char CIN[10]; }Info_pers;

typedef struct Gest_pers { Info_pers employ; int nbr_ann; struct maillon *prochain; }un_fonct;

Travail ` a faire: Afin que l’utilisateur puisse tester toutes les fonctionnalit´es de la pr´esente application, un menu permettra d’effectuer des choix multiples parmi les propositions suivantes: 1. La saisie de toutes les informations concernant un employ´e et leur ajout a` la fin de la liste27 .La pr´esente fonction ne doit pas autoriser l’adjonction d’un ´el´ement d´ej`a existant dans le fichier. 2. La lecture des informations sauvegard´es sur le fichier Info Personel.bin et de les repr´esenter en m´emoire en adoptant le type Gest pers. 3. La recherche du dernier maillon dans la liste. 4. Informer sur le nombre d’ann´ee en service relatifs `a un employ´e de nom: nomr et de cin:cinr. 5. Reporter dans le fichier Info Personel.bin , apr`es chaque tache ex´ecut´ee, toutes les informations sur tous les employ´es de l’entreprise. 25

Au lieu du traitement des donn´ees simples comme les tableaux Pour faciliter l’ajout, la suppression, le tri la modification,... 27 Le fichier est pr´ealablement class´e selon le nombre d’ann´ees en service 26

al abdali Abdelhamid

226

EHTP


CLUB EHTPEC

Langage C

6. Supprimer du fichier un employ´e ayant une cin:cinr. 7. Modifier l’une des informations sur un employ´e dans le fichier, selon un choix: nom, pr´enom, CIN et /ou nombres d’ann´ees en service. 8. Afficher le contenu d’un fichier. 9. Trier le fichier apr`es chaque changement de son contenu. 10. Constituer un fichier Retr Personel.bin des employ´es qui seront a` la retraite cette ann´ee.

al abdali Abdelhamid

227

EHTP


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

#include <stdio.h> #include <stdlib.h> #include <string.h> #define NOM "Info_Personel.bin"

typedef struct Info_pers { char Nom[20]; char Prenom[20]; char CIN[10]; }pers; typedef struct Gest_pers { pers employ; int nbr_ann; struct Gest_pers*prochain; }liste; liste*nouveau(pers a,int ann) { liste*p=NULL; p=(liste*)malloc(sizeof(liste)); if(!p) { printf("memoire insufusante\n"); exit(-1); } p->employ=a; p->nbr_ann=ann; p->prochain=NULL; return p; } int appartenance(liste*l,pers b) { liste*p=NULL; pers a; for(p=l;p;p=p->prochain) { a=p->employ; if((!strcmp(a.Nom,b.Nom))&&(!strcmp(a.Prenom,b.Prenom))&&(!strcmp(a.CIN,b.CIN))) { return 1; } } return 0; } liste*InserEnQueu(liste*l) { liste*p=NULL; liste*pr=NULL; int k; int ann; pers b; do { printf("le nom: "); gets(b.Nom); printf("le prenom: "); gets(b.Prenom); printf("le CIN : "); gets(b.CIN); printf("entrer le nombre des annee de depart: scanf("%d",&ann);getchar(); k=appartenance(l,b); }while(k==1); p=nouveau(b,ann); if(l==NULL) { l=p; }

");


78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

else { for(pr=l;pr->prochain;pr=pr->prochain) ; pr->prochain=p; } return l; } liste*creation(liste*l) { liste*p=NULL; int i,N; p=l; do { printf("entrer le nombre total des employe: scanf("%d",&N); }while(N<1);getchar(); for(i=0;i<N;i++) { p=InserEnQueu(p); } return p; } void remplir(liste*l) { FILE*fich=NULL; liste*p=NULL;

");

fich=fopen(NOM,"wb"); if(!fich) { printf("memoire insufusante\n"); exit(-1); } for(p=l;p;p=p->prochain) { fwrite(&(p->employ),sizeof(p->employ),1,fich); fwrite(&(p->nbr_ann),sizeof(p->nbr_ann),1,fich); } fclose(fich); } void afficherFichier() { FILE*fich=NULL; pers a; int b; fich=fopen(NOM,"rb"); if(!fich) { printf("echec d'ouverture du fichier\n"); exit(-1); } fread(&a,sizeof(a),1,fich); fread(&b,sizeof(b),1,fich); while(!feof(fich)) { printf("nom:%s\nprenom:%s\nCIN:%s\n",a.Nom,a.Prenom,a.CIN); printf("le nombre d'anne de services: %d\n",b); fread(&a,sizeof(a),1,fich); fread(&b,sizeof(b),1,fich); } fclose(fich); } /*REMARQUE 3/ LA RECHERCHE DU DERNIER MAILLON EST FACILE IL SUFFiT D'ADOPTER L'INSTRUCTION SUIVANTE for(p=l;p->prochain;p=p->prochain) ; 4/déjà faite. 5/il ya deux methodes: 1.soit on ouvre un autre fichier et stoke dans dedans tous les informations de tous les employes sauf l'employe caracterisé


155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178

par cinr ,on va le sauter,puis on le supprime l'ancien fichier et son nom on va le donner au nouveau fichier. 2.on stoke le contenu total dans une liste simplement chainee et on fait une supperession soit en tete ou ailleurs selon l'employe qui est caracterisÊ par le cinr donnÊ par l'utilisateur. puis on stoke la liste apres la modification dans le fichier 6/ on stoke le contenu total dans une liste simplement chaine, on va modifie la maillon correspondant puis on stoke la liste apres la modification dans le fichier. 7/la fonction afficher est deja faite. 8/Il sufit stoker le contenu du fichier dans une liste simplemnt chaine,et la trier selon l'anne de service donne,puis stoker la liste dans le fichier. 9/cette question est similaire a une question de l'un des problèmes prÊcedents. */

int main() { printf("Hello world!\n"); return 0; }


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.