Documente Academic
Documente Profesional
Documente Cultură
1) Notion de fonction En Maths, les fonctions sont nommes par f(x), g(x) Par exemple, si on prend la fonction f(x)=x2. On peut aussi nomme cette fonction f par carre, on crit : carre(x)=x2 Ici, la fonction carre prend la valeur de la variable x(relle) , calcule et retourne la valeur x2 (relle).
SM-SMI3
En langage C, on peut dfinir cette fonction carre, de la manire suivante : float carre(float x) Le type de { Le type de la variable x la valeur return x*x; calcule et La valeur de retour } retourne
de la fonction carre de la fonction
SM-SMI3
Un exemple de fonction Dfinir en C une fonction qui retourne le successeur dun entier int successeur(int n) Le type de la variable n { Le type de la valeur calcule return n+1; et retourne de la fonction La valeur de } retour de la
fonction
SM-SMI3
2) Description de la syntaxe de dfinition dune fonction : La syntaxe dune fonction Nom comprend de la fonction
(carre)
Le type de la valeur calcule et retourne de la fonction carre
float carre(float x) Dbut de la { fonction La valeur de return x*x; retour de la fonction Fin de la fonction }
SM-SMI3
Le corps de la fonction est la partie limite par le dbut et la fin de la fonction float carre(float x) Dbut de la fonction { La valeur de Le corps de retour de la return x*x; fonction la fonction } Fin de la
fonction
SM-SMI3
Remarque : les variables doivent tre dclares au dbut de la fonction(comme pour la fonction main).
SM-SMI3
Exemple : Donner les noms des lments spcifis par les chiffres
6
1 2 4
SM-SMI3
SM-SMI3
SM-SMI3
10
SM-SMI3
11
SM-SMI3
12
5) Fonction avec des arguments de diffrents types Exemple : La fonction puissance Xn.
SM-SMI3
15
double puissance(int n, double x) { double p=1; int i; for(i=1; i<=n; i++) p*=x; return p; }
SM-SMI3
16
6) Utilisation dune fonction Quand on dfinit une fonction, on peut lutiliser dans une expression. On dit quon fait appel la fonction. Cet appel doit respecter : - Le nombre darguments et leurs types - Le type de retour de la fonction.
SM-SMI3
17
Exemple 1
SM-SMI3
18
double module(double x, double y) { z=somme(carre(x),carre(y)); return sqrt(z); //sqrt : cest la racine carr }
SM-SMI3 19
Linstruction return Cette instruction indique la valeur de retour de la fonction et assure la sortie immdiate de la fonction.
SM-SMI3
20
La fonction main
Un programme C peut contenir plusieurs fonctions chacune ralisant une tche bien dtermine. Lensemble de ces tches reprsente la tche globale du programme. Une de ces fonctions est la fonction main qui reprsente la fonction principale. Elle reprsente le point dentre dans le programme. Toutes les fonctions vont servir de manire directe ou indirecte la fonction main Cette fonction peut tre utilise sans valeur de retour et sans instruction return. Cette fonction peut tre utilise sans argument.
SM-SMI3 22
Exemple : int min (int x, int y) { if (x<y) return x; else return y; } main() { int x, y ,z; z=min(x,y); printf(%d,z); }
SM-SMI3 23
Les fonctions prdfinies double sqrt(double x), double pow(double x , double y).
SM-SMI3
24
Exercice Construire une fonction som_carre(int n) qui calcule et retourne la somme des carrs des nombres de 1 n. n tant largument de la fonction. faire un appel cette fonction dans la fonction main
SM-SMI3
25
Rponse 1 :
#include<stdio.h> int som_carre(int n) //dfinition de la fonction { return (n*(n+1)*(2*n+1))/6; } void main() //main avec void { printf("la somme des carrs est:%d",som_carre(3)); //Appel de la fonction }
SM-SMI3 26
On peut crire la fonction som_carre autrement : int som_carre(int n) //dfinition de la fonction { int i,y; y=0; for(i=1;i<=n;i++) { y+=i*i; } return y; } void main() //main avec void { printf("la somme des carres est:%d",som_carre(3)); } SM-SMI3
27
Rgle 1 : Cette rponse lexercice montre lemplacement des dfinitions des fonctions dans un programme C. Elles sont places avant la fonction main.
SM-SMI3
28
Rponse 2 :
#include<stdio.h> int som_carre(int n); //entte de la fonction : dclaration void main() { printf("la somme des carrs est:%d",som_carre(3)); //Appel de la fonction }
int som_carre(int n) //dfinition de la fonction { return (n*(n+1)*(2*n+1))/6; }
SM-SMI3
29
Rgle 2 Cette deuxime rponse montre une autre faon pour placer les dfinitions des fonctions dans un programme C. Elles sont places aprs la fonction main. Lentte de la fonction doit tre plac avant main.
SM-SMI3
30
Rponse 3
#include<stdio.h> #include "util.h" void main() { printf("la somme des carrs est:%d",som_carre(3)); //Appel de la fonction } util.h est un fichier entte qui contient la dfinition de la fonction som_carre.
SM-SMI3 31
Rgle 3 Les fonctions utilises dans un programme peuvent tre dfinies dans un fichier appel fichier entte(extension .h).
SM-SMI3
32
Les fonctions - procdures Les fonctions- procdures ou procdures: des fonctions sans valeur de retour. La valeur de retour est void ou bien n'est pas spcifie. Une procdure ralise une tche au programme principal sans rendre une valeur.
SM-SMI3
33
SM-SMI3
34
Rponse 1 :
#include<stdio.h> void som_carre(int n) //dfinition de la procdure { int s; s=(n*(n+1)*(2*n+1))/6; printf("la somme des carrs est:%d", s); } main() { som_carre(3); //Appel de la procdure }
SM-SMI3
35
Rponse 2 :
#include<stdio.h> som_carre(int n) //dfinition de la procdure { int s; s=(n*(n+1)*(2*n+1))/6; printf("la somme des carrs est:%d", s); } main() { som_carre(3); //Appel de la procdure }
SM-SMI3
36
Rponse 3:
#include<stdio.h> som_carre(int n) //dfinition de la procdure { int s; s=(n*(n+1)*(2*n+1))/6; printf("la somme des carrs est:%d", s); return /*une valeur */; } main() { som_carre(3); //Appel de la procdure }
SM-SMI3
37
Appel d'une procdure On n'a pas besoin de mettre l'appel d'une procdure dans une expression comme dans le cas de celui d'une fonction.
SM-SMI3
38
Exemples d'appel
#include<stdio.h> som_carre(int n) //dfinition de la procdure { int s; s=(n*(n+1)*(2*n+1))/6; printf("la somme des carrs est:%d", s); } main() { int n=4; som_carre(n); som_carre(3); //Appel de la procdure }
SM-SMI3
39
Exemples de procdure
printf scanf
SM-SMI3
40
Les paramtres de fonctions -Paramtres formels : spcifier lors de la dfinition de la fonction. Ils sont des variables. -Paramtres rels ou effectifs : spcifier lors de l'appel de la fonction. Ils sont des variables, des constantes symboliques, littrales ou expressions qlqs compatibles avec les paramtres formels.
SM-SMI3 41
SM-SMI3
42
Transmission des paramtres : L'appel d'une procdure se fait en remplaant les paramtres formels par les paramtres effectifs. Ce processus s'appelle transmission des paramtres. Il y a une transmission par valeurs et une transmission par adresse( voir plus loin) Transmission par valeurs : on utilise la valeur du paramtre
SM-SMI3 43
Procdure ou fonctions sans paramtres : Une procdure peut tre sans paramtres. On l'exprime par () ou (void) aprs le nom de la procdure. Exemple main() ou main(void)
SM-SMI3
44
Exemple crire une procdure void table_5() qui affiche la table de multiplication de 5.
SM-SMI3
45
SM-SMI3
46
SM-SMI3
47
Rcursivit Construisons une fonction qui calcule la somme s(n)=1+2+n s(n)= (1+2++n-1)+n on peut en dduire s(n)= s(n-1)+n s(n-1)=s(n-2)+n-1 s(2)=s(1)+2 s(1)=1
SM-SMI3 48
SM-SMI3
49
Exemple Construire la fonction int factoriel(int n) qui retourne le factoriel de n. //f(n) = n*(n-1)*(n-2)**2*1 //f(n) = n*f(n-1), f(n-1) = (n-1)*f(n-2) etc int factoriel(int n) { if (n==0) return 1; else return factoriel(n-1)*n; }
SM-SMI3 50
Exercice Construire la fonction double som_inverse(int n) qui retourne la somme : s(n)=1+1/2+ 1/31/n .
SM-SMI3
51
Rponse
Exercice Construire la fonction int pair(int n) qui retourne 1 si n est pair et 0 si n est impair int pair(int n) { if (n==0) return 1; else if (n<0) return 0; else return pair(n-2); }
SM-SMI3 53
Ch 2 Les tableaux
SM-SMI3
54
Dfinition Un tableau est une suite d'lments de mme type. Cette suite est reprsente par un nom appel nom du tableau: Variable tableau. Exemple de tableau (reprsentation logique)
m 1 4 11 13 10
SM-SMI3
55
SM-SMI3
56
Taille et type d'un tableau Un tableau est caractris par : - un nom - une taille : nombre d'lments - un type : int, char
SM-SMI3
57
Exemple
m 1 4 11 13 10
Dclaration d'un tableau type nom_tableau[taille]; Exemple double notes[4]; double note1, note2;
SM-SMI3
59
Accs aux lments d'un tableau Chaque lment du tableau possde un indice pour y accder. Si un lment du tableau se trouve la case n, son indice est n-1. Le premier lment a l'indice 0 On accde l'lment d'indice i par nom_tableau[i]
SM-SMI3
60
Exemple
m 1 4 11 13 10
SM-SMI3
61
Accs aux lments d'un tableau Exemple double notes[4]; notes*0+, notes*1+
SM-SMI3
62
Oprations sur les tableaux Les lments d'un tableau de type t subissent les mmes oprations qu'une variable de type t.
Affectation Lecture criture Oprations arithmtiques Etc.
SM-SMI3
63
SM-SMI3
64
Initialisation d'un tableau la dclaration type nom_tableau*taille+=,val1,val2valn-; Exemple int x[2]={1,2}; x[0] a la valeur 1 et x[1] a la valeur 2.
SM-SMI3
65
Initialisation d'un tableau la dclaration(suite) type nom_tableau*+=,val1,val2valn}; Exemple int x[]={1,2}; x[0] a la valeur 1 et x[1] a la valeur 2.
SM-SMI3
66
Initialisation d'un tableau la dclaration(suite) type nom_tableau*+=,val1,val2valn}; Exemple int x[3]={1,2}; x[0] a la valeur 1 et x[1] a la valeur 2.
SM-SMI3
67
Utilisation de sizeof sizeof(type) donne la taille du type Exemple sizeof(int) est 4 sizeof(variable) sizeof(nom_tableau)
SM-SMI3
68
SM-SMI3
69
Exercice Construire un programme C qui lit les lments d'un tableau de rels de taille n (n lire aussi), les affiche , calcule leur somme et leur moyenne.
SM-SMI3
70
Rponse main() { int i,nb; float t[10], s=0; scanf("%d",&nb); //la taille effective du tableau for(i=0; i<nb; i++) scanf("%f",&t[i]); for(i=0; i<nb; i++) printf("%f\t",t[i]); for( i=0; i<nb; i++) s+=t[i]; printf("la somme est:%f",s); printf("la moyenne est:%f",s/n); }
SM-SMI3 71
Construire les procedure suivantes : void lecture(int t[], int nb) pour lire les lments du tableau t de taille nb. void affiche(int t[], int nb) pour afficher les lments du tableau t de taille nb.
SM-SMI3
72
Rponse void affiche(int t[], int nb) { int i; for(i=0;i<nb; i++) printf("%d\n",t[i]); }
SM-SMI3
73
Rponse (suite) void lecture (int t[], int nb) { int i; for(i=0;i<nb; i++) scanf("%d",&t[i]); }
SM-SMI3
74
SM-SMI3
75
Rponse
#include <stdio.h> void affiche (int t[], int nb) { int i; for(i=0;i<nb; i++) printf("%d\n",t[i]); } void lecture (int t[], int nb) { int i; for(i=0;i<nb; i++) scanf("%d",&t[i]); } main() { int t[3]; lecture(t,3); affiche(t,3); }
SM-SMI3 76
SM-SMI3
77
Tableaux de caractres(chanes de caractres) Soit le tableau suivant char nom[10]; la variable nom est une variable tableau de 10 caractres au maximum. nom*0+ dsigne le premier caractre Ce genre de variable s'appelle variable chane de caractres Un tableau de caractres se termine par le caractre '\0'. Il dsigne la fin de la chane.
SM-SMI3
78
SM-SMI3
79
Exemple #include <stdio.h> main() { char nom[10], prenom[10]; printf("donner le nom"); gets(nom); printf("donner le prenom"); gets(prenom); printf("vous avez saisi %s %s",nom, prenom); }
SM-SMI3 80
Les chanes constantes littrales Les constantes littrales de chanes de caractres sont dlimites par des qutes "" Exemple "salam"
SM-SMI3
81
Les lments d'une chane Chaque lment d'une chane est un caractre (i.e. crit entre apostrophes) char x[10]="salam"; x[0] contient le caractre 's', x[1] contient le caractre 'a', x[5] contient le caractre '\0', caractre de fin de chane.
SM-SMI3 82
Chanes et affectation On ne peut affecter des chanes des variables de chanes de manire globale ( la dclaration seulement). char x[10]; //dclaration de la variable chane x. char x[10]="salam"; // affectation de la chane "salam" la variable x(initialisation).
SM-SMI3 83
Chanes et affectation(suite) On peut aussi faire des affectations caractre par caractre. Exemple char x[10]; //dclaration de la variable chane x. x[0]='s'; // affectation du caractre 's' la premire case.
SM-SMI3 84
Initialisation des chanes -Initialisation globale Exemple char x[]="salam"; -Initialisation caractre par caractre Exemple char x[]={'s','a','l','a','m','\0'};
SM-SMI3
85
Oprateur d'adressage : & L'oprateur d'adressage & donne l'adresse d'une variable Syntaxe &nom_variable Exemple int x &x donne l'adresse de la variable x.
SM-SMI3
86
SM-SMI3
87
Notion de pointeur Pour placer l'adresse d'une variable(obtenue avec &) on utilise une variable dite variable pointeur ou pointeur. Dclaration d'une variable pointeur
Syntaxe type *nom_variable; L'oprateur * s'appelle oprateur d'indirection. Exemples
float *px; //px variable qui va pointer vers un float. int *py; //py variable qui va pointer vers un int.
SM-SMI3 88
SM-SMI3
89
Exemple pointeur et variable pointue int *py; //py variable qui va contenir l'adresse d'une variable int. int y=1;
On peut crire py=&y; //py contient maintenant l'adresse de la variable y.
SM-SMI3
90
Accs une variable pointue par un pointeur soit les int *px; int x=1;
px=&x; //py contient maintenant l'adresse de la variable y. Pour manipuler le contenu de x par le pointeur px, on utilise l'oprateur * de la manire suivante *px Toute opration que l'on peut effectuer directement sur x, on peut la faire indirectement avec *px.
SM-SMI3 91
Exemples d'oprations int *px, x; px=&x; - printf("%d est non premier\n",*px); - (*px)++; - *px=*x+2; Remarque Pour lire une valeur x, on crit: scanf("%d",&x); ou scanf("%d",px);
SM-SMI3 92
Oprations sur les pointeurs Soit les dclarations suivantes: int *x, y=1, *z, t; il est possible d'effectuer les oprations suivantes: x=&y; z=x; z=x+1; z++; z--; x=&*z; t=*&y;
SM-SMI3 93
Exercices Soit les dclarations suivantes: int x=1 , *y=&x, z=2, *t=&z; Donner les valeurs des expressions suivantes:
x+*y x+*t *y+*t 2**t+1**y.
SM-SMI3
94
Rponses Soit les dclarations suivantes: int x=1 , *y=&x, z=2, *t=&z;
x+*y 2 x+*t 3 *y+*t 3 2**t+1**y 5.
SM-SMI3
95
Pointeur 0 ou NULL. un pointeur ayant la valeur 0 est dit pointeur NULL. int *p=NULL; Ou int *p=0;
Remarque Le pointeur null est commun pour tous les types.
SM-SMI3
96
Pointeur et transmission des paramtres par adresses Pour expliquer simplement ce type de transmission, nous considrons l'exemple suivant : void echange( int x, int y) { int z; z=x; x=y; y=z; printf("dans echange les valeurs sont %d %d",x,y); } main()
{ int a=1, b=2; echange(a,b); printf("aprs echange les valeurs sont %d %d", a, b);
}
SM-SMI3 97
Exemple (suite) void echange( int *x, int *y) { int z; z=*x; *x=*y; *y=z; printf("dans echange les valeurs sont %d %d",x,y); } main()
{ int a=1, b=2; echange(&a,&b); printf("aprs echange les valeurs sont %d %d", a, b);
}
SM-SMI3 98
Pointeur et tableau
Soit la dclaration suivante: int tab_i[10]; - tab_i est un tableau de 1O lments. - tab_i est aussi un pointeur sur le premier lment du tableau tab_i. C'est--dire : tab_i[0] - Le premier lment peut tre manipul par *tab_i tab_i est un pointeur constant. tab_i++ tab_i=
SM-SMI3 99
SM-SMI3
100
Remarque
tab_i est un pointeur constant. On ne peut faire ce genre d'instructions tab_i++ tab_i=
SM-SMI3
102
SM-SMI3
103
Exercice Crer un programme en langage C avec les procdure suivantes: void lire(int *p, int nb) pour lire nb lments d'un tableau dont le premier lment est pointu par p. void ecrire(int *p, int nb) pour afficher nb lments d'un tableau dont le premier lment est pointu par p. void main() contenant des appels aux procdures lire() et ecrire() dfinies ci-dessus.
SM-SMI3 104
Rponse
#include<stdio.h> void lire(int *p, int nb) {int i; for(i=0;i<nb;i++) scanf("%d",p+i); } void ecrire(int *p, int nb) {int i; for(i=0;i<nb;i++) printf("%d",*(p+i)); } main() {int tab_i[10]; lire(tab_i,3); ecrire(tab_i,3);
SM-SMI3
105
SM-SMI3
106
Prsentation dans ce chapitre, nous allons tudier les fonctions qui simplifient la manipulation des chanes de caractres. Ces fonctions comprennent : - strlen(ch) donne longueur de ch; - strcmp(ch1,ch2) compare ch1 et ch2; - strcpy(ch1,ch2) copie ch2 dans ch1; - Etc.
SM-SMI3
107
Utilisation de strlen
#include<stdio.h> #include<string.h> main() { char ch1[100]="salam"; printf("%d",strlen(ch1)); }
SM-SMI3
108
Remarque strcmp prend en considration la casse. A est diffrent de a On peut utiliser stricmp pour ngliger la casse.
SM-SMI3
112
Utilisation de strncmp strncmp(ch1,ch2,n) compare les n premiers caractres de ch1 et ch2 Exemple strncmp("salam","salut",3) 0 Remarque on peut aussi utiliser strnicmp("Salam","salut",3)0
SM-SMI3
113
SM-SMI3
116
Changement de casse strlwr(ch) convertit ch en minuscule. strupr(ch) convertit ch en majuscule. Exemple printf(strlwr("Salam")); salam printf(strupr("Salam")); SALAM
SM-SMI3
119
Recherche d'un caractre dans une chane char *pointeur=strchr(ch, car) recherche le caractre car dans la chane ch.
#include<stdio.h> #include<string.h> main() {char ch[100]="salam "; char *ptr; ptr=strchr(ch,'a'); printf("%s",ptr); alam }
SM-SMI3 120
Recherche d'un caractre dans une chane char *pointeur=strrchr(ch, car) recherche le caractre car dans la chane ch partir de la fin.
#include<stdio.h> #include<string.h> main() {char ch[100]="salam "; char *ptr; ptr=strrchr(ch,'a'); printf("%s",ptr); am }
SM-SMI3 121
Recherche d'une sous-chane dans une chane char *pointeur=strstr(ch, sous-chane) recherche la sous-chane sous-chane dans la chane ch.
#include<stdio.h> #include<string.h> main() {char ch[100]="salam "; char *ptr; ptr=strstr(ch,"ala"); printf("%s",ptr); alam }
SM-SMI3 122
Recherche d'un caractre d'une chane dans une autre char *pointeur=strpbrk(ch1, ch2) recherche un caractre de ch2 (les occurrences de petits indices d'abord) dans ch1.
#include<stdio.h> #include<string.h> main() {char ch[100]="salam "; printf(strpbrk("salam","ra")); alam }
SM-SMI3 123