Sunteți pe pagina 1din 41

DEPARTEMENT DE GENIE ELECTRIQUE

Fascicule de Travaux Pratiques en Programmation


1re anne Ingnieurs Mcatronique

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) .

PARTIE I : TRAVAUX PRATIQUES

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP1 : ELEMENTS DE BASE EN LANGAGE C


1.1 Cration dun programme en C
Ldition consiste en la cration dun programme source grce lditeur quelconque (Word sous Windows vi sous Unix), le fichier cr aura lextension *.CPP ; La compilation est la traduction du programme source en langage machine. Le rsultat de cette tape porte le nom du module objet *.OBJ ; Ldition de liens a pour but de complter le programme objet par les diffrents modules correspondants aux fonctions prdfinies (fonction standards) utilises par le programme. Le rsultat est un programme excutable ne langage machine qui pourra tre excut ultrieurement sans appel aux composants de lenvironnement de programmation C *.EXE . Un programme simple se compose de plusieurs parties : Les directives de prcompilation ; Une ou plusieurs fonctions dont lune sappelle obligatoirement main(), celle-ci constitue le programme principal et comporte 2 parties : - la dclaration de toutes les variables et fonctions utilises - des instructions Les commentaires dbutent par /* et finissent par */, ils peuvent stendre sur plusieurs lignes.

Les tapes de la cration dun programme en C sont ldition, la compilation et ldition de liens :

1.1.1 Les directives de prcompilation


Elles commencent toutes par un #. Commande signification #include <stdio.h> permet dutiliser les fonctions printf() et scanf(). #include <math.h> permet dutiliser les fonctions mathmatiques. #define PI 3.14159 #undef PI #ifdef PI instructions 1 ... #else instructions 2 ... #endif dfinit la constante PI. partir de cet endroit, la constante PI nest plus dfinie. si la constante PI est dfinie, on compile les instructions 1, sinon, on compile les instructions 2.

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.

1.1.2 La fonction main()


Elle commence par une accolade ouvrante { et se termine par une accolade fermante }. lintrieur, chaque instruction se termine par un point-virgule. Toute variable doit tre dclare. void main() { /* debut main*/ int i ; /* declaration des variables */ instruction_1 ; 4

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP1 : ELEMENTS DE BASE EN LANGAGE C


instruction_2 ; ... } Exemple :

/*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*/

1.2 Les constantes et les variables en C 1.2.1 Les constantes


Le langage C autorise 2 mthodes pour dfinir des constantes. 1re mthode: dclaration d'une variable, dont la valeur sera constante pour tout le programme. const type Nom_Const = valeur_cte; Exemple: void main() { const float PI = 3.14159; float perimetre,rayon = 8.7; perimetre = 2*rayon*PI; .... }

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; .... }

1.2.2 Les variables


Le C fait la diffrence entres les MAJUSCULES et les minuscules. Donc pour viter les confusions, on crit les noms des variables en minuscule et on rserve les majuscules pour les constantes symboliques. Pour dclarer une variable, on fait prcder son nom par son type : type nom_var

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP1 : ELEMENTS DE BASE EN LANGAGE C


Notons que : Les noms doivent commencer par une lettre et ne contenir aucun blanc. Le seul caractre spcial admis est le soulignement (_). Il existe un certain nombre de noms rservs (while, if, case, ...), dont on ne doit pas se servir pour nommer les variables. On ne doit pas utiliser les noms des fonctions pour des variables. Il existe 6 types de variables : Type char short int long float Signification caractre cod sur 1 octet entier cod sur 2 octets entier cod sur 4 octets entier cod sur 8 octets rel cod sur 4 octets val. min val. max -27 -27 -231 -263 ~ -1038 ~ -10308 27-1 27-1 231-1 263-1 ~ 1038 ~ 10308

double rel cod sur 8 octets

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* /

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP1 : ELEMENTS DE BASE EN LANGAGE C


printf("taille de a : %d\n",sizeof (a)) ; /* taille de a : 40*/ printf("taille de b : %d\n",sizeof (b)) ; /* taille de b : 40*/ printf("taille de 4.25 : %d\n",sizeof (4.25)) ; /* taille de 4.25 : 8 printf("taille de Bonjour ! : %d\n",sizeof "Bonjour !");/* taille de Bonjour ! : 9*/ printf("taille dun float : %d\n",sizeof(float)) ; /* taille dun float : 4*/ printf("taille dun double : %d\n",sizeof(double)); /* taille dun double : 8*/ Remarque : La taille d'une variable ne dpend pas uniquement de son type mais aussi de la taille du mot machine. Exemple: Taille du mot machine sizeof (char) sizeof(int) sizeof(short) sizeof(long) sizeof(unsigned) sizeof(float) sizeof(double) 16 bits 1 octet 2 octets 2 octets 4 octets 2 octets 4 octets 8 octets 36 bits 1octet 4 octets 2 octets 4 octets 4 octets 4 octets 8 octets

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

1.3 Les oprateurs :


Le premier oprateur connatre est laffectation "=". Exemple : {a=b+c ;} Il sert mettre dans la variable de gauche la valeur de ce qui est droite. Le membre de droite est dabord valu, et ensuite, on affecte cette valeur la variable de gauche. Pour les oprations dites naturelles, on utilise les oprateurs +, -, *, /, %. / est loprateur quotient de la division et % est lopration modulo : 5%2 est le reste de la division de 5 par 2. 5%2 est donc gal 1. Dautres oprateurs sont dfinis dans lexemple qui suit : Exemple : i+=5 ; /* i=i+5 */ i-=3 ; /* i=i-3 */ i*=4 ; /* i=i*4 */ i/=2 ; /* i=i/2 */ i%=3 ; /* i=i%3 */

1.3.1 Conversion des types


Il est important de comprendre que lors de lvaluation dune opration arithmtique, lopration sera effectue dans le plus grand des deux types mis en jeu. Les types sont classs ainsi : char < int < float < double Exemple: int i=2; f loat f=4.3; f=f*i ; /*la multiplication f*i est effectue en float*/ 7

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP1 : ELEMENTS DE BASE EN LANGAGE C


Remarques : Loprateur de division peut agir comme division entire ou division sur les nombres virgule flottante. int i = 2, j = 3; printf("%f \n",i/j);/* affiche la valeur 0 car puisque 2 et 3 sont des constantes de types entiers, la division est une division entire */ Dans ce cas on peut utiliser loprateur de conversion de type. Loprateur de conversion de type, appel cast, permet de modifier explicitement le type d'un objet. On crit (type) objet On crira donc : int i = 2, j = 3; printf("%f \n",(float)i/j); /* pour afficher 0.6666 */ lopration a+1 a un sens, elle a pour rsultat le caractre suivant a dans le code ASCII.

1.3.2 Incrmentation et dcrmentation


En C, il existe un certain nombre doprateurs spcifiques, quil faut utiliser prudemment sous peine derreurs. ++ incrmente la variable dune unit. - - dcrmente la variable dune unit. Ces 2 oprateurs ne sutilisent pas avec des rels. Exemples : i++ ; /* effectue i=i+1 */ i-- ; /* effectue i=i-1 */ Leur utilisation devient dlicate quand on les utilise avec dautres oprateurs. Exemples: int i=1 , j ; j=i++ ; /* effectue dabord j=i et ensuite i=i+1 */ /* on a alors j=1 et i=2 */ j=++i ; /* effectue dabord i=i+1 et ensuite j=i */ /* on a alors j=2 et i=2 */ Quand loprateur ++ (ou --) est plac avant une variable, lincrmentation est effectue en premier. Lincrmentation (la dcrmentation) est faite en dernier quand ++ (ou--) est plac aprs la variable.

1.3.3 Les oprateurs de comparaison


Les oprateurs qui servent comparer 2 variables sont : == != < <= gal diffrent de infrieur infrieur ou gal > suprieur >= suprieur ou gal && et logique || ou logique

ATTENTION ! Ne pas confondre loprateur daffectation = et loprateur de comparaison == . 8

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP1 : ELEMENTS DE BASE EN LANGAGE C


1.4 Les entres-sorties conversationnelles 1.4.1 La fonction printf()
Elle sert afficher lcran la chane de caractre donne en argument, cest--dire entre parenthses. printf("Bonjour") ; /*affichera Bonjour lcran*/ Certains caractres ont un comportement spcial : Caractre '\n' '\t' '\v' '\r' '\f' '\\' '\'' '\"' Dsignation interligne tabulation horizontale tabulation verticale retour charriot saut de page backslash cote guillemets Valeur (code ASCII) 0x0a 0x09 0x0b 0x0d 0x0c 0x5c 0x2c 0x22 Nom ASCII LF HT VT CR FF \ ' ''

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

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP1 : ELEMENTS DE BASE EN LANGAGE C


1.4.2 La fonction scanf() Dans un programme, on peut vouloir quune variable nait pas la mme valeur chaque excution. La fonction scanf() est faite pour cela. Elle permet de lire la valeur que lutilisateur rentre au clavier et de la stocker dans la variable donne en argument. Elle sutilise ainsi :
void main(){ int a ; scanf("%d",&a) ; } En gnral : scanf("%format",liste_dadresses); Exemple: void main(){ char alpha; int i; float r; scanf("%c",&alpha); scanf("%d",&i); scanf("%x",&i); scanf("%f",&r); }

/* saisie d'un caractre */ /* saisie d'un nombre entier en dcimal */ /* saisie d'un nombre entier en hexadcimal*/ /* saisie d'un nombre rel */

1.4.3 Autres fonctions dentre- sortie en C


la fonction putchar() : cette fonction existe dans la bibliothque STDIO.H . putchar(c) ; permet dcrire sur le fichier standard de sortie (lcran) le caractre c avec c est de type char. Elle joue le mme rle que printf(%c,c). la fonction getchar():cette fonction existe dans la bibliothque STDIO.H . c=getchar(), permet de lire partir de fichier standard dentre (le clavier) le caractre c. Elle joue le mme rle que scantf(%c,&c). la fonction getch() : cette fonction existe dans la bibliothque CONIO.H. Elle attend le prochain appui sur le clavier, et rend le caractre qui a t saisi. L'appui sur une touche se fait sans cho, c'est dire que rien n'est affich l'cran. En cas de redirection du clavier, on prend le prochain caractre dans le fichier d'entre.

10

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP1 : ELEMENTS DE BASE EN LANGAGE C TRAVAIL DEMANDE


Exercice1 : Partie I 1) Lancer le BORLAND C et prsenter le menue gnral. Voir avec dtaille les items de File, Compile et Run. 2) Afficher et fermer quelques fentres sous cet environnement (fentre du HELP). Partie II En utilisant la fonction printf crire un programme en C qui : Efface lcran avec la commande clrscr() ; Ecrire SALUT sur une premire ligne ; Ecrire je commence a apprendre le langage C ; Attend lappui dune touche.

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

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP1 : ELEMENTS DE BASE EN LANGAGE C


Exercice 3 : 1) crire un programme qui affiche le carr et le cube dun nombre rel saisi au clavier. 2) Ecrire un programme qui affiche la somme s, la diffrence d, le produit p, le quotient q et le reste de la division r de deux entiers a et b saisis au clavier. Exercice 4 : 1) Tester et compiler le programme suivant #include <stdio.h> #include <conio.h> void main() { int a, b, calcul ; char u, v; puts("BONJOUR"); a = 5 ; b = 50 ; u = 65 ;v = A ; calcul = (a + b)/2 ; printf(la somme S=:%d,a+b) ; printf( Voici le resultat : %d\n , calcul) ; printf( 1er affichage de u : %d\n ,u) ; printf( 2me affichage de u : %c\n ,u) ; printf(1er affichage de v: %c\n ,v) ; puts("Pour continuer frapper une touche..."); getch(); } Que donne ce programme comme rsultat ? Conclure. 2) Modifier ce programme afin dobtenir le bon rsultat. 3) Afficher S en hexadcimal. 4) Ajouter quelques instructions ce programme afin de : a) afficher le code ASCII de la lettre A b) afficher le code ASCII des lettres B et C en utilisant la variable v c) afficher les lettres B et C d) afficher les lettres b et c.

12

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP2 : LES INSTRUCTIONS DE CONTROLE CONDITIONNELLES ET REPETITIVES


Ce sont des instructions qui permettent de notamment faire des tests et des boucles dans un programme. Leur rle est donc essentiel.

2.1 Les instructions conditionnelles 2.1.1 Les tests if (sialors)


Loprateur de test sutilise comme suit : if (expression) {instruction ;} /* Si expression est vraie alors instruction est excute */

La structure ifelse (sialorssinonalors) :


if (expression) {instruction 1 ;} /*une seule instruction ou un bloc dinstructions*/ else {instruction 2 ;} /*une seule instruction ou un bloc dinstructions*/ /* Si expression est vraie alors linstruction 1 est excute */ /* Sinon, cest linstruction 2 qui est excute */ Exemple : int x=4,y=12; i f (x>y) {printf ( "x est suprieur y\n" ) ; x=x+y ;} else printf ( "x est infrieur y\n" ) ;

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

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP2 : LES INSTRUCTIONS DE CONTROLE CONDITIONNELLES ET REPETITIVES


/* chaque else se rapporte au if le plus proche sauf si on utilise des accolades comme dans le cas suivant */

ii) Regroupement d'instructions :


if (expression1) /* premier if */ { if (expression2) instruction1; else if (expression3) instruction2; } else /* sinon se rapportant au premier if */ instruction3; Exemple : if (A !=B) {if (A>B) printf(A est suprieur B); else if (A<B) printf(A est infrieur B);} else printf(A est gal B) ; Remarques : Les instructions excuter peuvent tre des instructions simples {a=b ;} ou un bloc dinstructions {a=b ; c=d ; ...}. Si on a une seule instruction, on peut ne pas mettre les accolades. Test de NON logique : if (!(expression1)) /* si l'expression1 est fausse */ Si on a plus quune expression tester : test de ET logique: if ((expression1) && (expression2)) /* si l'expression1 ET l'expression2 sont vraies*/ test de OU logique : if ((expression1) || (expression2)) /* si l'expression1OU l'expression2 est vraie */

4.1.2 Linstruction switch(selon quefaire)


Cette instruction sutilise quand un entier ou un caractre prend un nombre fini de valeurs et que chaque valeur implique une instruction diffrente. switch (i) { case val1 : instruction 1 ; break ; case val2 : instruction 2 ; break ; . . . case valN : instruction N ; break ; default : instruction N+1 ; break ; /*i est un entier ou un caractre*/ /* si i=val1 on excute linstruction 1 */ /* sortie du switch */ /* si i=val2 on excute linstruction 2 */

/* si i=valN on excute linstruction N */ /* pour les autres valeurs de i on excute linstruction N+1*/ 14

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP2 : LES INSTRUCTIONS DE CONTROLE CONDITIONNELLES ET REPETITIVES


} Exemple : switch (n ) { case 0 : printf("nul\n"); /*si on tape 0 le programme affiche nul*/ break; case 1 :printf(un\n); /*si on tape 1 le programme affiche un*/ break; case 2 :printf(deux\n); /*si on tape 2 le programme affiche deux*/ break; case 3 : printf("trois\n"); /*si on tape 3 le programme affiche trois*/ break; default : printf("erreur\n");/*si on tape un entier diffrent de 0,1,2 ou 3 le programme affiche erreur*/ } Le bloc "default" n'est pas obligatoire. Remarque : On peut ne pas mettre les break ; dans les blocs dinstructions. Mais alors on ne sort pas du switch, et on excute toutes les instructions des case suivants, jusqu rencontrer un break ;. Si on reprend lexemple prcdent en enlevant tous les break, alors : si i=val1 on excute les instructions 1, 2, 3, , N+1. si i=val2 on excute les instructions 2, 3,, N+1. si i=valN on excute les instructions N et N+1. pour toutes les autres valeurs de i, on nexcute que linstruction N+1.

2.2 Les structures rptitives 2.2.1 La boucle for (pourfaire)


Elle permet dexcuter des instructions plusieurs fois sans avoir crire toutes les itrations. Dans ce genre de boucle, on doit savoir le nombre ditrations avant dtre dans la boucle. Elle sutilise ainsi : for (initialisation ; condition d'arrt ; incrmentation) { instructions ... ; } Exemple : #include <stdio.h> void main(){ int i; for (i=1; i<10; i++) /*i est le compteur*/ printf("%d ",i); } /* ce programme affiche 1 2 3 4 5 6 7 8 9 */ Remarque : on ne peut pas enlever les points virgules qui sparent les instructions se trouvant entre les parenthses mme si on enlve une, deux ou toutes les instructions.

15

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP2 : LES INSTRUCTIONS DE CONTROLE CONDITIONNELLES ET REPETITIVES


2.2.2 La boucle while (tant quefaire)
Contrairement la boucle for, on nest pas obligs ici de connatre le nombre ditrations. Il ny a pas de compteur. while (expression) { instructions ... ; /*les instructions ne sexcutent que si expression est vrai*/ } Lexpression est value chaque itration. Tant quelle est vraie, les instructions sont excutes. Si ds le dbut elle est fausse, les instructions ne sont jamais excutes. Exemple : #include <stdio.h> void main() { float x,R ; x=1.0 ; R=1000 ; while (x < R ) /*tant que x est infrieur R */ { x = x+0.1*x ; printf("x=%f",x) ; } /*tant que x est infrieur R on calcule la nouvelle valeur de x et on laffiche lcran* / } /*si la valeur de x devient suprieur ou gale R on nentre pas la boucle while*/ Remarque : Si rien ne vient modifier lexpression dans les instructions, on a alors fait une boucle infinie : while (1) { instructions } en est un exemple.

2.2.3 La boucle do ... while (rptertant que)


la diffrence dune boucle while, les instructions sont excutes au moins une fois : lexpression est value en fin ditration. do { instructions ... ; /*les instructions sont excutes au moins une fois*/ } while (expression); Exemple : #include <stdio.h> void main(){ int a; do { printf("\n Entrez un entier entre 1 et 10 : "); scanf("%d",&a); /* la saisie se fait au moins une fois*/ } while ((a <= 0) || (a > 10));} /*on rpte la saisie si la condition (a <= 0) OU (a > 10) est vraie*/ Les risques de faire une boucle infinie sont les mmes que pour une boucle while.

16

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP2 : LES INSTRUCTIONS DE CONTROLE CONDITIONNELLES ET REPETITIVES TRAVAIL DEMANDE


LES INSTRUCTIONS DE CONTROLE CONDITIONNELLES Exerxice1 : 1) Ecrire un programme en C qui permet de saisir deux entiers a et b et dafficher leur maximum max. 2) Ecrire un programme en C qui permet de saisir trois entiers et dafficher lentier le plus grand et celui le plus petit. Exercice 2 : Ecrire un programme qui permet de rsoudre ax2+bx+c=0. Exercice 3 : 1) Ecrire un programme en C qui permet de saisir un nombre et dafficher ce nombre en toutes lettres. 2) Modifier ce programme afin dafficher en toute lettre tous les entiers infrieur ce nombre et suprieur 0. Exercice 4 : Ecrire un programme en C qui permet de saisir une date sous le format jour mois anne et qui permet de dterminer le nombre de jour partir du 1er jour de lanne. LES INSTRUCTIONS DE CONTROLE REPETITIVES Exercice 5 : Ecrire un programme qui calcule la moyenne de N notes saisies au clavier. N est donn par lutilisateur et diffrent de 0. Indication : le calcul de la moyenne s'effectue en initialisant une variable initialise 0, puis en y ajoutant progressivement les notes saisies puis division par N. Exercice 6 : Ecrire un programme en C qui affiche toutes les puissances de 2, jusqu' une valeur maximale donne par l'utilisateur. On calculera la puissance par multiplications successives par 2. LES INSTRUCTIONS DE CONTROLE CONDITIONNELLES ET REPETITIVES Exercice 7 : 1) Ecrire un programme de jeu demandant de deviner un nombre entre 0 et 10 choisi par l'ordinateur. On ne donnera pas d'indications avant la dcouverte de la solution, o l'on indiquera le nombre d'essais nbr_essais. 2) Modifier ce programme pour quil permet de : - prciser au joueur chaque essai si sa proposition est trop grande ou trop petite ; - afficher vous avez eu un peu de chance si le nombre dessais nbr_essais = 1 ; - afficher bravo si le nombre dessais nbr_essais < 4 ; 17

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP2 : LES INSTRUCTIONS DE CONTROLE CONDITIONNELLES ET REPETITIVES


afficher ce score me semble bien minable si le nombre dessais nbr_essais > 6.

Indication : la solution sera choisie par l'ordinateur par la fonction rand() qui rend un entier alatoire (dclare dans stdlib.h).

18

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP3 : LES TABLEAUX ET LES POINTEURS


3.1 Les Tableaux
Un tableau est une suite de cellules conscutives en mmoire pouvant contenir des donnes de type identique.

3.1.1 Les tableaux une dimension (vecteurs) i) Dclaration


type Nom_Tab [ TAIL_MAX ]; type est le type des lments composant le vecteur, Nom_Tab est le nom qui dsigne le tableau, TAIL_MAX est la taille ou la dimension de dclaration c'est--dire le nombre d'lments maximum utilisables. Exemple : float tab[5] ; /*est un tableau de 5 rels*/ int tablo[8] ; /*est un tableau de 8 entiers*/ char p2[7]="Bonjour" ; /*est un tableau de 7 caractre*/ Lors de la dclaration, le compilateur rserve la mmoire ncessaire pour le tableau c'est--dire qu'il rserve TAIL_MAX*sizeof(type) octets. Remarques et Dfinitions : TAIL_MAX doit obligatoirement tre une expression constante de type entier c'est--dire explicite ou dfinie grce une directive de compilation #define. Exemple : #define N 10 void main(){ double tab[N] ; /* est un tableau de 10 doubles*/ ....} Le nombre dlments saisir dans un tableau ne doit pas dpasser TAIL_MAX pour ne pas dborder sa capacit. Par dfinition, en langage C, Nom_Tab est l'adresse du premier lment du tableau, cette adresse est constante puisque c'est le compilateur qui lui a affect une valeur lors de la dclaration du tableau. La valeur de cette adresse ne pourra en aucun cas tre modifie par le programme.

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*/

iii) Accs aux lments dun vecteur


Nom_Tab[i] dsigne l'lment d'indice i du tableau (ATTENTION ! les indices commencent 0, par consquent i pourra varier de 0 TAIL_MAX-1). Il dsigne le contenu du tableau la position i+1 ; il s'agit donc d'une valeur. 19

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP3 : LES TABLEAUX ET LES POINTEURS


&Nom_Tab[i] caractrise l'adresse de l'lment Nom_Tab[i].

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]

iv) Manipulation dun vecteur


La manipulation dun vecteur est toujours lie la manipulation des lments du vecteur. Cest pourquoi le traitement des tableaux contient toujours des structures rptitives (for, while, dowhile). Exemple : #include<stdio.h> #include<conio.h> void main(){ float MOY[50], X, Max; int i,j,N; clrscr(); /*Lecture du nombre dlment N dun vecteur MOY de type rel (de dimension max 50)*/ do { printf(donner le nombre dlment du tableau) ; scanf(%d,&N) ; }while(N<=0 || N>50); /* Remplissage du tableau*/ for(i=0;i<N;i++) { do{ printf(donner la moyenne de ltudiant %d,i+1); scanf(%f,&MOY[i]); }while(MOY[i]<0 || MOY[i]>20); /* la moyenne doit tre entre 0 et 20*/ } /* Recherche dun lment X dans le tableau*/ printf(donner une valeur) ; scanf(%d,&X) ; i=0 ; while(i<0 && MOY[i] !=X) i=i+1; if(i<N) printf(%f existe dans Moy,X) ; 20

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP3 : LES TABLEAUX ET LES POINTEURS


else printf(%f nexiste pas dans Moy,X) ; /* Recherche du maximum du tableau*/ Max=MOY[0] ; for(i=0;i<N;i++) { if(Max<MOY[i]) Max=MOY[i]; } printf(la valeur maximale de Moy est %f, Max) ; /* Affichage du tableau*/ for(i=0;i<N;i++) printf(la moyenne de ltudiant %d : %.3f\n, i+1,MOY[i]) ; /* Fin du programme*/ getch() ; }

3.1.2 Les tableaux deux dimensions (matrices)


Un tableau 2 dimensions est similaire une matrice.

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

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP3 : LES TABLEAUX ET LES POINTEURS


iii) Accs aux lments dune matrice
Nom_Tab[i][j] dsigne l'lment de la ligne i et de la colonne j (ATTENTION !les indices commencent 0, par consquent i pourra varier de 0 LIG_MAX-1 et j pourra varier de 0 COL_MAX-1. &Nom_Tab[i][j] dsigne l'adresse de l'lment Nom_Tab[i][j].
Adresses &Nom_Tab[LIG_MAX-1][COL_MAX-1] & Nom_Tab[LIG_MAX-1][1] & Nom_Tab[LIG_MAX-1][0] & Nom_Tab[1][COL_MAX-1] &Nom_Tab[1][1] &Nom_Tab[1][0] &Nom_Tab[0][COL_MAX-1] Valeurs Nom_Tab[LIG_MAX-1][COL_MAX-1] Nom_Tab[LIG_MAX-1][1] Nom_Tab[LIG_MAX-1][0] Nom_Tab[1][COL_MAX-1] Nom_Tab[1][1] Nom_Tab[1][0] Nom_Tab[0][COL_MAX-1] Nom_Tab[0][1] Nom_Tab[0][0]

Nom_Tab[LIG_MAX-1]

Nom_Tab[1]

Nom_Tab

Nom_Tab[0]

&Nom_Tab[0][0]

iv) Manipulation dune matrice


Pour manipuler un lment, on a besoin de prciser lindice de la ligne et lindice de la colonne. Cest pourquoi le traitement des matrices contient toujours deux structures rptitives imbriques lune pour parcourir les lignes et lautre pour parcourir les colonnes. Exemple : #include<stdio.h> #include<conio.h> void main(){ float M[50][40], R[50][40]; int i,j,L,C,X; clrscr(); /*Lecture des dimensions L et C dune matrice M de type rel (de dimension max 50 lignes et 40 colonnes) */ do { printf(donner la taille relle de M) ; scanf(%d%D,&L,&C) ; }while(L<=0 || L>50|| C<=0 || C>40); /* Remplissage du tableau*/ for(i=0;i<L;i++) for(j=0;j<C;j++) { printf(donner la valeur de la case %d-%d,i,j); scanf(%f,&M[i][j]) ; } 22

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP3 : LES TABLEAUX ET LES POINTEURS


/* Multiplication R=M*X */ printf(donner une valeur) ; scanf(%d,&X) ; for(i=0;i<L;i++) for(j=0;j<C;j++) R[i][j]=M[i][j]*X ; /* Affichage du tableau*/ for(i=0;i<L;i++) for(j=0;j<C;j++) printf(R[%d,%d]=%.3f\n,i,j,R[i][j]); /* Fin du programme*/ getch() ; }

3.2 Les Pointeurs 3.2.1 Dfinition et dclaration dun pointeur


Un pointeur est une variable qui a pour valeur ladresse dune autre variable : celle sur laquelle elle pointe. Un pointeur est toujours associ un type de variable et un seul. Au moment de la dclaration, on dtermine le type de variable pointe par le pointeur, en crivant le type concern, puis le nom du pointeur avec une * devant : type * nom_Pointeur ; Exemple : int *pta ; /* la variable pta est un pointeur sur un entier*/ int a ; /* la variable a est un entier*/

3.2.2 Oprateur dadresse : &


Pour affecter ladresse de la variable a au pointeur pta, on crit linstruction : pta=&a ; /*pta pointe sur a*/ Cet oprateur signifie donc adresse de.

3.2.3 Oprateur dindirection : *


Cet oprateur, mis en prfixe dun nom de pointeur signifie valeur de la variable pointe ou, plus simplement, le contenu de ladresse. Exemples : int x=1 ; int *px ; /* dclaration dun pointeur sur un entier */ px=&x ; /* px pointe sur x */ *px=12 ; /* la variable pointe par px reoit 12*/ char *pc; *pc = 34 ; char *pa; *pa = 'a'; /* le code ASCII de a est rang dans la case mmoire pointe par pa */ int *ad1, *ad2, *ad3 ; 23

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP3 : LES TABLEAUX ET LES POINTEURS


int n=10,p=20; ad1=&n; ad2=&p; *ad1=*ad2+2; /* n=p+2 */ *ad1+=3; /* *ad1=*ad1+3 ce qui signifie n=n+3 */ *(ad1)++; /* *ad1=*ad1+1 ce qui signifie n++ */ ad2=ad1; printf("x=%d\n",x) ; /* affiche x=12 */ printf("contenu de la case mmoire: %c\n",*pc) ; /* affiche contenu de la case mmoire: */ printf("valeur de l'adresse en hexadcimal: %p\n",pc);/*affiche son adresse en hexadcimal*/

3.2.4 Mmoire et Pointeurs


Les pointeurs et les noms des variables donnent accs un emplacement en mmoire centrale. Le nom dune variable reste toujours li la mme adresse mmoire On prend lexemple suivant : int a=0xa ; /* a est un entier cod sur 4 octets */ short b=0x0 ; /* b est un entier cod sur 2 octets */ int c=0x14 ; /* c est un entier cod sur 4 octets */ int *ptint ; ptint=&a ; On aura le tableau suivant : Nom a b c ptint Adresse bfbff000 bfbff004 bfbff006 bfbff010 Valeur code en hexadcimal 00 00 00 0a 00 00 00 00 00 14 bf bf f0 00

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

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP3 : LES TABLEAUX ET LES POINTEURS


}

3.3 Tableaux et Pointeurs


Le nom du tableau est un pointeur constant sur son premier lment. int tab[10] ; int *p=&tab[0] ; /*la variable p reoit ladresse du premier lment du tableau*/ En partant de cet exemple, on peut crire: Notation *p=10 ; *(p+1)=20 *(p+i)=-15 ; Equivalent tab[0]=10 tab[1]=20 tab[i]=-15

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

3.4 Allocation dynamique de mmoire


Jusqu maintenant, lors de la dclaration dun tableau, il fallait prciser les dimensions, soit de faon explicite soit de faon implicite. Dans ces deux cas on a dclare un tableau de dimension fixe. Mais si lon veut que le tableau change de taille dune excution une autre, cela nous oblige modifier le programme et le recompiler chaque fois, ou bien dclarer un tableau dune dimension trs grande et nutiliser que les n premires cases mais ce serait du gchis. Pour viter cela, on fait appel lallocation dynamique de mmoire : au lieu de rserver de la place lors de la compilation, on la rserve pendant lexcution du programme, de faon interactive. 25

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP3 : LES TABLEAUX ET LES POINTEURS


3.4.1 La fonction malloc()
malloc(N) renvoie ladresse dun bloc de mmoire de N octets libres (ou la valeur 0 sil ny a pas assez de mmoire). Exemple : int *p ; p = malloc(800);/* fournit ladresse dun bloc de 800 octets libres et laffecte au pointeur p */ /*Allocation dynamique dun tableau une dimension*/ int n ; int *tab ; printf("taille du tableau :\n") ; scanf("%d", &n) ; tab = (int *)malloc(n*sizeof(int)); /* le cast est ncessaire pour prciser le type de donnes sur lesquelles tab va pointer */ free(tab) ; /* on libre la place mmoire rserve*/ /*Allocation dynamique dun tableau de deux dimensions*/ int i,j,n,m ; float **tab ; scanf("%d%d",n,m) ; tab = (float **)malloc(n*sizeof(float *)) ; for (i=0 ; i<n ; i++){ tab[i] = (float *)malloc(m*sizeof(float)) ; } for (i=0 ; i<n ; i++){ for (j=0 ; j<m ; j++){ tab[i][j] = 10*i+j ; } } free(tab); Remarque : Ces fonctions sont dfinies dans les bibliothques STDLIB.H ou ALLOC.H (suivant votre compilateur).

26

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP3 : LES TABLEAUX ET LES POINTEURS TRAVAIL DEMANDE


TABLEAUX A UNE SEULE DIMENSION

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

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP3 : LES TABLEAUX ET LES POINTEURS


int A=1, B=2, C=3 ; int *p1, *p2 ; int A=1, B=2, C=3 ; p1=&A ; p2=&C; *p1=*p2 * B; p1=p2; p2=&B; *p1- =*p2; *p1* =*p2; A=*p2**p1; p1=&A; *p1=*p1/*p2; } Dterminer la valeur de chaque variable suite lexcution de chaque instruction. Exercice 7 : Soit P un pointeur qui pointe sur un tableau A. int A[]={12, 23, 34, 45, 56, 67, 78, 89, 90} ; int *P ; P=A ; Quelles valeurs ou adresses fournissent les expressions suivantes : *P+2 ; *(P+2) ; P++ ; A+3 ; TABLEAUX ET POINTEURS

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

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP4 : LES CHAINES DE CARACTERES


Le langage C offre quelques facilits d'critures pour simuler les chanes de caractres l'aide de tableaux. En plus de cela, certaines fonctions de la bibliothque standard (et les autres), principalement la bibliothque STRING.H, permettent de faciliter leur gestion. la diffrence d'un tableau, les chanes de caractres respectent une convention : se terminer par le caractre nul, '\0' (antislashzero). Ainsi, pour construire une chane de caractres la main , il ne faut pas oublier ce caractre final. En langage C, les chanes de caractres sont des tableaux de caractres. Leur manipulation est donc analogue celle d'un tableau une dimension.

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.2 Affichage l'cran


On peut utiliser la fonction printf et le format %s: Exemple : char message[10] = "salut"; printf("voici le message: %s\n",message); On utilisera si possible la fonction puts non formate: puts(message); /* est quivalent printf("%s\n",message) */;

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

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP4 : LES CHAINES DE CARACTERES


Remarques: Les fonctions printf et sanf permettent de lire et dafficher simultanment plusieurs informations le type quelconque. Par contre gets et puts ne traitent quune chane la fois. Avec le code %s de scanf, les dlimiteurs sont classiquement lespace, la tabulation ou la fin de ligne. Ceci interdit la lecture dune chane contenant des espaces. Avec gets, seule la fin de ligne sert de dlimiteur. Dans les appels des fonctions scanf et puts, les identificateurs de tableaux comme nom, prnom ou ville ne doivent pas tre prcds de loprateur & puisquils reprsentent dj des adresses. La fonction puts ralise un changement de ligne en fin de laffichage de la chane, ce qui nest pas le cas de la fonction printf avec le code format %s. La fonction gets fournit en rsultat, soit un pointeur sur la chane lue, soit un pointeur nul on cas danomalie.

4.4 Fonctions sur les chanes de caractres


Ces fonctions appartiennent la bibliothque STRING.H.

4.4.1 Comparaison des chanes


strcmp(chaine1, chaine2); Compare deux chanes dont on lui fournit les adresses et elle fournit une valeur entire dfinie comme tant : Exemple : strcmp(bonjour , monsieur) ; /*revoie un entier ngatif*/ strcmp(Tunis,Tunis) ; /*revoie un entier positif*/ positive si chaine1 > chaine2 (cest dire chainel vient aprs chaine2 au sens de lordre dfini par le code ASCII) nulle si chaine1 = chaine2 (cest dire que chaine1 et chaine2 contiennent exactement la mme suite de caractres). ngative si chaine 1 < chaine2

4.4.2 Longueur dune chane


strlen(chaine); Renvoie la longueur de la chaine (un entier) sans compter le caractre '\0'. Exemple : strlen("coincoin") ; /*renvoie 8*/

4.4.3 Concatnation et copie de chanes


strcpy (destination,source); /*copie le contenu de source l'adresse mmoire point par destination, incluant le caractre nul final*/ strncpy (destination, source, n); /*procde de manire analogue strcpy, en faisant la recopie au nombre de caractres prciss par lexpression entire n*/ strcat (destination,source); /*concatne la chane source la fin de la chane destination, en y rajoutant aussi le caractre nul final. Toutes ces fonctions renvoient le pointeur sur la chane destination*/ 30

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP4 : LES CHAINES DE CARACTERES


strncat (destination, source, n); /*procde de manire analogue strcat, en offrant en outre un contrle sur le nombre n de caractres qui seront concatns la chaine destination */

4.4.4 Recherche dans une chaine :


Ces fonctions renvoient ladresse de linformation recherche en cas de succs, sinon le pointeur NULL (c'est--dire le pointeur de valeur 0 ou encore le pointeur faux). strchr(chane, caractre) ; /* recherche le caractre dans chane*/. strrchr(chane, caractre) ; /* recherche le caractre dans chane en commenant par la fin*/. strstr(chane, sous-chane) ; /* recherche la sous-chane dans chane*/.

31

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP4 : LES CHAINES DE CARACTERES TRAVAIL DEMANDE


SAISIE ET AFFICHAGE DES CHAINES DE CARACTRES Exercice 1 : Ecrire un programme qui affiche le code ASCII de chaque lettre de votre prnom. Exercice 2 : Ecrire un programme qui saisit successivement chaque caractre de votre prnom puis les affiche. COMPARAISON, RECHERCHE ET CONCATENATION DES CHAINES DE CARACTRES Exercice 3 : Ecrire un programme qui saisit un caractre alphabtique et indique si celui-ci est une voyelle ou une consonne et sil sagit dune majuscule ou non. Vous utiliserez la table du code ASCII. Exercice 4 : Saisir un texte. Ranger les caractres en mmoire. Lire le contenu de la mmoire et y compter le nombre d'espaces et de lettres e. Exercice 5 : 1) crire un programme en C qui retourne le nombre de caractres que comporte une chaine ch saisie au clavier. 2) crire un programme qui recopie le contenu dune chane src dans la chane dest. Exemple d'utilisation : char mot[] = "Un beau dimanche"; /* une chaine initialise. */ char tut[256]; /* au max 255 caractres */ /* ici tut = "Un beau dimanche" */ 3) crire un programme en C qui ajoute la chane src la fin de la chane dest. 4) crire un programme en C qui teste si les deux chanes ch1 et ch2 sont identiques (c..d. ont le mme contenu), dans ce cas il affiche 0. Le programme affiche 1 si ch1 est aprs ch2 dans l'ordre lexicographique, -1 si ch1 est avant ch2. Exercice 6 : Saisir un texte. Ranger les caractres en mmoire. Lire le contenu de la mmoire et y compter le nombre d'espaces et de lettres e. Exercice 7 : Ecrire un programme qui lit 5 mots, spars par des espaces et qui les affiche ensuite dans une ligne, mais dans l'ordre inverse. Les mots sont mmoriss dans un tableau de chanes de caractres. Exemple voici une petite phrase ! ! phrase petite une voici

32

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP5 : LES FONCTIONS EN LANGAGE C


5.1 Dfinition
On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'excuter dans plusieurs parties du programme une srie d'instructions, cela permet une simplicit du code et donc une taille de programme minimale. En gnral, le nom d'une fonction apparat trois endroits dans un programme: lors de la dclaration ; lors de la dfinition ; lors de l'appel.

5.2 La dclaration des prototypes


Elle permet de dfinir au compilateur les paramtres d'entre et de sortie afin de pouvoir vrifier lors d'appel de fonction l'ordre de passage des paramtres. La dclaration de prototype se diffrencie de la dclaration de fonction par lajout dun point virgule ; en fin de ligne. Elle est situe au dbut du programme. La syntaxe de dclaration des prototypes est la suivante : Type_de_retour Nom_de_la_Fonction (TypeArg1 NomArg1, TypeArg2 NomArg2, ...); Type_de_retour est le type de la valeur renvoye par la fonction. Nom_de_la_Fonction est le nom de la fonction. type1 (ou TypeArg1) est le type du 1er argument Arg1... . NomArg1 : est le nom du 1er argument Arg1... . Exemple : float affine(float f, int d) ;/* la fonction affine accepte en ente un rel f et un entier d et retourne un rsultat de type rel.*/

5.2.1 Rgles pour la dclaration des fonctions


De faon analogue aux dclarations de variables, nous pouvons dclarer une fonction localement ou globalement. La dfinition des fonctions joue un rle spcial pour la dclaration. En rsum, nous allons considrer les rgles suivantes: Dclaration locale : Une fonction peut tre dclare localement dans la fonction qui l'appelle (avant la dclaration des variables). Elle est alors disponible cette fonction. Dclaration globale : Une fonction peut tre dclare globalement au dbut du programme (derrire les instructions #include). Elle est alors disponible toutes les fonctions du programme. Dclaration implicite par la dfinition : La fonction est automatiquement disponible toutes les fonctions qui suivent sa dfinition. Lors de la dclaration, le nombre et le type des paramtres doivent ncessairement correspondre ceux de la dfinition de la fonction. La fonction principale main n'a pas besoin d'tre dclare.

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

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP5 : LES FONCTIONS EN LANGAGE C


Type_de_retour Nom_de_la_Fonction( type1 arg1 , type2 arg2, ... , typen argn) { dclaration variables locales ; instructions ; return (expression) ; } Type_de_retour est le type de la valeur renvoye par la fonction. type1 est le type du 1er argument arg1... . Les variables locales : sont des variables qui ne sont connues qu lintrieur de la fonction. expression est value lors de linstruction return (expression) ; cest la valeur que renvoie la fonction quand elle est appele depuis main().arg1 , arg2, ... , argn sont les paramtres formels. La 1` re ligne de la dclaration est appele le prototype de la fonction. La valeur retourne est spcifie laide du mot rserv return. Exemple: float affine( float x ) { /* la fonction affine prend 1 argument rel */ /* et renvoie un argument rel */ int a,b ; /* paramtre locales*/ a=3 ; b=5 ; return (a*x+b) ; /* valeur renvoye par la fonction */ } Il est possible en C de crer des fonctions sans paramtres ou ne renvoyant aucune valeur (procdures). Pour cela on utilise un type prvu cette effet : void . On utilise ce type pour des fonctions censes affiches uniquement des messages par exemple. Exemple: void afficherBonjour() { printf("Bonjour !\n"); } /* pas de paramtres donc void */ /* pas de return*/

Il y a deux mthodes pour passer des variables en paramtre dans une fonction : le passage par valeur et le passage par variable.

5.3.1 Passage des paramtres par valeur


En C, le passage des paramtres se fait toujours par la valeur, c'est--dire les fonctions n'obtiennent que les valeurs de leurs paramtres et n'ont pas d'accs aux variables elles mmes. Les paramtres d'une fonction sont considrer comme des variables locales qui sont initialises automatiquement par les valeurs indiques lors d'un appel. A l'intrieur de la fonction, on peut donc changer les valeurs des paramtres sans influencer les valeurs originales dans les fonctions appelantes.

34

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP5 : LES FONCTIONS EN LANGAGE C


Exemple : /*La fonction ETOILES dessine une ligne de N toiles. Le paramtre N est modifi l'intrieur de la fonction*/ void ETOILES(int N) { while (N>0) { printf("*"); N--; } printf("\n");

} 5.3.2 Passage de l'adresse d'une variable


Comme on l'a constat ci-dessus, une fonction n'obtient que les valeurs de ses paramtres. Pour changer la valeur d'une variable de la fonction appelante, on va procder comme suit: la fonction appelante doit fournir l'adresse de la variable. la fonction appele doit dclarer le paramtre comme pointeur. On peut alors atteindre la variable l'aide du pointeur. Exemple : Pour pouvoir modifier le contenu de X et de Y, la fonction PERMUTER a besoin des adresses de X et Y. En utilisant des pointeurs, on crit: void PERMUTER (int *A, int *B) { int AIDE; AIDE = *A; *A = *B; *B = AIDE; } Nous appelons la fonction par: PERMUTER(&X, &Y); /* le contenu des variables X et Y est chang*/

5.4 Lappel de fonction


Il dirige le programme principal ou une autre fonction sur la fonction excuter en donnant les variables d'entres et ou l'affectation de la variable de sortie. Lappel d'une fonction se fait selon la syntaxe suivante : Cas dune fonction revoyant aucune valeur de retour : Var = Nom_de_la_fonction(Var_Arg1,Var_Arg2,,Var_ArgN) ; Cas dune procdure : Nom_de_la_fonction(Var_Arg1,Var_Arg2,,Var_ArgN) ; Elle est excute, mais le programme appelant ne reoit aucune valeur de retour. Cest une fonction de type void.

35

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP5 : LES FONCTIONS EN LANGAGE C


Var_Arg1,Var_Arg2,,Var_ArgN sont les paramtres effectifs.

36

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP5 : LES FONCTIONS EN LANGAGE C TRAVAIL DEMANDE


Exercice 1 : 1) Ecrire une fonction de prototype void Bonjour() qui affiche le message bonjour . 2) Ecrire une fonction de prototype void Classe() qui appelle la fonction Bonjour() et qui affiche le message Nous sommes la classe 1ere ING MECA . 3) Les mettre en uvre dans main(). Exercice 2 : 1) Ecrire une fonction de prototype void carr() qui calcule et affiche le carr de deux entiers a et b. 2) La mettre en uvre dans main(). Exercice 3 : 1) Ecrire une fonction de prototype int puissance() qui calcule la puissance de deux entiers ab. 2) La mettre en uvre dans main(). Exercice 4 : Ecrire une fonction C qui accepte en entre un nombre et affiche ce nombre en toute lettre. Ecrire un programme C qui permet de saisir un nombre et dafficher en toute lettre tous les entiers infrieur ce nombre et suprieur 0. Exercice 5 : Un programme contient la dclaration suivante: int tab[10] = {15, 3,28,1,-6,32,42,-15,89,-19}; /* variable globale */ 1) 2) 3) 4) 5) Ecrire une fonction de prototype void affiche() qui affiche les lments du tableau. Ecrire une fonction de prototype void Moyenne() qui calcule la moyenne du tableau. Ecrire une fonction int Max() qui renvoie la valeur maximale du tableau. Ecrire une fonction int Min() qui renvoie la valeur minimale du tableau. Les mettre en uvre dans main().

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

Dpartement de Gnie Electrique TRAVAUX PRATIQUES PROGRAMMATION C

TP5 : LES FONCTIONS EN LANGAGE C


b) permuter les valeurs de x et y en utilisant la fonction Permute. Exercice 8: Ecrire une fonction qui accepte en entre un tableau et retourne ce tableau tri par ordre croissant. Ecrire une fonction qui affiche les n lments dun tableau. Ecrire un programme C qui saisie une liste de n entier et dafficher cette liste trie.

38

PARTIE II : MINI PROJET EN PROGRAMMATION C

39

Dpartement de Gnie Electrique MINI PROJET EN PROGRAMMATION C

REDACTION DU RAPPORT ET EXPOSE


1 Rdaction du rapport :
Le rapport doit contenir 1) Un sommaire ; 2) Une introduction; 3) Deux chapitres : Un chapitre gnral qui dcrit toute lapplication Un deuxime chapitre de description dtaille du travail ralis : i) le programme principal : Les diffrentes variables globales ou locales du programme principal et leurs significations. ii) les diffrentes fonctions ralises : le prototype de chaque procdure ou fonction, liste des diffrentes variables locales utilises dans les fonctions et leurs significations ; le code de chaque fonction doit tre prsent par un organigramme bien structur. iii) les diffrentes structures proposes. 4) Une conclusion ; 5) Une liste bibliographique des rfrences utilises.

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

S-ar putea să vă placă și