Vous êtes sur la page 1sur 13

Objectifs du cours

M d l : Algorithmique Module Al ith i

1. Projection des notions dalgorithmique vers un langage de programmation 2 Prise en main des lments de base du Langage C 2.

Cours Programmation en langage C


2013-2014

3. Comprendre la syntaxe du langage C 4. Apprendre crire un programme simple en langage C

SAIDI Rajaa
r.saidi@insea.ac.ma

Bibliographie
Langage C

Plan du cours (1/2)


Introduction au langage C

Brian W. Kernighan, Dennis M. Ritchie : Le langage C : Norme ANSI ditions D Dunod, d Septembre S t b 2004 Robert Sedgewick : Algorithmes en langage C dition DUNOD, 2005

Historique du langage C Caractristiques du langage C tapes de la programmation en C C Composantes t dun d programme en C

Exercices en C

C. Delannoy : Programmer en langage C avec exercices corrigs, 5e dition 2009

Chapitre 1- Types de base, Oprateurs et Expressions


Les types simples Dclaration des variables simples Les oprateurs standards Priorit et associativit des oprateurs

Chapitre 2 2- Quelques fonctions particulires


Les Entres (Input) Les Sorties (Output)

Plan du cours (2/2)


Chapitre 3- Les structures de contrle

valuation et organisation
Examen final : 30% de la note final du module algorithmique Volume V l h horaire i : 14h

Structures de choix Structures itratives

Chapitre 4- Les tableaux


T bl Tableaux une di dimension i Tableaux plusieurs dimensions Implmentation des algorithmes de tri

Chapitre 5- Les chanes de caractres


Dfinition Dclarations et Initialisations dune chane de caractres Manipulation des chanes de caractres

Chapitre 6- Les structures de donnes


Type structure D l ti d Dclaration dune structure t t Utilisation des structures


5 6

Prliminaire
Avant la phase dcriture dun programme et de son implmentation, il faut dabord bien dfinir le problme (et les donnes associes) et cest l l ith i lalgorithmique qui i permet t de d le l rsoudre d

Algorithme : squence doprations visant la rsolution dun problme en un p fini temps

Chapitre 1 INTRODUCTION AU LANGAGE C

Une fois lalgorithme et les structures de donnes dfinis, on les code en un g g informatique et on obtient un programme g langage

Programme : suite dinstructions permettant de raliser une ou plusieurs tches, de rsoudre un problme, de manipuler des donnes

Nombreux langages de plus haut niveau ont t dfinis :


la programmation structure (C, Pascal, ) l programmation la ti fonctionnelle f ti ll (Lisp,) (Li ) la programmation logique (Prolog, ) La p programmation g scientifique q ( (Maple, p , Matlab,) , ) la programmation objet (Smalltalk, Eiffel, C++, Java, )
8

Historique du langage C
1972 : Dennis Ritchie (chercheur dans les laboratoires Bell) a conu le langage C pour dvelopper une version portable du systme dexploitation UNIX 1978 : une 1re dfinition du langage est apparue avec louvrage de Ritchie et t Kernighan K i h The Th C programming i l language Annes 80 : le langage C est devenu de plus en plus populaire que ce soit d dans l monde le d acadmique d i que celui l i des d professionnels f i l 1983 : lorganisme ANSI American National Standards Institute chargeait h it une commission i i d mettre de tt au point i t une dfinition dfi iti explicite li it et t indpendante de la machine pour le langage C 1989 : dfinition dfi iti de d la l norme ANSI-C ANSI C

Caractristiques du langage C
Universel : C n'est pas orient vers un domaine d'application spciale Proche de la machine : il offre des oprateurs qui sont trs proches de ceux du langage machine (ex. la gestion de la mmoire) Rapide : car trs proche du langage machine Indpendant de la machine : il peut tre utilis sur n'importe quel systme en possession d d'un un compilateur C Portable : en respectant le standard ANSI-C, il est possible d'utiliser le mme programme sur tout autre systme Extensible : le langage est anim par des bibliothques de fonctions extensibles

10

tapes de la programmation en C
C est un langage compil ( par opposition aux langages interprts). Un programme C est dcrit par un fichier texte, appel fichier source traduit en langage machine (langage binaire). Cette opration est effectue par le compilateur C La compilation se dcompose en 4 phases successives : Prprocesseur : transformation purement textuelle (inclusion dautres fichiers sources) C Compilation il ti : traduit t d it le l fichier fi hi pour gnrer un code en assembleur Assemblage : transforme le code assembleur en un fichier binaire ( fichier objet) Edition de liens : liaison des diffrents fichiers objets et production de lexcutable
11

Composantes dun programme en C


Les instructions du langage C sont obligatoirement encapsules dans des fonctions et il existe une fonction privilgie appele main qui est le point d dpart de d t de d tout t t programme

Dbut du p programme g #include <stdio.h> main() { int i=3;


Inclusion des bibliothques Point d'entre du programme Dclaration des variables Affichage de donnes Commentaire
12

printf( Bonjour %d fois!\n printf("Bonjour fois!\n", i);


/*Ce / Ce programme affiche Bonjour 3 fois! fois!*/ /

Fin du programme

Types simples
Un type dfinit l'ensemble des valeurs que peut prendre une , le nombre d'octets rserver en mmoire et les variable, oprateurs que l'on peut appliquer dessus En C, C il n'y a que deux types de base

Chapitre 1 TYPES DE BASE, OPRATEURS ET EXPRESSIONS

les entiers l rels les l

13

14

Types simples
Type Entiers char int short [int [int] ] long [ [int int] ] Rels float double long double Description caractres entiers entiers courts entiers longs nombres dcimaux nombres dcimaux de prcision suprieure nombres dcimaux encore plus prcis Octets 1 2 ou 4 2 4 4 8 10 ou 12

Dfinition dune variable


Dclaration d'une variable Type nom_de_la_variable [= valeur];

Type

Conditionne le format de la variable en mmoire

Nom

Unique pour chaque variable Commence toujours par une lettre Diffrenciation minuscule-majuscule

Remarques

Valeur

Un caractre (char) est un nombre entier (il s'identifie son code ASCII). Par consquent, une variable de type char peut contenir une valeur entre -128 et 127 et elle peut subir les mmes oprations que les variables du type short, short int ou long Si l'on ajoute le prfixe unsigned l'une de ces variantes, alors on manipule des entiers ti non signs i
15

Peut voluer pendant l'excution initialisation grce l'oprateur d'affectation (=)

Exemple

int nb; char c = 'a'; float pi = 3.14; double r = 6.2879821365;

16

Dfinition dune constante


En utilisant l'attribut const, la valeur d'une variable ne change pas au cours de lexcution du programme Exemples const int MAX = 767 ; const char NEWLINE = '\n' \n ; La directive #define permet de donner un nom une constante. Dans ce cas le prprocesseur effectue le remplacement correspondant avant la compilation Exemples #define TVA 20 #define PI 3.14159 int a; a=TVA; /*a prend la valeur 20*/
17

Oprateurs, Expressions & Instructions


Les oprateurs sont des symboles qui permettent de manipuler des variables, c'est--dire effectuer des oprations Une expression est un calcul qui donne une valeur comme rsultat et ayant un type Une expression peut comporter des constantes, des variables et des appels de fonctions combins entre eux par des oprateurs et former ainsi une expression i complexe l Toute expression suivie d'un point virgule devient une instruction

18

Les oprateurs (1/5)


Affectation simple Syntaxe Sy ta e : <variable> a ab e = <expression> e p ess o ; Exemple const t int i t LONG = 141 ; /* affectation ff t ti de d valeurs l constantes t t */ On peut enchaner des affectations. L'valuation commence de la droite vers la gauche Exemples b=(a = 5 + 3)+1 a=b=c=d quivalente : a = 8 et b = 9 a = (b = (c = d)) -= *= /= %=

Les oprateurs (2/5)


Arithmtiques

addition (+), soustraction (-), multiplication (*) et division (/)

Relationnels

<, <= , > , >= , != , == (galit) , =(affectation), ! (ngation), || (ou logique), && (et logique),%(reste de la division) le rsultat de la comparaison est un entier valant
0 si le rsultat de la comparaison est faux 1 si le rsultat de la comparaison est vrai

Exemple
a = 2+3 a = 3%2 a = (6==5) (6 5) a = (2!=3) a = (6<=3) a =((3==3) || (6<=3)) a =((3==3) && (6<=3))
19

Oprateurs d'affectation tendue : += Exemple a = a + b s'crit a += b

valeur de a : 5 valeur de a : 1 valeur de a : 0 valeur de a : 1 valeur de a : 0 valeur de a : 1 valeur de a : 0


20

Les oprateurs (3/5)


Oprateurs particuliers de C

Les oprateurs (4/5)


Oprateurs particuliers de C : Exemple a t chaque c aque op opration, at o , i et j co contiennent t e e t respectivement espect e e t 3 et 15 5 Avant

Oprateurs d'incrmentation (++) et de dcrmentation (--) P Post-incrmentation i i <var>++; quivalente i l <var>=<var>+1; 1 Post-dcrmentation <var>--; quivalente <var>=<var>-1; Dans une expression, la valeur de la variable <var> est d'abord utilise telle quelle, puis incrmente (ou dcrmente) Exemple int a, b; a=b++; quivalent a=b, b=b+1;

Opration i++;++j; i=++j; i=j++; j=--i+5; j=i--+5; i=i++;

quivalent i=i+1;j=j+1 j=j+1; i=j; i=j; j=j+1; i=i-1; j=i+5; j=i+5; i=i-1; i=i; i=i+1

Rsultat i=4 et j=16 i=16 et j=16 i=15 et j=16 i=2 et j=7 i=2 et j=8 i=4

Pr-incrmentation Pr incrmentation ++<var>; quivalente <var> <var>=<var>+1; <var>+1; Pr-dcrmentation --<var>; quivalente <var>=<var>-1; Dans une expression, la valeur de la variable <var> est d'abord incrmente (ou dcrmente) puis utilise dcrmente), Exemple int a, b; a=++b; quivalent b=b+1, a=b;
21

22

Les oprateurs (5/5)


Oprateur squentiel ( , ) e p , <expr2>,, e p , , <exprN> e p <expr1> Exprime des calculs successifs dans une mme expression Exemple E l L'expression : x = 5 , x + 6 a pour valeur 11 Oprateur conditionnel (? :) <expression> ? <expr1> : <expr2> <expression> est value. Si sa valeur est non nulle, alors la valeur de <expr1> est retourne. Sinon, c'est la valeur de <expr2> qui est renvoye Exemple c=a>b?a:b si a est le plus grand, alors affectation c le contenu de a sinon affectation c le contenu de b

Priorit et associativit des oprateurs


Lors de l'valuation des diffrentes parties d'une expression, les oprateurs respectent certaines lois de priorit et d'associativit Exemples Prenons a = 3 et b = 4, lexpression a *= b += 5 s'value : a *= ( b += 5 ) a *= ( b = b + 5 ) a *= ( b = 9 ) a *= 9 a=a*9 a = 27 27 Priorit 1 2 3 4 5 6 7 Oprateur () */% +== != && = += *= Associativit

! ++ -- (Pr)

23

24

Exercice 1
Donner la valeur de i, j, n aux endroits demands
#include<stdio.h> main() { i t i, int i j j, n; i=0;n=i++; A:i=?n=? i=10; n=++i; B:i=?n=? i=20; j=5; n=i++ * ++j; C:i=?n=? i=15; n=i+=3; D:i=?j=?n=? i=3; j=5; n=i*=--j; E:i=?j=?n=? }
25

Exercice 2
Donner la valeur de n, p, q, r aux endroits demands
Associativit += *=

Priorit 1 2 3 4 5 6 7

Oprateur () */% +-* == != && =

#include<stdio h> #include<stdio.h>


main() { int n=10, , p=5, p , q=10, q , r; ; r=n== (p=q); A:n=? p=? q=?r=? n= p=q=5; n+=p+=q; B: n = ? p = ? q = ? q=n<p q p ? n++ : p p++; ; C: n = ? p = ? q = ? q= n>p ? n++ : p++; D: n = ? p = ? q = ? }

Priorit 1 2 3 4 5 6 7

Oprateur () */% +-* == != && = += *=

Associativit

! ++ -- ( (Pr) )

! ++ -- ( (Pr) )

26

Affichage de la valeur dune variable (1/4)


Utilisation de la fonction printf Syntaxe : printf( printf("format format daffichage" d affichage , variables)

Chapitre 2 QUELQUES FONCTIONS PARTICULIRES

format : texte, caractres de contrle (\n , \t , ) et spcificateurs de format spcificateurs de format FORMAT %d ou %i %u %o %x %c %f %e %s
27

TYPE int Unsigned int int int char float ou double float ou double char*

Description entier relatif entier naturel (unsigned) entier exprim en octal entier exprim en hexadcimal caractre rel en notation dcimale rel en notation exponentielle chane de caractres
28

Affichage de la valeur dune variable (2/4)


Utilisation de la fonction printf Syntaxe : printf( printf("format format daffichage" d affichage , variables) Exemple 1 int a = 120 ; int b = 60 ; printf("%i i tf("%i plus l %i est t %i\ %i\n", " a, b, b a + b) ; //Affiche sur l'cran : 120 plus 60 est 180 Exemple E l 2 char b = 'A' ; /* le code ASCII de A est 65 */ printf("Le caractre %c a le code %i\n", b, b) ; // Affiche sur l'cran : Le caractre A a le code 65

Affichage de la valeur dune variable (3/4)


Caractres de contrle
Caractre de contrle `\a` `\t` `\n` `\r` `\0` \0 `\\` `\?` \? `\"` `\f` `\v` Signification g Bip sonore Tabulation horizontale Passage la ligne suivante Retour chariot Caractre nul Trait oblique (antislash) Point dinterrogation d interrogation Guillemets Saut de page Tabulation verticale

Exemple

char b = 'A' ; printf("\tLe caractre %c a le code %i\n", b, b) ;


29 30

Affichage de la valeur dune variable (4/4)


Utilisation de la fonction printf Action sur le gabarit daffichage d affichage
Les entiers sont affichs par dfaut sans espaces avant ou aprs Les flottants avec six chiffres aprs le point Pour agir sur laffichage, un nombre est plac aprs % et prcise le nombre de caractres minimum i i utiliser ili

Lecture dune valeur saisie au clavier


Utilisation de la fonction scanf Syntaxe : scanf( scanf("format format de lecture lecture", &variables) Exemple
#include <stdio.h> <stdio h> main() { int n, p; //dclaration des variables printf("donner une valeur pour n : "); scanf("%d",&n); // lecture de la valeur de n //affichage de la valeur de n printf("Merci pour %d\n",n); p printf("donner ( une valeur p pour p : "); ) scanf("%d",&p); // lecture de la valeur de p //affichage de la valeur de p printf( Merci pour %d\n" printf("Merci %d\n ,p); p); }
31 32

Exemples
printf("%f" , x ); x = 1.2345 printf("%3d" , n ); n = 20 n=3 n = 2358 n = -5200 ^20 20 ^^3 2358 -5200 printf("%10f" , x ); //cadrage droite x = 1.2345 x = 1.2345 ^^1.234500 1.234500 ^^ printf("%-10f" , x ); //cadrage gauche x = 12.3456789 1.234500 12.345678

Affichage dun caractre


Utilisation de la fonction putchar Syntaxe : putchar(variable) // variable de type int ou char Exemple
char c = 'a' ; char b = '\n' ; putchar('x') ; /* affiche la lettre x */ putchar('?') ; /* affiche le symbole ? */ / / putchar(b) ; /* retour la ligne */ putchar(65) ; /* affiche le caractre de code ASCII = 65 c.--d. la lettre A */ putchar(c) ; /* affiche le caractre a */ / /

Lecture dun caractre


Utilisation de la fonction getchar() Syntaxe : char variable = getchar() Cette fonction peut accepter un caractre saisi au clavier, y compris un caractre spcial, spcial et l l'afficher afficher sur l l'cran cran Exemple
printf("donner une valeur pour le caractre c "); char c =getchar(); //scanf("%c",&c);

33

34

Exercice
Ecrire un programme qui permute et affiche les valeurs de trois variables A, B, C de type entier saisis par le clavier( A-->B, B-->C, C-->A) Correction
#include<stdio.h> main() { i t A, int A B B, C; C int AIDE; printf("Entrer p ( la valeur de A, , B et C :\t"); ); scanf("%d %d %d", &A,&B,&C); printf("A=%d \t B=%d\t C=%d\n",A,B,C); AIDE= A; A=C; C=B; B=AIDE; printf("A=%d \t B=%d\t C=%d\n",A,B,C); }
35 36

Chapitre 3 STRUCTURES DE CONTROLE

Structures de contrle
Structures de choix Structures itratives Instructions break et continue

Structures de choix (1/3)


Contrlent le droulement de lenchanement des instructions lintrieur dun programme Ces instructions peuvent tre exprimes par

Des instructions de branchement conditionnel : if .else Des instructions de branchement multiple : switch

37

38

Structures de choix (2/3)


Branchement conditionnel : if .else Syntaxe
if( expression) instruction;

Exercice 1
Ecrire un programme qui affiche le plus grand de trois entiers saisis au clavier (A,B,C) Correction
#include<stdio.h> main() { int A,B,C, Max; printf("entrer p ( e e les es valeurs a eu s des trois o s entiers e e s (A, ( , B, , C) : "); ); scanf("%d %d %d",&A,&B,&C); if(A>B) Max = A; else Max = B; if(C>Max) Max = C; printf("le max de %d,%d et %d est : %d\n",A,B,C,Max); }

ou
if( expression) { Instruction1; } else { instruction2; }

expression : expression quelconque. Aprs p valuation, , si elle est vraie, , alors le 1er bloc dinstructions est excut, sinon cest le 2me bloc qui est excut bloc dinstructions : peut dsigner une suite d dinstructions instructions dlimites par des accolades ou une seule instruction

Max =(A>B?A:B)>C?(A>B?A:B):C;

Exemple
if (a == b) a=1; a 1; //si a gal b jaffecte j affecte 1 a if (a == b) a=1; else a=0; //si a gal b jaffecte 1 a sinon jaffecte 0 a
39

40

Exercice 2
Ecrire un programme qui rsout l'quation AX+B=0

Structures de choix(3/3)
Branchement multiple : Switch Syntaxe
switch (expression) { case constante_1 : [ suite_d'instructions_1 ] ; case constante_2 : [ suite_d'instructions_2 ]; .............. case constante_n : [ suite_d'instructions_n ]; default : suite_d'instructions ; } Teste si une expression prend une parmi une suite de valeur p constantes, et effectue le branchement correspondant si cest le cas

Bien videmment, on n'oubliera pas tous les cas particuliers (notamment les cas "tout x est solution" et "pas de solution")

Correction
#include<stdio.h> main() { float A,B; printf("Tapez la valeur de A :"); scanf("%f",&A); printf("Tapez la valeur de B :"); scanf("%f",&B); if(!A) /* if(A==0)*/ if(A 0)*/ { if(!B) /* if(B==0) */ printf("Tout X est solution"); else printf("Pas de solution"); } else printf("Une seule solution : %f", -B/A); }
41

Exemple
int a; switch it h (a) ( ) { case 7 : a=2; //si a gal 7 jaffecte 2 a case 4 : a a=3; 3; //si a gal 4 jaffecte j affecte 3 a default : a=0; //sinon jaffecte 0 a }
42

Structures itratives (1/3)


Instructions itratives : while
while( expression p ) { instructions; }

Structures itratives (2/3)


Instructions itratives : do while on vrifie la condition avant dexcuter d excuter la liste dinstructions
do { instructions; } while( expression );

on excute la liste dinstructions d instructions avant de vrifier la condition

Exemple
int a=0; while(a<4) //tant que a<4 jexcute les instructions suivantes { a++; printf ("La valeur de a :%d \n", a); }

Exemple
int a=0; do //faire les instructions suivantes { a++; // jincrmente ji t ad de 1 printf ("La valeur de a :%d \n", a); } while(a<4); hile(a<4) //tant que q e a<4
43 44

Structures itratives(3/3)
Instructions itratives : for
for( exp1 ; exp2 ; exp3 ) { instructions; }

Exercice 1
Ecrire un programme qui calcule n! dun entier saisi par le clavier. Utiliser une boucle while puis une boucle for Correction
// Avec la boucle while #include <stdio.h> main() { int n,i=1,fact= 1; printf("ENTRER UN ENTIER : "); scanf("%d",&n); f("%d" & ) while (i<=n) { fact= fact * i; i++; } printf("\nn = %d n! = %d",n,fact);
45

exp1 : effectue les initialisations ncessaires avant lentre dans la boucle exp2 : est le test de continuation de la boucle ; le test est valu avant l lexcution excution du corps de la boucle exp3 : est excute la fin du corps de la boucle

//Avec la boucle for #include <stdio.h> main() { int n,i,fact= 1; printf("ENTRER UN ENTIER: "); scanf("%d",&n); for (i=1;i<=n;i++) fact= fact * i; fact printf("\nn = %d n! = %d",n,fact); }

Exemple E l
int a; for( a=0; a<4 ; a++ ) { printf ("La valeur de a :%d \n", a); }

Remarques : En pratique, exp1 et exp3 contiennent souvent plusieurs initialisations (instructions) ( ) spares p par des virgules p g Les expressions exp1 et exp3 peuvent tre absentes (les points virgules doivent cependant apparatre) : for (;exp2;)

46

Exercice 2
Ecrire un programme qui affiche tous les diviseurs dun entier n saisi par le clavier. Utiliser la boucle dowhile Correction
#include <stdio.h> main() { int div=1,n; printf("ENTRER UN ENTIER: "); scanf("%d",&n); printf("\nLISTE DES DIVISEURS DE %d :",n); do { if(n%div==0) printf("\t%d",div); div++; } while(div<=n/2); if(n!=1) printf("\t%d",n); }
47

Instructions break et continue (1/2)


Instruction break

Linstruction break peut tre employe lintrieur de nimporte quelle boucle (for ; while ; dowhile ; switch) Elle permet labandon de la structure et le passage la premire instruction qui suit la structure En cas de boucles imbriques, break fait sortir de la boucle la plus interne

Exemple int i, j ; for (i = 1 ; i<=10 ; i++) { for (j = 1 ; j<=10 ; j++) { if(j == 5) break ; printf("%d\t", i * j) ; } printf("\n") ; }

48

Instructions break et continue (2/2)


Instruction continue

Exercice 1
Que fait ce programme?
#include <stdio.h> main() { int n=0; do { if(n%2==0) { printf("%d est pair \n ",n); n+=3; continue; } if(n%3==0) { printf("%d est multiple de 3 \n ",n); n+=5; 5 } if(n%5==0) { printf("%d est multiple de 5 \n ",n); break; } n+=1; } while(1); }

Linstruction continue peut tre employe lintrieur dune structure de type boucle (for ; while ; dowhile ) Elle permet labandon de litration courante et fait passer directement litration suivante dune boucle Linstruction continue concerne la boucle la plus interne

Exemple int i, j ; //Initialisations for ( ; i>0 && j>0; i--,j--) { if(i == 5) continue; printf("i : %d et j : %d\n", i, j) ; if(j == 5) break ; }

Valeurs i=2 et j=3 i=6 et j=3 i=3 et j=5

Affichage i : 2 et j : 3 i : 1 et j : 2 i : 6 et j : 3 i : 4 et j : 1 i : 3 et j : 5

49

50

Exercice 2
crire un programme qui fournit la liste des nombres premiers infrieurs 50 Correction
#include <stdio.h> main() { int n; /* variable destine contenir les entiers infrieurs 50 */ int i; printf("1, 2"); /* Les deux premiers nombres premiers sont affichs */ /* Pour les entiers entre 3 et 50, on vrifie s'ils ont un diviseur autre que 1 */ for (n = 3; n <= 50; n+=2) /* Vrifier seulement les nombres impairs*/ { f (i = 3; for 3 i*i <= n; i i+=2) 2) /* Vrifier V ifi seulement l t lexistence l i t dun d di diviseur i i impair*/ i */ if (n%i==0) break; if (i*i > n) printf(", %d", n); } }
51