92
1 Introduction au Langage C SMA3 & SMI3 2013 - 2014 A. El moutaouakkil [email protected]

Introduction au Langage C - netuniversity.ma

  • Upload
    others

  • View
    6

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Introduction au Langage C - netuniversity.ma

1

Introduction au Langage C

SMA3 & SMI3

2013 - 2014

A. El moutaouakkil [email protected]

Page 2: Introduction au Langage C - netuniversity.ma

Apprendre à programmer avec le langage C

Être capable d’analyser des problèmes simples et écrire les

programmes correspondants

Maîtriser et Avoir plus de facilité à programmer en C

Un maximum d’exercices d’application

Objectif:

Page 3: Introduction au Langage C - netuniversity.ma

3

Plan:

RAPPELS

TYPES DE BASE, OPÉRATEURS ET EXPRESSIONS, LES ENTREES ET SOTIES DE C ET LES

INSTRUCTIONS DU CONTROLE

LES TABLEAUX ET LES CHAÎNES DE CARACTÈRES

LES POINTEURS

LES FONCTIONS

LES STRUCTURES

LES FICHIERS

CONCLUSION

Page 4: Introduction au Langage C - netuniversity.ma

4

Rappels:

Page 5: Introduction au Langage C - netuniversity.ma

Techniques du traitement automatique de l’information au moyen des ordinateurs

Eléments d’un système informatique

Langages (Java,C/C++, Fortran,etc.)

Système d’exploitation (DOS,Windows, Unix, etc.)

Matériel (PC, Macintosh, station SUN, etc.)

Applications (Word, Excel, Jeux, oracle,etc.)

Informatique?

Page 6: Introduction au Langage C - netuniversity.ma

Unité centrale (le boîtier) Processeur ou CPU (Central Processing Unit)

Mémoire centrale

Lecteur disquettes, lecteur CD-ROM

Cartes spécialisées (cartes réseau, son, ...)

Interfaces d'entrée-sortie (Ports série/parallèle, …)

Périphériques

Moniteur (l'écran), clavier, souris

Modem, imprimante, scanner, …

Matériel: Principaux éléments d’un PC

Page 7: Introduction au Langage C - netuniversity.ma

Ensemble de programmes qui gèrent le matériel et contrôlent les applications Gestion des périphériques (affichage à l'écran, lecture du

clavier, pilotage d’une imprimante, …)

Gestion des utilisateurs et de leurs données (comptes, partage des ressources, gestion des fichiers et répertoires, …)

Interface avec l’utilisateur (textuelle ou graphique): Interprétation des commandes

Contrôle des programmes (découpage en taches, partage du temps processeur, …)

Qu’est ce qu’un système d’exploitation?

Page 8: Introduction au Langage C - netuniversity.ma

Un langage informatique est un outil permettant de donner des ordres (instructions) à la machine

A chaque instruction correspond une action du processeur

Intérêt : écrire des programmes (suite consécutive

d’instructions) déstinés à effectuer une tache donnée Exemple: un programme de gestion de comptes bancaires

Contrainte: être compréhensible par la machine

Langages informatiques

Page 9: Introduction au Langage C - netuniversity.ma

Langage binaire: l’information est exprimée et manipulée sous forme d’une suite de bits

Un bit (binary digit) = 0 ou 1 (2 états électriques)

Une combinaison de 8 bits= 1 Octet possibilités qui permettent de coder tous les caractères alphabétiques, numériques, et symboles tels que ?,*,&, … Le code ASCII (American Standard Code for Information Interchange)

donne les correspondances entre les caractères alphanumériques et leurs représentation binaire, Ex. A= 01000001, ?=00111111

Les opérations logiques et arithmétiques de base (addition, multiplication, … ) sont effectuées en binaire

25628

Langage Machine

Page 10: Introduction au Langage C - netuniversity.ma

Problème: le langage machine est difficile à comprendre par l'humain

Idée: trouver un langage compréhensible par l'homme qui sera ensuite converti en langage machine

Assembleur (1er langage): exprimer les instructions élémentaires de façon symbolique

+: déjà plus accessible que le langage machine -: dépend du type de la machine (n’est pas portable) -: pas assez efficace pour développer des applications complexes

Apparition des langages évolués

ADD A, 4

LOAD B

MOV A, OUT

traducteur langage machine

L'assembleur

Page 11: Introduction au Langage C - netuniversity.ma

Intérêts multiples pour le haut niveau:

proche du langage humain «anglais» (compréhensible)

permet une plus grande portabilité (indépendant du matériel)

Manipulation de données et d’expressions complexes (réels, objets, a*b/c, …)

Nécessité d’un traducteur (compilateur/interpréteur),

exécution plus ou moins lente selon le traducteur

Code source

en langage évolué

Compilateur ou Langage

machine Interpréteur

Langages haut niveau

Page 12: Introduction au Langage C - netuniversity.ma

Compilateur: traduire le programme entier une fois pour toutes

+ plus rapide à l’exécution + sécurité du code source - il faut recompiler à chaque modification

Interpréteur: traduire au fur et à mesure les instructions du programme à chaque exécution

+ exécution instantanée appréciable pour les débutants - exécution lente par rapport à la compilation

exemple.c Compilateur

fichier source

exemple

fichier exécutable

exécution

exemple.bat

fichier source

Interprétation+exécution

Compilateur/interpréteur

Page 13: Introduction au Langage C - netuniversity.ma

Langages de programmation

Deux types de langages: Langages procéduraux Langages orientés objets

Exemples de langages: Fortran, Cobol, Pascal, C, … C++, Java, …

Choix d’un langage?

Page 14: Introduction au Langage C - netuniversity.ma

Spécification

Analyse

Traduction en langage

Compilation

Tests et modifications

Enoncé du problème

Cahier des charges

Algorithme

Programme source

Programme exécutable

Version finale et résultats

Etapes de réalisation d’un programme

Page 15: Introduction au Langage C - netuniversity.ma

Le terme algorithme vient du nom du mathématicien arabe Al-Khawarizmi (820 après J.C.)

Un algorithme est une description complète et détaillée des actions à effectuer et de leur séquencement pour arriver à un résultat donné

Intérêt: séparation analyse/codage (pas de préoccupation de syntaxe)

Qualités: exact (fournit le résultat souhaité), efficace (temps d’exécution, mémoire occupée), clair (compréhensible), général (traite le plus grand nombre de cas possibles), …

L’algorithmique désigne aussi la discipline qui étudie les algorithmes et leurs applications en Informatique

Une bonne connaissance de l’algorithmique permet d’écrire des algorithmes exacts et efficaces

Algorithmique

Page 16: Introduction au Langage C - netuniversity.ma

16

INTRODUCTION ET NOTIONS DE BASE :

Page 17: Introduction au Langage C - netuniversity.ma

17

Introduction au Langage C

Mon Premier Programme en C

#include <stdio.h>

void main()

{

printf("Bonjour!\n");

}

Inclusion de la bibliothèque contenant la fonction printf

Point d'entré du programme

première instruction

Début du programme

Fin du programme

Page 18: Introduction au Langage C - netuniversity.ma

18

Introduction au Langage C

C

fichier

Code

assembleur

Assembleur

Code

objet Linker

Code

executable

Compilateur C

Exemple: Devcpp www.bloodshed.net

www.codeblocks.org/

Page 19: Introduction au Langage C - netuniversity.ma

19

Introduction au Langage C

Définition d'une variable nom:

Unique pour chaque variable

Commence toujours par une lettre

Différenciation minuscule-majuscule

type: Conditionne le format de la variable en mémoire

Peut être soit un type standard ou un type utilisateur

valeur: Peut évoluer pendant l'exécution

initialisation grâce à l'opérateur d'affectation

Page 20: Introduction au Langage C - netuniversity.ma

20

Introduction au Langage C

Types de variable charcaractères int entiers short [int] entiers courts long [int] entiers longs float nombres décimaux double nombres décimaux de précision

supérieure long double nombres décimaux encore plus

précis unsigned int entier non signé

[..] signifie facultatif

Page 21: Introduction au Langage C - netuniversity.ma

21

Introduction au Langage C

Déclaration d'une variable Type nom_de_la_variable [= valeur]

Exemple: int nb;

float pi = 3.14;

char c = 'a';

long i,j,k;

double r = 6.2879821365;

Page 22: Introduction au Langage C - netuniversity.ma

22

Introduction au Langage C

Type

Bits

Min.

Max.

char

8

-128

127

signed char

8

-128

127

unsigned char

8

0

255

short

16

-32768

32767

unsigned short

16

0

65535

int

32

-2147483648

2147483647

unsigned

32

0

4294967295

long

32

-2147483648

2147483647

unsigned long

32

0

4294967295

float

32

1.17 E-38

3.4 E+38

double

64

2.22 E-308

1.7 E+308

long double

128

3.36 E-4932

1.1 E+4932

Page 23: Introduction au Langage C - netuniversity.ma

23

Introduction au Langage C

Affichage de la valeur d'une variable en C

printf("format de l'affichage", variables) Exemple

int i =8;int j = 10; printf("i vaut: %d j vaut: %d \n",i,j); float r = 6.28; printf("le rayon = %f \n",r);

Autres formats: %x entier en hexadécimal %c caractère %lf double %s chaîne de caractères %e réel en notation scientifique

Page 24: Introduction au Langage C - netuniversity.ma

24

Introduction au Langage C

Acquisition de la valeur d'une variable en C

scanf("format de l'affichage", adresses variables) Exemple

int i;int j; scanf("%d%d",&i,&j); float r; scanf("%f ",&r);

Autres formats: %x entier en hexadécimal %c caractère %lf double %s chaîne de caractères %e réel en notation scientifique

Page 25: Introduction au Langage C - netuniversity.ma

25

Introduction au Langage C

Ecrire un programme qui fait la connaissance de l’ordinateur

avec l’utilisateur pour une première utilisation

Exemple:

Ordinateur : bonjour mon utilisateur.

Utilisateur : bonjour mon ordinateur.

Ordinateur : comment tu t’appelles ?

Utilisateur : …

Page 26: Introduction au Langage C - netuniversity.ma

26

Introduction au Langage C

Solution

#include <stdio.h>

main()

{

char c[100];

printf(“Bonjour mon utilisateur \n");

scanf(“%S",c);

printf(“Comment t appelles tu ? \n");

scanf(“%S",c);

printf(“je suis content de vous connaitre \n");

scanf(“%S",c);

//…

return 0;

}

Page 27: Introduction au Langage C - netuniversity.ma

27

Introduction au Langage C

Instructions de base

opérateurs de base

+,-,*, / opérateurs arithmétique de base

% reste d'une division entière

== test d'égalité

!= test de différence

<, >, <=, >= test de comparaison

! négation

|| ou logique pour évaluer une expression

&& et logique pour évaluer une expression

Page 28: Introduction au Langage C - netuniversity.ma

28

Introduction au Langage C

Instructions de base opérateurs de base

a = 2+3 valeur de a: 5

r = 3%2 valeur de a: 1

a = (3==3) valeur de a: 1

a = (6==5) valeur de a: 0

a = (2!=3) valeur de a: 1

a = (6<=3) valeur de a: 0

a = !1 valeur de a: 0

a =((3==3) || (6<=3)) valeur de a: 1

a =((3==3) && (6<=3)) valeur de a: 0

Page 29: Introduction au Langage C - netuniversity.ma

29

Introduction au Langage C

Instructions de base instruction conditionnelle simple si alors

if (expression) {

instructions; }

expression est évaluée après chaque itération. Si le résultat est vrai alors les instructions sont exécutées sinon on sort de la boucle.

exemple int i =5; int n; if (i<=20) {

n =0; }

Page 30: Introduction au Langage C - netuniversity.ma

30

Introduction au Langage C

Instructions de base instruction conditionnelle simple si alors sinon

if (expression) { instructions1;} sinon { instrutions2; }

expression est évaluée après chaque itération. Si le résultat est vrai alors les instructions1 sont exécutées sinon on exécute l'ensemble instructions2

exemple int i =5;int n; if (i<=20) n =0; else n=5;

Page 31: Introduction au Langage C - netuniversity.ma

31

Introduction au Langage C Instructions de base

instruction conditionnelle multiple switch (expression) { case valeur1: instructions1;break; case valeur2: instructions2;break; . . . case valeur3: instruction3;break; default: instruction4;break; } expression est évaluée. Si le résultat vaut valeur1, alors

instruction1 est exécutée et on quitte le switch, sinon si expression vaut valeur2, ……, sinon on va dans default.

Page 32: Introduction au Langage C - netuniversity.ma

32

Introduction au Langage C

Instructions de base instruction conditionnelle multiple

exemple int c='a'; switch (c) { case 'a': file();break; case 'b': save();break; case 'q': quitter();break; default: beep();break; }

Page 33: Introduction au Langage C - netuniversity.ma

33

Introduction au Langage C

Instructions de base boucle tant que

while (expression) {

instructions; }

expression est évaluée avant chaque itération. Si le résultat est vrai alors les instructions sont exécutées sinon on sort de la boucle

exemple i =0; n = 20; while (i<n) {

i++; }

Page 34: Introduction au Langage C - netuniversity.ma

34

Introduction au Langage C

Instructions de base boucle répéter

do {

instructions; } while (expression);

expression est évaluée après chaque itération. Si le résultat est vrai alors les instructions sont exécutées sinon on sort de la boucle

exemple i =0; n = 20; do {

i++; } while(i<n);

Page 35: Introduction au Langage C - netuniversity.ma

35

Introduction au Langage C

Instructions de base boucle pour

for(expr1;expr2;expr3)

{

instructions

}

expr1: évaluée 1 seule fois en début de boucle

expr2: évaluée avant chaque itération. Si vrai alors les instructions de la boucle sont exécutées sinon la boucle est terminée

expr3: évaluée à la fin de chaque itération

Page 36: Introduction au Langage C - netuniversity.ma

36

Introduction au Langage C

Instructions de base boucle pour

exemple // somme des 100 premiers entiers

int i,s;

s= 0

for(i=0;i<=100;i = i+1)

{

s = s+i; / / ou s+=i;

}

printf("s = \n",s);

Page 37: Introduction au Langage C - netuniversity.ma

37

Introduction au Langage C

l'instruction break, continue, goto permet d'interrompre prématurément une

boucle et de se brancher vers la première instruction n'appartenant pas à la boucle

exemple: int i;int n=20;

for (i=0;i<100;i++)

{

if (n==31) break;

n=n+1;

}

printf("%d\n",n);

Quand n vaut 31 alors la boucle est

interrompue

Page 38: Introduction au Langage C - netuniversity.ma

38

Introduction au Langage C

l'instruction break,continue, goto permet d’aller à l’itération suivante

prématurément (sans exécuter les instruction qui viennent après elle)

exemple: int i;int n=20;

for (i=0;i<100;i++)

{

if (n==31) continue;

n=n+1;

}

printf("%d\n",n);

Quand n vaut 31 alors la boucle

passe à l’itération suivante

Page 39: Introduction au Langage C - netuniversity.ma

39

Introduction au Langage C

l'instruction break,continue, goto permet d’aller prématurément une boucle et

de se brancher vers la première instruction n'appartenant pas à la boucle

exemple: int i;int n=20;

for (i=0;i<100;i++)

{

if (n==31) goto etiq;

n=n+1;

}

etiq:

printf("%d\n",n);

Quand n vaut 31 alors

l’exécution saute vers etiq

Page 40: Introduction au Langage C - netuniversity.ma

/* exemple de programme C : -somme des nb de 1 à 10 et affichage de la valeur*/

#include <stdio.h> int main (void) { int n; int somme; int i; printf("donner un entier n :"); scanf("%d", &n); somme = 0; for (i = 1; i <= 10; i++) { somme = somme + i; } printf ("%d\n", somme); }

Fichier C (extension .c)

1

En C le programme principal s'appelle toujours main

1

déclarations de variables de type entier (cases mémoire pouvant contenir un entier)

2

2

3 Acquisition des données 3

4 Traitement 4

affiche à l'écran la valeur de l'entier contenu dans somme

5 5

0

Page 41: Introduction au Langage C - netuniversity.ma

41

Introduction au Langage C

Les tableaux statiques à 1 dimension définition

Ensemble de variables de même type, de même nom caractérisées par un index.

déclaration type nom_tableau[dimension]

exemples: char buffer[80];

int mat[10];

doit être une

constante

Page 42: Introduction au Langage C - netuniversity.ma

42

Introduction au Langage C

Les tableaux statiques à 1 dimension

accès aux éléments du tableau

Nom_tableau[indice]

exemples:

buffer[5] = 'c';

mat[6] = 10;

le premier élément commence à l'indice 0 !!

Les valeurs ne sont pas initialisées !!

Les débordements ne sont pas vérifiés

Page 43: Introduction au Langage C - netuniversity.ma

43

En général, les tableaux sont initialisés par l'indication de la liste des éléments du

tableau entre accolades:

char CHAINE[] = {'H','e','l','l','o','\0'};

Pour le cas spécial des tableaux de caractères, nous pouvons utiliser une initialisation

plus confortable en indiquant simplement une chaîne de caractère constante:

char CHAINE[] = "Hello";

Lors de l'initialisation par [], l'ordinateur réserve automatiquement le nombre d'octets

nécessaires pour la chaîne, c.-à-d.: le nombre de caractères + 1 (ici: 6 octets).

Initialisation de chaînes de caractères

Page 44: Introduction au Langage C - netuniversity.ma

44

Les fonctions de <string>

La bibliothèque <string> fournit une multitude de fonctions pratiques pour le traitement de

chaînes de caractères

strlen(s) fournit la longueur de la chaîne sans compter le '\0' final

strcpy(s, t) copie t vers s

strcat(s, t) ajoute t à la fin de s

strcmp(s, t) compare s et t lexicographiquement et fournit un résultat:

Négatif : si s précède t

zéro : si s est égal à t

Positif : si s suit t

strncpy(s, t, n) copie au plus n caractères de t vers s

strncat(s, t, n) ajoute au plus n caractères de t à la fin de s

Page 45: Introduction au Langage C - netuniversity.ma

45

Introduction au Langage C

Les tableaux statiques à 2 dimensions et plus

définition

Il s'agit d'un tableau de tableaux

déclaration

type nom_tableau[dim1][dim2]…[dimn]

exemples:

char buffer[20][80];

int mat[6][10];

char livres[100][60][80];

Page 46: Introduction au Langage C - netuniversity.ma

46

Introduction au Langage C

Page 47: Introduction au Langage C - netuniversity.ma

47

Introduction au Langage C

IleMaurice.pgm (800x529)

exemple:

int i,j;

int ima[800][529];

for (i=0;i<800;i++)

for (j=0;j<529;j++)

{

ima[i][j]=255-ima[i][j];

if(ima[i][j]>100)

ima[i][j]=0;

else

ima[i][j]=255;

}

Page 48: Introduction au Langage C - netuniversity.ma

48

Introduction au Langage C

Les tableaux statiques à 2 dimensions et plus

accès aux éléments

nom_tableau[ind1][ind2]…[indn]

exemples:

livre[30][15][20] = 'c';

mat[5][6] =13;

printf("%d\n",mat[5][6]);

Page 49: Introduction au Langage C - netuniversity.ma

49

Introduction au Langage C

Les Pointeurs

Deux manières d'utiliser une variable

Par son nom adressage direct

compilateur réserve de la mémoire pour la variable

exemple:

int x =17;

Page 50: Introduction au Langage C - netuniversity.ma

50

Introduction au Langage C Les Pointeurs

Par son adresse adressage indirect

une variable de type pointeur contient l'adresse d'une autre variable

Le lien entre pointeur et la variable pointée est géré par le programmeur

exemple:

int x =17;

int * px = &x;

px pointe vers x

Page 51: Introduction au Langage C - netuniversity.ma

51

Introduction au Langage C

Les Pointeurs

déclaration d'un pointeur

type * nom_du_pointeur

exemples

char *buffer;

int *pf;

float *ppi;

C'est au programmeur d'initialiser le pointeur

Page 52: Introduction au Langage C - netuniversity.ma

52

Introduction au Langage C initialisation d'un pointeur

Il faut lui fournir l'adresse d'une variable existant en mémoire

Il doit pointer vers une zone mémoire réservée par le compilateur comme étant une variable

utilisation de l'opérateur d'adressage & int f;

int *pf,*pg;

pf = &f;

pg =(int*)malloc(sizeof(int));

.

.

free(gf);

création du lien entre le

pointeur et la variable allocation

dynamique d'une variable

de type int

création du lien entre pg

et l'espace mémoire réservé

libération de l'espace réservé

Page 53: Introduction au Langage C - netuniversity.ma

53

Introduction au Langage C

Les Pointeurs utilisation de l'opérateur d'indirection *

travaille la valeur de la variable pointée

exemples

int i =8;

int *pi;

pi = &i;

printf("%d\n",*pi);

*pi = 19;

printf("%d\n",i);

8

19

Page 54: Introduction au Langage C - netuniversity.ma

54

Introduction au Langage C

Lien entre le nom d'un tableau à 1 dimension et les pointeurs

Nom du tableau = adresse du premier élément du tableau

nom_tableau[i] peut s'écrire *(nom_tableau+i)

exemples:

char buffer[80];

*buffer = 'C'; accès au premier caractère

*(buffer + 5) = 'V'; accès au 6 ème caractère

Page 55: Introduction au Langage C - netuniversity.ma

55

Introduction au Langage C

Lien entre le nom d'un tableau à 2 dimension et les pointeurs un tableau 2d est un tableau de tableau de

dimension 1 On peut donc dire que le nom d'un tableau 2d est

l'adresse d'un tableau d'adresse de tableaux de dimension 1

On dit aussi qu'il s'agit d'un pointeur de pointeur

exemple: int TAB[6][7];

int **p; déclaration d'un pointeur de pointeur

p = TAB; initialisation du pointeur de pointeur

Page 56: Introduction au Langage C - netuniversity.ma

56

Introduction au Langage C

Lien entre le nom d'un tableau à 2 dimension et les pointeurs

TAB

0

1

2

3

4

5

0 1 2 3 4 5 6

tableaux de pointeurs vers des tableaux

d'entiers

tableaux d'entiers

Page 57: Introduction au Langage C - netuniversity.ma

57

Introduction au Langage C

Initialisation dynamique d'un tableau

Tableau une dimension

int * t;

t = (int*)malloc(20*sizeof(int));

nom du

tableau

fonction de calcul

automatique de la

taille d'un entier en

octet fonction d'allocation dynamique

de la mémoire

nombre d'éléments dans le tableau

Page 58: Introduction au Langage C - netuniversity.ma

58

Introduction au Langage C

Initialisation dynamique d'un tableau

Tableau à deux dimensions n*m

déclaration dynamique du tableau de n pointeurs et des n tableaux à une dimension de m éléments

quelques lignes de code sont nécessaires (voir transparent suivant)

Page 59: Introduction au Langage C - netuniversity.ma

59

Introduction au Langage C

Initialisation dynamique d'un tableau Tableau à deux dimensions n*m

int **TAB,l; TAB = (int**)malloc(n*sizeof(int*)); for (l=0;l<n;l++) { TAB[l] = (int*)malloc(m*sizeof(int)); } désallocation: for (l=0;l<n;l++) free(TAB[l]); free(TAB);

Page 60: Introduction au Langage C - netuniversity.ma

#include <stdio.h> void main (void) // calcul de la moyenne d’un tableau { int N, somme, i, T[100]; printf("donner la taille du tableau N < 100 :"); scanf("%d", &N); printf("donner les elements du tableau d’entiers :");

for (i = 1; i <= N; i++) scanf("%d", &T[i]); for (i = 1; i <= N; i++) //affichage du tableau printf("%d ", T[i]);

somme = 0; for (i = 1; i <= N; i++) //calcul de la somme somme = somme + T[i]; printf ("\nla moyenne des elements du tableau est %d\n", somme/N); }

Fichier C (extension .c)

Page 61: Introduction au Langage C - netuniversity.ma

61

Introduction au Langage C

Les fonctions définition

Ensemble d'instructions pouvant être appelés de manière répétitive par un nom

déclaration type arg_ret nom_f( type arg1,type arg2, …type argn)

{

ensemble instructions

}

- arg_ret est l'argument renvoyé par la fonction (instruction return

- nom_f est le nom de la fonction

- arg1 …argn sont les arguments envoyés à la fonction

Page 62: Introduction au Langage C - netuniversity.ma

62

Introduction au Langage C

Les fonctions

règles d'utilisation

L'ordre, le type et le nombre des arguments doivent être respectés lors de l'appel de la fonction

L'appel d'une fonction doit être située après sa déclaration ou celle de son prototype (voir exemple transp suivant)

Si la fonction ne renvoie rien alors préciser le type void

Page 63: Introduction au Langage C - netuniversity.ma

63

Introduction au Langage C

Les fonctions exemple:

int min(int a, int b);

void main()

{ int a,b;

printf(‘‘le min est %d’’,min(a,b));

}

int min(int a, int b)

{ if (a <b) return a;

else return b;

}

Prototype de la fonction

min

Programme principal

Fonction min et son bloc d'instruction

s

Page 64: Introduction au Langage C - netuniversity.ma

64

Introduction au Langage C

Les fonctions

Les paramètres se passent par valeur

Recopie en mémoire des paramètres dans des paramètres temporaires.

Toute modification des paramètres dans la fonction est sans effet sur les paramètres originelles

Quand on quitte la fonction, les paramètres temporaires sont effacés de la mémoire

Recopie dans le sous programme appelant de la valeur du paramètre retourné par la fonction return.

Page 65: Introduction au Langage C - netuniversity.ma

65

Introduction au Langage C

Les fonctions exemple:

void permutter(int x, int y) { int temp; temp = a; a = b; b= temp; } void main() { int x=3;int y =5; permutter(x,y); printf("x=%d y=%d \n",x,y); }

x=3 y=5

Aucune action sur

les paramètres x et y

Page 66: Introduction au Langage C - netuniversity.ma

66

Introduction au Langage C

Les fonctions

Passage d'arguments par adresse

On passe non pas la valeur de la variable mais son adresse

Il est donc possible par les pointeurs de modifier le contenu de l'adresse, donc la variable originelle

Permet de modifier plusieurs arguments à la fois dans une fonction

Permet de passer des tableaux en argument

Page 67: Introduction au Langage C - netuniversity.ma

67

Introduction au Langage C

Les fonctions exemple:

void permutter(int *pa, int *pb) { int temp; temp = *pa; *pa = *pb; *pb= temp; } void main() { int x=3;int y =5; permutter(&x,&y); printf("x=%d y=%d \n",x,y); }

Action sur les paramètres

x et y

x=5 y=3

Page 68: Introduction au Langage C - netuniversity.ma

68

Introduction au Langage C

La fonction récursive exemple:

int fact(int n) { if(n==0) return 1; else return n*fact(n-1); } main() { printf("factoriel de 5 =%d \n",fact(5)); }

La fonction fact appelle

elle même

Page 69: Introduction au Langage C - netuniversity.ma

#include <stdio.h> int somme (int N) // calcul de la somme d’un tableau

{ int som, i, T[100]; printf("donner les elements du tableau d’entiers :"); for (i = 1; i <= N; i++) scanf("%d", &T[i]); som= 0; for (i = 1; i <= N; i++) //calcul de la somme som = som + T[i]; return som; } void main (void) // calcul de la moyenne d’un tableau

{ int N; printf("donner la taille du tableau N < 100 :"); scanf("%d", &N); printf ("\nla moyenne des elements du tableau est %d\n", somme(N)/N); }

Fichier C (extension .c)

Page 70: Introduction au Langage C - netuniversity.ma

70

Structure

Les structures de données Il est possible de créer des ensembles de variables regroupées

sous le même nom, on parle de variables agglomérées.

Exemple : struct individu { char nom[30]; char prenom[50]; int age;

}

Utilisation : struct individu etudiant, professeur; etudiant.nom = « einstein »; etudiant.prenom = « albert »; etudiant.age = 25;

Page 71: Introduction au Langage C - netuniversity.ma

71

intérêt

Rassembler des données hétérogènes caractérisant une entité pour en faire un type utilisateur.

exemple:

point dans l'espace 3 entiers

nœud d'un arbre binaire 2 adresses vers les fils, 3 entiers pour les données du nœud

noms et références des pièces mécaniques constituant une voiture 600 tableaux de caractères + 600 entiers pour la référence

Structure

Page 72: Introduction au Langage C - netuniversity.ma

Les structures de données

déclaration

struct nom_structure

{

type1 nomchamps1;

type2 nomchamps2; . . .

typeN nomchampsN;

};

Structure

Page 73: Introduction au Langage C - netuniversity.ma

Les structures de données

exemple et utilisation struct pt { int x; int y; int z; char nom; }; main() { struct pt p; }

Structure

Page 74: Introduction au Langage C - netuniversity.ma

Les structures de données

simplification de l'écriture struct pt { int x; int y; int z; char nom; }; typedef struct pt point; main() { point p; }

typedef struct pt

{

int x; int y; int z; char nom;

} point;

Notations équivalentes

Structure

Page 75: Introduction au Langage C - netuniversity.ma

Les structures de données

accès aux données

Deux cas de figure

On dispose du nom de la variable

Accès par: NomVariable.NomChamps

exemple

main()

{

point p1;

p1.x = 8; p1.y = 9; p1.z = 10;

printf(’’x=%d y=%d z=%d’’, p1.x,p1.y,p1.z);

}

Structure

Page 76: Introduction au Langage C - netuniversity.ma

Les structures de données accès aux données

Deux cas de figure On dispose de l'adresse de la variable (pointeur)

Accès par: NomPointeurVariable->NomChamps

exemple

main()

{

point *pp1, p1, P2[5];

pp1 = &p1;

pp1->x = 8; pp1->y = 9; pp1->z = 10;

printf(’’x=%d y=%d z=%d’’, pp1->x,pp1->y,pp1->z;

}

Structure

Page 77: Introduction au Langage C - netuniversity.ma

77

Comme sur un écran on peut réaliser des entrées et des sorties sur un fichier

Les fichiers sont soit:

binaires (un float sera stocké comme il est codé en mémoire , d'où gain de place mais incompatibilité entre logiciels) formaté ASCII (un float binaire sera transformé en décimal puis on écrira le caractère correspondant à chaque chiffre).

Fichiers

Page 78: Introduction au Langage C - netuniversity.ma

78

FILE *fic;

char nom_fic[20]=“c:\travail\smi\a5_7\info1\liste1.txt”;

// ouverture du fichier fic = fopen(nom_fic, "r"); // ouvrir en lecture if(fic == NULL){ printf("Impossible d'ouvrir le fichier %s\n", nom_fic); exit(1); } printf(".............. Ouverture du fichier %s\n", nom_fic);

Fichiers

Ouverture d'un fichier La fonction FILE *fopen(char *nomfic, char *mode) ouvre le fichier dont le nom est donné comme premier argument, selon le mode d'ouverture précisé (w = écriture, r = lecture, a = ajout en fin de fichier) et l'assigne à un flux, i.e. à une variable de type FILE *. Dans le programme ci-dessous, nom_fic est une chaîne de caractères qui contient le nom du fichier à ouvrir, et fic est une variable de type FILE *.

Page 79: Introduction au Langage C - netuniversity.ma

79

Fermeture d'un fichier La fonction int fclose(FILE *) ferme le fichier dont le nom est une variable de type FILE *. Dans le programme ci-dessous, nom_fic est une chaîne de caractères qui contient le nom du fichier ouvert, et fic est une variable de type FILE *.

// fermeture du fichier if(fclose(fic) == EOF){ printf("Probleme de fermeture du fichier %s", nom_fic); exit(1); } printf(".............. Fermeture du fichier %s\n", nom_fic);

Fichiers

Page 80: Introduction au Langage C - netuniversity.ma

80

Lecture des données d'un fichier Fgets La fonction char *fgets(char *chaine, int max, FILE *fichier) lit une chaîne de caractères sur le fluxfichier et la stocke dans la chaîne chaine. Elle lit au maximum max - 1 caractères, elle s'arrête dès qu'elle rencontre un caractère de passage à la ligne et place un \0 à la fin de la chaîne.

exemple Prenons un programme qui affiche le contenu d'un fichier et compte le nombre de lignes de ce fichier :

Fichiers

Page 81: Introduction au Langage C - netuniversity.ma

81

#include <stdio.h> #include <string.h> #include <stdlib.h> void verif_et_recup_arg(int nb, char *arguments[], int nb_souhaite, char *chaine) { if(nb != nb_souhaite){ printf("Usage : lignes nom_fichier\n"); exit(1); } strcpy(chaine, arguments[1]); } int main(int argc, char *argv[]) { FILE *fic; int nb_lignes; char ligne_lue[512]; char nom_fic[255]; verif_et_recup_arg(argc, argv, 2, nom_fic); // ouverture du fichier fic = fopen(nom_fic, "r"); // ouvrir en lecture if(fic == NULL){ printf("Impossible d'ouvrir le fichier %s\n", nom_fic); exit(1); } printf(".............. Ouverture du fichier %s\n", nom_fic); // compter et afficher les lignes du fichier nb_lignes = 0; while(fgets(ligne_lue, 512, fic) != NULL){ printf("\t%s", ligne_lue); nb_lignes++; } printf("le fichier %s comporte %d lignes\n", nom_fic, nb_lignes); // fermeture du fichier if(fclose(fic) == EOF) { printf("Probleme de fermeture du fichier %s", nom_fic); exit(1); } printf(".............. Fermeture du fichier %s\n", nom_fic); return 0; }

fgets

Page 82: Introduction au Langage C - netuniversity.ma

82

Lecture des données d'un fichier fscanf La fonction int fscanf(FILE *fichier, char *format, adr_var_1, adr_var_2, ...) prend comme premier argument le flux dans lequel elle doit lire et stocke les données lues selon le format défini par la chaîne format dans les variables adr_var_ passées par adresse.

exemple

Le programme ci-dessous utilise la fonction scanf pour stocker dans des variables les informations d'un fichier annuaire qui comporte sur chaque ligne un nom, un prénom, le numéro de téléphone et l'adresse mail d'une personne. NB : on suppose que le nom de la personne ne comporte pas d'espace.

Fichiers

Page 83: Introduction au Langage C - netuniversity.ma

83

#include <stdio.h> #include <string.h> #include <stdlib.h> void verif_et_recup_arg(int nb, char *arguments[], int nb_souhaite, char *chaine) { if(nb != nb_souhaite){ printf("Usage : annuaire nom_fichier\n"); exit(1); } strcpy(chaine, arguments[1]); } int main(int argc, char *argv[]) { FILE *fic; int nb_lignes, t1, t2, t3, t4, t5; char nom_fic[255], nom[255], prenom[255], mail[255]; verif_et_recup_arg(argc, argv, 2, nom_fic); fic = fopen(nom_fic, "r"); // ouvrir en lecture if(fic == NULL){ printf("Impossible d'ouvrir le fichier %s\n", nom_fic); exit(1); } printf(".............. Ouverture du fichier %s\n\n", nom_fic); // recuperer les donnees de l'annuaire nb_lignes = 0; while(fscanf(fic, "%s %s %d %d %d %d %d %s", nom, prenom,\ &t1, &t2, &t3, &t4, &t5, mail) != EOF){ printf("\tnom = %s\n \tprenom = %s\n \ttel = %.2d %.2d %.2d %.2d %.2d\n \tmail = %s\n\n",\ nom, prenom, t1, t2, t3, t4, t5, mail); nb_lignes++; } printf("le fichier %s comporte %d lignes\n", nom_fic, nb_lignes); if(fclose(fic) == EOF){ // fermeture du fichier printf("Probleme de fermeture du fichier %s", nom_fic); exit(1); } printf(".............. Fermeture du fichier %s\n", nom_fic); return 0; }

fscanf

Page 84: Introduction au Langage C - netuniversity.ma

84

Écriture de données dans un fichier fputs La fonction int fputs(char *chaine, FILE *fic) écrit la chaîne de caractères chaine sur le flux fic. Elle retourne le dernier caractère de la chaîne en cas de succès (EOF en cas d'erreur).

exemple Prenons un programme qui écrit dans un fichier résultat ligne par ligne :

Fichiers

Page 85: Introduction au Langage C - netuniversity.ma

85

#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fic; int nb_lignes; char ligne_lue[512]; // ouverture du fichier fic = fopen("resultat.txt", "w"); // ouvrir en ecriture if(fic == NULL){ printf("Impossible d'ouvrir le fichier resultat.txt\n"); exit(1); } do{ fgets(ligne_lue, 512, stdin); fputs(ligne_lue, fic); } while(strcmp(ligne_lue, "FIN\n") != 0); // fermeture du fichier if(fclose(fic) == EOF) { printf("Probleme de fermeture du fichier resultat.txt\n"); exit(1); } printf("les donnees ont ete stockees dans resultat.txt\n"); return 0; }

fputs

Page 86: Introduction au Langage C - netuniversity.ma

86

Écriture de données dans un fichier

fprintf La fonction int fprintf(FILE *fic, char *format, var_1, var_2, ...) écrit les données var_ dans le flux fic en respectant le format spécifié par la chaîne format. Elle retourne le nombre de caractères écrits sur le flux.

exemple Le programme ci-dessous ajoute une entrée dans l'annuaire :

Fichiers

Page 87: Introduction au Langage C - netuniversity.ma

87

#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fic; char nom_fic[255], nom[255], prenom[255], mail[255]; int t1, t2, t3, t4, t5; // stockage des donnees issues de la ligne de commandes if(argc != 10){ //10 car num. tel. = 5 blocs d'entiers printf("Usage : annuaire nom_fichier nom prenom tel mail\n"); exit(1); } strcpy(nom_fic, argv[1]); strcpy(nom, argv[2]); strcpy(prenom, argv[3]); strcpy(mail, argv[9]); t1 = atoi(argv[4]); t2 = atoi(argv[5]); t3 = atoi(argv[6]); t4 = atoi(argv[7]); t5 = atoi(argv[8]); // ouverture du fichier fic = fopen(argv[1], "a"); // ouvrir en ajout if(fic == NULL){ printf("Impossible d'ouvrir le fichier %s\n", nom_fic); exit(1); } // ajouter les donnees dans l'annuaire fprintf(fic, "\n%s %s %.2d %.2d %.2d %.2d %.2d %s", nom, prenom, t1, t2, t3, t4, t5, mail); // fermeture du fichier if(fclose(fic) == EOF){ printf("Probleme de fermeture du fichier %s", nom_fic); exit(1); } printf("Les informations ont ete stockees dans l'annuaire\n"); return 0; }

fprintf

Page 88: Introduction au Langage C - netuniversity.ma

88

FILE *fic;

char nom_fic[20]=“c:\travail\smi\a5_7\info1\liste1.txt”;

// ouverture du fichier fic = fopen(nom_fic, "rb"); // ouvrir en lecture if(fic == NULL){ printf("Impossible d'ouvrir le fichier %s\n", nom_fic); exit(1); } printf(".............. Ouverture du fichier %s\n", nom_fic);

Fichiers

Ouverture d'un fichier mode binaire La fonction FILE *fopen(char *nomfic, char *mode) ouvre le fichier dont le nom est donné comme premier argument, selon le mode d'ouverture précisé (wb = écriture, rb = lecture, ab = ajout en fin de fichier) et l'assigne à un flux, i.e. à une variable de type FILE *. Dans le programme ci-dessous, nom_fic est une chaîne de caractères qui contient le nom du fichier à ouvrir, et fic est une variable de type FILE *.

Page 89: Introduction au Langage C - netuniversity.ma

89

Écriture et lecture de données dans un fichier en mode binaire

Fread Syntaxe: fwrite(&n,taille d'un bloc,nombre de blocs,fichier_pt); ou fread(&n,taille d'un bloc,nombre de blocs,fichier_pt); fwrite et fread fournissent respectivement le nombre de blocs écrits ou lus. - n est la variable lue ou écrite - taille d'un bloc est la taille en octets de la variable sizeof(n). - nombre de blocs est le nombre de variables que l'on désire lire ou écrire - fichier_pt est le pointeur de flux

Fichiers

Page 90: Introduction au Langage C - netuniversity.ma

90

#include<stdio.h> main(void) { char nomfich[20]; int n; FILE *entree; printf("nom du fichier"); scanf("%20s",nomfich); entree=fopen(nomfich,"rb"); if(!entree){printf("erreur d ouverture"); exit();} do{ fread(&n,4,1,entree); if(!feof(entree))printf("\n%d",n); }while(!feof(entree)); fclose(entree); Return 0;}

fread

Détection de la fin d’un fichier

feof Syntaxe: feof(fichier_pt) Retourne une valeur non nulle (vraie) si une fin de fichier a été trouvée sinon zéro (faux)

Page 91: Introduction au Langage C - netuniversity.ma

91

Accès direct à un fichier En mode séquentiel ,après chaque opération, le pointeur du fichier est incrémenté du nombre d'octets transférés, on peut également accéder au fichier en n'importe quel point: accès direct. Fseek fseek(fichier_pt,taille*(num-1),par); - taille est le nombre d'octets de la variable - num numéro de la variable où on veut se placer. Exemple: 2*(num-1) pour des entiers courts. - par est un paramètre: 0 déplacement depuis le début du fichier 1 déplacement a partir de la position courante 2 déplacement à partir de la fin du fichier fteel(fichier_pt) ; /*position courante du pointeur en octets*/ Les instructions suivantes donnent la taille d'un fichier: fseek(fichier_pt,0,2); taille=fteel(fichier_pt);

Fichiers

Page 92: Introduction au Langage C - netuniversity.ma

92

Nous avons vu ici des fonctions de base du langage C permettant de

solutionner un grand nombre de problèmes et projets de programmation.

La maîtrise de ce langage (comme pour d’autre) nécessite de la curiosité

la volonté et passe par la multiplication des exercices et des problèmes

tels que ceux vus en séries de TD et d’autres que vous pouvez trouvez sur

Internet :

À titre d’exemple:

www.lamsade.dauphine.fr/~manouvri/C/PolyExoC_MM.pdf D’autre références pour cours et exercices:

http://c.developpez.com/ lien général et en particulier:

http://c.developpez.com/livres/le-c-20-heures/ …

Conclusion