Le Langage C

Embed Size (px)

Citation preview

Langage de Programmation- Le Langage C -

Sommaire 1. 2. 3. 4. 5. 6.

Histoire du langage C Introduction au langage lments de base (rgles dcriture, types) Les variables Oprateurs et expressions Les entres-Sorties (printf, scanf) Les structures de contrle

Sommaire7. 8. 9. 10. 11. 12.

Classification des variables Les objets structurs (tableaux, structures) Les Fonctions Les pointeurs Les fichiers Le prprocesseur (#include, #define)

Histoire du C

Origines

C a trois anctres: les langages CPL, BCPL et B. CPL : (pour Combined Programming Language) a t conu au dbut des annes 1960 - universits de Cambridge et de Londres. Fortement typ mais trop complexe disparition dans las anne 70 BCPL : (pour Basic CPL) Cambridge en 1966 par Martin Richards. Version siplifie Ecriture dun 1er Compilateur et de divers systmes dexploitations B : Ken Thompson vers 1970 dans les laboratoires Bell Version simplifie du BCPL

Histoire du CC: dvelopp par un collgue de Ken Thompson, Dennis Ritchie qui ajouta les tableaux, les pointeurs, les nombres virgule flottante, les structures... 1972 fut l'anne de dveloppement la plus productive et sans doute l'anne de baptme de C. En 1973, C fut suffisamment au point pour que 90% de UNIX puisse tre rcrit avec. - Une 1re dfinition du langage est apparue en 1978 avec louvrage de Ritchie et Kernighan The C programming language. - Son succs international a contribu sa normalisation: 1- ANSI (American National Standard Institute 2- ISO (International Standadization Organisation 3- CEN (Comit Europen de Normalisation) en 1993

1. Introduction au langage C- Le langage C est un langage de bas niveaux, dans le sens o il permet la manipulation de donnes que manipulent les ordinateurs (Bit, octet, adresse) Langages volus (Pascal, Fortran, ADA) - Il est suffisamment gnral pour permettre de dvelopper des application de type scientifique ou de gestion base sur laccs aux bases de donnes (Word et Excel sont crits partir de C ou C++) - Il est un des 1ers langages offrant des possibilits de programmation modulaire: Un programme peut tre constitu de plusieurs module (module = fichier .c)

1. Introduction au langage C- Un langage de programmation a pour finalit de communiquer avec la machine. Le langage maternel de la machine n'utilise que deux symboles (0 et 1): c'est le langage machine. Exemple: le nombre 5 est reconnu par une machine par la succession des symboles 101 (c'est la reprsentation du nombre en base 2). De mme, les oprations qu'une machine est capable d'excuter sont codes par des nombres, c'est--dire une succession de 0 et 1. Par exemple, l'instruction Machine 00011010 0001 0010 demande la machine d'effectuer l'opration 1+2. Ce langage est le seul qui soit compris par l'ordinateur, Est-il alors le seul moyen pour communiquer avec celui-ci??? Rponse : Non, utilisation du langage assembleur : add $1 $2

Il fut suivi par des langages plus sophistiqus et de plus en plus proche du langage humain

1. Introduction au langage C- La programmation structure (Fortran, Pascal, C, Perl, Tcl ), - La programmation structure et modulaire (Ada, Modula), - La programmation fonctionnelle (Lisp) - La programmation logique (Prolog) - La programmation objet (C++, Java, VB.net, C# ).

Compilateur

1. Introduction au langage CQuest ce quun programme C? Cest un texte crit avec un diteur de texte, respectant une certaine syntaxe et stock sous forme d'un ou plusieurs fichiers (gnralement avec l'extension .c). A l'oppos du langage assembleur, les instructions du langage C sont obligatoirement encapsules dans des fonctions et il existe une fonction privilgie appele main qui est le point de dpart de tout programme. Exemple: main() { printf(Bonjour!); } Source.c Compilation Objet.o Edition des liens Excutable

2. lments de base2.1 les fichiers includeExemple: # include main() { printf(Bonjour!); } La directive #include inclu le fichier stdio.h au programme avant la compilation (pour pouvoir utiliser la fonction prdfinie printf. On parle alors de prproceseur

2. lments de base2.2 les CommentairesExemple: # include //pour pouvoir utiliser la fonction printf main() { printf(Bonjour!); } /*Ce programme imprime la chaine de caractre Bonjour! lcran*/

2. lments de base2.3 Prsentation de quelques instructions du langage C

2. lments de base2.3 Prsentation de quelques instructions du langage CExemple 2 :

2. lments de base2.4 Les identificateursLes identificateurs servent dsigner les diffrents objets manipuls par le programme:Variables, fonctions, - Commence ncessairement par une lettre - une lettre majuscule est tenue pour diffrente de la lettre minuscule correspondante; - Au plus 31 caractre - Le caractre _ (appel blanc soulign ) est considr comme une lettre ; il peut donc figurer n'importe quelle place dans un identificateur: _Total2, Prix_unit

2. lments de base2.5 Les Types dans CLes types de base du langage C se rpartissent en 3 grande catgories en fonction de la nature des informations quils permettent de reprsenter: Nombres entiers (int) Nombres flottants (float ou double) Caractre (char): apparat en C comme un cas particulier de int.

Ils peuvent tre signs ou non signs : signed ou unsigned (unsigned int x;)

2. lments de basea. Les Types Entiers

short int ou short (entier sur 16 bits : - 32 768 32 767) int (entier sur 32 bits : - 2 147 483 648 2 147 483 647) long int ou long (entier sur 32 bits ou 64 bits, selon les machines)

Chacun des 3 peut tre nuanc par lutilisation du qualificatif unsigned pour ne reprsenter que des nombres positifs: Exemple: unsigned short x; x peut aller de 0 65 535 pas de bit rserv pour le signe - C accepte les constantes entire en notation dcimale, hexadcimale ou octale

2. lments de baseb. Les Types FlottantsFloat : cod sur 4 octets avec 1 bit de signe, 23 bits de mantisse et 8 bits d'exposant Double : cod sur 8 octets avec 1 bit de signe, 52 bits de mantisse et 11 bits d'exposant Long : cod sur 10 octets avec 1 bit de signe, 64 bits de mantisse et 15 bits d'exposant

- C accepte les constantes flottante en notation dcimale ou scientifique 3.5e+3 3500 2.43 -0.38 -.38 4. .27

2. lments de basec. Le Type CharEn C, un caractre est un entier sign cod sur 1 octet Notation des constantes caractres : a , $ ..

Important:

a a

Il existe des caractres non imprimables, tel que le changement de ligne, de Tabulation, en voici un tableau rcapitulatif

2. lments de baseNOTATION \a \b \f \n \r \t \v \\ \' \ '' \? RESULTAT cloche ou bip (alert ou audible bell) Retour arrire (Backspace) Saut de page (Form Feed) Saut de Ligne (Line Feed) Retour chariot (Carriage Return) Tabulation horizontaLe (HorizontaL Tab) Tabutation verticale (VerticaL Tab) \ ?

2. lments de baseA propos du type boolen :

Pas de type boolen en C. Le type boolen est reprsent par un entier. Il se comporte comme la valeur boolenne vraie si cette valeur entire est non nulle. Dans un contexte qui exige une valeur boolenne (comme les tests, par exemple), un entier non nul quivaut vrai et la valeur zero quivaut faux

2. lments de base2.6 Les Mots rservs

Les mots suivants sont rservs. Leur fonction est prvue par la syntaxe de C et ils ne peuvent pas tre utiliss dans un autre but :auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while

3. Les Variables3.1 DeclarationChar Unsigned Auto Register Static extern Const volatile Float Double Long double Signed Short Int long identificateur = expression

Exemple:

int x, y=0, z; extern float a,b; static unsigned short n=1000;

3. Les Variables3.2 Les variables statiques locale

Le qualificatif static, plac devant la dclaration d'une variable locale, produit une variable qui est: -Pour sa visibilit , locale -Pour sa dure de vie, statique (Permanente) Elle n'est accessible que depuis l'intrieur du bloc ou elle est dclare, mais elle est cre au dbut du programme et elle existe aussi longtemps que dure l'excution de celui-ci. Exemple : void bizarre(void) { static int cpt = 1000; printf("%d ", cpt); cpt++; } Appels conscutifs : 1000 1001 1002

4. Oprateurs et ExpressionsC dispose d'un important ventail d'oprateurs originaux d'affectation et d'incrmentation.

4.1 Oprateurs arithmtiques en C

Comme tous les langages, C dispose d'oprateurs classiques "binaires" , savoir l'addition (+), la soustraction (-), la multiplication (*) et la division (/), ainsi que d'un oprateur "unaire" correspondant l'oppos not - (comme dans -n ou -x+y). Les oprateurs binaires ne sont priori dfinis que pour deux oprandes ayant le mme type parmi: int, long int, float, double, long double et ils fournissent un rsultat de mme type que leurs oprandes.

4. Oprateurs et Expressions4.1 Oprateurs arithmtiques en CDe plus, il existe un oprateur de "modulo" not % qui ne peut porter que sur des entiers et qui fournit le reste de la division de son premier oprande par son second. Par exemple, 11%4 vaut 3, 23%6 vaut 5 Remarque: le quotient de deux entiers fournit un entier. Ainsi 5/2 vaut 2; en revanche, le quotient de deux flottants (not, lui aussi, /) est bien un flottant (5.0/2.0 vaut bien approximativement 2.5). Priorit des oprateurs : les rgles sont "naturelles" et rejoignent celles de l'algbre traditionnelle

4. Oprateurs et ExpressionsConversions implicites :

On peut crire des expressions mixtes dans lesquelles interviennent des oprandes de types diffrents: Int n,p; float x; Conversion implicite: int float Mme mcanisme : n*x + p (int * float) + int ( float*float) + int float float + + int float float

On parle de conversion dajustement de type: intlongfloatdoublelong double

4. Oprateurs et ExpressionsPromotions numriques :

On a vu que les oprateurs numriques ne sont pas dfinis pour le types char et short :

C prvoit que toute valeur char ou short soit dabord convertie en int. short n,p; float x; Conversion systmatique: Conversion implicite : n*x + p (short * float) + short ( int * float) + int float + float float float * float + int

4. Oprateurs et Expressions4.2 Oprateurs RelationnelsComme tout langage, C permet de "comparer" des expressions l'aide d'oprateurs classiques de comparaison. exemple : 2*a > b +5

Par contre, C se distingue de la plupart des autres langages sur deux points: 1-le rsultat de la comparaison est, non pas une valeur "boolenne" (on dit aussi "logique") prenant l'une des deux valeurs vrai ou faux, mais un entier valant:

0 si le rsultat de la comparaison est faux, 1 si le rsultat de la comparaison est vrai.

Ainsi, la comparaison ci-dessus devient en fait une expression de type entier. Cela signifie qu'elle pourra ventuellement intervenir dans des calculs arithmtiques;

4. Oprateurs et Expressions4.2 Oprateurs Relationnels2-les expressions compares pourront tre de type quelconque et seront soumises au rgles de conversion prsentes prcdemment. Liste des oprateurs: < >= mme priorit Exemple: a < b == c < d == !=

> mme priorit

(a < b) == (c < d)

Remarque: les oprateurs relationnels sont moins prioritaires que les oprateurs arithmtiques ( x+y < a+2 (x+y) < (a+2) )

4. Oprateurs et Expressions4.3 Oprateurs LogiquesC dispose de trois oprateurs logiques classiques: et (not &&), ou (not | |) et non (not ! ). Par exemple: (a 7 char *ch= "coucou"; strlen(adr); ==> 6

Concatnation de chanesstrcat: concatne 2 chanes strcat( but, source) char ch1[50] = "Comment"; char *ch2 = "cava"; strcat(ch1,ch2); ch1 ==> "Commentcava" strncat: concatne 2 chanes avec contrle de la longueur strcat( but, source, lgmax) char ch1[50] = "Comment"; char *ch2 = "cava"; strcat(ch1, ch2, 2); ch1 ==> "Commentca"

Comparaison de chanes

strcmp: compare 2 chanes, ordre des codes de caractre (ASCII). strcmp( ch1, ch1)positif si ch1 > ch2 nul si ch1 = ch2 ngatif si ch1 < ch2

strcmp("bonjour", "madame"); ==> ngatif strcmp("bonjour", "andre"); ==> posit

Copie de chanes

strcpy: copy source dans dest. strcpy( dest, source) strncpy: de mme que strcpy avec longeur max. strncpy( dest, source, lgmax) char ch1[20] = "123456789" char ch2[20] = "coucou" strncpy(ch1, ch2, 3); ==> ch1 = "cou456789" strncpy(ch1, ch2, strlen(ch2) + 1); ==> ch1 = "coucou"

Recherche dans une chane

On peut rechercher l'occurrence d'un caractre d'une sous chane, les fonctions renvoient un pointeur sur l'endroit recherch ou NULL dans le cas contraire. strchr( chane, caractre) en partant du dbut strrchr( chane, caractre) en partant de la fin strstr( chane, sous-chane) en partant du dbut

Conversion

Les fonctions de conversion ignorent les espaces de dbut de chane et utilisent les caractres suivants pour fabriquer une valeur numrique. Un caractre illgal arrte le traitement. Si aucun caractre n'est exploitable, renvoie nul. atoi( chane) int atol( chane) long atof( chane) double

Exercices

Exercice 1. crire un programme dterminant le nombre de lettres e (minuscules) prsentes dans un texte de moins d'une ligne (suppose ne pas dpasser 132 caractres) fourni au clavier.

Exercice 2. crire un programme qui supprime toutes les lettres e (minuscules) d'un texte de moins d'une ligne (suppose ne pas dpasser 132 caractres) fourni au clavier. Le texte ainsi modifi sera cr, en mmoire, la place de l'ancien.

Correction

#include #include #define CAR 'e' #define LGMAX 132 main() { char texte[LGMAX+1] ; char * adr ; int ncar ; printf ("donnez un texte termin par return\n") ; gets (texte) ; Ncar = 0 ; adr = texte ; while ( adr=strchr(adr,CAR) ) { ncar++ ; adr++ ;} printf ("votre texte comporte %d fois le caractre %c", ncar, CAR) ;}

Correction

#include #include #define CAR 'e' #define LGMAX 132 main() { char texte[LGMAX+1] ; char * adr ; printf ("donnez un texte termin par return\n") ; gets (texte) ; adr = texte ; while ( adr=strchr(adr,CAR) ) strcpy (adr, adr+1) ; printf ("voici votre texte priv des caractres %c\n", CAR) ; puts (texte) ; }

Les structures

DfinitionLa structure permet de regrouper diffrentes variables en une seule.Exemple : Struct produit { int id; int qte; Float prix; }; Struct produit oeuf; "produit" est un modle de structure, il n'y a pas de rservation de place mmoire. "id", "qte" et "prix" sont nomms champs. "oeuf" est une variable de type "produit", la place mmoire est rserve lors de la dclaration de "oeuf".

Accs au champs

On peut concentrer l'criture (pas recommand):Struct produit{ int id; Int qte; Float prix; }oeuf, tomate, mozarella; L'accs au champs se fait par l'oprateur point : oeuf.prix = 1.15; printf("%f", oeuf.prix); scanf("%f", &oeuf.prix); oeuf.prix++;

L'affectation

L'affectation entre 2 structures de mme modle : Struct produit oeuf, tomate; tomate = oeuf; ce qui quivaut : tomate.prix = oeuf.prix; tomate.qte= oeuf.qte; tomate.id = oeuf.id; Remarque: l'affectation globale entre 2 tableaux est impossible, mais on peut la raliser en crant une structures contenant un tableau

Initialisation des structures

Les structures suivent la rgle des classes d'allocation. Il est possible d'initialiser explicitement avec des expressions constantes et non des expressions quelconques, comme les tableaux.Struct produit tomate = { 2, 2000, 2.15 };

La taille d'une structure dpend des contraintes d'alignement:Struct taille {intx; char c; }t; printf(" taille %d \n", sizeof(t));

La taille de t devrait tre 5, mais en fait sizeof renvoie la taille relle 8.

TypedefTypedef permet de dfinir des types synonymes typedef int entier;entier i, j, k; typedef int * ptent; Ptent pti, ptj, ptk; Struct produit {int id; int qte; float prix; }; typedef struct produit t_produit; t_produit oeuf, tomate

Les structures comportant des tableaux

Struct eleve {int id; char nom[20]; int note[10]; } Ali; Ali.note[4] = note_geo; Ali.nom est l'adresse du tableau "nom". strcpy(Ali.nom, "Ali"); Ali.nom[2] est la lettre 'i' Struct eleve Myrieme= {10, "Myrieme" , {0, 1, 2, 3, 4, 5}};

Les tableaux de structures

Struct point {char nom[10]; int x; int y}; Struct point courbe[50]; "point" est le modle de structure, courbe est tableau de 50 lments de type "point" courbe[3].x est valide, courbe.x[3] n'a pas de sens. courbe[3] est une structure "point" le 4 me point de la courbe. courbe[3].nom[2] pour accder au 3 me caractre de nom du 4 me point de la courbe. courbe est l'adresse du dbut du tableau. Initialisation : Struct point courbe2[25] = {{'a', 1, 2}, {'b', 1, 2}, , {'d', 1, 2}};

Les structures imbriques

Struct date {int jour; int mois; int annee}; Struct person {char nom[10]; char prenom[10]; Struct date date_embauche; Struct date date_poste; } Mohammed; Mohammed.date_embauche.annee= 1985; Mohammed.date_poste.annee= Mohammed.date_embauche.annee;

Porte des modles de structure

Si le modle est dclar : A l'intrieur d'une fonction, la porte est limite la fonction. A l'extrieur d'une fonction, la porte est limite tout le fichier source mais pas dans les autres fichiers sources car la directive "extern" ne peut s'appliquer (seulement aux variables). Par contre on peut utiliser un fichier ".h" inclus par la directive include

Les structures en arguments

On peut transmettre une structure par valeur (contrairement au tableau) et on travaille dans l'appele sur une copie. Pour changer les valeurs de la structure, on envoie un pointeur : f(&date_embauche) dfinition de l'appele : Void f(struct date *d); Dans l'appele on accde au champs par :(*d).annee= 1986 ou on peut aussi utiliser :d->annee= 1986 Structure en valeur de retour Struct date f(.)

Les unions

Les unions permettent de stocker dans un espace mmoire des variables de plusieurs types diffrents. union prime {int fixe; double taux; } sac, *pt_sac; La syntaxe est la mme que pour une structure : sac.val, pt_sac->taux struct salaire {char nom[10]; union prime prime_mensuelle; } employe[50]; employe[5]. prime_mensuelle.fixe, employe[6]. prime_mensuelle.taux L'initialisation explicite se fait par le premier type ici int

ExercicesExercice 1. Dfinir une structure date contenant trois champs de type entier pour identifier le jours, le mois et lanne. Initialiser une variable de type structure date. Afficher cette structure : laide de la variable. laide dun pointeur. Exercice 2. Dfinir un tableau de structures date. Dfinir un pointeur sur ce tableau. Initialiser ce tableau. Imprimer le contenu du tableau

Correction#include struct date /* declaration du modele de structure date */ { int jour; int mois; int annee; }; main () { struct date dat, *ptdate = &dat; /* saisie de la date */ printf (" Entrez une date ( jj mm aaaa ) :"); scanf ("%d %d %d", &dat.jour, &dat.mois, &dat.annee); /* affichage de la date */ printf (" La date est : %d\t%d\t%d\n", dat.jour, dat.mois, dat.annee); /* affichage de la date avec le pointeur */ printf (" La date est : %d\t%d\t%d\n", ptdate->jour, ptdate->mois, ptdate->annee); }

Correction

#include struct date{ int jour, mois, annee;}; main() { struct date dat[5], *ptdate=dat; int i = 0; printf ("Entrez 5 dates au format ( jj mm aaaa )\n"); while (i < 5){ scanf ("%d %d %d", &dat[i].jour, &dat[i].mois, &dat[i].annee); i++; } for (i = 0; i < 5; i++, ptdate++) { /* sans pointeur */ printf (" Date numero %d : %d\t%d\t%d\n", i + 1, dat[i].jour, dat[i].mois, dat[i].annee); /* avec pointeur */ printf (" Date numero %d : %d\t%d\t%d\n", i + 1, ptdate->jour,ptdate->mois, ptdate->annee); } }