Vous êtes sur la page 1sur 4

TD 7

Fonctions en Turbo Pascal


Tout comme en mathmatique, il est possible en Turbo Pascal de dfinir des fonctions pour les utiliser plus tard dans le calcul. Cela plusieurs intrts : si une fonction/un calcul est utilis plusieurs fois dans le mme programme, il suffit de le programmer une fois dans une fonction, puis l'on peut l'utiliser i l'on veut. Le second est de rendre le programme plus lisible : en effet, on peut choisir le nom des fonctions de faon facilement se souvenir de ce quelle est cense faire. On va ici dfinir la fonction tangente, qui n'existe pas de base dans turbo pascal. PROGRAMessai_fonction; VARalpha,beta,res:REAL; FUNCTIONtan(x:real):real; BEGIN tan:=sin(x)/cos(x); END; BEGIN readln(alpha,beta); res:=tan(alpha)+tan(beta)+2*tan(alpha+beta); writeln(res); END. On notera le parrallle avec la dfinition mathmatique : tan : , x sin x /cos x . Le mot cl FUNCTION annonce que l'on va dclarer une fonction, tan est le nom de la fonction que le veut dfinir, (x:real) le nom de l'argument de la fonction, et sont type (rappel : real ). enfin :real;annonce le type du rsultat de la fonction. Enfin, le code compris entre le BEGIN et le END dcrit les calculs faire pour calculer la fonction. Une fois le calcul termin s'il ne se fait pas en une seule instruction, on rutilise le nom de le fonction pour dire quel est le rsultat final. Une fontion est en quelque sorte un mini programme elle tout seule, avec des arguments en plus. Une fonction peut avoir ses propres variables (qui ne rentre pas en collision avec celle du programme mme si elle le mme nom!), ses suites d'instructions, ses boucles Exemple : calcul du nime terme d'une suite en partant de x. FUNCTIONsuite(x:real;n:integer):real; VARi:integer; u:real; BEGIN u:=x; fori:=1tondou:=3.2*u*(u1); suite:=u; END;

Exercice 1
Faire un programme qui demande n et m et qui calcul

in
i=1

. (en utilisant des real, car avec les


m

puissances, le rsultats peuvent tre grand). Pour eviter de devoir faire une double boucle, on dfinira une fonction puissance, il suffira donc de calculer habituelle dont on code une somme.

puissance i , n
i=1

, de la faon

Correction: PROGRAMsomme_puissance; VARi,n,m:integer; s:real; FUNCTIONpuissance(a,b:integer):real; VARi:integer; p:real; BEGIN p:=1; Fori:=1tobdop:=p*a; puissance:=p; END BEGIN readln(n,m); s:=0; Fori:=1tomdos:=s+puissance(i,n); writeln(s); readln; END. Pour calculer la fonction puissance, il faut voir a b comme le produit aaaa (b fois). Un tel produit se calcul facilement (en gros comme une somme, sauf la valeur initial qui doit tre 1 et non pas 0, car c'est 1 l'lment neutre de la multiplication). Note : on dfinit deux fois la variable i dans ce code. n'est pas un problme ! Comme expliqu en introduction, le code d'une fonction, a ses propres variables lui. Si elle utilise un variable qui n'est pas dans ses variables locales ( elle ), elle utilisera les variables globales, mais si elle le choix elle utilisera toujours les siennes. Ainsi, il n'y pas de collisions entre les deux boucles.

Exercice 2 : Thorme des valeurs intermdiaires (Dichotomie, mon amour)


Soit f une fonction continue dfinie au moins sur un intervalle [ g , d ] , et telle que f(g) et f(d) ne soient pas de mme signe. Le thorme des valeurs intermdiaires nous dit alors qu'il existe x 0 [ g , d ] tel que f x 0 =0 . Le but de notre programme sera, tant donn f, g et d, trouver un tel x 0 (en fait trouver une valeur approche prs). Comme pour le jeu plus grand plus petit , nous allons partir de l'intervalle complet, puis le couper en deux en choisissant la moiti gauche ou la moiti droite comme il faut . Soit donc m= g d /2 le milieu du segment. Il y alors deux possibilit, soit f(m) est du mme signe que f(g), soit il est du mme signe que f(d). Dans le premier cas, l'intervalle [m , d ] vrifie la condition permettant d'appliquer le TVI, sinon c'est l'intervalle [m , g ] qui le vrifie. On choisi donc suivant le cas un nouvel intervalle [d ' , g ' ] , vrifiant la condition du TVI, et qui est deux fois plus petit que l'original. En rptant cet (bauche d') algorithme suffisamment souvent, on peut donc obtenir un intervalle aussi petit que l'on veux, sur lequel on est sr que la fonction s'annule : c'est la dichotomie. La proprit de l'intervalle (qu'il vrifie les conditions du TVI) est vraie pour le nouvel intervalle, si elle l'est pour l'ancien intervalle : c'est notre invariant de rcurrence (la condition du TVI est notre hypothse de rcurrence ). On peut donc prouver par rcurrence que cette proprit est vraie mme aprs avoir rpte n fois l'opration. Les preuves mathmatiques d'un certain nombre de thorme mathmatiques reposent sur cette technique (le TVI justement, mais aussi Bolzano-Weierstrass...) . Reprenons donc ! On un intervalle, on va lui appliquer cette opration jusqu' ce qu'il soit plus petit que 2 : in nous faut donc une boucle While. Une fois qu'il est plus petit que 2 , on en prend son milieu m. Or on sait que sur cette intervalle, il existe x 0 tq f x 0=0 , donc mx 0 : m est une approximation correcte ! Y-a plus qu'a ! Note : g, d et sont des rels, et pourront donc tre demand l'utilisateur avec un readln. Par contre f est une fonction. Nous somme obliger de la dfinir dans le programme mme. Mais justement, en utilisant FUNCTION, plutt que de retaper la formule de f chaque que f est utilise, on pourra trs facilement changer cette fonction f pour essayer notre algorithme sur diffrentes fonctions. Correction : Gardons notre sang froid ! Le programme crire est en fait assez court. L'important pour y arriver est de bien comprendre les explications ci dessus, et il peut tre utile d'essayer de visualiser les dcoupages successifs. Prendre une feuille, un crayon, est une bonne ide : dessinez une fonction, un intervalle vrifiant le condition du TVI. Puis marquez son milieu et dessinez le nouvel intervalle selon le procd ci dessus. Rptez 3 ou 4 fois. Une toute petite astuce peu vous simplifier beaucoup la vie. Comment tester si deux rels sont de mmes signes en Turbo-Pascal. Il existe une solution naturelle avec des boolens : IF(a>0)=(b>0)thenelse; Notons (a>0) est un boolen, qui vaut TRUE si a est positif , FALSE sinon (respectivement pour b). Ainsi, a et b sont deux mme signes si et seulement si (a>0) est gal (b<0). Si ce genre de ''bidouille'' avec les boolens vous rebutent, vous pouvez toujours utiliser l'astuce

suivante : a et b sont de mme signe ssi et seulement si le produit ab est positif : IFa*b>0thenelse;

C'est bon ? Allez on y va : PROGRAMdichotomie_mon_amour; VARg,d,m,epsilon:REAL; FUNCTIONf(x:real):real; BEGIN f:=10*sin(x)x*x; END; BEGIN Writeln('gauche,droite,epsilon?'); readln(g,d,epsilon); WHILEdg<2*epsilonDOBEGIN m:=(g+d)/2; IF(f(m)>0)=(f(g)>0) theng:=m elsed:=m; END; m:=(g+d)/2; writeln(m); readln; END. Vous pouvez maintenant servir de se programme pour trouver des solutions approches de toutes vos quations une inconnue en les mettant sous la forme f(x)=0 (si f est bien continue...). Il faut tout de mme deviner un intervalle vrifiant la proprit du TVI. En prenant f(x)=sin(x), g=3, d=4, et =0.000001 on obtient une valeur de correcte pour les 6 premires dcimales. De mme en prenant f(x)=ln(x)-1, g=1, d=3, et =0.0001 on obtient une valeur de e correcte pour les 4 premires dcimales. (Attention ne pas prendre epsilon trop petit : si on passe en dessous de la prcision des calculs sur les rels de l'ordinateur, il se peut que le programme bug ). Nous nous resservirons de cet algorithme durant le prochain TD. C'est une des bases fondamentales pour tudier les fonctions l'aide d''un ordinateur : comprendre et savoir refaire !

Vous aimerez peut-être aussi