1/24
Introduction au langage C - Cours 2
Girardot/Roelens
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
Objectif de ce cours 2/24
Objectifs de ce cours
Du problème au programme
Ipasser d’un problème exprimé en français à la réalisation d’un
programme Cqui résoud ce problème
Concepts de programmation
Iexpressions arithmétiques
Istructures de contrôle (tests, boucles)
Imodélisation de données
Ipremiers algorithmes
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 du PGCD Présentation 3/24
Problème du PGCD
Énoncé
Etant donnés deux nombres entiers (par exemple, 834389
et 944353), calculer le PGCD de ces deux nombres
Analyse
Iquelles sont les données du problèmes ? les deux nombres
entiers
Iquel est le résultat cherché ? le PGCD
Il’arithmétique nous assure l’existence de ce PGCD : on veut un
moyen de le calculer : un algorithme
Algorithme
Iun 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)
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 du PGCD Algorithme d’Euclide 4/24
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 AB; sinon, permuter (ainsi, Aest toujours le plus
grand des deux entiers)
2. est-ce que A=B? Si oui, le PGCD est Aet le programme est
terminé
3. sinon, retrancher Bde A
4. revenir à l’étape 1
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 du PGCD Passage au programme 5/24
Passage au programme
Questions liminaires
Il’aspect algorithmique est-il clair ?
Iquelles sont les « entrées » du programme ?
Iles nombres A et B
Iquelles sont les « sorties » du programme ?
Ile PGCD de A et B )la valeur de A à la fin de l’algorithme
Aspects du traitement
Igérer la boucle répétitive / tester la condition d’arrêt
Igérer le cas « A<B » / échanger deux variables
Iimprimer le résultat
De quelles « variables » avons nous besoin ?
Iles entiers A et B
Iautres ?
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 du PGCD Éléments de C 6/24
Éléments de C
Boucle « infinie » : trois solutions
Iinstruction « for »
for (;;)
instruction
Iinstruction « while »
while (1)
instruction
Iinstruction « do. . . while »
do
instruction
while (1);
Attention à la syntaxe de ces constructions !
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 du PGCD Éléments de C 7/24
Éléments de C(2)
Instruction simple
Iexpression (éventuellement, avec affectation) se terminant par
un ;
Instruction composée
Ipermet d’utiliser un bloc d’instructions à un emplacement d’un
programme où la syntaxe n’autorise qu’une instruction unique
Isyntaxe
{
« suite d’instructions »
}
Instruction vide
Ipermet de ne « rien » faire à un emplacement d’un programme où
la syntaxe impose la présence d’une instruction unique
Ideux syntaxes possibles
;
{}
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 du PGCD Éléments de C 8/24
Éléments de C(3)
Instruction conditionnelle
Iexécuter une instruction si, et seulement si, une condition est
satisfaite
Ideux syntaxes : if ( « condition » )« instruction »
Iet : if ( « condition » )« instruction » else « instruction »
Condition
Iune expression numérique
I« vraie » si sa valeur est différente de 0, « faux » si elle est égale à 0
Iles 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
Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France
Problème du PGCD Étapes du traitement 9/24
Étapes du traitement
Échange de deux variables
Ipremière idée : A=B;B=A;)ne convient pas !
Ipasser par une troisième variable !
Ine pas oublier sa déclaration
Iutiliser une instruction composée
{
C=A;
A=B;
B=C;
}
Note :
! penser à l’aspect séquentiel de l’exécution
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 du PGCD Étapes du traitement 10/24
Étapes du traitement (2)
Arrêt conditionnel et impression d’un message
Iutiliser une expression conditionnelle
Ifaire appel à une instruction composée
Il’instruction return permet l’arrêt de la procédure main et donc
l’arrêt du programme
Ison paramètre est un « code de retour »
Ié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
Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France
Problème du PGCD Le programme complet 11/24
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
Problème de sommation Premier algorithme 12/24
Problème de sommation des « N »
premiers entiers
Algorithme « immédiat »
Iboucle de 1 à N
int S, N, i; ... S=0; for (i=1; i<=N; i++)
S=S+i;
Ise lit : pour iprenant la valeur initiale 1, tant que iest inférieur ou
égal à N, en incrémentant ià chaque étape, faire. . .
Incrémentation
Ii++ équivaut à i=i+1, et incrémente de 1la variable i
Il’expression i++ a comme valeur la valeur de la variable iavant
incrémentation
Iautre forme possible : ++i, expression ayant pour valeur la valeur
de la variable iaprè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
Un autre algorithme
Propriété :
i=N
X
i=1
i=N(N+1)
2
Nouveau programme
int S, N;
S=N*(N+1)/2;
Comparaison ?
I40 fois plus rapide pour N=100 ;
Ila durée d’exécution ne dépend pas de la valeur de N. . .
Importance du choix de l’algorithme !
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 Éléments de C 14/24
Éléments de C
La boucle for
Isyntaxe :
for (« init » ;« test » ;« itération »)« instruction »
Iéquivalente à
« init »;
while ( « test » ){« instruction » « itération »;}
Iles parties « init » et « itération » sont facultatives ; si « test » est
omis, l’expression utilisée par défaut est « 1 »
Iexemple :
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
Ibreak permet de « sortir » de la boucle
Icontinue permet de forcer le passage à l’itération suivante de la
boucle
Introduction au langage C - Cours 2 - Septembre 2013
Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France
Calcul de sinus Présentation 15/24
Problème du calcul de sinus
On veut calculer le sinus d’un angle donné
Iméthode de calcul : série alternée
sin(x)=
1
X
i=0
(1)ix2i+1
(2i+1)! =xx3
3!+x5
5!x7
7!+···
Ice n’est pas un algorithme (somme infinie) !
Analyse
Ila série est alternée dès qu’il y a décroissance en valeur absolue
Ile terme de rang nest |x2n+1|
(2n+1)!
Ion doit avoir (2n+1)>|x|, soit n>|x|
2
Il’erreur est alors inférieure à |x|2n+1
(2n+1)!
Introduction au langage C - Cours 2 - Septembre 2013
Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France
Calcul de sinus Du problème au programme 16/24
Du problème au programme
Comment passer à un programme n’utilisant que les opérations
connues (expressions arithmétiques, boucles, etc) ?
Définissons :
UN=xx3
3!+···+(1)Nx2N+1
(2N+1)! =
N
X
i=0
(1)ix2i+1
(2i+1)! =
N
X
i=0
ui
avec :
u0=x
ui=(1)ix2i+1
(2i+1)!
ui+1=(1)i+1x2i+3
(2i+3)! =(1)ix2i+1
(2i+1)! (1)x2
(2i+2)(2i+3)=uix2
(2i+2)(2i+3)
Introduction au langage C - Cours 2 - Septembre 2013
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
Du problème au programme (2)
Posons :
wi=2i(2i+1)=4i2+2i
wi+1=(2i+2)(2i+3)=4i2+10i+6=wi+8i+6
d’où :
ui+1=uix2
wi+1
Introduction au langage C - Cours 2 - Septembre 2013
Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France
Calcul de sinus Du problème au programme 18/24
Du problème au programme (3)
Ainsi :
w0=0
wi+1=4i2+10i+6
=wi+8i+6
posons :
zi+1=8i+6
soit encore :
z0=2
zi=8i2
zi+1=zi+8
Introduction au langage C - Cours 2 - Septembre 2013
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
Du problème au programme (4)
Récapitulons :
z0=2zi+1=zi+8
w0=0wi+1=wi+zi+1
u0=xu
i+1=uix2
wi+1
U0=xU
i+1=Ui+ui+1
Introduction au langage C - Cours 2 - Septembre 2013
Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France
Calcul de sinus Du problème au programme 20/24
Du problème au programme (5)
Test d’arrêt
Idéfini à parti d’une précision voulue "
Le test proposé peut s’écrire :
n>|x|
2et |x|2n+1
(2n+1)! <"
Il faut donc :
Idéfinir la précision attendue
Icompter les itérations
Isavoir calculer le plus petit entier supérieur à |x|
2!fonctions de
bibliothèque mathématique fabs et ceil
Introduction au langage C - Cours 2 - Septembre 2013
Girardot/Roelens - Ecole des Mines de Saint-Etienne, 158 cours Fauriel, 42023 Saint-Etienne, France
1 / 6 100%