Vous êtes sur la page 1sur 6

Algorithme et programmation

I. Résolution de problèmes.

Un problème est décrit de la manière suivante :


1. La description des entrées d’un problème
2. Ce que l’on attend en sortie

Exemple :
On nomme « troisième » le problème suivant :
Entrée : Une suite de caractères A
Sortie : Le troisième caractère de A

Ici une suite de caractères A est appelée une instance du problème Troisième.
. La description du problème est appelée une spécification du problème.

Il peut exister plusieurs (ou même aucune) manière de résoudre le problème. On utilise des
algorithmes pour résoudre ces problèmes

Un algorithme possède également une spécification, que l’on donne généralement sous la
forme : . Entrée(s) (décrit le format attendu en entrée)
. Précondition(s) (ce que doivent respecter les entrées pour que l’algorithme ft°nne)
. Sortie(s) (décrit le format du résultat)
. Postcondition(s) (décrit les propriétés à respecter sur le résultat, et l’état de la
mémoire à la fin de l’exécution de l’algorithme)

Exemple : Problème moitié


Entrée un nombre entier positif sortie : la moitié de ce nombre.
Algo Divise (n entier)
Renvoyer n/2

Spécifications de Divise :
. Entrée : un entier n
. Précondition : n
. Sortie : un entier k
. Postcondition : 2k = n

I. Bases de la programmation impérative.


1. Affectation

L’affectation est une instruction qui se présente de la manière suivante :

: ici on indique un nom de variable pour identifier et stocker des données, lors d’une
affectation, les données précédentes sont écrasées.
Rq : Dans certains langages il est nécessaire de déclarer les variables avant de les affecter.
Lors de la déclaration, on précise le type de la variable, notamment pour connaitre l’espace
mémoire nécessitant à réserver.
Quelques types :
. Entiers signés : permettant de représenter Z/. On les appelle également « intger » » ou encore
« int »
. Entiers non signés : /N, « unsignet int »
. Booléens Vrais et Faux « bool »
. Flottants : Nombres à virgule flottante, « float »
. Caractère : « char »

: Expression (valeur ou calcul) dont le résultat est du type de la variable à laquelle on


affecte la valeur, pour chacun des types, il existe des opérateurs permettant d’effectuer des
calculs (+, -, *, /)

Exemple : Syntaxe C

int x ; // ou int x = 2


x = 2 ;
y = x + 3 ;
x = y ;

A la fin du programme on a x = 5 et y = 5

2. Affichage

Afficher un texte ou le contenu d’une variable est une instruction.


C : stdio.hx

3. Structure de contrôle.
a. For/Pour

Une boucle « for », sert à répéter une portion de code un nombre définie de fois.

Exemple :

For i allant de 1 à 5

Afficher i

b. While/Tant que

Une boucle « while » permet de répéter une portion de code tant qu’une certaine condition est
vérifiée.

Exemple :

n = 100
while (n > 50)
n = n - 10 (calcul dont le résultat est un booléen)
afficher n
c. If/si, else/alors

Exemple

Algo (n)
si n est pair (condition)
afficher « n est pair »
sinon
afficher « n est impair »

4. Les fonctions

Si on a besoin d’exécuter un même code à différents endroits d’un programme, il est judicieux
d’écrire ce code dans une fonction. Ce code peux dépendre de données d’entrée appelées
arguments.

Exemple :

plus2(n)
renvoyer(n+2)
main()
x=5
y = plus2(x)
x = plus2(y)

n est continuellement crée puis effacé afin de bien calculer

%d permet d’appeler un entier


%f permet d’appeler un flottant

3. Programmes :

Un langage de programmation est un langage permettant à un être humain d’écrire des


instructions dans le but d’être exécuté par un ordinateur.
La compilation est la traduction de code écrit dans un langage dans un autre langage. En
général cela d’un langage de programmation vers un exécutable.

Schéma : Disque dur : Mémoire vive

Code C Binaire + espace mémoire

gcc
Exécution
Binaire
Cela est valable pour les langages dit compilés en opposition avec les langages dit interprétés.
C, C++, Ocamel langage compilé et Python, Javascript interprété.

L’interprétation consiste à compiler et exécuter ligne par ligne « à la volée » le code écrit.

Points fort :

Compilé Interprété
Vitesse Usage
Interactivité
Débuggage

Il existe plusieurs paradigmes de programmation (3 au programme), impératif structuré


consiste a faire évoluer l’état du programme avec des instructions exécutées successivement.

1. L’état du programme est la description de la mémoire (en particulier, les valeurs de


chaque variables) à un instant t de l’exécution du programme.

2. Le déclaratif fonctionnel consiste à placer les fonctions au cœur du programme et


repose énormément sur la récursivité.

Exemple :

OCamel privilégie la programmation déclarative fonctionnelle

3. Un langage peut également ne pas être de « programmation », mais par exemple « de
requête ». SQL est par exemple un langage obéissant au paradigme logique, on décrit
ce que l’on veut obtenir plutôt que des actions à réaliser.

IV. Analyse de programmation


1. Terminaison des programmes
Exemple :

int f(int x)


while(x>0)
x = x + 1 ;

return x ;

On dit qu’un programme termine sur son exécution se fait en un nombre fini d’étapes. Pour
montrer qu’une boucle n’est pas infinie, il faut identifier un variant de boucle : quantité
calculée à partir de l’état du programme qui appartient à un ensemble bien fondé, qui décroit
strictement à chaque itération.

Un ensemble bien fondé est un ensemble (munie d’une relation d’ordre) dans lequel toute
suite strictement décroissante est fini. (/N,<) est un ensemble bien fondé
Exemple :

int g(int a, int b) (1)


int r = a (2)
int q = 0 ; (3)
while (r – b >= 0) (4)
r = r – b ; (5)
q = q + 1 ; (6)

return q ; (8)

Si b > 0 le programme termine car n – b est un variant de boucle, en effet :


. r – b >= 0 d’après la condition d’arrêt
. à chaque itération la quantité r -b décroit de b > 0 (ligne 5), donc décroit strictement

2. Correction de programme

Un programme est correct s’il respecte sa spécification.

Exemple :

int puissance_de_2(int x)  (1)


int res = 1 ; (2)
int y = x ; (3)
while(y > 0)  (4)
res = 2 * res ; (5)
y = y - 1 ; (6)

Return res ; (7)

Spécification de : puissance_de_2

. Entrée : un entier x
. Pré - condition : x >= 0
. Sortie : un entier res
. Post condition : res = 2x

Pour montrer la correction du programme, on utilise souvent un invariant de boucle (eq a une
hypothèse de récurrence), une propriété sur l’état du programme qui est vraie en début du
programme et qui reste vraie d’une itération sur l’autre.

Un bon invariant de boucle est tel que l’on peut déduire la post – condition de spécification à
partir de l’invariant en fin de programme.

Ici on pose I « 2x – y = res »


Montrons que I est un invariant.
Initialisation :

A l’entrée de la boucle while, on a res = 1, et y = x donc x – y = 0 donc 2x – y = 20 = 1, on a bien


I vraie

Conservation : (hérédité pour la récurrence)

Supposons I vraie au début d’un itération, montrons que I reste vraie à la fin de l’itération (et
donc au début de l’itération suivante s’il y en a une).
On indice les variables avec i pour identifier les valeurs au début de l’itération et avec f à la
fin de l’itération. Ici, grâce à I vraie en début d’itération on a 2x – yi = resi , res n’est modifié
qu’à la ligne 5 donc resf = 2resi de même pour y et la ligne (6), yf = yi – 1
2x – y = 2 x – (yi – 1) = 2x – yi + 1 = 2 * 2x – yi =2 * resi = resf
D’où I vraie en fin d’itération on a la conservation de I.

Conclusion :

On a donc I vraie à la fin de la dernière itération. On a cet instant y vaut 0 de manière évidente
(en prenant en colpte la précondition)
On a donc 2x – 0, ce qui est bien notre post – condition.

Vocabulaire :
Algorithme : Séquence d’instructions que l’on peut suivre de manière déterministe, à partir de
données d’entrées et fournissant un résultat.

Vous aimerez peut-être aussi