Académique Documents
Professionnel Documents
Culture Documents
Chapitre 5 Les Fonctions
Chapitre 5 Les Fonctions
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;
}
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;
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>
int i;
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>
• 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.
• 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 ;
}
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