Vous êtes sur la page 1sur 40

Chapitre 5 :

les fonctions et les procédures


A.Abdali
MIPC S3
Sous-programmes
Lors de l’écriture d’un programme, il est fréquent de devoir utiliser la
• même séquence d’instructions à différents endroits
• - Il est préférable d’écrire la séquence une seule fois et y faire appel chaque
fois que c’est nécessaire
• - Une telle séquence est appelée sous-programme
• - Il est aussi souvent utile de « décomposer » un programme complexe en
• différents sous-programmes plus simples pour le rendre plus clair
• Lecture de données -> réalisation de calculs -> Ecriture des résultats

Exemple motivant
• - On cherche à écrire un programme qui permet de calculer la somme de 3
entiers lus a,b et c élevés respectivement à la puissance m, n et p
également lues : am + bn + cp
Exemple de fonction et de procédure
#include <stdio.h>
#include <stdlib.h>

//définition de la fonction
int puissance(int x,int y){

int res=1,i;
for(i=1;i<=y;i++)
res=res*x;
return res;
}

//une procédure est une fonction qui ne retourne pas de valeur

void affiche(int u, int v){

int w;
// Appel à la fonction
w=puissance(u,v);
printf("la valeur d affichage est:%d\n",w);
}

int main(){

int x=2,y=3;
//appel à la procédure
affiche(x,y);
system("pause");
}
Exemple de procédure
void ligne() {
/* ecrit une ligne de 20 - */
int i;
for (i = 1; i <= 20; i = i + 1)
printf("-");
printf("\n");
}
int main() {
/* sous-programme d’entrée */
int a;
ligne();
printf(" Bonjour à tous ");
for (a = 0; a < 5; a = a + 1)
ligne();
}
Appel de sous-programme
void afficheTable(int n,int max)
{
int i;
for (i = 1; i <= max; i = i + 1)
printf(“%d * %d = %d \n”, n, i, n * i);
}
int main() {
int j, a, borne;
scanf(“%d”,&a); scanf(“%d”, &borne);
for (j = 1; j <= a; j = j + 1)
afficheTable(j, borne);
}
Paramètres de type structure
typedef struct complexe { float reel; float imaginaire; }complexe;

complexe cplus(complexe c1, complexe c2) {


complexe res;
res.reel = c1.reel + c2.reel;
res.imaginaire = c1.imaginaire + c2.imaginaire;
return res;
}

int main() {
complexe comp1,comp2,comp3;
scanf("%f %f", &comp1.reel, &comp1.imaginaire);
scanf("%f %f", &comp2.reel, &comp2.imaginaire);
comp3 = cplus(comp1, comp2);
printf("Resultat = %f + %fi", comp3.reel, comp3.imaginaire);
}
float maxtab(float t[], int nbelt) {
int i; float pg;
pg = t[0];
for (i = 1; i<nbelt; i = i + 1)
if (t[i]>pg) pg = t[i];
return pg;
}
main() {
int nbelt1, nbelt2, n;
float t1[10], t2[15];
printf("Dimension de t1 et t2");
scanf("%d%d",&nbelt1,&nbelt2);
Paramètres de type tableau
printf("Donnez les éléments de t1");
for (n = 0; n<nbelt1; n= n + 1)
scanf("%f",&t1[n]);
printf("Donnez les éléments de t2");
for (n = 0; n<nbelt2; n=n + 1)
scanf("%f",&t2[n]);
printf("Le maximum de t1 est ");
if (maxtab(t1,nbelt1)>maxtab(t2, nbelt2))
printf(" superieur ");
else
printf(" inferieur ");
printf(" a celui de t2 ");
getch();
}
Paramètres de type tableau
/* remise à zéro des éléments du tableau */
#include <stdio.h>
#include<string.h>

void raz(int t[], int n) {


int i;
for (i = 0; i < n; i++)
t[i] = 0;
}
int main() {

int i;

int t1[4], t2[5];


printf("saisir les elements du tableau t1\n");

for(i=0;i<4;i++)
scanf("%d",&t1[i]);
printf("saisir les elements du tableau t2\n");

for(i=0;i<5;i++)
scanf("%d",&t2[i]);

raz(t1, 4);
raz(t2, 5);
for(i=0;i<4;i++)
printf("t[%d]=%d\n",i,t1[i]);
printf("\n\n\n");
for(i=0;i<5;i++)
printf("t[%d]=%d\n",i,t2[i]);

}
Paramètres de type tableau
#define TAILLE_VECT 3
void plus_vect(float v1[], float v2[], float v3[]) {
int i;
for (i = 0; i < TAILLE_VECT; i = i + 1)
v3[i] = v1[i] + v2[i];
}
int main() {
float a[TAILLE_VECT], b[TAILLE_VECT];
float res[TAILLE_VECT];
scanf("%f %f %f", &a[0], &a[1], &a[2]);
scanf(“%f %f %f”, &b[0], &b[1], &b[2]);
plus_vect(a, b, res);
printf("résultat: (%f %f %f)", res[0], res[1], res[2]);
}
Paramètres de type tableau

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

int strlen1(char s[]) { // calcule longueur de s


int res = 0;
int i = 0;
while(s[i] != '\0') {
res = res + 1;
i = i + 1;
}
return res;
}
int main(){
char chaine[80];
scanf("%s", chaine); // ou gets(chaine);
printf(" Longeur de la chaine %s: %d ", chaine,strlen1(chaine));
}
Problème de passage des paramètres par valeurs
• #include<stdio.h>
main(void)
{
void echange (int a, int b) ;
int n=10, p=20 ;
printf ("avant appel: %d %d\n", n, p) ;
echange (n, p) ;
printf ("après appel: %d %d", n, p) ;
return 0 ;
}
• void echange (int a, int b)
{
int c ;
printf ("début echange : %d %d\n", a, b) ;
c=a;
a=b;
b=c;
printf ("fin echange :%d %d\n", a, b) ;
}

• avant appel : 10 20
début echange : 10 20
fin echange : 20 10
après appel : 10 20
• La fonction echange reçoit deux valeurs correspondant à ses deux arguments muets a et b.

• Elle effectue un échange de ces deux valeurs. Mais, lorsque l'on est revenu dans le
programme principal, aucune trace de cet échange ne subsiste sur les arguments effectifs
n et p.

• En effet, lors de l'appel de echange, il y a eu transmission de la valeur des expressions n et


p.

• On peut dire que ces valeurs ont été recopiées "localement" dans la fonction echange
dans des emplacements nommés a et b.

• C'est effectivement sur ces copies qu'a travaillé la fonction echange, de sorte que les
valeurs des variables n et p n'ont, quant à elles, pas été modifiées. C'est ce qui explique le
résultat constaté.
Ce problème est résolu par un passage
par adresse ou par variable
#include<stdio.h>
int main(){
void echange (int* a, int* b) ;
int n=10, p=20 ;
printf ("avant appel: %d %d\n", n, p) ;
echange (&n, &p) ;
printf ("après appel: %d %d", n, p) ;
getch();
return 0 ;
}

void echange (int* a, int *b)


{ int c ;
printf ("début echange : %d %d\n", *a, *b) ;
c = *a ;
*a = *b ;
*b = c ;
printf ("fin echange : %d %d\n", *a, *b) ;
}
Exercice : Fonction factorielle: Fonction récursive
Définition: Une fonction récursive est une fonction qui appelle elle-même
#include<stdio.h>
int N;
main()
{
/* Prototypes des fonctions appelées */
double FACT(int N);
double y;
printf("Introduire le nombre de lignes N : ");
scanf("%d",&N);
y=FACT(N);
printf("%f\n",y);
getch();
}
double FACT(int N)
{
double x = 0;
if (N == 0)
{
x = 1;
return(x);
}else {
x = N*FACT(N-1);
return(x);
}
}
Exercice

• Ecrire un programme qui construit et affiche le triangle de Pascal en calculant les


coefficients binomiaux:
 
1
1 1
1 2 1
1 3 3 1
14 6 4 1
....

• On n'utilisera pas de tableau, c.-à-d. il faudra calculer les coefficients d'après la


formule ci-dessous, tout en définissant et utilisant les fonctions adéquates.
#include<stdio.h> void LIGNEC(int P)
#include<math.h> {
double FACT(int N) int Q;
{ /* Traitements */
double x = 0; for (Q=0; Q<=P; Q++)
if (N == 0) printf("% 6.0f", C(P,Q));
{ printf("\n");
x = 1; }
return(x); void TRIANGLE(int LIGNES)

me
} {
int P;

ogram
else
{ /* Traitements */
x = N * FACT(abs(N-1)); du pr for (P=0; P<LIGNES; P++)
return(x);
LIGNEC(P);
}
}
Suite

main()
}
{
double C(int P, int Q)
/* Prototypes des fonctions appelées */
{
int N;
return FACT(P)/(FACT(Q)*FACT(P-Q));
printf("Introduire le nombre de lignes N : ");
scanf("%d",&N);
}
TRIANGLE(N);
getch();
}
Référence
• Module B23
• Emmanuel Renaux
• Emmanuel.Renaux@telecom-lille1.eu

Vous aimerez peut-être aussi