Format PDF, 4/page - Mines Saint Etienne

publicité
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
Téléchargement