1/24 Objectif de ce cours 2/24 Objectifs de ce cours Du problème au programme Introduction au langage C - Cours 2 I passer d’un problème exprimé en français à la réalisation d’un programme C qui résoud ce problème Concepts de programmation Girardot/Roelens Septembre 2013 I expressions arithmétiques I structures de contrôle (tests, boucles) I modélisation de données I premiers algorithmes Introduction au langage C - Cours 2 - Septembre 2013 Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Problème du PGCD Présentation Problème du PGCD Énoncé Etant donnés deux nombres entiers (par exemple, 834389 et 944353), calculer le PGCD de ces deux nombres Analyse I quelles sont les données du problèmes ? les deux nombres entiers I quel est le résultat cherché ? le PGCD I l’arithmétique nous assure l’existence de ce PGCD : on veut un moyen de le calculer : un algorithme Algorithme I un algorithme est une suite finie d’opérations, qui appliquée à un ensemble fini de données, fournit en un temps fini un résultat déterminé (le même algorithme appliqué aux mêmes données fournit le même résultat) 3/24 Problème du PGCD Algorithme d’Euclide Algorithme d’Euclide Voir http://fr.wikipedia.org/wiki/Algorithme_d%27Euclide retrancher le plus petit nombre du plus grand jusqu’à obtenir deux nombres égaux : la valeur commune est le PGCD Étapes de l’algorithme 1. vérifier que A B ; sinon, permuter (ainsi, A est toujours le plus grand des deux entiers) 2. est-ce que A = B ? Si oui, le PGCD est A et le programme est terminé 3. sinon, retrancher B de A 4. revenir à l’étape 1 Introduction au langage C - Cours 2 - Septembre 2013 Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France 4/24 Problème du PGCD Passage au programme 5/24 Problème du PGCD Passage au programme I I Boucle « infinie » : trois solutions l’aspect algorithmique est-il clair ? quelles sont les « entrées » du programme ? I I I le PGCD de A et B ) la valeur de A à la fin de l’algorithme I I gérer la boucle répétitive / tester la condition d’arrêt gérer le cas « A<B » / échanger deux variables imprimer le résultat I I instruction « do. . . while » do instruction while (1); De quelles « variables » avons nous besoin ? I instruction « while » while (1) instruction Aspects du traitement I instruction « for » for (;;) instruction les nombres A et B quelles sont les « sorties » du programme ? I 6/24 Éléments de C Questions liminaires I Éléments de C les entiers A et B autres ? Attention à la syntaxe de ces constructions ! Introduction au langage C - Cours 2 - Septembre 2013 Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Problème du PGCD Éléments de C 7/24 Problème du PGCD Éléments de C (2) Instruction simple I expression (éventuellement, avec affectation) se terminant par un ; Instruction composée I permet d’utiliser un bloc d’instructions à un emplacement d’un programme où la syntaxe n’autorise qu’une instruction unique I syntaxe { « suite d’instructions » } Instruction vide I permet de ne « rien » faire à un emplacement d’un programme où la syntaxe impose la présence d’une instruction unique I deux syntaxes possibles ; { } Éléments de C 8/24 Éléments de C (3) Instruction conditionnelle I exécuter une instruction si, et seulement si, une condition est satisfaite I deux syntaxes : if ( « condition » ) I et : if ( « condition » ) « instruction » « instruction » else « instruction » Condition I une expression numérique I I « vraie » si sa valeur est différente de 0, « faux » si elle est égale à 0 les opérateurs de comparaison de C (<, ==, >, <=, >=, !=) fournissent un résultat numérique entier, 0 ou 1 Pas de booléen en C ! Introduction au langage C - Cours 2 - Septembre 2013 Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Problème du PGCD Étapes du traitement 9/24 Problème du PGCD Étapes du traitement I Arrêt conditionnel et impression d’un message première idée : A = B ; B = A; ) ne convient pas ! passer par une troisième variable ! I I 10/24 Étapes du traitement (2) Échange de deux variables I Étapes du traitement ne pas oublier sa déclaration utiliser une instruction composée { C=A; A=B; B=C; } Note : ! penser à l’aspect séquentiel de l’exécution I utiliser une expression conditionnelle I faire appel à une instruction composée l’instruction return permet l’arrêt de la procédure main et donc l’arrêt du programme I I I son paramètre est un « code de retour » écriture : procédure printf (print with format) if (A==B) { printf("La valeur du PGCD est %d\n", A); return 0; } Introduction au langage C - Cours 2 - Septembre 2013 Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Problème du PGCD Le programme complet 11/24 Problème de sommation Le programme PGCD #include <stdio.h> int main(int argc, char * argv[]) { int A, B, C; A = 834389; B = 944353; for (;;) { if (A<B) { C=A; A=B; B=C; } if (A==B) { printf("La valeur du PGCD est %d\n", A); return 0; } A=A-B; } Introduction au langage C - Cours 2 - Septembre 2013 } Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Premier algorithme 12/24 Problème de sommation des « N » premiers entiers Algorithme « immédiat » I I boucle de 1 à N int S, N, i; ... S=0; for (i=1; i<=N; i++) S=S+i; se lit : pour i prenant la valeur initiale 1, tant que i est inférieur ou égal à N, en incrémentant i à chaque étape, faire. . . Incrémentation I I I i++ équivaut à i=i+1, et incrémente de 1 la variable i l’expression i++ a comme valeur la valeur de la variable i avant incrémentation autre forme possible : ++i, expression ayant pour valeur la valeur de la variable i après incrémentation Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Problème de sommation Second algorithme 13/24 Problème de sommation Un autre algorithme Propriété : i=N X i = i=1 Nouveau programme Éléments de C 14/24 Éléments de C La boucle for I syntaxe : for (« init » ; « test » ; « itération ») « instruction » I équivalente à « init »; while ( « test » ) { « instruction » « itération »; } I les parties « init » et « itération » sont facultatives ; si « test » est omis, l’expression utilisée par défaut est « 1 » I exemple : N ⇥ (N + 1) 2 int S, N; S=N*(N+1)/2; Comparaison ? I 40 fois plus rapide pour N=100 ; I la durée d’exécution ne dépend pas de la valeur de N. . . int i, s; for (i=s=0; i<10; i++) s=s+i*i; Échappement I à l’intérieur d’une boucle for ou while Importance du choix de l’algorithme ! I I break permet de « sortir » de la boucle continue permet de forcer le passage à l’itération suivante de la boucle Introduction au langage C - Cours 2 - Septembre 2013 Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Calcul de sinus Présentation 15/24 Calcul de sinus Problème du calcul de sinus sin(x) = i=0 I Comment passer à un programme n’utilisant que les opérations connues (expressions arithmétiques, boucles, etc) ? Définissons : méthode de calcul : série alternée 1 X ( 1)i x 2i+1 =x (2i + 1)! x3 x5 + 3! 5! x7 + ··· 7! I on doit avoir (2n + 1) > |x|, soit n > l’erreur est alors inférieure à |x|2n+1 (2n+1)! |x| 2 N N i=0 i=0 X x3 ( 1)N x 2N+1 X x 2i+1 + ··· + = ( 1)i = ui 3! (2N + 1)! (2i + 1)! UN = x ce n’est pas un algorithme (somme infinie) ! Analyse I la série est alternée dès qu’il y a décroissance en valeur absolue |x 2n+1 | I le terme de rang n est (2n+1)! I 16/24 Du problème au programme On veut calculer le sinus d’un angle donné I Du problème au programme avec : u0 =x ui = ui+1 = ( 1)i x 2i+1 (2i+1)! ( 1)i+1 x 2i+3 (2i+3)! = ( 1)i x 2i+1 (2i+1)! ⇥ ( 1)⇥x 2 (2i+2)(2i+3) = ui ⇥ x2 (2i+2)(2i+3) Introduction au langage C - Cours 2 - Septembre 2013 Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Calcul de sinus Du problème au programme 17/24 Calcul de sinus Du problème au programme (2) Du problème au programme 18/24 Du problème au programme (3) Ainsi : w0 = 0 wi+1 = 4i 2 + 10i + 6 = wi + 8i + 6 Posons : = 2i ⇥ (2i + 1) = 4i 2 + 2i wi posons : wi+1 = (2i + 2) ⇥ (2i + 3) = 4i 2 + 10i + 6 = wi + 8i + 6 zi+1 = 8i + 6 d’où : ui+1 = ui ⇥ soit encore : x2 wi+1 z0 = 2 zi = 8i 2 zi+1 = zi + 8 Introduction au langage C - Cours 2 - Septembre 2013 Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Calcul de sinus Du problème au programme 19/24 Calcul de sinus Du problème au programme (4) Du problème au programme 20/24 Du problème au programme (5) Test d’arrêt I Récapitulons : z0 = 2 zi+1 Le test proposé peut s’écrire : = zi + 8 w0 = 0 wi+1 = wi + zi+1 u0 ui+1 = x U0 = x = ui ⇥ défini à parti d’une précision voulue " x2 wi+1 Ui+1 = Ui + ui+1 n> |x| 2 et |x|2n+1 <" (2n + 1)! Il faut donc : I définir la précision attendue I compter les itérations I savoir calculer le plus petit entier supérieur à bibliothèque mathématique fabs et ceil |x| 2 ! fonctions de Introduction au langage C - Cours 2 - Septembre 2013 Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Calcul de sinus Écriture du code 21/24 Calcul de sinus Écriture en C Écriture du code 22/24 Écriture en C (2) Tests complexes I opérateur « ou séquentiel » || Représentation des données I I 5 variables de type flottant : U, u, w, z, x I une variable de type entier (pour compter le nombre d’itérations) : i I une variable de type flottant : epsilon Données supplémentaires I une variable de type flottant pour stocker x 2 : x2 I une variable de type entier pour stocker |x| 2 I opérateur « et séquentiel » && I I A||B calcule A ; si A est différent de 0, cette valeur est fournie comme résultat ; si A vaut 0, la valeur B est calculée et fournie comme résultat ; B n’est calculée que si A vaut 0. A&&B calcule A ; si A est nul, cette valeur est fournie comme résultat ; si A est différent de 0, la valeur B est calculée et fournie comme résultat ; B n’est calculée que si A est différent 0. ex : X=(P!=0)&&(Q/P>W); : imin if ((D!=0)&&(K%D!=0)) A!=0 || exit(0); Introduction au langage C - Cours 2 - Septembre 2013 Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Calcul de sinus Écriture du code 23/24 Calcul de sinus Écriture en C (3) #include <stdio.h> #include <math.h> int main (int argc,char *argv[]) { double x,x2,z,w,u,U,epsilon; int i,imin; x=M_PI/4;epsilon=0.000001; x2=x*x;z=-2;w=0;u=x;U=x;imin=ceil(fabs(x/2)); for (i=0;;i++) { z=z+8;w=w+z;u=-u*x2/w;U=U+u; if ((i > imin) && (fabs(u) < epsilon)) { printf("sin(%.10g)=%.10g\n",x,U); printf(" [apres %d iterations]\n",i+1); return 0; } } Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France Tests Tests Exécution pour x = ⇡4 : sin(0.785398163397)=0.70710678118 [5] Exécution pour x = 100⇡ : sin(314.1592654)=-6.04152987e+118 [433] Problème : I manipulation de termes de valeurs absolues très différentes : |u155 | ⇡ 6 10134 I précision des nombres : 16 chiffres décimaux I exemple : double a,b,c; a=1e22; b=-1e22; c=100.0; printf("%f %f\n",a+b+c, a+c+b); imprime : 100.000000 0.000000 Introduction au langage C - Cours 2 - Septembre 2013 Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France 24/24