Exercices PROGRAMMATION EN FORTRAN Exercices Hacène Ouzia Polytech Paris UPMC Sciences de la Terre (3 ème année) Université Pierre et Marie Curie Séance 4 2016 Hacène Ouzia Programmation en Fortran 2016 1 / 26
AGENDA Exercices 1 Exercices Choix et conditions Sommes et produits Algorithmes itératifs Tableaux Hacène Ouzia Programmation en Fortran 2016 2 / 26
1 Exercices Choix et conditions Sommes et produits Algorithmes itératifs Tableaux Hacène Ouzia Programmation en Fortran 2016 3 / 26
Alternatives ENONCÉ Soit n un entier naturel. On souhaite calculer la foncion : 8 "Lundi", si n 2 7N, >< "Mardi", si n 2 7N + 1, J (n) =... >: "Dimanche", si n 2 7N + 6. QUESTIONS + Donner le pseudo-code d un programme calculant J. + Analyser sa complexité. + Implémenter votre pseudo-code en Fortran. Hacène Ouzia Programmation en Fortran 2016 4 / 26
Alternatives Algorithme 1 : Jours de la semaine Entrée : n :: entier naturel Sortie : J :: chaîne de caractères 1 Début 2 Valeur mod(n, 7) 3 Suivant Valeur Faire 4 Cas Valeur vaut 0 Faire 5 J Lundi 6 Fin cas 7 Cas Valeur vaut 1 Faire 8 J Mardi 9 Fin cas 10 Cas Valeur vaut 2 Faire 11 J Mercredi 12 Fin cas 13 Cas Valeur vaut 3 Faire 14 J Jeudi 15 Fin cas 16 Cas Valeur vaut 4 Faire 17 J Vendredi 18 Fin cas 19 Cas Valeur vaut 5 Faire 20 J Samedi 21 Fin cas 22 Cas Valeur vaut 6 Faire 23 J Dimanche 24 Fin cas 25 Fin suivant 26 Fin COMPLEXITÉ O (1) Hacène Ouzia Programmation en Fortran 2016 5 / 26
Alternatives IMPLÉMENTATION ALTERNATIVES 1 program choix_multiples 2 implicit none 3 integer :: N 4 integer :: k 5 6 call system("clear") 7 8 write(*,"(/, Veuillez entrer un entier : )",advance= no ) 9 read *, N; 10 11 write(*,"(. Le jour de la semaine correspondant est : )", advance= no ) 12 k = mod(n,7)! Mod(N,D) = reste de la division de N par D 13!... Hacène Ouzia Programmation en Fortran 2016 6 / 26
Alternatives IMPLÉMENTATION ALTERNATIVES 13!... 14 select case (k) 15 case (0) 16 write(*,"( Lundi )") 17 case (1) 18 write(*,"( Mardi )") 19 case (2) 20 write(*,"( Mercredi )") 21 case (3) 22 write(*,"( Jeudi )") 23 case (4) 24 write(*,"( Vendredi )") 25 case (5) 26 write(*,"( Samedi )") 27 case (6) 28 write(*,"( Dimanche )") 29 end select 30 write(*,*) 31 stop "Fin choix multiples" 32 end program choix_multiples Hacène Ouzia Programmation en Fortran 2016 7 / 26
Somme ENONCÉ soit n un entier naturel donné. On souhaite calculer la valeur suivante : nx S (n) = k 7 k=1 QUESTIONS + Donner le pseudo-code d un programme calculant S. + Analyser sa complexité. + Implémenter votre pseudo-code en Fortran. Hacène Ouzia Programmation en Fortran 2016 8 / 26
Somme PSEUDO-CODE Algorithme 2 : Calculer une somme Entrée : n :: entier naturel non nul Sortie : :: réel! Contiendra la somme 1 Début 2 0! Important 3 Pour k = 1 à n faire 4 + k 7 5 Fin pour 6 Fin COMPLEXITÉ O (n) Hacène Ouzia Programmation en Fortran 2016 9 / 26
Somme IMPLÉMENTATION SOMME 1 program calculer_sommme 2!<><><>< DEBUT DECLARATION 3 implicit none 4 integer :: N, k, Somme 5!<><><>< FIN DECLARATION 6 call system("clear") 7!<><><>< Lire la valeur N 8 write(*,"(/, Nombre de termes de la somme: )", advance= no ) 9 read *, N 10!<><><>< Calculer la somme 11 Somme = 0 12 do k=1, N, 1 13 Somme = Somme + k**7 14 end do 15!<><><>< Afficher la somme 16 write(*,"(. La somme des,i4, premier(s) terme(s) vaut,6x, :,i10)") N, Somme 17 write(*,*) 18!<><><>< Terminer le programme 19 stop "Fin programme somme" 20 end program calculer_sommme Hacène Ouzia Programmation en Fortran 2016 10 / 26
Produit ENONCÉ soit n un entier naturel donné. On souhaite calculer la valeur suivante : ny P (n) = 1 + k 2 k=1 QUESTIONS + Donner le pseudo-code d un algorithme calculant P + Analyser sa complexité. + Implémenter votre algorithme en Fortran. Hacène Ouzia Programmation en Fortran 2016 11 / 26
Produit PSEUDO-CODE Algorithme 3 : Valeur de P(n) Entrée : n :: Entier naturel non nul Sortie : :: Réel! Contiendra le produit 1 Début 2 1! Ne pas mettre 0 3 Pour k = 1 à n faire 4 (1 + k 2 ) 5 Fin pour 6 Fin COMPLEXITÉ O (n) Hacène Ouzia Programmation en Fortran 2016 12 / 26
Produit PSEUDO-CODE Algorithme 4 : Valeur de P(n) Entrée : n :: Entier naturel non nul Sortie : :: Réel! Contiendra le produit 1 Début 2 1! Ne pas mettre 0 3 Pour k = 1 à n faire 4 (1 + k 2 ) 5 Fin pour 6 Fin COMPLEXITÉ O (n) Hacène Ouzia Programmation en Fortran 2016 12 / 26
Somme IMPLÉMENTATION PRODUIT 1 program Calculer_produit 2!<><><>< DEBUT DECLARATION 3 implicit none 4 integer :: N, k, produit 5!<><><>< FIN DECLARATION 6 call system("clear") 7!<><><>< Lire la valeur N 8 write(*,"(/,2x, Nombre de termes : )", advance= no ) 9 read *, N 10!<><><>< Calculer le produit 11 Produit = 1 12 do k=1, N 13 Produit = Produit*(1+ k**2) 14 end do 15!<><><>< Afficher le produit 16 write(*,"(. Le produit des,i4, terme(s) vaut,6x, :,i10)") N, Produit 17 write(*,*) 18!<><><>< Terminer le programme 19 stop "Fin programme somme" 20 end program Calculer_produit Hacène Ouzia Programmation en Fortran 2016 13 / 26
Somme et produit ENONCÉ soient n et m deux entiers donnés. On souhaite calculer valeur suivante : 8 0, m = 0 et n 2 N, m, n 2 0 = 0 et m 1 2 N, >< U (m, n) = mx 1 B i=1 @ ny C 1+ i A, sinon >: k+i k=1 QUESTIONS + Donner le pseudo-code d un algorithme calculant U + Analyser sa complexité. + Implémenter votre algorithme en Fortran. Hacène Ouzia Programmation en Fortran 2016 14 / 26
Somme et produit PSEUDO-CODE Algorithme 5 : Valeur de U(m, n) Entrées : m, n :: Entiers naturels Sortie : µ :: Réel! Contiendra la valeur de U(m, n) 1 µ 0 2 Début 3 Pour i = 1 à m faire 4 1 5 Pour k = 1 à n faire 6 i i+k 7 Fin pour 8 µ µ + 1 1+ 9 Fin pour 10 Fin COMPLEXITÉ O (nm) Hacène Ouzia Programmation en Fortran 2016 15 / 26
Somme et produit IMPLÉMENTATION VALEUR DE LA FONCTION U 1 program Calculer_Umn 2 implicit none 3 integer :: N, M, i, k 4 real :: pi, Umn 5 call system("clear") 6 write(*,"(/,2x, Le nombre M : )", advance= no );read *, M 7 write(*,"(2x, Le nombre N : )", advance= no );read *,N 8 Umn = 0 9 if( N.NE. 0)then 10 do i=1, M 11 pi = 1 12 do k=1, N 13 pi = pi*i*(1./(i+k)) 14 end do 15 Umn = Umn + 1./(1+pi) 16 end do 17 end if 18 write(*,"(/,2x, La valeur de U(,i4,,,i4, ) est :, f7.2,/)") M,N,Umn 19 stop "Fin programme somme" 20 end program Calculer_Umn Hacène Ouzia Programmation en Fortran 2016 16 / 26
Racine carrée ENONCÉ soit " une précision donnée. On souhaite calculer une approximation de p à " près à l aide de la méthode de Héron : ( u n+1 = u 1 2 n + un, n 2 N u 0 = QUESTIONS + Donner le pseudo-code d un algorithme calculant p + Implémenter votre algorithme en Fortran. Hacène Ouzia Programmation en Fortran 2016 17 / 26
Racine carrée PSEUDO-CODE Algorithme 6 : Valeur approchée de p Entrée : :: réel non nul Sortie : :: réel! Contiendra la valeur approchée 1 Début 2 1 3 ( + ) 2 4 5 Tant que faire 6 1 7 ( + ) 2 8! Modifie la condition d arrêt 9 Fin tant que 10 Fin + Montrer le code appro-racine-2.f90 Hacène Ouzia Programmation en Fortran 2016 18 / 26
Racine carrée PSEUDO-CODE Algorithme 7 : Valeur approchée de p Entrée : :: réel non nul Sortie : :: réel! Contiendra la valeur approchée 1 Début 2 1 3 ( + ) 2 4 5 Tant que faire 6 1 7 ( + ) 2 8! Modifie la condition d arrêt 9 Fin tant que 10 Fin + Montrer le code appro-racine-2.f90 Hacène Ouzia Programmation en Fortran 2016 18 / 26
Tri par insertion ENONCÉ soit n un entier naturel donné. On considère T (n) un tableau à n éléments. Le principe d un algorithme de tri par insertion est le suivant : à une itération k 2 {1,...,n 1} donnée, tous les éléments de la section T (1 : k) du tableau T sont triés (par exemple, dans un ordre croissant). A l itération suivante, i.e. k + 1, l algorithme considère l élément T (k + 1) et le place dans la section T (1 : k) de telle sorte que la section T (1 : k + 1) reste triée. QUESTIONS + Donner le pseudo-code d un algorithme triant par insertion le tableau T + Analyser sa complexité. + Implémenter votre algorithme en Fortran. Hacène Ouzia Programmation en Fortran 2016 19 / 26
Tri par insertion PSEUDO-CODE Algorithme 8 : Tri par insertion Entrées : N :: un entier naturel non nul, T :: Tableau à N éléments Sortie : T :: Tableau à N éléments 1 Début 2 Pour j = 2 à N faire 3 copieelementcourant T (j) 4 Pour i = j 1 à 1, pas = 1 faire 5 Si T (i) > copieelementcourant alors 6 T (i + 1) T (i) 7 T (i) copieelementcourant 8 Fin si 9 Fin pour 10 Fin pour 11 Fin COMPLEXITÉ O N 2 Hacène Ouzia Programmation en Fortran 2016 20 / 26
Tri par insertion PSEUDO-CODE Algorithme 9 : Tri par insertion (version optimisée) Entrées : N :: un entier naturel non nul, T :: Tableau à N éléments Sortie : T :: Tableau à N éléments 1 Début 2 Pour j = 2 à N faire 3 Pour i = j 1 à 1, pas = 1 faire 4 Si T (i) > T (j) alors 5 T (i + 1) T (i) 6 T (i) T (j) 7 Fin si 8 Fin pour 9 Fin pour 10 Fin Hacène Ouzia Programmation en Fortran 2016 21 / 26
k-ème plus grand élément ENONCÉ Soient n un entier donné et T un tableau d entiers de taille n. Le but de cet exercice est de déterminer le k-ème plus grand élément de T (l élément maximum est le premier plus grand élément) sans trier au préalable les éléments de T. Par exemple, pour le tableau suivant T =[4, 5, 7, 1]l élément 4 est le 3-ème plus grand élément et 5 le deuxième plus grand élément. QUESTIONS + Donner le pseudo-code d un algorithme calculant le k-ème plus grand élément de T + Analyser sa complexité. + Implémenter votre algorithme en Fortran. Hacène Ouzia Programmation en Fortran 2016 22 / 26
k-ème plus grand élément PSEUDO-CODE Algorithme 10 : k-ème plus grand élément Entrées : k, N :: entiers naturel non nul T :: Tableau de N réels tous distincts Sortie : Resultat : réel 1 Début 2 Chercher oui 3 j 1 4 Tant que Chercher et j apple N faire 5 Compteur 0 6 ElementCourant T (j) 7 Pour i = 1 à N faire 8 Si i 6= j et ElementCourant < T (i) alors 9 Compteur Compteur + 1 10 Fin si 11 Fin pour 12 Si Compteur = k 1 alors 13 Chercher non 14 Resultat ElementCourant ; 15 Fin si 16 j j + 1; 17 Fin tant que 18 Fin COMPLEXITÉ O N 2 Hacène Ouzia Programmation en Fortran 2016 23 / 26
Matrices ENONCÉ soit une permutation de {1,...,n}. Soit M une matrice appartenant à M m n (R). Soit M la matrice obtenue en permutant les lignes de la matrice M suivant la permutation. QUESTIONS + Donner le pseudo-code d un programme calculant M + Analyser sa complexité. + Implémenter votre pseudo-code en Fortran. Hacène Ouzia Programmation en Fortran 2016 24 / 26
Matrice IMPLÉMENTATION PERMUTER LES LIGNES D UNE MATRICE 1 program Permuter_lignes_matrice 2 implicit none 3 integer, parameter :: NbrLignes =3, nbrcolonnes = 5 4 integer, parameter, dimension(nbrlignes) :: Permutation = (/3,1,2/) 5 real, dimension(nbrlignes, NbrColonnes) :: matrice 6 integer :: i,j 7 do i=1, NbrLignes 8 matrice(i,:) = i*10! Notez les sections 9 end do 10 write(*,"(/2x, La matrice en entree :,/)") 11 do i=1, NbrLignes 12 write(*,"(3x)", advance= no ) 13 do j=1, NbrColonnes 14 write(*,"(f5.2, 3x)", advance= no ) matrice(i,j) 15 end do 16 write(*,*) 17 end do 18! Permuter la matrice M 19 matrice(:,:) = matrice(permutation,:) 20!... Hacène Ouzia Programmation en Fortran 2016 25 / 26
Matrice suite... IMPLÉMENTATION PERMUTER LES LIGNES D UNE MATRICE 20!... 21 write(*,"(//2x, La matrice permutee :,/)") 22 do i=1, NbrLignes 23 write(*,"(3x)", advance= no ) 24 do j=1, NbrColonnes 25 write(*,"(f5.2, 3x)", advance= no ) matrice(i,j) 26 end do 27 write(*,*) 28 end do 29 write(*,*) 30 stop "Fin permutee matrice" 31 end program Permuter_lignes_matrice Hacène Ouzia Programmation en Fortran 2016 26 / 26