TE 6 Structures de contrôle en fortran et C A Structures de contrôle

Publié par

TE 6 Structures de contrôle en fortran et C Références – Polycopié fortran : chap. 4 ; chap. 2, section 2 ; annexe C – Polycopié C : chap. 6 – Transparents : cours 3 A Structures de contrôle A.1 Structures conditionnelles Exercice 1 : Affectation et test A Compiler les programmes affectation-test.c 1 et affectation-test.f90 suivants, Dans le cas où un exécutable est produit, tester le programme avec les valeurs (2, 2), (0, 0), (2, 0) puis (0, 2) ; expliquer.
  • erreur de troncature de la série
  • epsilon
  • recherche de epsilon float par dichotomie
  • recherche de epsilon real implicit
  • durée d'exécution suivant l'opti- misation avec la commande time
  • eps
  • real
  • somme
  • sommes
  • programmes
  • programme
Publié le : mercredi 28 mars 2012
Lecture(s) : 84
Source : wwwens.aero.jussieu.fr
Nombre de pages : 5
Voir plus Voir moins
TE 6
Structures de contrÔle en fortran et C
RÉfÉrences – Polycopifortran: chap.4; chap. 2, section 2; annexe C – PolycopiC: chap. 6 – Transparents: cours 3
A Structuresde contrÔle A.1 Structuresconditionnelles Exercice 1 : Affectation et testA 1 Compiler les programmesaffectation-test.cetaffectation-test.f90suivants, Dans le cas oÙ un excutable est produit, tester le programme avec les valeurs(2,2),(0,0),(2,0)puis(0,2); expliquer. Corriger les programmes pour obtenir le comportement attendu. affectation-test.c affectation-test.f90 #include <stdio.h>program affectation #include <stdlib.h>implicit none int main(void){ int i, j;integer :: i, j printf("saisir deux entiers\n");write(*,*) "saisir deux entiers" scanf("%d %d", &i, &j);read(*,*) i, j printf("i=%d j=%d\n",i, j);write(*,*) "i=", i, " j=", j if (i=j) {if (i=j) then printf("i et j sont egaux : i=%dj=%d\n", i, j);write(*,*) "i et j sont egaux, i=", i, " j=", j } endif exit(EXIT_SUCCESS); } endprogram affectation
Exercice 2 :A Ècrire un programme qui saisit deux nombresentiersxety, les affiche, puis les compare et affiche (selon les cas) un des trois messages suivants :xest plus grand quey,xest plus petit queyoux est gal Ay. 1. ál’aide deifsanselse. 2. ál’aide de structures de typeif... else ...imbriques. 3.BÈcrire une deuxime version de ce programme avec une seule structureif ...com-portant unelse if. 4.BDans quel langage peut-on aussi utiliser une structure d’numration de cas (case) ? 5. Transformer le programme pour utiliser des rels (floatoureal). Tester alors avec les valeurs9.8765430et9.8765435
Exercice 3 : AnnÉes bissextilesA On rappelle qu’une anne est bissextile : – sielle est multiple de 4 mais n’est pas multiple de 100, ou – sielle est multiple de 400.
1. EnC, compiler d’abord avecgccseul, puis avec les options de l’aliasgcc-mni-c99et noter l’intÉrt des options.
1
TE 6. Structures de contrÔle en fortran et C
UPMC M1 :MNI
1. Ècrireun programmebissextile.c(bissextile.f90) qui dtermine si une anne est bis-sextile, en utilisant des tests imbriqus. Le programme prendra en charge la saisie de l’anne. 2. Enfaire une versionbissextile2oÙ la condition est value sous forme de boolen avec des oprateurs logiques. 3. Copierl’un des programmes prcdents pour construire un programmeliste_bissextile affichant la liste des annes bissextiles entre les annes 1880 et 2020 en utilisant une structure itrative avec compteur.
A.2 StructuresitÉratives Exercice 4 : SommesA 1. ál’aide d’une structure itrative avec compteur, crire un programme qui imprime la suite des entiers de 1 A 10. Le complter progressivement pour qu’il affiche cÔte A cÔte la somme des entiers de 1 A 10, leurs carrs et la somme de ces carrs. Complter le programme en affichant de plus les sommes calcules grĀce aux expressions analytiques suivantes : n n X X n(n+ 1)n(n+ 1)(2n+ 1) 2 i=eti= 2 6 i=1i=1 Comparer les rsultats obtenus. 2.ABá l’aide d’une structurewhileen C oudo whileen fortran, crire un programme qui imprime la suite des entiers positifs, la somme de ces entiers, leurs carrs et la somme de ces carrs, en arrtant le calcul ds que la somme des carrs dpasse 500.
Exercice 5 : Somme de la sÉrie alternÉe harmoniqueA On se propose de calculer la somme de la srie suivante : n+1 1 1(1) 1+ +∙ ∙ ∙+ +∙ ∙ ∙= ln2 2 3n Notations : nX X Sn=uiS= limSn=ui n→∞ X i=1i=1 RnSn1S Rn=SSn1=uiεn= = S S i=n On rappelle que, pour une srie alterne, le resteRn, caractrisant l’erreur de troncature de la srie, peut tre major en valeur absolue par le premier terme omis dans la somme finie :|Rn|6|un|. Ècrire et tester A chaque tape un programmealtern.f90et un programmealtern.cqui : 1. pournfix, calculent et affichent la somme finieSnainsi que l’cart relatifεnavec la limite thorique ; 2. dterminentle nombrenmaxde termes suffisant pour assurer une erreur relative detronca-42 turemajore parreltol, valeur que l’on saisira au clavier dans le domaine[10,10 ]; 3.ABeffectuent la sommation dans l’ordrequi limite les erreurs d’arrondi ; on testera l’effet 7 du changement de l’ordre de sommation pour des prcisions relatives jusqu’A 10. On demande de travailler en simple prcision (REALen fortran et enfloaten C).
2
2011-2012
UPMC M1 :MNI
TE 6. Structures de contrÔle en fortran et C
Exercice 6 : Recherche des nombres premiersAB
1. Ècrireun programme qui dtermine et affiche si un nombre entier fourni par l’utilisateur est premier ;le tester. Puis en faire une deuxime version qui optimise la recherche des diviseurs entiers (quel pas choisir et oÙ s’arrter?). 2. Transformerce programme pour qu’il affiche et compte tous les nombres premiers infrieurs A un entier fourni par l’utilisateur (on pourra comparer la dure d’excution suivant l’opti-misation avec la commandetimeA condition de rediriger les entres/sorties).
Exercice 7 : PrÉcision des flottants : recherche deεAB
Les rels reprsents en virgule flottante sont cods sur un nombre fixe de bits rpartis entre : – signe – mantisse(qui dtermine la prcision) – exposant(qui dtermine le domaine) Les rels sont donc reprsents approximativement et dans un intervalle fini par un ensemble discret n n+1 23 et fini de valeurs. Dans chaque octave[2,2 ], les2flottants sur 32 bits sont en progression n23 arithmtique de raison2εε= 2. En particulier, pourn= 0, la valeur1.est reprsente exactement, et son successeur est1 +ε. Mais son prdcesseur, dans l’octave[1/2,1], est1ε/2. L’cart relatif entre deux rels conscutifs est donc compris entreε/2etε. La prcision relative de reprsentation des rels est donc majore parε.
epsilon.c #include <stdio.h> #include <stdlib.h> // definition des caracteristiques des flottants #include <float.h> int main(void){ float eps; eps = FLT_EPSILON; printf("FLT_EPSILON %g\n",eps); exit(EXIT_SUCCESS); }
epsilon.f90 program real_eps implicit none real :: eps eps = epsilon(1.) write(*,*) "epsilon(1.) = ", eps end program real_eps
1. Excuterles programmesepsilon.c(epsilon.f90) afin d’afficher la valeur deεpour le type floaten C et pour le typeREALen fortran respectivement. Que se passe-t-il si on imprime cette valeur en format%fen C ou en formatf8.6en fortran? 2. Justifierles valeurs affiches sachant que pour les flottants sur 32 bits, 23 bits sont consacrs A la mantisse, 8 A l’exposant et 1 au signe. 3.BOn se propose dans la suite de rechercher un encadrement deεpar une mthode de dichotomie. On considre des intervalles[f1, f2]de borne infrieure fixef1= 1., et de largeurδ=f2f1variable. La borne infrieure,f1, est reprsente exactement mais la borne suprieure,f2, sera arrondie au flottant le plus proche. On part deδ= 1.et on diviseδ par 2 A chaque tape de l’itration jusqu’A ce que borne infrieure et borne suprieure soient confondues dans la reprsentation en flottant. Complter le code fourni dansrech-epsilon 2 pour mettre en œuvre l’itrationet afficher la largeur de l’intervalle. Comparer avecεaffich prcdemment. Expliquer A l’aide d’un schma figurantf1= 1.et son successeur, ainsi que f2et son approximation en flottant pour les dernires tapes de la dichotomie. On pourra essayer des divisions par des valeurs infrieures A 2 pour tudier plus en dtail l’encadrement; la recherche sera alors plus longue.
2. EnC, on veillera À n’utiliser que des constantes de typefloatpour Éviter des opÉrations endouble.
2011-2012
3
TE 6. Structures de contrÔle en fortran et C
rech-epsilon.c #include <stdio.h> #include <stdlib.h> #include <float.h> // necessaire pour FLT_EPSILON int main(void){ float eps; float f1, f2, delta; eps = FLT_EPSILON; printf("FLT_EPSILON %g\n",eps); // recherche de epsilon float par dichotomie // initialisation delta = 1.f; f1 = 1.f; f2 = f1 + delta;
// a completer par la boucle de dichotomie
exit(EXIT_SUCCESS); }
4
UPMC M1 :MNI
rech-epsilon.f90 program real_eps ! recherche de epsilon real implicit none real :: eps real :: f1, f2, delta eps = epsilon(1.) write(*,*) "epsilon(1.) = ", eps ! initialisation delta = 1. f1 = 1. f2 = f1 + delta
! a completer par la boucle de dichotomie
end program real_eps
2011-2012
UPMC M1 :MNI
B ComplÉments(facultatifs)
TE 6. Structures de contrÔle en fortran et C
Exercice 8 : Nombre d’orAB L’objectif est d’crire un programme calculant le Nombre d’Or. Celui-ci peut tre obtenu A partir de la suite de Fibonnacciundfinie par la rcurrence suivante :
un+1=un+un1avecu0= 1etu1= 1   1+ 5 La suite des rapportsvn=un+1/unconverge vers le Nombre d’Or de valeur thorique. 2 1. Quellestructure de contrÔle permet de piloter le calcul des termes de la suite jusqu’A ce que le rapportvnde deux termes conscutifs converge A la prcision relativeηprs ? 2. Ècrirele programme de calcul des suitesunetvn. 4 3. Testerle programme avecη= 10enrealen fortran et enfloaten C. Combien d’itrations 1+ 5 sont ncessaires? Comparez la valeur trouve Acalcule dans le mme type. 2 6 4. Lereprendre avecη= 10. Combien d’itrations sont ncessaires? 10 5.BQue doit-on modifier pour atteindre la prcision de10? Quel est alors le nombre d’itrations ncessaires? Reprendre la comparaison thorique avec attention.
Exercice 9 : Somme de la sÉrie entiÈre de argsh(x)B La fonction argument sinus hyperbolique admet le dveloppement en srie entire suivant lorsque |x|61: X 1 1×3 1×3×5 3 57 argshx=xx+xx+∙ ∙ ∙=an(x) 2×3 2×4×5 2×4×6×7 n=0 (6.1) n (1) (2n)! 2n+1 an(x) =x 2n2 2n+ 12 (n!) 1. Indiquerpourquoi programmer le calcul de cette srie en calculant le terme gnralan(x)tel qu’il est crit ci-dessus n’est ni numriquement sÛr, ni numriquement efficace. an+1(x) 2. Encalculant ,montrer qu’il existe une relation de rcurrence liantan+1(x)Aan(x). an(x) 3. Programmerle calcul de la srie en utilisant cette rcurrence. Laisser le choix dexA l’uti-lisateur et calculer par dfaut les 100 premiers termes de la srie. Comparer A la fin le rsultat obtenu avec celui fourni par la fonctionasinhen C, et en utilisant le fait que 23 argsh(x) = lnx+x+ 1en fortran. 4. Enfait, il ne sert A rien de rajouter des termes dans la somme ds que le rapport entre le terme A ajouter et la somme partielle devient infrieur en valeur absolue A, donn en fortran par la fonction intrinsqueEPSILON(1.)et en C par la constanteFLT_EPSILONdfinie dans le fichier d’entte<float.h>Modifier le programme pour arrter la sommation ds que ce rapport est atteint. On demande de travailler en simple prcision (REALen fortran et enfloaten C).
3. Lafonction intrinsÈqueasinh, extension de typegnusousgfortrannorme 2003, est intÉgrÉe À la norme du fortran 2008.
2011-2012
5
Soyez le premier à déposer un commentaire !

17/1000 caractères maximum.