Documente Academic
Documente Profesional
Documente Cultură
ELABORE PAR :
SNOUSSI Jamila KOUKI Olfa
Prface
Ce fascicule de programmation en langage C sadresse aux tudiants de premire anne Ingnieurs Mcatronique. Le fascicule comporte deux parties une pour les travaux pratiques et lautres pour le projet. La premire partie contient cinq TPs rpartis comme suit : TP1 : Elments de base en langage C TP2 : Les structures de contrles conditionnelles et rptitives TP3 : Les tableaux et les pointeurs TP4 : Les chaines de caractres TP5 : Les fonctions en langage C Les TPs comportent une partie cours qui inclue la syntaxe des instructions en langage C et des exercices raliser. Avant dassister la sance de TP, chaque tudiant doit maitriser la partie cours se rapportant au TP quil va effectuer et ce laide du cours, du TD et du fascicule de TP. Evaluation des sances de travaux pratiques Programmation C: 1) Au dbut de Chaque sance, il y a un test dvaluation de 15 mn. Ltudiant doit rpondre aux questions sur des feuilles dexamens et non pas sur lordinateur. Gnralement, le test porte sur les problmes traits dans lnonc du fascicule des travaux pratiques ni. 2) Lvaluation de ce test ( Test ) est compte 50% de la note globale de la sance des Travaux Pratiques ni ( Note_TPi ). 3) Lors de la sance des Travaux Pratiques ni, les travaux effectus par les tudiants sont valus par lenseignant. Une note Ev_Pl est attribue chaque tudiant et elle sera compte 50% de la note globale de la sance des Travaux Pratiques ni ( Note_TPi ). Note_TPi = 0,5 . Test + 0,5 . Ev_Pl
4) Chaque absence induit automatiquement une note globale de la sance des Travaux Pratiques ni gale zro( Note_TPi=0 ). 5) La moyenne des notes globales dvaluation des Travaux pratiques prsente 75% de la note module de Travaux Pratiques Programmation C. Evaluation des projets des travaux pratiques Programmation C: 1) Chaque binme aura un seul sujet de projet choisi par lenseignant des travaux pratiques. 2) Les tudiants doivent remettre le rapport de projet muni dun CD-ROM contenant le code source du programme avant la soutenance. 3) La date et le lieu de la soutenance des projets sont communiqus aux tudiants par voie daffiche par lenseignant des travaux pratiques. (Normalement pendant les deux dernires semaines du semestre et dans le mme laboratoire des travaux pratiques) 4) La dure totale dune soutenance varie entre 15 et 25 mn (expos, questions et dlibration). Lexpos dure entre 10 et 15 minutes. 5) Les apprciations de lenseignant sont pondres comme suit : Note_Projet = 0,3. Soutenance + 0,3. Rapport + 0,4. Programme
o Soutenance reprsente la note dvaluation de lexpos, Rapport reprsente la note dvaluation du rapport et Programme reprsente la note dvaluation du programme. 6) Note_Projet prsente 25% de la note module de Travaux Pratiques Programmation1. Note_Module_TP = 0,25. Note_Projet + 0,75. i ( Note_TPi /5) .
Les tapes de la cration dun programme en C sont ldition, la compilation et ldition de liens :
Parmi ces directives, une seule est obligatoire pour le bon fonctionnement dun programme : #include<stdio.h>. En effet, sans elle, on ne peut pas utiliser les fonctions utiles pour laffichage lcran : printf() et la lecture des donnes au clavier : scanf(). Nous verrons le fonctionnement de ces fonctions plus tard.
/*fin main*/
#include <stdio.h>/* bibliothque d'entres-sorties standard */ /* Mon 1er programme en C */ void main() {*/debut main*/ clrscr(); /*permet deffacer lcran*/ printf("Hello world \n") ; }/*fin main*/
Dans ce cas, le compilateur rserve de la place en mmoire (ici 4 octets), pour la variable PI, mais dont on ne peut changer la valeur. 2me mthode: dfinition d'un symbole l'aide de la directive de compilation #define. #define Nom_Const valeur_cte Exemple : #define PI 3.14159 void main() {float perimetre,rayon = 8.7; perimetre = 2*rayon*PI; .... }
On peut faire prcder chaque type par le prfixe unsigned, ce qui force les variables prendre des valeurs uniquement positives. La dclaration et laffectation dune variable peuvent se faire au mme temps. Exemples : int a ; int z=4 ; unsigned int x ; float zx, zy ; float zx=15.15 ; double z ; char zz ; char zz=a ; Remarques : Il nexiste pas de type complexe en langage C. Il n'existe pas de type boolen en Langage C. Lors de l'utilisation de boolen (tests logiques...), il faudra se souvenir des conventions suivantes : - un boolen est un entier, - la valeur FAUX est un entier gal zro, - la valeur VRAI est un entier gal 1 dans le cas du rsultat d'une valuation, diffrent de zro quand on cherche valuer. Exemple: (3 > 4) a pour valeur 0 (FAUX) , (3 < 4) a pour valeur 1 (VRAI), et 3 est VRAI. Il existe en C une fonction qui permet de renvoyer la taille en octets occupe par un type. Cest la fonction sizeof et elle a comme syntaxe : sizeof(expression) Exemples : int a[10] ; char b[5][10] ; 6 /* a est entier */ /* z est entier et vaut 4 */ /* x est un entier positif (non sign) */ /* zx et zy sont de type rel */ /* zx est de type rel et vaut 15.15 */ /* z est un rel en double prcision */ /* zz est une variable caractre */ /* zz vaut a* /
On remarque ici que la taille du type short est la mme quelque soit la taille du mot machine. En effet ce dernier sert limiter la taille d'une variable 2 octets uniquement et ce quelque soit la machine utiliser
Mais printf() permet surtout dafficher lcran la valeur dune variable, dans ce cas la fonction printf exige l'utilisation de formats de sortie, avec la structure suivante: printf("%format",nom_de_variable); Le caractre % indique le format dcriture lcran. Exemple : void main(){ int n=3, m=4 ; printf("%d",n) ; /* affiche la valeur de n au format d (decimal) */ printf("n=%d",n) ; /* affiche n=3 */ printf("n=%d, m=%d",n,m) ; /* affiche n=3, m=4 */ printf("n=%5d",n) ; /* affiche la valeur de n sur 5 caracteres : n= 3*/ printf("Bonjour\n") ; /*affichera Bonjour lcran et retourne la ligne*/ } Remarque : le compilateur nempche pas dcrire un char sous le format dun rel affichage de valeurs dlirantes. Et si on crit un char avec un format dcimal, on affiche la valeur du code ASCII du caractre. Voici le tableau des formats utilisables : %d %x %u %hd %d %f %e %lf %le %c %s integer integer unsigned short long float float double double char char entier (dcimal) entier (hexadcimal) entier non sign (positif) entier court entier long rel, notation avec le point dcimal (ex. 123.15) rel, notation exponentielle (ex. 0.12315E+03) rel en double prcision, notation avec le point dcimal rel en double prcision, notation exponentielle Caractre chane de caractres
/* saisie d'un caractre */ /* saisie d'un nombre entier en dcimal */ /* saisie d'un nombre entier en hexadcimal*/ /* saisie d'un nombre rel */
10
Excuter ce programme sur machine. ETAPES A SUIVRE : 1) Lancer le BORLAND C 2) Sil y a des fentres ouvrantes, fermer ces fentres 3) Crer un nouveau fichier 4) Taper le code du programme 5) Enregistrer le programme sous votre rpertoire de travail 6) Compiler le programme 7) Interprter les messages derreurs et corriger le programme 8) Voir le rsultat de lexcution dans la fentre de sortie 9) Enregistrer de nouveau le programme (pour ne pas perdre les corrections apportes) 10) Quitter le BORLAND C 11) Lancer le BORLAND C de nouveau 12) Ouvrer le prcdent programme 13) Modifier le programme en ajoutant des lignes sur les quelles vous afficher votre prnom, votre nom et votre groupe. 14) Faire toutes les oprations pour excuter le programme. Exercice 2 : Commenter et tester le programme suivant : #include <stdio.h> #define PI 3.1415 void main() {clrscr() ; double rayon; double perimetre; printf("Rayon = "); scanf("%f", &rayon); perimetre = 2 * PI * rayon; printf("Le primtre est : %4.2f\n", perimetre);} Que donne ce programme pour un rayon gal 5 ? 11
12
i) Conditions imbriques :
if (expression 1) instruction 1 ; else if (expression 2) instruction 2 ; else if (expression 3) instruction 3 ; else instruction 4 ; Exemple : float note ; i f (note>=10) printf ( "success\n" ) ; else if (note>=9) /* 9<=note<10 */ printf (rachat\n); else if (note>=8) /* 8<=note<9 */ printf(controle\n); else printf(echec); /* note<8 */
13
/* si i=valN on excute linstruction N */ /* pour les autres valeurs de i on excute linstruction N+1*/ 14
15
16
Indication : la solution sera choisie par l'ordinateur par la fonction rand() qui rend un entier alatoire (dclare dans stdlib.h).
18
ii) Initialisation
L'initialisation d'un tableau peut se faire en mme temps que sa dclaration. type Nom_Tab [ TAIL_MAX ]={val1, val2,...}; Exemple : float vect[ 4 ] = { -5.3 , 4.88 , 2.67 , -45.675 }; /*place -5.3 dans vect[ 0 ], 4.88 dans vect [ 1 ], 2.67 dans vect[ 2 ] et -45.675 dans vect[ 3 ] ; float vect[ ] = { -5.3 , 4.88 , 2.67 , -45.675 }; /*place -5.3 dans vect [ 0 ], 4.88 dans vect[ 1 ], 2.67 dans vect[ 2 ] et -45.675 dans vect[ 3 ] et fixe sa dimension 4*/
Adresses
Valeurs &Nom_Tab[TAIL_MAX-1] Nom_Tab[TAIL_MAX-1] &Nom_Tab[TAIL_MAX-2] Nom_Tab[TAIL_MAX-2] &Nom_Tab[2] &Nom_Tab[1] Nom_Tab : &Nom_Tab[0] Nom_Tab[2] Nom_Tab[1] Nom_Tab[0]
i) Dclaration
type Nom_Tab [ LIG_MAX ] [ COL_MAX ]; type est le type des lments composant la matrice, Nom_Tab est le nom qui dsigne le tableau, LIG_MAX est la taille de dclaration de la longueur maximale des lignes, COL_MAX est la taille de dclaration de la longueur maximale des colonnes. Exemple : int Tab[2][2]; Remarque : Les dimensions suprieures respectent le mme principe. int Tab[2][2][7][4]; /* dclaration d'un tableau de dimension 4*/ Lors de la dclaration, le compilateur rserve la mmoire ncessaire pour le tableau c'est--dire qu'il rserve LIG_MAX*COL_MAX*sizeof(type) octets. LIG_MAX et COL_MAX doivent obligatoirement tre des expressions constantes de type entier. /*dclaraion dune matrice 2x2*/
ii) Initialisation
type Nom_Tab [ LIG_MAX ][COL_MAX]={{val11, val12,...},{val21, avl22,},.}; valeurs de la ligne 1 Exemple : float Mat[2][4]= {{-5.3,4.88,2.67,-45.675} ,{3.72,-2.6,35.1,0.25}};/*dclaration et initialisation*/
21
Nom_Tab[LIG_MAX-1]
Nom_Tab[1]
Nom_Tab
Nom_Tab[0]
&Nom_Tab[0][0]
Les cases mmoire des variables a, b et c contiennent leurs valeurs. Celles de la variable ptint contiennent ladresse de la valeur pointe. En effet, la valeur stocke est (bfbff000), ce qui est bien ladresse de a. Remarque : On ne peut pas affecter directement une valeur un pointeur. Lcriture suivante est interdite: char *pc; pc = 0xfffe; /*faux*/ Exemple : #include <stdio.h> void main(){ float *px ; float x=3.5 ; px=&x ; printf ("adresse de x : 0x%lx \n",&x) ; /*adresse de x : 0xbfbffa3c*/ printf ("valeur de px : 0x%lx \n",px) ; /*valeur de px : 0xbfbffa3c*/ printf ("valeur de x : %3.1f \n",x) ; /*valeur de x : 3.5*/ printf ("valeur pointe par px : %3.1f \n",*px) ; /* valeur pointe par px : 3.5*/ 24
ATTENSION ! Comme le nom du tableau est un pointeur constant donc les instructions daffectation sont interdites. tab=po ; tab++ ; tab-- ; tab+=i ; /*faux*/ /*faux*/ /*faux*/ /*faux*/
Pour expliquer davantage, on donne le tableau suivant : Notation &tab[0] ; p=&tab[0] p=tab+i ; p++ ; *(tab+i) ; Initialisation de tab for(i=0 ;i<N ;i++) tab[i]=0; Tab; p=tab ; p=&tab[i] ; p=&tab[i+1] ; tab[i] ; En utilisant un pointeur for(i=0 ;i<N ;i++) *(tab+i)=0; for(i=0, p=tab;i<N ;p++,i++) *p=0; Equivalent
26
Exercice 1 : Ecrire un programme C qui permet de : 1) saisir N notes dans un tableau ; 2) calculer et afficher la moyenne M de ces N notes ; 3) dterminer et afficher la valeur de la meilleure note note_max . Exercice 2 : Ecrire un programme en C qui permet de : 1) ranger N entiers positifs dans un tableau Tab (N ne dpasse pas 40) ; 2) chercher le nombre doccurrences dune valeur X dans Tab. Exercice 3 : Ecrire un programme en C qui permet de : 1) remplir un tableau T de N rels (0<N<20) ; 2) trier T selon un ordre croissant puis selon un ordre dcroissant ; 3) insrer un rel X dans T tout en respectant lordre. Exercice 4 : Un programme contient la dclaration suivante: int tab[20] = {4,-2,-23,4,34,-67,8,9,-10,11, 4,12,-53,19,11,-60,24,12,89,19}; Complter ce programme de sorte d'afficher les lments du tableau avec la prsentation suivante: 4 -67 4 -60 -2 8 12 24 -23 9 -53 12 4 -10 19 89 34 11 11 19
TABLEAUX A DEUX DIMENSIONS Exercice 5 : Ecrire un programme en C qui permet de saisir deux matrices A et B de mme dimension (nbre de ligne max est 20 et nbre de colonnes max est 20) et de dterminer leur somme. POINTEURS Exercice 6 : Soit le programme suivant : void main(){ 27
Exercice 8 : Ecrire un programme en C qui range les lments dun tableau A de type entier dans lordre dcroissant. Le programme utilisera deux pointeurs p1 et p2 et une variable numrique AIDE pour la permutation des lments. Exercice 9 : Ecrire un programme en C qui lit un entier X et un tableau A de type entier au clavier et qui limine toutes les occurrences de X dans A en tassant les lments restants. Indication : le programme utilisera deux pointeurs P1 et P2 pour parcourir le tableau.
28
4.1 Dclaration
char nom[dim]; /*ou bien*/ char *nom ; nom= (char*)malloc(dim) ; Exemple: char prnom[10]; char *message ; message=(char*)malloc(10) ; Le compilateur rserve (dim-1) places en mmoire pour la chane de caractres: En effet, il ajoute toujours le caractre NULL ('\0') la fin de la chane en mmoire.
4.3 Saisie:
On peut utiliser la fonction scanf et le format %s. Exemple : char message[10]; printf("crivez votre message: "); scanf("%s",message); On utilisera de prfrence la fonction gets non formate. gets(message); /*est quivalent scanf("%s",message)*/
29
31
32
5.3 La dfinition
Avant d'tre utilise, une fonction doit tre dfinie car pour l'appeler dans le corps du programme il faut que le compilateur la connaisse, c'est--dire qu'il connaisse son nom, ses arguments et les instructions qu'elle contient. La dfinition d'une fonction se fait selon la syntaxe suivante : 33
Il y a deux mthodes pour passer des variables en paramtre dans une fonction : le passage par valeur et le passage par variable.
34
35
36
Exercice 6 : tab1 et tab2 sont des variables locales main: int tab1[10] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}; int tab2[10] = {-19,18,-17,16,-15,14,-13,12,-11,10,-9,8,-7,6,-5,4,-3,2,-1,0}; 1) Ecrire une fonction de prototype void affiche(int *tab) qui permet d'afficher les 20 nombres suivant un tableau 4x5. 2) La mettre en uvre dans main() pour afficher tab1 et tab2. Exercice 7 : 1) Ecrire une fonction Permute, avec passage darguments par adresse, permettant de permuter deux entiers a et b. 2) Dans le programme principal main() : 3) a) saisir deux entiers x et y. 37
38
39
NOTONS : Le rapport ne doit pas dpasser une vingtaine de pages. Une copie des codes sources de lapplication doit tre rendue sur CD.
2 Expos
Chaque tudiant doit prparer un expos dcrivant lapplication ralise ainsi quune dmonstration pratique.
40