Aacahieralgorithmiqu
Aacahieralgorithmiqu
Aacahieralgorithmiqu
MAKNI
I. Introduction
On désigne par algorithmique l’ensemble des activités logiques qui relèvent des
algorithmes.
Le mot algorithmes vient du nom du mathématicien Al Khawarizmi (né vers 780 - mort vers
850) qui a écrit en langue arabe le plus ancien traité d’algèbre « abrégé de calcul par la complétion et
la simplification » dans lequel il décrivait des procédés de calcul à suivre étape par étape pour
résoudre des problèmes ramenés à des équations.
Rédiger un algorithme consiste à décrire les différentes étapes de calcul pour résoudre un
problème. En d'autres termes, un algorithme est un énoncé d’une suite d’opérations permettant de
donner la réponse à un problème. Si ces opérations s’exécutent en séquence, on parle d’algorithme
séquentiel. Si les opérations s’exécutent sur plusieurs processeurs en parallèle, on parle d’algorithme
parallèle. Si les tâches s’exécutent sur un réseau de processeurs on parle d’algorithme réparti ou
distribué.
Il est parfois fait usage du mot algorithmie, bien que ce dernier ne figure pas dans la plupart des
dictionnaires.
Antiquité :
Les algorithmes dont on a retrouvé des descriptions exhaustives ont été utilisés dès l’époque
des Babyloniens, pour des calculs concernant le commerce et les impôts.
L’algorithme le plus célèbre est celui qui se trouve dans le livre des Éléments d'Euclide. Il
permet de trouver le plus grand diviseur commun, ou PGCD, de deux nombres.
N.M. Page 1
X= 5 Y = 2
L’étape a) X+ Y = 7 et X prend la valeur : 7
L’étape b) X –Y = 5 donc Y prend la valeur : 5
B) Utiliser la calculatrice pour faire fonctionner cet algorithme pour plusieurs valeurs X et Y.
TI casio
: Input X (Entrer X) ? , obtenu dans l’éditeur du programme
: Input Y (Entrer Y) en appuyant sur les touches SHIFT VARS F4
:
:X–Y Y
: DISP ‘’X =’’, X ( Afficher X) X obtenu dans l’éditeur du programme
: DISP ‘’Y =’’, Y ( Afficher Y) en appuyant sur les touches SHIFT VARS F5
Exercice 2 Calcul du PGCD de deux entiers naturels (TI82-83-84 et TI-Nspire) voir document
Exercice 3
• Choisir un nombre.
• Lui ajouter 13
• Si le nombre obtenu est supérieur ou égal à 20, alors lui retrancher 15, sinon lui ajouter 15.
• Multiplier le nombre obtenu par 7.
• Ecrire le résultat.
( Voir programme TPA TI83 Plus)
Exercice 4
Soit une fonction f qui à un entier naturel n associe l’entier f(n) défini de la façon suivante :
,
;
2
,
3
1
1. Calculer l’image par la fonction f de chacun des entiers 0 ; 1 ; 2 ; 3 ; 4 ; 50 ; 51.
2. Ecrire un algorithme permettant de calculer les valeurs de la fonction f .
Entrée
Saisir n
Traitement
Si n est pair
Alors
Y prend la valeur
Sinon
Y prend la valeur 3n +1.
Fin de SI
Sortie
Afficher Y.
3. (Voir le programme TPB TI 83 plus).
N.M. Page 2
o Entrée
o Saisir N
Exercice 5 o Initialisation
Voici un algorithme, écrit en langage naturel: • S prend la valeur 0.
• Choisir un entier naturel N. • Traitement
• Initialiser une valeur S en lui affectant la valeur 0. Pour i de 1 jusqu’à N
S prend la valeur S + i
• Répéter pour chaque entier i de 1 jusqu’à N l’instruction :
• Fin de pour
Donner à S la valeur S+i. • Sortie
• A la fin de la répétition afficher S. • Afficher S
1. Faire fonctionner cet algorithme lorsque n = 10.
2. Quel est le rôle de cet algorithme.
3. Ecrivons l’algorithme sous forme codée :
Exercice 6
Voici un algorithme, écrit en langage naturel:
• Choisir un entier naturel N.
• Initialiser une variable u en lui affectant la valeur N
• Répéter tant que 11 l’instruction :
• Donner à u la valeur u – 11.
• A la fin de la répétition afficher u.
: Prompt N
: N sto R
: ClrList L1
: {N} sto L1
: While iPart(R/2)=R/2
: augment(L1,{2}) sto L1
: R/2 sto R
: End
: For (J,3,N,2)
: While iPart(R/J)=R/J
: augment(L1,{J}) sto L1
: R/J sto R
: End
: End
: Disp L1
Exercice 9 Algoritmhe pour démontrer qu’un nombre est premier
:ClrHome
:Input « Un nombre impair : » , N
:1 sto D
N.M. Page 3
:Lbl 1
:D+2 sto D
:If D*D#N
:Then
:If fPart(N/D)=0
:Then
:Disp « Divisible par », D
:Else
:goto1
:End
:Else
:Disp « Premier »
:End
:Input N
:For (k,1,N)
:If randInt(1,6)=4
:P + 1 sto P
:End
;Disp « Nombre d’apparition de 4 est » ,P
N.M. Page 4
IV) Algorithmique et langage Python
IV-1 Préparer l’écriture
On commence par demander une nouvelle fenêtre : Files, News widdow.
Ensuite, il faut enregistrer le programme : Files, Save As, On donne un nom qui convient sans espace, sans
accents et finissant par .py
Application 2
Ecrire un algorithme donnant les coordonnées du milieu d’un segment. ( Voir corrigé exercice 16)
Application 3
Ecrire un algorithme donnant la distance entre deux points. (Voir corrigé exercice 24)
Application 4
Ecrire un algorithme donnant l’âge d’une personne à partir de sa date de naissance. (Voir corrigé
exercice 23)
Application 5
Devinette
Demander à quelqu’un de penser très fort à deux nombres
Demander la somme de ces deux nombres puis la différence de ces deux nombres.
Ecrire un algorithme permettant de lui communiquer les deux nombres qu’il a choisi au début.
( voir corrigé exercice 13)
Application 6
Ecrire un algorithme permettant le calcul de la somme des carrés de nombres.
Application 7
Ecrire un algorithme qui pour un temps donné en secondes, le convertit en heures minutes et secondes.
Application 8 ( en construction)
Application 9 ( en construction)
N.M. Page 5
IV-3. Instruction conditionnelle et tests logiques
Tout d’abord considérons l’instruction conditionnelle « si » correspondant aux différents schémas
algorithmiques :
• Si condition alors instruction
Ou bien :
• Si condition alors
• Instruction 1
• Instruction 2.
• Finsi
Pour isoler l’ensemble des instructions on peut les décaler vers la droite on appelle ceci : indenter
• Si condition alors
• Instruction 1
• Instruction 2
• . .
A ce moment, il est inutile de faire « finsi ». C'est ce que fait l’éditeur Python après le symbole « : »
• If condition :
• Instruction 1
• Instruction 2
Application 10
Faire un petit programme Pythagore qui demande trois longueurs de côtés et qui indique si le triangle est
rectangle ou pas.
Dans cette application, on ne sera trop ambitieux et on indiquera quelle est le plus grand côté.
N.M. Page 6
Application 11 (Maximum, minimum, tri de deux nombres IREM Grenoble)
Ecrire un programme lisant les valeurs de deux nombres A et B et affectant le maximum de A et
de B à la variable MAXIMUM.
Une solution :
Entrer A et B
Si ) * alors
MAXIMUM+A
Sinon
MAXIMUM+B
Afficher la valeur du MAXIMUM
Application 12
Compléter l’algorithme précédent pour affecter le maximum de A et B à la valeur MAXIMUM, et le
minimum de A et B à la valeur MINIMUM.
Une solution :
Entrer A et B
Si ) * alors
MAXIMUM+A
MINIMUM+B
Sinon
MAXIMUM+B
MINIMUM+A
Afficher la valeur du MAXIMUM
Voir corrigé Exercice 19
Application 13
On souhaite écrire un algorithme lisant les valeurs de A, B, C et affectant le maximum de A, B
et C à la variable MAXIMUM.
Voir corrigé exercice 20
Application 14
Programmer et faire fonctionner l’algorithme suivant :
Saisir A, B
Si A > B
Alors
Afficher 5A+2B
Sinon
Afficher 5A-2B
Application 15
Un commerçant de reprographie facture 0,30 € les 20 premières photocopies et 0,15 € les
suivantes.
1. Quel est le montant payé pour 15 photocopies ? pour 50 photocopies ?
2. Ecrire un algorithme permettant de calculer le montant payé quant le nombre de
photocopies est donné. Programmer cet algorithme, puis vérifier les résultats de la
question
N.M. Page 7
IV-4 Les boucles dans Python.
On souhaite afficher des nombres de 0 à 30. Pour cela, on utilise l'instruction while, (tant que).
En langage Naturel Instruction de Python
L’initialisation, on commence par 0 K=0
Tant que k est inférieur ou égal à 20 While k<=30 :
On écrit le nombre k print k
On incrémente, c'est-à-dire qu’on affiche k+1 à k k = k+1
On remarque la même syntaxe que pour la commande if, avec les deux points et l’indentation
obligatoire.
B. L'algorithme de Babylone
Un exemple historique
Il y a environ 4000 ans, cet algorithme était utilisé par les lettrés de Babylone pour calculer des racines carrées.
1ère étape :
La première valeur approchée de √50 est la moitié de 50, c'est à dire 25.
2e étape :
En divisant 50 par 25, on trouve 2 ; √50 est donc compris entre 2 et 25. La deuxième valeur
approchée de √50 sera la moyenne arithmétique de 2 et de 25 soit 13,5.
3e étape :
En divisant 50 par 13,5, on trouve 3,7037 ; √50 est donc compris entre 3,7037 et 13, 5. La troisième
valeur approchée de √50 sera la moyenne arithmétique de 3,7037 et de 13, 5 soit 8,6018.
Étapes suivantes :
On continue autant de fois qu'il est nécessaire en répétant le procédé. Nous accepterons, sans le
démontrer, qu'on obtient ainsi des valeurs approchées de plus en plus précises de √50 .
La méthode se généralise à tout nombre positif.
N.M. Page 8
Construire un organigramme
Au lieu d'utiliser le langage courant pour décrire un algorithme, on peut utiliser un organigramme qui
le présente de manière plus visuelle et surtout plus synthétique.
Les organigrammes, très à la mode au début de l'informatique, sont aujourd'hui moins utilisés. Mais
dans certains cas, ils sont extrêmement utiles à la compréhension.
Avant de présenter l'organigramme, nous ferons trois remarques qui permettront de mieux comprendre
comment il a été construit.
1°) On peut observer que, la première approximation mise à part, toutes les autres sont calculées de la
0 ,-
même façon. : si v est l'approximation qui suit immédiatement l'approximation u, on a / 1 2 2 .
Le même calcul est donc répété un certain nombre de fois.
0 ,-
2°) Contrairement à ce qu'on pouvait penser à priori, la formule / 1 2 2 montre que
deux variables seulement suffisent pour décrire la suite des valeurs approchées de √50 .
3°) Il existe différents moyens d'arrêter les calculs. On peut fixer à l'avance le nombre des
approximations qui seront calculées, 20 ou 30 par exemple. On peut aussi décider de stopper les
calculs lorsque une certaine précision, fixée elle aussi à l'avance, est atteinte. Pour cela, au cours des
calculs, on peut tester la valeur absolue de la différence de deux valeurs approchées
consécutives uet v. On décidera par exemple de cesser les calculs dès qu'on aura | 4 5| 6 10'7 .
L'organigramme de Babylone
Voici maintenant l'organigramme annoncé :
N.M. Page 9
Commentaire
Cet organigramme a un début et une fin. Il comprend 3 variables numériques (u, v et d) ainsi qu'une constante numérique (c'est a).
Les instructions qu'il comporte sont exécutées une à une, de manière séquentielle. Une « boucle » répète le même calcul tant que c'est nécessaire
mais naturellement avec des valeurs différentes. Le nombre de répétitions dépend du résultat du test d>0,000001 placé dans la case rose. Selon la
réponse à ce test, les calculs sont poursuivis ou stoppés.
Remarque :
L'instruction d'affectation = permet de définir une variable numérique en lui donnant un nom et une
valeur. Bien que ce soit le même qu'en mathématique, le symbole = a ici un tout autre sens. Par
exemple, l'instruction x=x+1 ne désigne pas du tout une équation mais indique simplement que la
nouvelle valeur de la variable numérique x s'obtient en ajoutant 1 à l'ancienne !
Algorithme et programmation
L'algorithme dans le langage Python
a=input("Choisir a :" )
u=a/2.0
d=abs(a-u)
while d>0.000001 :
v=(u+a/u)/2.0
d=abs(u-v)
u=v
print u
Même si les instructions sont exprimées en anglais, on reconnaît la démarche utilisée dans
l'organigramme.
L'entrée du nombre a se fait à l'aide de l'instruction input() : c'est un mot anglais d'origine latine qui
signifie « introduire, mettre dedans ».
Le mot-clé anglais while, qui signifie tant que..., sert à définir une boucle conditionnelle.
La précision demandée est atteinte lors du calcul de la 7e valeur approchée. Celle-ci
vaut 7,07106781187.
Un programme est donc la mise en œuvre d'un ou de plusieurs algorithmes, dans le cadre d'un
langage de programmation.
N.M. Page 10
Application 22 Dichotomie
Objectif : Chercher une solution par dichotomie :
On considère une fonction f définie sur par 8 8² 4 28 4 2
On commence par observer sa représentation graphique à l’aide de la calculatrice ou à l’aide du
logiciel de géométrie Géogebra.
On peut conjecturer que l’équation f(x) = 0 admet une unique solution sur l’intervalle :1; ∞: et que
cette solution est comprise entre 2 et 3.
1. Appliquer l’algorithme ci-dessous avec a = 2, b = 3 et e = 0,1.
Demander a et b
Demander e
Tant que b – a > e
Affecter à c la valeur (a+b)/2
Si <= > <? 6 0 alors mettre c en b
Sinon mettre c en a
Fin tant que
Afficher c,
C) Boucle et itérateurs
Boucle Pour :
Application 23
On souhaite trouver tous les triangles rectangles dont les côtés sont des entiers consécutifs, le premier
est un entier entre 1 et 10.
Il s’agit ici de répéter 10 fois le travail réalisé dans l’application 10 de la page 6, avec pour longueurs
de côtés : (1 ;2 ;3) , (2 ;3 ;4) , (3 ;4 ;5) , …. (10 ;11 ;12).
1. On écrit l’algorithme :
On suppose que le plus petit côté est par exemple c.
Début :
Pour c allant de 1 à 10 par pas de 1,
Mettre c+1 dans b
Mettre b+1 dans a
Afficher a, b et c.
Si c²+b² = a²
Ecrire « Le triangle est rectangle »
Sinon, écrire « Le triangle n’est pas rectangle »
Fin du si
Fin du pour
2. On traduit l’algorithme en Python
for c in range(1,10,1) :
b=c+1
a= b+1
print a,b,c
If c**2+b**2=a**2
print « le triangle est rectangle »
Else :
print « le triangle n’est pas rectangle »
3. Faire fonctionner le programme pour des entiers consécutifs de 1 à 30 puis de 1 à 50 puis
de 1 à 100 …... Que dire ?
N.M. Page 11
Application 24
Retour à la boucle Tant Que
On souhaite maintenant trouver 4 triangles rectangles dont les côtés sont des entiers, les deux
plus petits étant consécutifs. Contrairement à l’application 23, on ne sait pas pour quelle
valeur de c on va s’arrêter : l’utilisation d’une boucle pour est alors impossible. On va
reprendre la boucle tant que ( While ) et afficher les triplets qui donnent des triangles
rectangles.
1. On écrit l’algorithme :
Variables
a,b,c longueurs des côtés ; compteur pour n allant de 1 à 4.
Début
Initialiser c à 1
Initialiser n à 0
Tant que n < 4
Mettre c+1 dans b
Mettre racine(b²+c²) dans a
Si a est entiers, afficher a ,b et c et augmenter n de 1.
Fin de si
Ajouter 1 à c
Fin tant que
Fin
2. On traduit l’algorithme en Python
N.M. Page 12
Exercice 13 (Devinette)
print"Penser tres fort a deux nombres"
print"Calculer la somme et la difference de ces deux nombres"
#saisir de la somme
s=input("Entrer la somme :")
#saisir de la difference
d=input("Entrer la difference:")
print"..."
print"..."
x=(s+d)/2
y=(s-x)
print "les nombres sont :",y,"et",x
Exercice 14 (Indice de masse corporelle)
m=float(input("masse en kilo:"))
t=float(input("taille en metre:"))
IMC=m/(t**2)
print'votre masse corporelle est de :',IMC
Exercice 15 (Algorithme d’Euclide)
a=input("Choisissez l'entier a:")
b=input("choisissez l'entier b:")
D=max(a,b) #On appelle D le plus grand des deux nombres choisis
d=min(a,b) #On appelle d le plus petit des deux nombres choisis
r=D%d #On calcule le reste de la division euclidienne de D par d
while r!=0: #tant que le reste est différent de O
D=d
d=r
r=D%d #On calcule le reste de la division euclidienne de D par d
print"Le pgcd de ",a,"et de ",b,"vaut",d
Exercice 16 (Coordonnées du milieu d’un segment)
XA=float(input("abscisse de A :"))
YA=float(input("ordonnee de A :"))
XB=float(input("abscisse de B :"))
YB=float(input("ordonnee de B :"))
XM=(XA+XB)/2
YM=(YA+YB)/2
print('abscisse de M:',XM)
print('Ordonnee de M:',YM)
Exercice 17 (Primalité d'un entier naturel) (ce programme est à améliorer)
from math import*
print("module pour déterminer si un nombre est premier")
n=input("entrer un entier naturel :")
a=sqrt(n)
p=0
c=2
while (c<=a):
d=(n%c)
if (d==0):
print(n,"n'est pas un nombre premier, il est divisible par",c)
p=1
break
c=c+1
if (p==0):
print(n, "est un nombre premier")
raw_input("appuyer sur entrer pour finir")
N.M. Page 13
Exercice 18 : (Maximum de deux nombres)
A=input('A=')
B=input('B=')
if A>B:
max=A
else:
max=B
print("le maximum est :"),max
Exercice 19 :(Maximum et minimum de deux nombres)
#maxi mini
A=input('A=')
B=input('B=')
if A>B:
max=A
min=B
else:
max=B
min=A
print("le maximum est :"),max,"le minimum est",min
Exercice 20 : (Maximum de trois nombres)
Algorithme :
Entrer A, B, C
# Calcul du maximum de A et B
Si ) * alors
MAXIMUM+ )
Sinon
MAXIMUM+ *
# Calcul du maximum de MAXIMUM et C
Si @ A)BCADA alors
MAXIMUM+ @
Sinon
MAXIMUM+ A)BCADA
Avec Python
#Maximum de trois nombres
A=input('A=')
B=input('B=')
C=input('C=')
#calcul du maximum de A et B
if A>B:
max=A
else:
max=B
#calcul du maximum de A et C
if C>max:
max=C
else:
max=max
print"le maximum de",A,";",B,"et",C,"est",max
N.M. Page 14
for i in range(N+1):
print i,cube(i)
Exercice 22 ( Calculer la somme d’une liste)
T=[1,2,3,4,5]
C=0
for i in range(5):
C=C+T[i]
print C
Exercice 23 (Python peut Trouver votre âge)
Exercice 25 (segment 1)
from turtle import*
x1=-200
y1=-100
x2=50
y2=150
up()
goto(x1,y1)
down()
goto(x2,y2)
up()
Exercice 26 (segment 2)
from turtle import*
x=-100
y=-150
a=30
d=200
up()
goto(x,y)
down()
left(a)
forward(d)
up()
N.M. Page 15
forward(100)
left(120)
forward(100)
mainloop()
Exercice 28 (Triangle 2)
from turtle import*
reset()
couleur=['red','blue','green']
for i in range(3):
color(couleur[i])
forward(100)
left(120)
mainloop()
Exercice 29 (Triangle 3)
A suivre …….
DESSINS GEOMETRIQUES ( lycée l’Oiselet ) lien vers mon bureau pour activer Python.
Etape 5 : Utilisation de cette fonction pour tracer une frise et fabrication de la fonction «frise ».
N.M. Page 16
reset()
forward(100)
left(120)
forward(100)
left(120)
forward(100)
mainloop()
Solution Etape 2 : Introduire une boucle FOR pour rendre la tâche automatique.
reset()
couleur=['red','blue','green']
for i in range(3):
color(couleur[i])
forward(100)
left(120)
N.M. Page 17
mainloop()
reset()
couleur=['red','blue','green']
def triangle(cote):
for i in range(3):
color(couleur[i])
forward(cote)
left(120)
mainloop()
N.M. Page 18
triangle(100)
Solution Etape 5 : Utilisation de cette fonction pour tracer une frise et fabrication de la fonction
« frise »
reset()
couleur=['red','blue','green']
def triangle(cote):
for i in range(3):
color(couleur[i])
forward(cote)
left(120)
def frise(n,cote):
for i in range(n):
triangle(cote)
N.M. Page 19
up()
forward(cote)
down()
mainloop()
frise(4,100)
reset()
couleur=['red','blue','green']
def init(x,y,cap):
up()
goto(x,y)
left(cap)
down()
N.M. Page 20
def triangle(cote):
for i in range(3):
color(couleur[i])
forward(cote)
left(120)
def frise(n,cote):
for i in range(n):
triangle(cote)
up()
forward(cote)
down()
mainloop()
init(-200,0,45)
frise(4,100)
N.M. Page 21
Solution Etape 7 : Fabrication de la frise emboitée des triangles équilatéraux.
reset()
couleur=['red','blue','green']
def init(x,y,cap):
up()
goto(x,y)
left(cap)
down()
N.M. Page 22
def triangle(cote):
for i in range(3):
color(couleur[i])
forward(cote)
left(120)
def frise(n,cote):
for i in range(n):
triangle(cote)
up()
forward(cote)
down()
init(-300,0,0)
for i in range(5):
frise(2**(i+1),300./(2**(i+1)))
init(-300,0,0)
mainloop()
N.M. Page 23
Solution Etape 8 : Fabrication de la frise emboitée « mieux » des triangles équilatéraux.
reset()
couleur=['red','blue','green']
def init(x,y,cap):
up()
goto(x,y)
left(cap)
down()
def triangle(cote):
for i in range(3):
color(couleur[i])
forward(cote)
left(120)
N.M. Page 24
def frise(n,cote):
for i in range(n):
triangle(cote)
up()
forward(cote)
down()
def frise_fractale(x,y,cap,n,cote):
init(x,y,cap)
for i in range(n):
frise(2**(i+1),cote/(2.**(i+1)))
init(x,y,cap)
mainloop()
frise_fractale(-300,0,0,4,300)
APPLICATION 22 Dichotomie
rom math import*
def fonc(x):
return x**2-2*x-2
a=float(input("a="))
b=float(input("b="))
e=float(input("e="))
while((b-a)>e):
c=(a+b)/2.
if fonc(a)*fonc(c)<0:
b=c
else:
a=c
print"Une valeur approchée de la solution de f(x)=0 est",c
N.M. Page 25