Faculté Polytechnique de Mons Service d Informatique Travaux Pratiques d Informatique 1 par Mohammed BENJELLOUN Avec la participation de : J-F Bauwens, Assistant S. Mahmoudi, Assistant E. Malengreau, Assistante pédagogique A. Wermelinger, Assistante Année académique 2006-2007
Table des matières Introduction 1 Consignes....................................... 1 1 Instructions de base 2 1.1 Objectifs de la séance.............................. 3 1.2 Rappels syntaxiques.............................. 3 1.3 Le jeu de l urne................................. 5 1.4 Le jeu du nombre caché............................ 7 1.5 Pour ceux qui ont terminé........................... 9 2 Tableaux et instruction switch 10 2.1 Objectifs de la séance.............................. 11 2.2 Rappels théoriques............................... 11 2.3 Application................................... 12 3 Les Fonctions 14 3.1 Objectifs de la séance.............................. 15 3.2 Rappels théoriques............................... 15 3.3 Application................................... 16 4 Pointeurs, références et arguments de fonctions 18 4.1 Objectifs de la séance.............................. 19 4.2 Rappels théoriques............................... 19 4.3 Application................................... 22 Conclusions et perspectives 23 i
Introduction Consignes Si malgré la préparation du TP, vous n avez pas terminé à la fin de la séance, vous devrez le continuer seul et poser vos éventuelles questions avant le TP suivant. Vous pouvez venir nous les poser directement, durant les ateliers du mercredi ou les poser via le forum du cours. Cette remarque est valable pour tous les travaux pratiques de ce cours. Pour rappel, les travaux pratiques sont obligatoires. 1
Chapitre 1 Instructions de base Contents 1.1 Objectifs de la séance........................ 3 1.2 Rappels syntaxiques......................... 3 1.2.1 Les commentaires.......................... 3 1.2.2 Les opérateurs de base........................ 3 1.2.3 Les flux d entrées/sorties...................... 3 1.2.4 Les structures alternatives...................... 4 1.2.5 Les structures répétitives...................... 4 1.3 Le jeu de l urne........................... 5 1.3.1 Modifications............................. 5 1.3.2 Nombre aléatoire........................... 6 1.3.3 Complexité algorithmique...................... 6 1.4 Le jeu du nombre caché...................... 7 1.4.1 Première étape............................ 7 1.4.2 Deuxième étape............................ 8 1.4.3 Troisième étape............................ 8 1.4.4 Quatrième étape........................... 8 1.5 Pour ceux qui ont terminé..................... 9 2
Instructions de base 3 1.1 Objectifs de la séance Nous commencerons par rappeler dans ce chapitre les principales instructions qui seront utilisées lors de ces travaux pratiques. Ces notions seront illustrées avec la mise en pratique d un exemple traité durant le cours théorique. A la fin de cette séance, l étudiant maîtrisera la syntaxe des principales instructions de base. 1.2 Rappels syntaxiques 1.2.1 Les commentaires 1 // ceci est un commentaire 2 3 /* ceci est un commentaire 4 sur 5 plusieurs lignes*/ 1.2.2 Les opérateurs de base Voir syllabus d exercices, chapitre 2. 1.2.3 Les flux d entrées/sorties cout est le flux standard de sortie habituellement associé à l écran. cin est le flux standard d entrée habituellement associé au clavier. 1 #include <iostream> 2 using namespace std; 3 4... 5 // affichage à l écran 6 cout << "Un entier" 7 8 // saisie au clavier et stockage dans la variable temp 9 cin >> temp
Instructions de base 4 1.2.4 Les structures alternatives Si l expression A est vraie alors les instructions 1 et 2 s exécutent. Sinon, ce sont les instructions 3 et 4 qui s exécutent. 1 if (expressiona){ 2 instruction1; 3 instruction2; 4 } 5 else{ 6 instruction3; 7 instruction4; 8 } 1.2.5 Les structures répétitives 1 for ( expression1 ; expression2 ; expression3){ 2 instruction1; 3 instruction2; 4... 5 } 1 while (expression){ 2 instruction1; 3 instruction2; 4... 5 } 1 do{ 2 instruction1; 3 instruction2; 4... 5 }while (expression);
Instructions de base 5 1.3 Le jeu de l urne Le jeu de l urne expliqué durant le cours théorique consiste à tirer au sort 2 boules dans une urne. Les boules sont soit noires soit vertes. A chaque tirage, une boule est replacée dans l urne comme l illustre la figure 1.1. Le but du jeu est de déterminer la couleur de la dernière boule. Fig. 1.1 Illustration du jeu de l urne [2]. Programmer le jeu de l urne (version automatique) en respectant les étapes ci-dessous. 1. Demander à l utilisateur combien de boules vertes et noires existent dans l urne. Deux variables NN et NV seront utilisées pour mémoriser cette information. Calculer NT = NN + NV et afficher le résultat. 2. Dans un premier temps, l utilisateur tire les boules en regardant dans l urne. Il a donc le choix entre tirer deux boules noires, 1 noire et 1 verte, ou deux boules vertes. Réaliser un tirage. Afficher NN, NV et la couleur de la boule qui est remise dans l urne en fonction du choix de l utilisateur. Tester le programme et vérifier les différents cas possibles. 3. Afin de vider complètement l urne, il est nécessaire de prélever plusieurs fois des boules de l urne. Recommencer l opération précédente tant qu il y au a moins une boule dans l urne. S il n y a qu une boule dans l urne, le tirage est impossible. La boucle peut donc être interrompue avec l instruction break et la couleur de la dernière boule est affichée pour terminer le jeu. 1.3.1 Modifications Le programme résultant du point précédent peut être amélioré de plusieurs manières.
Instructions de base 6 1. Comme vu en théorie, le nombre d opérations dépend strictement du nombre initial de boules dans l urne. Mettre en commentaire les modifications du point 3 de la section 1.3 et recommencer le tirage i fois, pour i variant de NT à 2. 2. Recommencer la saisie des variables NN et NV tant que NT n est pas compris entre 1 et 20. En effet, il faut protéger l utilisateur des mauvaises manipulations qu il pourrait commettre. De plus, NN et NV doivent être positifs. 1.3.2 Nombre aléatoire Le jeu sera complet dès que l utilisateur tire réellement au sort les boules dans l urne. L ordinateur va donc générer un nombre aléatoire pour remplacer l intervention de l utilisateur dans le tirage au sort (point 2 de la section 1.3). Pour ce faire, les fonctions srand() et rand() seront utilisées. La première permettra d initialiser le générateur aléatoire de la machine à l aide d un nombre passé en paramètre. La seconde procède au tirage au sort d un nombre alétoire proprement dit. Un exemple est donné ci-après. 1 do 2 cin>>nbr; 3 while(nbr<0); 4 5 srand(nbr); //on initialise le générateur de chiffre aléatoire avec nbr saisi auparavant 6 7 // une boucle pour nous donner un nombre aléatoire entre 0 et 3 car 3 options sont possibles 8 do 9 choix=rand(); 10 while(choix>2); Il est possible d améliorer l exemple précédent grâce à l opération modulo (%). 1.3.3 Complexité algorithmique A l aide du programme précédent, vérifier la complexité de votre algorithme.
Instructions de base 7 1.4 Le jeu du nombre caché Ecrire un programme qui choisira un nombre entier aléatoire compris entre 0 et 100, puis le fera deviner à l utilisateur au moyen d essais successifs : le programme demandera au joueur d entrer un nombre; si le joueur devine le bon nombre, il a gagné, le programme lui affiche Bravo, c est trouvé! et s arrête. si le joueur ne donne pas le bon nombre, le programme lui précise trop petit ou trop grand, puis lui demande un autre essai, jusqu à ce que le joueur trouve. Dans un premier temps, le nombre à deviner sera saisi au clavier et sera nommé chifacher. Pour vous aider, voici le début du programme : 1 2 #include <iostream> 3 using namespace std; 4 void main() { 5 // chifacher : c est le chiffre que l on cherche 6 int chiffre, chifacher; 7 8 cout<<"entrez le chiffre positif (entre 1 et 100) a chercher : "; 9 cin >> chifacher; 10 11 cout<<"entrez votre chiffre positif "<<endl; 12 cin >> chiffre; 13 14 if (chiffre>chifacher) 15 cout << "Votre chiffre est Trop Haut \n"; 16 else if (chiffre = = chifacher) 17 cout << "Bravo c est trouve \n"; 18 else 19 cout << "Votre chiffre est Trop Bas \n"; 20 } Ecrivez ce programme et testez-le en jouant plusieurs fois. 1.4.1 Première étape Malheureusement, le chiffre à rechercher reste affiché à l écran. Dès lors, il n est pas très difficile de le trouver. Utilisez la boucle for afin d afficher 100 endl à l écran. Que se passe-t-il?
Instructions de base 8 1.4.2 Deuxième étape Lorsque le chiffre à rechercher n est plus affiché à l écran, il est presque impossible de le trouver dans l état où se trouve votre programme. En effet, il est nécessaire de disposer de plusieurs essais pour trouver le nombre à rechercher. Perfectionnez le programme pour que le joueur dispose de 5 essais pour trouver le nombre. Ensuite, modifiez le programme pour qu il puisse compter le nombre d essais du joueur et afficher le score en fin de partie. Cette boucle s exécute tant que l utilisateur n a pas trouvé. Comparez ces 2 méthodes et expliquez la principale différence? A la fin de chaque partie, une fois le nombre trouvé, le programme propose de continuer : une autre partie (O/N)? 1.4.3 Troisième étape Que se passe-t-il si le chiffre à rechercher n est pas compris entre 1 et 100? Remédiez à ce problème en obligeant le joueur à recommencer la saisie du chiffre à recherche tant que celui-ci n est pas compris entre 1 et 100. 1.4.4 Quatrième étape En vue d améliorer le programme, le chiffre à deviner ne sera plus saisi par l utilisateur mais choisi aléatoirement par l ordinateur. Pour ce faire, utilisez la fonction random. Testez le nouveau programme en jouant plusieurs fois. Que constatez-vous? Pourrait-on encore améliorer le programme?
Instructions de base 9 1.5 Pour ceux qui ont terminé Écrire un programme C++ qui calcule les racines d un polynôme du second degré à coefficients réels. Examinez toutes les possibilités (racines réelles, complexes, doubles, infinité ou inexistence de solutions). ax 2 + bx + c = 0 1 si a=b=c=0 Il y a une infinité de solutions réelles 2 3 si a=b=0 et c!=0 Il n y a aucune solution 4 5 si a=0, b!=0 et c!=0 une racine réelle de valeur -c/b 6 7 si a!=0, b!=0 et c!=0 8 delta = b*b - 4.0*a*c 9 si delta =0 // racine double 10 racine1 = racine2 = -b/(2*a) 11 sinon si delta > 0 //2 racines réelles 12 temp = sqrt(delta) 13 racine1 = (-b + temp)/(2*a) 14 racine2 = (-b - temp)/(2*a) 15 afficher( racine1) 16 afficher( racine2) 17 sinon // 2 racines complexes conjuguées 18 temp = sqrt(-delta) 19 reel = -b/2*a imag = temp/2*a 20 afficher("z1 = reel + imag*i") 21 afficher("z2 = reel - imag*i") aide : sqrt(x) = racine carrée de x, nécessite math.h
Chapitre 2 Tableaux et instruction switch Contents 2.1 Objectifs de la séance........................ 11 2.2 Rappels théoriques......................... 11 2.2.1 Les tableaux............................. 11 2.2.2 La structure de sélection switch................... 11 2.3 Application.............................. 12 2.3.1 Première étape............................ 12 2.3.2 Deuxième étape............................ 12 2.3.3 Troisième étape............................ 12 2.3.4 Quatrième étape........................... 13 10
Tableaux et instruction switch 11 2.1 Objectifs de la séance Le but de la séance est : de manipuler des tableaux (à une et deux dimensions) de différents types; de structurer un programme grâce à l utilisation de l instruction switch. 2.2 Rappels théoriques 2.2.1 Les tableaux Un tableau est un ensemble de variables de même type. Chacune d elles est appelée élément du tableau. Tous les éléments sont référencés à l aide du nom du tableau et sont stockés dans des emplacements contigus en mémoire. Syntaxe générale 1 Type Nom[n]; L élément Type correspond à l indicateur du type de données à stocker dans le tableau. L élément Nom est le nom du tableau déclaré. n définit le nombre d éléments et doit figurer entre crochets. Les tableaux sont indexés de 0 à n-1. Le premier élément correspond à l indice 0, le deuxième élément à l indice 1, etc. Un tableau à N dimensions est déclaré de la façon suivante : 1 Type Nom[Taille1][Taille2]...[TailleN]; où N est un nombre positif. 2.2.2 La structure de sélection switch L instruction de sélection switch est dédiée aux programmes qui déclenchent des actions en fonction de valeurs précises, comme les menus. Cette instruction permet de remplacer plusieurs if-else imbriqués et ainsi de gagner en lisibilité quand leur nombre augmente. Syntaxe 1 switch ( variable_contr^ole) { 2 case expression1: instruction1 ; 3 break; 4 case expression2: instruction2 ; 5 break; 6... 7 default:instruction-par-défaut ; 8 }
Tableaux et instruction switch 12 L expression conditionnelle variable contrôle est évaluée en premier. Si la valeur de renvoi est égale à l expression constante expression1, l instruction ensemble instruction1 s exécute. Si elle est égale à la valeur de expression2, ensemble instruction2 s exécute. Si la valeur de renvoi n est égale à aucune des expressions, l instruction figurant immédiatement après le mot clé default s exécute. Le mot clé case régit chaque cas. Remarque : En l absence de break, l instruction suivante est exécutée. 2.3 Application 2.3.1 Première étape Ecrire un programme qui demande à l utilisateur d entrer un entier N compris entre 1 et une constante Nmax. On fixera Nmax à 10. La valeur saisie sera mémorisée dans la variable N, par exemple. Le programme réitérera sa demande tant que N n est pas compris dans l intervalle fermé [1, Nmax]. Si l utilisateur ne satisfait pas à la demande après 3 essais, le programme s arrêtera. Tester le programme plusieurs fois. 2.3.2 Deuxième étape Après avoir saisi un entier N compris entre [1,Nmax], le programme proposera différentes opérations à l utilisateur : 1. calcul de la somme de N réels; 2. calcul de la moyenne de N entiers; 3. recherche du maximum de N string; 4. recherche du minimum d une matrice NxN de caractères. Le programme demandera ensuite à l utilisateur de faire son choix et le mémorisera dans la variable choix. Tester le programme plusieurs fois. 2.3.3 Troisième étape Une fois le choix de l utilisateur effectué, le programme l exécutera directement. Pour ce faire, utiliser l instruction switch afin de structurer le programme. Chaque cas du switch exécutera une des quatre opérations mentionnées ci-dessus et détaillées dans ce paragraphe.
Tableaux et instruction switch 13 Opération 1 - Calcul de la somme de N réels Le programme saisira N réels et les stockera dans un tableau. Il affichera les éléments du tableau puis calculera et affichera ensuite la somme de ces N réels. Pour rappel, la valeur de N est celle saisie en début de programme. Opération 2 - Calcul de la somme de N entiers Le programme saisira N entiers et les stockera dans un tableau. Il affichera les éléments du tableau puis calculera et affichera ensuite la moyenne de ces N entiers. Opération 3 - Recherche du maximum de N string Le programme saisira N string et les stockera dans un tableau. Il calculera et affichera ensuite le maximum (en se basant sur un classement alphabétique) de ces N strings. Opération 4 - Recherche du minimum d une matrice NxN de caractères Le programme saisira NxN caractères et les stockera dans une matrice (tableau à 2 dimensions). Il calculera et affichera ensuite le minimum (en se basant sur un classement alphabétique) de ces NxN caractères. 2.3.4 Quatrième étape Dès qu une opération est terminée, le programme proposera à nouveau le menu à l utilisateur tant que celui-ci ne décide pas de le quitter. Ajouter les instructions nécessaires pour satisfaire à cette condition. Pour vous aider : 1 boucle{ 2 cout << "Somme des reels, tapez 1" << endl; 3 cout << "Moyenne des entiers, tapez 2" << endl; 4 cout << "Max des strings, tapez 3" << endl; 5 cout << "Min de la Matrice de char, tapez 4" << endl; 6 cin >> choix; //deuxième étape 7 8 switch(choix){ 9 10 case 1: Saisit N réels, les range dans un tableau. Calcule et affiche la somme. 11 case 2: Saisit N entiers, les range dans un tableau. Calcule et affiche la moyenne. 12 case 3: Saisit N string, les range dans un tableau. Cherche et affiche le maximum. 13 case 4: Saisit NxN carctères, les range dans une matrice. Cherche et affiche le minimum. 14 }// switch(choix) - troisième étape 15 } // boucle - quatrième étape
Chapitre 3 Les Fonctions Contents 3.1 Objectifs de la séance........................ 15 3.2 Rappels théoriques......................... 15 3.3 Application.............................. 16 3.3.1 Première étape............................ 16 3.3.2 Deuxième étape............................ 16 3.3.3 Troisième étape............................ 17 14
Les Fonctions 15 3.1 Objectifs de la séance Le but de la séance est d apprendre à mettre en oeuvre des fonctions afin de modulariser un programme qui gagnera en lisibilité. 3.2 Rappels théoriques Une fonction est un ensemble d instructions, doté d un nom et pouvant éventuellement comporter des paramètres. On peut l appeler (en provoquant l exécution) depuis une autre fonction (éventuellement de la fonction main correspondant au programme principal ) en citant son nom, suivi, entre parenthèses, d une liste de paramètres, à condition d avoir préalablement déclaré cette fonction par un prototype. Il existe deux grandes classes de fonctions : celles qui ne revoient pas de résultats (fonction action); leur appel ne peut se faire que sous la forme d une instruction simple comme : 1 fct (n,a); celles qui fournissent un résultat; leur appel peut se faire, soit comme précédemment (leur résultat n est alors pas utilisé), soit au sein d une expression arithmétique, comme dans : 1 z= fct(n,x) * 2 + s ; Dans la définition d une fonction : l en-tête précise son nom, le type de paramètres (dits alors muets) et le type de sa valeur de retour; on utilise le mot void pour indiquer l absence de paramètres ou de valeur de retour; on peut déclarer des variables qui sont alors dites locales à la fonction, utilisables uniquement dans les instructions de la fonction. Une fonction peut renvoyer n importe quel type de valeur, à l exception d un tableau ou d une fonction. L instruction return figure dans la définition de la fonction et renvoir un type de valeur correspondant à celui qui est indiqué dans la déclaration. Lorsqu un tableau est mentionné en paramètre effectif, c est en fait la valeur de son adresse qui est transmise à la fonction. Cette dernière peut alors, contrairement à ce qui se passe pour les variables scalaires, modifier le contenu de ce tableau. Si l on souhaite qu une fonction modifie la valeur d une variable scalaire, il faut utiliser les pointeurs ou les références (voir TP4).
Les Fonctions 16 3.3 Application 3.3.1 Première étape Lors de cette séance, il vous est demandé de transformer le programme réalisé lors de la dernière séance en un programme modulaire, c est-à-dire un programme faisant appel à différentes fonctions. Pour rappel, dans un premier temps, on demandera à l utilisateur d entrer un entier N compris entre 1 et une constante Nmax. On fixera Nmax à 10. La valeur saisie sera mémorisée dans la variable N, par exemple. Le programme réitérera sa demande tant que N n est pas compris dans l intervalle fermé [1,Nmax]. Si l utilisateur ne satisfait pas à la demande après 3 essais, le programme s arrêtera. On demandera ensuite à l utilisateur d effectuer un choix parmi différentes opérations (voir ci-dessous) proposées dans une fonction menu(), par exemple. Une fois le choix de l utilisateur effectué, le programme l exécutera directement grâce à l utilisation de l instruction switch. Chaque cas du switch exécutera une des quatre opérations reprises ci-dessous. Chaque opération sera traitée à l aide de trois fonctions (une fonction saisie, une fonction affichage et une fonction propre à l opération traitée). Opération 1 - Calcul de la somme de N réels Le programme saisira N réels et les stockera dans un tableau (fonction Saisie reel(), par exemple). Il affichera les éléments du tableau (fonction Affiche reels(), par exemple) puis calculera et affichera ensuite la somme de ces N réels (fonction Affiche Som()). Pour rappel, la valeur de N est celle saisie en début de programme. Opération 2 - Calcul de la moyenne de N entiers Le programme saisira N entiers et les stockera dans un tableau. Il affichera les éléments du tableau puis calculera et affichera ensuite la moyenne de ces N entiers. Opération 3 - Recherche du maximum de N strings Le programme saisira N strings et les stockera dans un tableau. Il calculera et affichera ensuite le maximum de ces N strings (en se basant sur un classement alphabétique). Opération 4 - Recherche du minimum d une matrice NxN de caractères Le programme saisira NxN caractères et les stockera dans une matrice (tableau à 2 dimensions). Il calculera et affichera ensuite le minimum de ces NxN caractères (en se basant sur un classement alphabétique). 3.3.2 Deuxième étape Après avoir quitté la boucle switch et avant de quitter le programme, on demandera à ce dernier d afficher le résultat des quatre opérations (somme, moyenne, maximum, minimum).
Les Fonctions 17 Que se passera-t-il si les résultats des fonctions n ont pas été stockés dans une variable temporaire? Que se passera-t-il si le programme n a pas exécuté toutes les opérations? Existe-t-il un moyen simple qui permette de vérifier quels cas du switch ont été traités ou non? Pour vous aider, vous pouvez vous inspirer de la modularité suivante : 1 boucle{ 2 choix = menu(??); 3 switch(choix){ 4 case 1: Saisie_reels(???); 5 Affiche_Reels(???); 6 Som = Affiche_Som(???); 7 case 2: Saisie_entiers(???); 8 Affiche_enties(???) ; 9 Moy = Affiche_Moy(???); 10 case 3: Saisie_ strings(???); 11 Affiche_ strings(???); 12 Max = Affiche_Max(???); 13 case 4: Saisie_ Matrice(???); 14 Affiche_ Matrice(???); 15 Min= Affiche_Min(???); 16 } // switch(choix) 17 Ici avant de quitter le programme, on affiche Som, Moy, Max et Min; 18 } // boucle 3.3.3 Troisième étape Afin d optimiser le programme, est-il possible de minimiser le nombre de fonctions saisie et affichage? Que deviendrait le programme si les vecteurs des réels, des entiers et des strings n avaient pas tous le même nombre d éléments (même valeur de N)?
Chapitre 4 Pointeurs, références et arguments de fonctions Contents 4.1 Objectifs de la séance........................ 19 4.2 Rappels théoriques......................... 19 4.2.1 Les pointeurs............................. 19 4.2.2 Différents types de passage de paramètres d une fonction.... 19 4.2.3 Allocation dynamique de la mémoire................ 21 4.3 Application.............................. 22 4.3.1 Première étape............................ 22 4.3.2 Deuxième étape............................ 22 18
Pointeurs, références et arguments de fonctions 19 4.1 Objectifs de la séance Le but de la séance est : d utiliser des fonctions; de passer des paramètres par référence et/ou à l aide de pointeurs; de se familiariser avec la notion de vecteur dynamique. 4.2 Rappels théoriques 4.2.1 Les pointeurs Un pointeur est une variable dont la valeur est une adresse. Cette adresse est l emplacement d une autre variable en mémoire. On dit que le pointeur pointe vers cette autre variable. Il peut donc recevoir des valeurs différentes tout au long de l exécution du programme. Nous avons donc, lorsque le pointeur P pointe vers la variable i : Fig. 4.1 Illustration des pointeurs [1]. P = 35 P = 5A0F3 &P = 60C19 i = 35 &i = 5A0F3 4.2.2 Différents types de passage de paramètres d une fonction Il existe deux modes de passages de paramètres : le passage par valeur (cf. TP3) et le passage par référence (ou par adresse). Passage de paramètre par valeur Le passage de paramètre par valeur réalise une copie locale (au niveau de la fonction) de la valeur de la variable. La fonction travaille alors sur une copie de la variable et
Pointeurs, références et arguments de fonctions 20 toutes les modifications apportées à la copie seront oubliées à la fin de l exécution de la fonction (destruction de la copie). On utilise donc le passage par valeur lorsque le programme appelant n a pas besoin de garder les modifications, réalisées par la fonction, du contenu de la variable passée en argument. Remarque : l instruction return permet de récupérer les modifications d une et une seule variable vers la fonction appelante. Passage de paramètre par référence ou par adresse Le passage de paramètre par adresse transmet à la fonction l adresse de la variable qui sera utilisée durant l exécution de la fonction. Dès lors, les modifications seront réalisées sur la variable originale et seront donc toujours acquises après l exécution de la fonction. On utilise le passage par référence (ou par adresse) lorsque le programme appelant a besoin de garder les modifications, réalisées par la fonction, du contenu de la variable passée en argument. Remarque : lorsqu un tableau est mentionné en paramètre, c est en fait son adresse, qui correspond à l adresse de la première case du tableau, qui est transmise à la fonction. Exemple : Fig. 4.2 Illustration du passage par valeur, par pointeur, par référence [1].
Pointeurs, références et arguments de fonctions 21 Syntaxe : Déclaration : Appel : 1 void nom_fonction (type ¶mètre(s)); 1 nom_fonction ( paramètre(s)) Définition : 1 void nom_fonction (type ¶mètre(s)){ 2... 3 } 4.2.3 Allocation dynamique de la mémoire Il est parfois difficile de déterminer à l avance la taille requise d un tableau avant l exécution du programme. Trop élevée ou trop réduite, la taille d un tableau peut pénaliser considérablement une application. Heureusement, il existe des opérateurs spécifiques d affectation dynamique de mémoire permettant d allouer et de libérer de la mémoire. Les opérateurs new[] et delete[] sont utilisés pour allouer et restituer la mémoire pour les types tableaux. Il est ainsi possible de réserver l espace strictement nécessaire au bon fonctionnement de l application. Syntaxe : Allocation : 1 type *nom_tableau = new type[taille] ; Libération : 1 delete[] nom_tableau ;
Pointeurs, références et arguments de fonctions 22 4.3 Application 4.3.1 Première étape Écrire un programme qui traite un vecteur de nombres entiers et de taille maximale égale à vingt (taille max = 20) et qui gère en boucle le menu suivant : 1. Saisie du vecteur et affichage de ses données. 2. Calcul (1 seule fonction) et affichage du minimum et du maximum du vecteur. 3. Échange de position maximum minimum et affichage. 4. Efface le premier et le dernier élément du vecteur et affichage. 5. Ajout d un élément au milieu du vecteur et affichage. 6. Tri à bulles du vecteur et affichage. 7. Quitter. Consignes : Le menu sera affiché via une fonction et les différentes opérations seront traitées via l instruction switch case. Les points 1 à 6 seront chacun traités par au moins une fonction. Le nombre d éléments N du vecteur, plus petit ou égal à taille max, doit être demandé et testé dans la fonction saisie. Il vous est demandé d éviter l utilisation de l instruction return dans les fonctions et de privilégier l emploi des références pour retourner les modifications des paramètres à la fonction appelante. L optmisation des tests est souhaitée; le calcul du minimum, par exemple, ne peut être effectué avant de faire la saisie des données du vecteur. 4.3.2 Deuxième étape Que deviendrait le programme si le vecteur est crée dynamiquement?
Conclusions et perspectives Les travaux réalisés permettront d aborder avec sérénité la programmation orientée objet en 2ème année de Bachelier. Les lecteurs ne doivent pas perdre de vue qu il serait très difficile de parcourir exhaustivement les bases du C++ en si peu de temps. Dès lors, les travaux pratiques décrits ici sont considérés comme une introduction à un domaine très vaste, aussi bien par la matière qu il aborde que par les problématiques qu il peut résoudre. 23
Bibliographie [1] M. Benjelloun, Introduction à la programmation en c++, 1e bachelier, Syllabus, Mutuelle d Edition des étudiants, Faculté Polytechnique de Mons, 150 pages, 2006-2007. [2] G. Libert, Informatique 1 : cours de théorie, Syllabus, Mutuelle d Edition des étudiants, Faculté Polytechnique de Mons, 2006-2007. 24