Académique Documents
Professionnel Documents
Culture Documents
1ère année
IUT de Villetaneuse.
Hanène Azzag,
Frédérique Bassino,
Pierre Gérard,
Bouchaïb Khafif,
Mathieu Lacroix,
Mustapha Lebbah,
Guillaume Santini.
11 septembre 2014
IUT de Villetaneuse
Intro à l’algorithmique et à la programmation 66 1er semestre
Chapitre 4
Fonctions
Une fonction est une portion de code (séquence d’instructions) effectuant une tâche précise
(un calcul par exemple). De nombreuses fonctions sont déjà définies (dans des bibliothèques) dans
le langage C++, telle que abs() par exemple. Les fonctions permettent de réutiliser les portions
de code effectuant la tâche, aussi souvent qu’on le souhaite et à n’importe quel endroit dans le
programme. De plus, les fonctions permettent de structurer le programme et de le rendre plus
clair.
Par exemple, si l’on souhaite faire la somme des valeurs absolues de deux nombres saisis par
l’utilisateur, il est plus clair d’écrire
1 double nb1, nb2, res;
2 cout<<"Donnez une premier nombre réel";
3 saisie(nb1);
4 cout<<"Donnez un deuxième nombre réel";
5 saisie(nb2);
6
7 if (nb1 < 0)
8 nb1 *= -1;
9 if (nb2 < 0)
10 nb2 *= -1;
11 res = nb1 + nb2;
12
67
IUT de Villetaneuse
Entrées
Programme
appelant Fonction
Sorties
obligatoire. Attention, même s’il n’y a qu’une seule instruction, les accolades sont obligatoires.
La ligne 1 est appelée en-tête de la fonction.
Remarque : En C++, au maximum une valeur peut être retournée par la fonction. Nous
verrons dans la suite comment envoyer d’autres valeurs de sorties au programme appelant.
Une fonction est appelée avec des valeurs de paramètres ou non : le programme appelant fournit
ou non des données à la fonction, et le déroulement de celle-ci ne sera pas le même suivant les
données fournies.
Voici un exemple de fonction :
1 void affiche_age(bool estHomme, string nom, int age)
2 {
3 if (homme)
4 cout << "Mr ";
5 else
6 cout << "Mme ";
7 cout << nom << " a " << age << " ans." << endl;
8 }
9
10 int main()
11 {
12 affiche_age(true,"Martin",23);
13 affiche_age(false,"Sophie",32);
14 return 0;
15 }
La fonction affiche_age() est définie avec les lignes 3 à 10. La ligne 3 correspond à l’en-tête
de la fonction et les lignes 4 à 10 au corps de la fonction. Cette fonction est appelée (exécutée)
deux fois et produit donc l’affichage :
1 Mr Martin a 23 ans.
2 Mme Sophie a 32 ans.
Remarques :
– Les définitions de fonctions doivent être écrites avant la définition de la fonction main. De
plus une fonction doit être définie avant d’être appelée.
– Une fonction peut appeler une autre fonction. Dans ce cas, elle joue le rôle de programme
appelant.
Lors de l’appel d’une fonction, l’utilisateur fournit les valeurs des paramètres. Ces valeurs
pourront changer à chaque appel.
Lorsqu’on écrit le code de la fonction, on souhaite que estHomme indique si la personne est un
homme ou non, nom correspond au nom de la personne et age à son age. La fonction ne retourne
aucune valeur.
Lors du premier appel de la fonction (ligne 14), les valeurs des paramètres (paramètres effectifs)
sont true, "Martin" et 23. Pour le deuxième appel (ligne 15), les valeurs des arguments sont false,
"Sophie" et 32.
Les valeurs des paramètres doivent être du même type que ceux indiqués pour les paramètres
dans l’en-tête de la fonction. Dans le cas contraire, une conversion implicite de type est faite.
Remarque : On peut définir des fonctions ne prenant aucun paramètre.
I Sur ce thème : Exercice 1, questions 1.1 à 1.13, TD 5
I Sur ce thème : Exercice 2, TD 5
Valeur de retour
Une fonction peut être appelée pour calculer une valeur. C’est le cas de la fonction size() qui
calcule le nombre de caractères d’une chaîne de caractères. Il est alors nécessaire que la fonction
transmette la valeur calculée au programme appelant (flèche "Sortie" dans la figure 4.1). Pour
cela, on utilise l’instruction return suivie de la valeur à retourner. Attention, au plus une valeur
peut être retournée en C++. Voici un exemple de fonction retournant le périmètre d’un rectangle :
1 double perimetreRectangle(double longueur, double largeur)
2 {
3 double perimetre = 2 * (longueur + largeur);
4 return perimetre;
5 }
6
7 int main()
8 {
9 cout << "Le périmètre du rectangle est : " << perimetreRectangle(5.2,3.4) << endl;
10 return 0;
11 }
Attention : : Lorsque l’instruction return est exécutée, la fonction se termine. Autrement dit,
plus aucune autre instruction de la fonction n’est exécutée par la suite. De plus, l’instruction
return peut être utilisée même sans retourner aucune valeur.
I Sur ce thème : Exercice 1, questions 1.14 à 1.16, TD 5
I Sur ce thème : Exercice 2, TD 5
Fonction principale
La fonction main contient le programme principal. Elle est automatiquement appelée par le
système d’exploitation à l’exécution du programme. Sa valeur de retour est un code de retour d’état
d’exécution du programme qui peut être récupéré par le système d’exploitation. Si l’exécution est
correcte, la valeur retournée doit être 0. Une valeur non nulle correspond à un code d’erreur.
1 void affiche_somme(int x, int y)
2 { // Les paramètres en entrée x et y sont aussi des variables locales à la fonction !
3
6 cout << "La somme de " << x << " et " << y << " vaut " << z << endl;
7 }
8
9 int main()
10 {
11 affiche_somme(7,5); // Attention ! deux paramètres, 7 et 5
12 cout << z << endl;
13 return 0;
14 }
produira l’erreur suivante :
1 tmp.cpp:419:11: error: use of undeclared identifier ’z’
2 cout << z << endl;
3 ^
4 1 error generated.
puisque z est une variable locale à affiche_somme et n’existe plus après l’appel de cette fonction.
De la même manière, il n’est pas possible d’accéder dans une fonction à une variable déclarée
dans la fonction main (ou une autre fonction). La compilation du code :
1 void f()
2 {
3 cout << a << endl; // a n’a pas été déclarée
4 }
5
6 int main()
7 {
8 int a = 12; // a est une variable locale du main()
9 f();
10 return 0;
11 }
produira l’erreur
1 mp.cpp:410:11: error: use of undeclared identifier ’a’; did you mean ’std::uniform_int_dis-
2 tribution<long>::a’?
3 cout << a << endl; // a une variable locale à f()
car, même si la variable a existe durant toute l’exécution du programme, elle est locale à la fonction
main et ne peut donc être utilisée ailleurs que dans cette fonction.
Le fait que les variables soient locales à des fonctions explique l’utilisation des paramètres
et valeur de retour. En effet, une fonction ne peut communiquer des données avec son
programme appelant qu’avec ces paramètres et valeur de retour.
I Sur ce thème : Exercice 1, questions 1.17 et 1.18, TD 5
8 int main()
9 {
10 int i;
11 i = 5;
12 cout << "i = " << i << endl;
13 change(i);
14 cout << "i = " << i << endl;
15 return 0;
16 }
i i i
(main) (main) (change)
5 5 5
(a) Après exécution de la ligne 11 (b) Avant exécution de la ligne 4
i i i
(main) (change) (main)
5 3 5
(c) Après exécution de la ligne 4 (d) Après exécution de la ligne 13
Dans la fonction main est déclarée une variable i, initialisée ligne 11. L’état de la mémoire après
l’exécution de cette instruction est décrit dans la figure 4.2(a). Seule la variable i de la fonction
main est présente en mémoire et sa valeur est 5. L’instruction ligne 12 affiche i=5. La fonction
change est ensuite appelée avec passage de la variable i par copie. Une copie de la variable est
donc créée en mémoire et affectée au paramètre de la fonction change (qui s’appelle également i).
L’état de la mémoire correspond à celui indiqué dans la figure 4.2(b). L’instruction ligne 3 affiche
donc i=5. Puis, la valeur de i est changée ligne 4. Une seule variable i est connue de la fonction
change, et c’est par conséquent celle-là qui est modifiée (voir figure 4.2(c)). La ligne 5 affiche alors
i=3. À ce moment-là, l’exécution de change est terminée et les variables associées libérées. Alors,
après l’exécution de la ligne 13, la mémoire est dans le même état qu’avant cet appel, comme
décrit par la figure 4.2(d). La ligne 14 affiche donc i=5.
Il est inutile de commencer à écrire le corps de la fonction si les trois premières étapes n’ont
pas été faites (ou du moins mûrement réfléchies).
Intro à l’algorithmique et à la programmation 74 1er semestre
Departement informatique
11 if (rep=="oui" || rep=="o")
12 return true;
13 return false;
14 }
I Sur ce thème : Exercices 8 à 7, TD 5
I Sur ce thème : Exercices 8 à 7, TD 5
I Sur ce thème : Exercices 8 à 7, TD 5
1er semestre 75 Intro à l’algorithmique et à la programmation
IUT de Villetaneuse
Question 1.2 : [En-tête et corps] Qu’est-ce que l’en-tête d’une fonction ? Le corps d’une fonction ?
Correction :
– En-tête : première ligne contenant le type de retour, le nom de la fonction, les paramètres (entre parenthèses
séparés par des virgules) ainsi que leur type.
– Corps : les instructions associées à la fonction. 3
Question 1.3 : [Paramètres et valeurs des paramètres] Quelle est la différence entre paramètres
et valeurs des paramètres ?
Correction :
– Paramètres : noms donnés entre parenthèses de l’en-tête de la fonction. Les paramètres n’ont pas de valeur
et sont utilisées dans le corps de la fonction pour expliquer les instructions.
– Valeurs des paramètres : les valeurs passées à la fonction lors d’un appel. 3
Question 1.4 : [Programme appelant] Qu’est-ce qu’un programme appelant pour une fonction ?
Correction :
Partie de code où la fonction est appelée (exécutée). Le programme appelant peut être le programme principal ou
une fonction. (Il peut y avoir plusieurs programmes appelants.) 3
Question 1.5 : [Parenthèses] Les parenthèses sont-elles obligatoires dans la définition d’une fonc-
tion s’il n’y a pas d’arguments ? Sont-elles nécessaires dans un appel de fonction s’il n’y a pas de
valeurs d’arguments ?
Correction :
Oui, les parenthèses sont nécessaires dans les deux cas pour indiquer à l’ordinateur que l’on définit ou que l’on
appelle une fonction. 3
Question 1.6 : [Nombre d’appels] Combien de fois une fonction peut-elle être appelée au mi-
nimum ? Au maximum ? Donner deux exemples où une fonction est appelée 100 fois, un avec
les mêmes valeurs d’arguments pour tous les appels, puis l’autre avec des valeurs d’arguments
différents à chaque appel.
Correction :
Une fonction peut être appelée 0 fois au minimum. Il n’y a pas de limite maximum (Par exemple une boucle infinie
appelant à chaque itération une fonction). Exemples avec la fonction int2string() :
1 int foisDeux(int n){
2 return 2*n;
3 }
4
Intro à l’algorithmique et à la programmation 76 1er semestre
Departement informatique
9 while (i<100)
10 {
11 accumulateur += foisDeux(1);
12 i++;
13 }
14
12 int main()
13 {
14 somme2nb(1,2);
15 return 0;
16 }
Donner, pour la fonction somme2nb, les numéros des lignes associées à l’en-tête, au corps de la
fonction, à la définition et à l’appel de la fonction. Indiquer également le programme appelant.
Donner finalement ses arguments et ses valeurs d’arguments lors de son appel. Répondre ensuite
aux mêmes questions pour la fonction afficheRes.
Correction :
– Fonction somme2nb :
– En-tête : ligne 6
– Corps : lignes 8-9
– Définition : lignes 6-10
– Appel : ligne 14
– Programme appelant : programme principal (fonction main)
– 2 arguments a et b de type int. Valeurs des arguments lors de l’appel : 1 et 2.
– Fonction afficheRes() :
– En-tête : ligne 1
– Corps : ligne 3
– Définition : lignes 1-4
– Appel : ligne 9
– Programme appelant : fonction somme2nb
– 1 argument nb. Valeur d’argument lors de l’appel : 3 (1+2). 3
1er semestre 77 Intro à l’algorithmique et à la programmation
IUT de Villetaneuse
7 int main()
8 {
9 cout << "hello" << endl;
10 return 0;
11 }
Lors de l’exécution de ce code, combien de fois la fonction f1 est-elle appelée ? Combien de fois
est affiché hello ?
Correction :
La fonction f1 n’est jamais appelée. hello est donc affiché une seule fois. 3
7 int main()
8 {
9 cout << "hello" << endl;
10 f2();
11 f2();
12 return 0;
13 }
Lors de l’exécution de ce code, combien de fois la fonction f2 est-elle appelée ? Combien de fois
est affiché hello ?
Correction :
La fonction f2 est appelée 2 fois. hello est donc affiché 5 fois. 3
7 void f4()
8 {
9 f3();
10 cout << "hello" << endl;
11 f3();
12 }
13
14 int main()
15 {
16 cout << "hello" << endl;
17 f3();
18 f4();
19 return 0;
20 }
Intro à l’algorithmique et à la programmation 78 1er semestre
Departement informatique
Lors de l’exécution de ce code, combien de fois sont appelées f3 et f4 ? Combien de fois est affiché
hello ?
Correction :
f4 est appelée 1 fois et f3 3 fois. hello est donc affichée 8 fois. 3
7 void f6(int n)
8 {
9 int i = 0;
10 while (i<n)
11 {
12 f5();
13 i++;
14 }
15 cout << "hello" << endl;
16 }
17
18 int main()
19 {
20 cout << "hello" << endl;
21 f5();
22 f6(2);
23 f6(4);
24 return 0;
25 }
Lors de l’exécution de ce code, combien de fois sont appelées f5() et f6() ? Combien de fois est
affiché hello ?
Correction :
f6 est appelée 2 fois et f5 7 fois. hello est affichée 17 fois. 3
6 int main()
7 {
8 int a = 3;
9 int b = 5;
10 a = 18;
11 f(b);
12 return 0;
13 }
Quel est l’affichage produit par l’exécution du code précédent ?
Correction :
a = 5 3
1er semestre 79 Intro à l’algorithmique et à la programmation
IUT de Villetaneuse
Question 1.13 : [Valeur d’arguments (2)] Quel affichage donne l’exécution du code :
1 void f(int a, int b)
2 {
3 cout << "a = " << a << ", b = " << b << endl;
4 }
5
6 int main()
7 {
8 int a = 3;
9 int b = 4;
10 f(a,b);
11 f(b,a);
12 f(a,a);
13 f(b+2,b-3);
14 return 0;
15 }
Correction :
1 a = 3, b = 4
2 a = 4, b = 3
3 a = 3, b = 3
4 a = 6, b = 1
3
Question 1.14 : [Valeur retournée par une fonction (1)] Lors de l’exécution de ce code, combien
de fois est appelée f ? Combien de fois est affiché hello ?
1 void f(int a)
2 {
3 if (a<0)
4 return;
5 cout << "hello" << endl;
6 }
7
8 int main()
9 {
10 f(3);
11 f(-2);
12 return 0;
13 }
Correction :
La fonction f est appelée 2 fois et hello est affichée une seule fois. 3
Question 1.15 : [Valeur retournée par une fonction (2)] Lors de l’exécution du code suivant, quel
est l’affichage produit ? Quelles sont les valeurs des variables ?
1 int f(int x)
2 {
3 return 2 * x + 3;
4 }
5
6 int main()
7 {
8 int res = f(3);
Intro à l’algorithmique et à la programmation 80 1er semestre
Departement informatique
Question 1.16 : [Valeur retournée par une fonction (3)] Considérons les fonctions somme1 et
somme2 définies par :
1 void somme1(int a, int b)
2 {
3 cout << a+b << endl;
4 }
5
3 void f()
1er semestre 81 Intro à l’algorithmique et à la programmation
IUT de Villetaneuse
4 {
5 int a = 18;
6 cout << "a = " << a << endl;
7 }
8
9 int main()
10 {
11 int a = 5;
12 f();
13 cout << "a = " << a << endl;
14 return 0;
15 }
Quel est l’affichage produit par l’exécution du code précédent ?
Correction :
1 a = 18
2 a = 5
3
8 int main()
9 {
10 f(3);
11 f(6);
12 return 0;
13 }
Quel est l’affichage produit par l’exécution du code précédent ? Ne peut-on pas améliorer le code ?
Correction :
1 a = 11
2 a = 11
Il y a un problème lors de la conception de la fonction f(). En effet, cette fonction prend un paramètre mais sa
valeur n’est jamais utilisée. Ce n’est donc pas un paramètre mais une variable locale. Certains compilateurs peuvent
même considérer ceci comme une erreur de compilation. Il faut donc simplifier le code en supprimant le paramètre.
1 void f()
2 {
3 int varLocale = 11;
4 cout << "a = " << varLocale << endl;
5 }
3
1 void compare(int a, int b)
2 {
3 if (a==b)
4 cout << a << " est égal à " << b << endl;
5 else if (a < b)
6 cout << a << " est inférieur à " << b << endl;
7 else
8 cout << a << " est supérieur à " << b << endl;
9 }
10
11 int main()
12 {
13 compare(12,18);
14 return 0;
15 }
3
Question 3.2 : Ré-écrire la fonction estPair() pour que cette dernière renvoie true si le nombre
reçu en paramètre est pair, false sinon.
Correction :
1
8 int main()
9 {
10 if (estPair(12))
11 cout << "12 est pair" << endl;
12 else
13 cout << "12 est impair" << endl;
14 return 0;
15 }
3
Écrire la fonction qui reçoit deux nombres flottants en argument et qui calcule et renvoie leur
moyenne. Que se passe-t-il si l’on souhaite faire la moyenne de 2 et de 3 ?
Correction :
1 double moyenne(double a, double b)
2 {
3 return (a+b)/2;
4 }
5
6 int main()
7 {
8 cout << "Moyenne de 2 et 3 = " << moyenne(2,3) << endl;
9 return 0;
10 }
Il n’y a aucun problème pour faire la moyenne de deux entiers car comme les paramètres sont spécifiés comme étant
de type double, les valeurs 2 et 3 sont implicitement convertis en 2.0 et 3.0 respectivement. Dans tous les cas, (a+b)
est de type double et la division n’est pas une division entière (le dénominateur est automatiquement converti en
double). 3
Intro à l’algorithmique et à la programmation 84 1er semestre
Departement informatique
1 cout << absolue(-49.6) << endl; //Affiche 49.6
3
3. Fonction permettant la saisie d’un entier compris dans un intervalle [a, b] (Par exemple, saisie
d’un entier entre 10 et 20).
Correction :
1 /*!
2 * \fn int saisieBornee(int a, int b)
3 *
4 * Fonction retournant un entier positif saisi par l’utilisateur compris entre a et b
5 *
6 * \param nb : borne inférieure de l’intervalle
7 *
8 * \param nb : borne supérieure de l’intervalle
9 *
10 * La fonction renvoie la valeur saisie par l’utilisateur
11 */
Exemple d’appel :
1 int a = saisieBornee(10,20);
3
4. Fonction calculant la somme de deux fractions (par exemple la somme de 1/3 et 4/27)
Correction :
1 /*!
2 * \fn void sommeFractions(int num1, int den1, int num2, int den2, int &num_res, int &den_res)
3 *
4 * Fonction calculant la somme de deux fractions. Chaque fraction est codée avec deux entiers :
5 * - un pour le numérateur
6 * - un pour le dénominateur
7 *
8 * \param num1 : numérateur de la première fraction
9 * \param den1 : dénominateur de la première fraction
10 * \param num2 : numérateur de la deuxième fraction
11 * \param den2 : dénominateur de la deuxième fraction
12 * \param num1 : numérateur de la fraction résultat (valeur indéfinie en entrée)
13 * \param den1 : dénominateur de la fraction résultat (valeur indéfinie en entrée)
1er semestre 85 Intro à l’algorithmique et à la programmation
IUT de Villetaneuse
14 *
15 * La fonction ne renvoie rien
16 */
Exemple d’appel :
1 int den,num;
2 sommeFractions(1, 2, 2, 3, num, den);
3 cout << "1/2 + 2/3 = " << num << "/" << den << endl;
3
5. Fonction permettant de remplacer dans une chaîne de caractères chaque occurence d’une
chaîne par une autre. Par exemple, le remplacement de "o" par "yoo" dans "bonjour"
(transformant "bonjour" en "byoonjyoour").
Correction :
1 /*!
2 * \fn void remplaceSousChaine(string &texte, string cible, string remplacement)
3 *
4 * Fonction remplaçant dans texte chaque occurence de cible par remplacement
5 *
6 * \param texte : chaîne dans laquelle on effectue les remplacements
7 * \param cible : portion de chaîne que l’on veut remplacer
8 * \param remplacement : chaîne qui remplace les occurences cibles trouvées
9 *
10 * La fonction ne renvoie rien
11 */
Exemple d’appel :
1 string s = "bonjour";
2 remplaceSousChaine(s,"o","yoo");
3 cout << s << endl; //Affiche byoonjyoour
3
Attention, le résultat peut très vite dépasser la capacité de stockage des int. Il vaut mieux déclarer la variable
produit et le retour de fonction comme unsigned long int voire comme double ou double suivant les valeurs des
paramètres que l’on veut tester. 3
1er semestre 87 Intro à l’algorithmique et à la programmation
IUT de Villetaneuse
10 int main()
11 {
12 int nombre;
13 saisie(nombre);
14 cout<< "la valeur absolue de "<< nombre << " est "<< absolue(nombre)<< endl;
15 return 0;
16 }
3
2. Fonction permettant la saisie d’un entier positif ou nul et permettant d’effectuer des saisies
jusqu’à ce que ce nombre soit correct.
Correction :
1 int saisiePosNul()
2 {
3 int nb =-1;
4
14
15 int main()
16 {
17 int nombre;
18 nombre=saisiePosNul();
19 cout<< nombre << " est positif ou nul "<< endl;
20 return 0;
21 }
3
Intro à l’algorithmique et à la programmation 88 1er semestre
Departement informatique
3. Fonction permettant la saisie d’un entier compris dans un intervalle [a, b] (Par exemple, saisie
d’un entier entre 10 et 20) et permettant d’effectuer des saisies jusqu’à ce que ce nombre soit
correct en indiquant à l’utilisateur s’il doit donner un nombre plus petit ou plus grand.
Correction :
1 int saisieBornee(int a, int b)
2 {
3 int nb;
4 //saisie controlee avec indications nombre compris entre a et b (inclus)
5 cout << "Saisir un nombre entre "<< a << " et "<< b <<" (inclus) "<<endl;
6 saisie(nb);
7 while( nb < a || nb > b)
8 {
9 if (nb<a)
10 cout<< "Plus grand !" <<endl;
11 else
12 cout<< "Plus petit !" <<endl;
13 cout << "Saisir un nombre entre "<< a << " et "<< b <<" (inclus) "<<endl;
14 saisie(nb);
15 }
16 return nb;
17 }
18
19 int main()
20 {
21 int nombre;
22 nombre=saisieBornee(10,20);
23 cout<< nombre << " est dans le bon intervalle "<< endl;
24 return 0;
25 }
3
13 int main()
14 {
15 double nb;
16 int p;
17
1er semestre 89 Intro à l’algorithmique et à la programmation
IUT de Villetaneuse
Travail à faire :
– Écrire cette fonction,
– Écrire un programme de tests permettant d’afficher un message clair suivant la valeur du
discriminant calculé : "Pas de racines réelles", "Racine double réelle", etc.
Correction :
1
2 /*!
3 * Fonction retournant la valeur du discriminant du polynome a*x*x + b *x + c = 0
4 *
5 * \param a : coefficient de second degré
6 * \param b : coefficient de premier degré
7 * \param c : constante de l’équation
8 *
9 * La fonction renvoie la valeur du discriminant
10 */
11 double discriminantPlySecondDegre (int a, int b, int c){
12
13 return b*b-4*a*c;
14 }
Exemple d’appel de la fonction discriminantPlySecondDegre :
1 int main()
2 {
3 double discriminant = discriminantPlySecondDegre (1,2, -3);
4
5 if (discriminant>0)
6 cout << "Deux racines réelles" << endl;
7 else if (discriminant==0)
8 cout << "Racine réelle double" << endl;
9 else
10 cout << "Aucune solution réelle " << endl;
11
12 return 0;
13 }
3
20 cout<<"Le pgcd de " << a << " et de " << b << " est " << res<<endl;
21
22 return 0;
23 }
Affichage obtenu :
Le pgcd de 4 et de 10 est 2
3
1er semestre 91 Intro à l’algorithmique et à la programmation