Cours programmation en langage C : Fonctions, Tableaux et Matrices

Page 1 sur 6Lecteur de document UniversityLib

Cours programmation en langage C : Fonctions, Tableaux et Matrices

Informatique appliquée · course

Voir tous les documents en programmation

École Supérieure de Technologie

et d’Informatique

A.U. 2011/2012

Cours programmation en langage C

Informatique Appliquée 1ère année

Fonctions, tableaux et matrices (6 pages)

h

F500

F100

q

F200

F500

int x=5 ;

int *m ;

int **q ;

int *h ;

m=&x ;

q=&m ;

h=&q ;

printf(« %d », x) ; => 5

printf(« %p », &x) ; => F800

printf(« %p », m) ; => F800

printf(« %p », &m) ; => F200

printf(« %p », *m) ; => 5

m

F800

F200

x

5

F800

printf(« %p », q) ; => F200

printf(« %p », &q) ; => F500

printf(« %p », *q) ; => F800

printf(« %d », **q) ; => 5

printf(« %p », h) ; => F500

printf(« %p », &h) ; => F100

printf(« %p », *h) ; => F200

printf(« %p », **h) ; => F800

printf(« %d », *h) ; => 5

Rappel : utiliser %d pour afficher un entier et %p pour afficher une adresse mémoire

Passage par adresse :

void main()

{ int x ;

fct(&x) ; //passage par adresse de x

// appel de la fonction nommée fct

….

}

//entête de la fonction fct

void fct (int *a) // a est un pointeur sur x

{

…..

Publicité

}

La variable a est un pointeur sur la variable x ;

a

F800

F100

x

F800

Mme Wiem Yaiche Elleuch fonctions, tableaux et matrices

Page 1

Ainsi, à partir de la fonction fct, il est possible de modifier la valeur de la variable ‘x’ de main, en

utilisant le pointeur ‘a’ qui pointe sur x.

Exemple (extrait de l’examen de programmation janvier 2011) :

Soit le programme suivant :

void main()

{

int x, y, z ;

int a,b ;

int t, s ;

fct1(b,t,x,z) ;

a=fct2(&b, &s,y) ;

s=fct3(y,&z,&a,t) ;

z=fct4(y,&b,t,a,&x,&s) ;

}

Déduire l’en tête de chaque fonction

La fonction

fct1

void fct1 (int b, int *t, int x, int z)

L’entête

fct2

fct3

fct4

int fct2(int b, int s, int y)

int fct3 (int y, int z, int a, int *t)

int fct4 (int y, int b, int t, int a, int x, int *s)

Fonctions et tableau

// ou bien saisir2(&n) ;

Exemple de programme de remplissage et d’affichage d’un tableau de n éléments (en utilisant les

fonctions)

#include<stdio.h>

void main()

{ int tab[50], n ;

n =saisir();

remplir_tab (tab, n) ;

afficher_tab (tab, n) ;

}

/*/

int saisir()

{ int x ;

printf (« saisir une valeur ») ;

scanf(« %d », &x) ;

return x ;

}

Publicité

/*/

void saisir2 (int *a)

{

printf (« saisir une valeur ») ;

scanf(« %d », a) ;

}

Mme Wiem Yaiche Elleuch fonctions, tableaux et matrices

Page 2

/**/

void remplir_tab(int *tab, int n)

{ int i ;

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

scanf(« %d », tab+i) ;

}

/**/

void afficher_tab(int *tab, int n)

{ int i ;

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

printf(« %d », *(tab+i) ) ;

}

//

void remplir_tab(int *tab, int n) // version 2 remplissage du tableau

{ int *q ;

for (q=tab ; q<tab+n ; q++)

scanf(« %d », q ) ;

}

/*/

void remplir_tab(int *tab, int n) // version 2 affichage du tableau

{ int *q ;

for (q=tab ; q<tab+n ; q++)

printf(« %d », *q ) ;

}

Mme Wiem Yaiche Elleuch fonctions, tableaux et matrices

Page 3

Les matrices

Une matrice [20][30] est un tableau unidimensionnel de 20 éléments, tel que chaque élément est un

tableau de 30 entiers.

int mat[20][30] ; // réservation de 30*20=600 cases mémoires consécutives, chaque case possède sa propre adresse mémoire

mat

indice j

indice i

12 13 14

22 23 24

0 1 2 3 …. 29

0 1 2 3 …. 29

etc

F800 F801 F802 F803 etc F830 F831 (adresses successives)

0

mat[0]

1

mat[1]

….

Publicité

19

mat[0][0] :12

mat[1][2] :24

mat[1][29]

mat[19][29] :

dernière case

&mat[0][0] : F800

Dans cet exemple, une matrice de 2 lignes (l=2)et 3 colonnes (c=3) contenant les valeurs

suivantes est placée en mémoire:

12

22

13

23

14

24

mat+i*30+j (cid:1) &mat[i][j] avec 30 est le nombre de

colonnes réservées lors de la déclaration (int mat[20][30])

(mat+i30+j) (cid:1) mat[i][j]

mat (cid:1) &mat (cid:1) mat[0] (cid:1) &mat[0] (cid:1) &mat[0][0] : F800

mat[1] (cid:1) &mat[1] (cid:1) &mat[1][0] : F830

mat[0] : contenu de l’élément d’indice 0, qui est un tableau de 30 entiers

&mat[0] : adresse de l’élément d’indice 0 (adresse de début).

Exemple de remplissage et d’affichage d’une matrice de l lignes et c colonnes (sans les fonctions)

#include <stdio.h>

void main()

{ int l,c, mat[20][30],i,j ;

printf(« saisir nombre de lignes et nombre de colonnes ») ;

scanf(« %d%d », &l , &c) ;

Mme Wiem Yaiche Elleuch fonctions, tableaux et matrices

Page 4

printf(« remplissage de la matrice ») ;

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

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

scanf(« %d », &mat[i][j]) ;

printf(« affichage de la matrice ») ;

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

{

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

printf(« %d », mat[i][j]) ;

printf(« \n ») ;

}

//ou bien

l= saisir3 (&c) ;

// Ou bien

saisir2 (&l) ;

saisir2 (&c) ;

}

Exemple de remplissage et d’affichage d’une matrice de l lignes et c colonnes (en utilisant les

fonctions)

#include <stdio.h>

void main()

{

Publicité

int l,c, mat[20][30],i,j ;

l=saisir() ;

c=saisir() ;

remplir ( (int *)mat , l, c) ;

afficher ( (int *)mat, l, c) ;

}

/*/

int saisir()

{ int x ;

printf (« saisir une valeur ») ;

scanf(« %d », &x) ;

return x ;

}

/*/

void saisir2 (int *a)

{

printf (« saisir une valeur ») ;

scanf(« %d », a) ;

}

//

int saisir3 (int *a)

{

int b ;

printf(« saisir nombre de lignes et nombre de colonnes ») ;

scanf(« %d%d », &b , a) ;

return b ;

}

Mme Wiem Yaiche Elleuch fonctions, tableaux et matrices

Page 5

/*/

void remplir (int *mat, int l, int c)

{

int i,j ;

printf(« remplissage de la matrice ») ;

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

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

scanf(« %d », mat+i*30+j) ;

}

void remplir (int *mat, int l, int c)

{

int i,j ;

printf(« affichage de la matrice ») ;

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

{

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

printf(« %d », (mat + i30+j) ) ;

printf(« \n ») ;

}

}

Mme Wiem Yaiche Elleuch fonctions, tableaux et matrices

Page 6