É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