Vous êtes sur la page 1sur 44

Introduction à la programmation

Introduction à l’architecture des ordinateurs. Aperçu des langages machine et


des langages de programmation. Notion de programme. Spécification
fonctionnelle. Étapes dans la vie d’un programme. Qualités d’un programme.
Familiarisation avec votre ordinateur. Environnement de programmation.
Compilation et exécution d’un programme. Identification des erreurs de
logique et de syntaxe. Composantes d’un programme élémentaire (opérations
d’entrée / sortie, variables, lecture et écriture en mémoire, fonction principale
(« main »). Exemples de programmes simples en C++.
Qu’est-ce qu’un ordinateur ?
Appareil capable d’effectuer des calculs et de prendre des décisions logiques des
millions, voire des milliards de fois plus rapidement que le cerveau humain.
Ordinateur personnel Cerveau humain
100 millions d’additions /sec. plusieurs dizaines d’années

Superordinateur Cerveau humain


plusieurs centaines de milliards des centaines de milliers de personnes
d’additions /sec. en une année.
Les ordinateurs traitent des données au moyen d’une série d’instructions ou
d’opérations élémentaires connues sous le nom de programme.
Les programmeurs sont les personnes chargées de traduire des algorithmes
en une série d’instructions.
Les différents composants d’un ordinateur sont désignés par le terme matériel et
les programmes qui y sont exécutés, par le terme logiciels.
On peut se servir d’un ordinateur sans programmer (Excel, Word, PowerPoint, …).
Applications diverses :
° génération de films d’animation, mise en orbite d’un engin spatial,
° paiement d’une facture par l’entremise d’une succursale bancaire, etc.
Fonction d’un ordinateur
Machine capable de recevoir, de conserver, de traiter et de transmettre des
données.
Exécute pas à pas, très rapidement, une suite d’instructions que l’on nomme
« programme ».

Données Données
PROGRAMME
d’entrée de sortie

domaine fonction image


Historique
ENIAC, le 1e ordinateur électronique (1946) : 18 000 lampes env. reliées par un câblage.
Organisation d’un ordinateur
Quelle que soit leur apparence physique, la plupart des ordinateurs sont
habituellement divisés en 6 unités logiques.
1. Unité d’entrée
Celle qui reçoit l’information (données et programmes) provenant des différents
périphériques d’entrée et qui met cette information à la disposition des autres
unités afin qu’elle puisse être traitée.
Ex. : clavier, souris, numériseur(« scanners »), joystick, …

Gants de données
(« datagloves »)

Système optique
de
captures de mouvement
Organisation d’un ordinateur
2. Unité de sortie
Celle qui prend l’information traitée par l’ordinateur et qui la distribue aux différents
périphériques de sortie pour la rendre utilisable à l’extérieur de la machine.

Ex. : écran, imprimante, …


Organisation d’un ordinateur
3. Unité de mémoire
(désignée aussi sous le terme de mémoire ou mémoire principale)
Elle conserve l’information provenant de l’unité d’entrée de façon à la rendre
immédiatement disponible pour tout traitement.

Elle conserve également l’information traitée jusqu’à ce qu’elle puisse être


distribuée éventuellement aux périphériques de sortie.

Il existe deux types de mémoire :

(i) La mémoire en lecture-écriture: un stockage primaire rapide mais onéreux,


elle perd ses données en cas de coupure de courant (« Random Access
Memory »)
Permet le stockage de données ou de programmes n’ayant pas à être
disponibles en permanence.

(ii) La mémoire en lecture seule (« Read Only Memory »):


renferme certains programmes qui doivent toujours être présents.

On peut identifier une cellule mémoire à partir de son adresse ou de sa position.


Organisation d’un ordinateur
4. Unité arithmétique et logique

Serviteur de l’unité centrale de traitement.

Responsable de l’exécution des calculs (addition, soustraction, multiplication,


division, …) et des mécanismes de décision (par ex., la comparaison de 2
données en mémoire pour déterminer si elles sont égales ou non).
Organisation d’un ordinateur
5. Unité centrale de traitement
Coordonne la machine et supervise le fonctionnement des autres unités.
Exécute les opérations : accède aux instructions, les interprète et
active les unités appropriées.
Indique à l’unité d’entrée quand lire l’information en mémoire, indique à l’UAL
quand utiliser l’information provenant de la mémoire pour des calculs et
synchronise l’unité de sortie pour diriger l’information de la mémoire aux
périphériques de sortie.

Microprocesseur
Organisation d’un ordinateur
6. Unité de stockage secondaire
De grande capacité, elle permet l’entreposage de données à long terme.
Les données ou les programmes qui ne sont pas utilisés de façon active sont nor-
malement rangés dans ces unités secondaires (disques, disquette, carte USB, …).

Demande plus de temps pour accéder à des données rangées en mémoire


secondaire mais le coût par unité de stockage secondaire est moins élevé
comparativement à la mémoire principale.
Disque dur
Note : Les données et les programmes
sont stockés sur disque dur et
chargés en mémoire RAM au
démarrage du programme.

Carte USB
Coûts de fabrication et de développement
Les coûts de fabrication du matériel informatique ont énormément diminué au
cours des dernières années.

Les ordinateurs personnels sont devenus un produit d’usage courant.

Le coût de développement des logiciels n’a pas cessé de croître.

Constat Les entreprises sont inondées de données.


La complexité des problèmes à traiter a augmenté considérablement.
Équipes de développement importantes.
Un seul individu ne peut comprendre toutes les subtilités d’un modèle
de conception.
Conséquences Le logiciel est généralement livré en retard.

Ses coûts excèdent souvent les budgets prévus.


Le logiciel est souvent défectueux et difficile à modifier.
Un programme utilisé sera modifié On augmente sa complexité, à moins de
lutter contre ce phénomène.
Coûts de développement
Évolution des systèmes d’exploitation
Les systèmes d’exploitation sont des logiciels spécialisés qui furent développés
pour faciliter l’utilisation des ordinateurs et augmenter leur capacité de traitement.
Les premiers systèmes permettaient aux ordinateurs de n’exécuter qu’une seule
opération ou tâche à la fois.

La machine exécute un seul programme à la fois


(traitement par lot mono-utilisateur).
Les travaux étaient soumis à un centre de service informatique au moyen
de cartes perforées (délais rencontrés : plusieurs heures voire des jours
avant de recevoir le résultat du programme).
Les systèmes suivants permettent de partager les ressources de l’ordinateur entre
de nombreuses opérations pour permettre leur exécution en « simultané »
(multiprogrammation). demeure vrai.
Dans les années 60, on introduit des systèmes à temps partagé où des utilisateurs
branchés à leur propre terminal partagent une seule machine en même temps.
Dans les faits, celle-ci n’exécute pas tous les travaux en même temps mais
exécute plutôt une petite partie de la tâche d’un utilisateur, puis passe à celle
du suivant. L’ordinateur étant plus rapide, cela donne l’impression que les
programmes s’exécutent simultanément.
Informatique personnelle, distribuée et client/serveur
L’informatique personnelle a vu le jour en 1977 (Apple); le prix plus abordable
des ordinateurs a permis d’en faire une utilisation personnelle ou pour le travail.
En 81, IBM lançait le « IBM personal Computer ». Du jour au lendemain,
ce fut un bouleversement.
Les ordinateurs personnels étaient reliés en réseaux à l’intérieur d’une organisation,
soit sur des lignes téléphoniques, soit en réseaux locaux.
Le traitement informatique était distribué vers les différents postes de travail
à travers les réseaux au lieu d’un traitement central unique.
Pour faciliter la communication entre les ordinateurs d’un réseau, des machines
appelés serveurs de fichiers, offrent un stock de programmes et de données dont
peuvent se servir les ordinateurs clients répartis sur le réseau.
L’informatique parallèle permet d’exécuter des tâches en parallèle.

Un ordinateur parallèle possède plusieurs unités de traitement.

Il existe 2 types d’architectures parallèles :


- l’une où les unités de traitement partagent une mémoire commune,
- l’autre où chaque unité de traitement possède son bloc de mémoire.
Langages machine, d’assemblage et de haut niveau
Il existe des centaines de langages de programmation permettant de traduire un
algorithme en une suite d’opérations élémentaires connues de l’ordinateur
(C, C++, FORTRAN, JAVA, PASCAL, COBOL, SIMSCRIPT, GPSS, ADA, APL, …).
Des instructions qui ressemblent Programme écrit dans un Un programme doit respecter
scrupuleusement les conventions
à la langue naturelle et au langage langage de haut niveau du langage.
mathématique.
Spécifique pour
Ex. : PaieBrute = PaieReguliere + PaieSupplementaire Compilateur chaque langage.
(traducteur en langage d’assemblage)
Un peu plus clair pour les humains. Programme écrit en
Ex. : LOAD PaieReguliere
langage d’assemblage
ADD PaieSupplementaire
STORE PaieBrute Assembleur (traducteur en langage machine)

L’ordinateur ne peut comprendre


directement que son propre langage
Programme écrit en
machine. langage machine

Chaque programme est une suite


+1300042774
de nombres - une série de 1 et de 0 - Ex. : +1400593419 Instructions très primitives.
fastidieux pour les humains. +1200274027
Interpréteur
La compilation et l’assemblage d’un programme écrit en langage de haut niveau
peut prendre un temps considérable.
C’est pourquoi on développa des interpréteurs capables d’exécuter directement
des programmes en langage de haut niveau sans compilation.

Les programmes interprétés s’exécutent


plus lentement que ceux compilés.
La version compilée n’est produite qu’une fois le programme
complété, assurant ainsi un fonctionnement plus efficace.
Historique du C
Le C et le C++ figurent parmi les langages de haut niveau les plus puissants et
les plus répandus.
C est disponible pour la plupart des ordinateurs; il est indépendant du matériel.

Au début des années 80, l’emploi très répandu du C sur différents types
d’ordinateurs amena de nombreuses variantes.

La nécessité d’une version standard du langage C se faisait sentir.

En 83, un comité de l’American National Standards Comittee on Computers


and Information Processing (ANSI) était formé afin de fournir une définition du
langage plus claire et indépendante de la machine.

En 89, le standard élaboré fut approuvé.

En 90, l’ANSI travailla de pair avec l’International Standards Organization (ISO)


pour produire un document de normalisation du langage C à l’échelle mondiale.

Nous pouvons écrire des programmes portables capables


de fonctionner sur différentes plates-formes.
Historique du C++
Une extension du C, développé au début des années 80 est un sur-ensemble
de C.

Il offre des possibilités pour la programmation orientée objets.


Une approche « jeu de construction » pour concevoir des programmes :
ne pas essayer de réinventer la roue mais se servir de pièces existantes
chaque fois que c’est possible (réutilisation de logiciels).

C++ est un langage hybride qui permet de programmer en C, tout en profitant,


le cas échéant, des concepts orientés objets.

Note : En mai 95, Sun annonçait le Java fondé sur le C et le C++ tout en
incorporant des outils pour le multimédia, la mise en réseau, le
graphisme, l’accès à des bases de données, etc.
Avantages du langage C
C est un langage :
universel : non orienté vers un domaine d’applications particulières comme en
FORTRAN ou en COBOL.
compact : basé sur un noyau de fonctions et d’opérateurs limité, permettant la
formulation d’expressions simples mais efficaces.
moderne : C offre les opportunités rencontrées dans les autres langages de haut
niveau.
près de la machine : C renferme des opérateurs très proches de ceux du langage
machine et des fonctions qui permettent un accès simple et
direct aux fonctions internes de l’ordinateur.
rapide : la caractéristique précédente permet d’écrire des programmes efficaces.

indépendant de la machine : C peut être utilisé sur n’importe quel système en


possession d’un compilateur C.
portable : en respectant le standard ANSI-C, on peut utiliser le même programme
sur n’importe quel système simplement en le recompilant.
extensible : le langage possède tout un ensemble de librairies d’outils.
Désavantages du langage C
Code efficace mais pas toujours facilement compréhensible.
Code en C :
// Afficher les n premiers éléments d’un tableau A en insérant un espace
// entre les éléments et en commençant une nouvelle ligne après chaque
// dixième chiffre.

for (i = 0; i < n; i++)


printf("%6d%c", A[i], (i%10==9) ? '\n' : ' ');

Code en SIMSCRIPT :

DEFINE A, B, C AS REAL VARIABLES


DEFINE ADD2 AS A ROUTINE GIVEN 2 ARGUMENTS YIELDING 1 ARGUMENT
ROUTINE ADD2 GIVEN X AND Y, YIELDING Z
DEFINE X,Y, Z AS REAL VARIABLES
LET Z = X + Y
RETURN
END
Limites de la portabilité : ANSI-C est assez limité.
Certaines applications nécessitent l’usage de fonctions spécialisées.
Discipline de programmation
Danger du C.

C est un langage de programmation structuré mais près de la machine.


C ne nous force pas à adopter un certain style de programmation.

La tentation de programmer du code « spaghetti » est grande.

Le programmeur a beaucoup de liberté mais des responsabilités;


il doit veiller lui-même à adopter un style de programmation de qualité.
Qualités d’un programme
Correct : S’il obéit à ses spécifications.

Exemple :
Entrée : 2 entiers positifs, un numérateur et un dénominateur.
Sortie : la valeur de l’expression : numérateur / dénominateur.
Le programme doit accepter 2 entiers positifs en entrée seulement
et fournir uniquement le résultat escompté.

Précision souhaitée des données : Lors des calculs effectués, indiquer la


précision souhaitée (# de décimales).
Valide : Lorsque le programme est une composante d’un système, il doit
fonctionner sur une base individuelle mais aussi à l’intérieur du système.

Exemple : Calcul de la cotisation Régime d’emploi d’un


syndicale d’un employé employé
Fiable : Il fait ce qu’on s’attend tout le temps.

Exemple : Programme de calcul de l’inverse d’une matrice carrée


éprouvant de la difficulté lorsque le déterminant est près de 0.
Qualités d’un programme
Complet :
Il doit manipuler tous les échantillons de données possibles correctement.
Exemple : Calcul de la moyenne des notes à un examen sachant que
les notes n’ont pas encore été saisies.

Calcul du nombre de jours ouvrables écoulés depuis le début


des travaux de construction d’une maison. On doit prendre en
compte, le cas échéant, les 2 semaines de vacances de la
construction.

Il doit protéger le système contre des données erronées.

Il doit satisfaire à tous les besoins identifiés lors de la définition du problème.


Robuste : Le programme peut fonctionner même lorsque le système est en état
de défaillance.
Exemple : Erreur survenue lors de la saisie d’une donnée au clavier.

Utile : à nos besoins.


Qualités d’un programme
Efficace :
S’il exige comme ressources des quantités limitées.

Exemple : Calcul de 1 + 2 + 3 + … + 1 000 000 = 500 000 * 1 000 001


= 100 000 * 5 000 005
= 500 000 500 000.
Vérifiable : Si l’on peut démontrer formellement qu’il est correct.

Maintenance facile : Mise à jour facile.

Exemple : Changement de millénaire.

Programme bien documenté

Impression bien soigné


Trucs pour faciliter la bonne programmation
1. Définir le problème exactement.
2. Pensez en premier, programmer plus tard.
La Loi de Murphy, aussi connue sous le nom de Loi de l'Emmerdement Maximum (LEM).

Il existe de nombreuses variantes de cette loi, basés sur le fait que toute catastrophe possible a une fâcheuse
tendance à se produire. La plus connue est sans doute la Loi de la tartine beurrée, selon laquelle "Toute tartine
beurrée livrée à elle-même tombera du côté beurré." (Ça marche aussi avec de la confiture, et c'est encore plus
efficace si vous avez un tapis en dessous).

Corollaire sur la programmation :


Plus tôt vous commencez à coder votre programme (au-lieu de penser),
plus tard vous finirez.
3. Utiliser une technique de programmation (par ex., une approche « top-down »).

4. Utiliser autant que possible des structures linéaires (éviter les « GOTO »).

5. Utiliser immédiatement une syntaxe correcte.

6. Éviter l’usage d’éléments qui dépendent d’une installation donnée.

7. N’assumer jamais que l’ordinateur a assumé quelque chose (valeurs par défaut).
8. Vérifier à la main votre programme avant de le faire exécuter.
Étapes dans la vie d’un programme
1. Définir le problème avec précision.

2. Une approche de solution est choisie pour résoudre le problème.

3. Définition d’un algorithme.

4. Traduction en un langage de programmation au choix.

5. Mise au point d’un programme (validation).

6. Documentation.

7. Maintenance.
Familiarisation avec votre ordinateur
Ouverture d’une session
Recherche d’un emplacement pour écrire, tester et améliorer votre programme.
Création d’un nouveau dossier ou répertoire (1) .
Création d’un fichier C ou C++ à l’intérieur de ce dossier qui contiendra votre
futur programme : *.c ou *.cpp Exemple : Premier programme.cpp
(2)
* désigne le nom du fichier .
Ouverture de ce fichier.
En utilisant l’éditeur de C++, écrire votre premier programme tout en le
sauvegardant sur disquette à de multiples reprises.
Compiler votre programme.
Mettre au point votre programme et compiler de nouveau.
Exécuter votre programme.
Effectuer une dernière sauvegarde sur disquette.
Fermeture de la session.
(1) Les dossiers peuvent être imbriqués et former une hiérarchie.
(2) Ne pas utiliser d’accents ni les caractères spéciaux \ / : * ? " < > | pour un nom
de fichier ou un dossier. L’espace et le caractère de soulignement _ sont souvent utilisés.
Copies de sauvegarde de vos fichiers
Voici quelques règles à garder présentes à l’esprit lors de la création de copies
de sauvegarde sur une disquette ou une carte USB :
Sauvegardez souvent.

Pour éviter de passer plusieurs heures à refaire un travail.

Alternez les supports de sauvegarde.

Servez-vous de plusieurs disquettes de sauvegarde en alternance.

Ne sauvegardez que les fichiers source.

Ne pas sauvegarder le code machine car le compilateur peut générer de


nouveau très facilement ces fichiers.

Attention à la direction de sauvegarde.

Ne pas recouvrir un fichier plus récent par une version antérieure.


Description d’un programme simple
Fichier Premier programme.cpp
// Mon premier programme en C++.
#include <iostream.h>
void main()
{
cout << "C’est mon premier programme en C++." << endl;
}
C’est mon premier programme en C++.

Attention :
Vous devez saisir les majuscules et les minuscules exactement telles qu’elles
apparaissent.
Main, main et MAIN sont distincts l’un de l’autre.
C ou C++ ne tient pas compte de la présentation : espaces et sauts de lignes.
Ex.: Le programme précédent pourrait s’écrire en une seule ligne même
si ce n’est pas conseillé (attention à la mise en page : présenter un
programme de façon lisible) :
void main(){ cout << "C’est mon premier programme en C++." << endl;
Présentation de ce programme élémentaire
#include <iostream.h>
Inclure dans ce fichier le contenu du fichier iostream qui renferme la définition
d’outils permettant d’effectuer des opérations d’entrée/ sortie standards
(saisie au clavier et affichage à l’écran).
Note : C exige l’utilisation de bibliothèques de fonctions disponibles dans
leur forme précompilée (extension .LIB). Pour pouvoir les utiliser, il
faut inclure des fichiers en-tête (extension .h) dans nos programmes.

Après la compilation, le contenu des bibliothèques est ajouté à notre


programme pour former une version exécutable du programme.
void main()
{
cout << "C’est mon premier programme en C++." << endl;
}
Cela définit une fonction nommée main.
Une fonction est un ensemble d’instructions placées entre les accolades { }
effectuant une tâche particulière.
Tout programme C ou C++ possède une fonction main. Nous verrons plus tard
comment définir d’autres fonctions.
Présentation de ce programme élémentaire
cout << "C’est mon premier programme en C++." << endl;
Chaque instruction doit obligatoirement se terminer par un point-virgule.

cout permet d’afficher des données à l’écran selon les directives d’impression
spécifiées.

L’opérateur de sortie << permet de séparer des données et / ou des directives


d’impression entre elles.

"C’est mon premier programme en C++." désigne une chaîne de caractères à


afficher. Pour distinguer entre la fonction main et la chaîne main, on doit placer
dans ce dernier cas la suite de caractères entre guillemets "main".

endl permet de faire un saut de ligne à l’impression.

Cette instruction permet d’afficher à l’écran la chaîne


C’est mon premier programme en C++. puis, effectue un saut de ligne.
// Mon premier programme en C++.
Le symbole // signifie que le reste de la ligne est un commentaire.
Les commentaires servent à documenter les programmes et améliorer leur lisibilité.
Erreurs de compilation ou de syntaxe
Lorsque le compilateur rencontre une ou plusieurs erreurs, le programme n’est
pas traduit en langage machine. Il n’y a donc pas de programme à exécuter.

Corriger l’erreur et compiler à nouveau.

#include <iostream.h>
void main()
{
cot << "C’est mon premier programme en C++." << endl;
}

Vous allez obtenir plusieurs messages d’erreur à la compilation; le compilateur


n’a aucune idée de ce que vous entendez par cot.

Note : Si le compilateur détecte une erreur, il ne s’arrête pas immédiatement


et tente d’identifier autant d’erreurs que possible.

Il se peut que certaines erreurs subséquentes n’en soient pas; cela serait
dû à une mauvaise interprétation du compilateur.
Erreurs de compilation ou de syntaxe
#include <iostream.h>
void main()
{
cout << "C’est mon premier programme en C++." << endl
}

Le compilateur vous fournira probablement un seul message d’erreur plus précis.


Programme qui saisit 2 entiers et affiche leur somme.
/*
Ce programme lit 2 valeurs entières et affiche leur quotient.
Le deuxième entier doit être non nul.
*/
#include <iostream.h>
void main()
{
int entier1, entier2, quotient; // Déclaration.
cout << "Entrez le premier entier :" << endl;
cin >> entier1; // Lecture du 1e entier.
cout << "Entrez le deuxieme entier :" << endl;
cin >> entier2; // Lecture du 2ième entier.
quotient = entier1 / entier2;
cout << "Le quotient est :" << quotient << endl;
}
Entrez le premier entier :
63
Entrez le deuxieme entier :
21
Le quotient est :3
Analyse du programme.
/*
Ce programme lit 2 valeurs entières et affiche leur quotient.
Le deuxième entier doit être non nul.
*/
Lorsqu’un commentaire tient sur plusieurs lignes, le commentaire débute par /*
et se termine par */.

Note : Un commentaire n’appelle aucune action de la part de l’ordinateur et le


compilateur les ignore.

Il est interdit d’utiliser des commentaires imbriqués comme par exemple,

/* Ceci est /* évidemment */ défendu. */


void main()
{
// un ensemble de déclarations.
// un ensemble d’instructions.
}
void signifie que la fonction ne retourne aucune valeur à son environnement.
() signifie qu’il n’y a aucun paramètre à la fonction.
Analyse du programme.

int entier1, entier2, quotient; // Déclaration.

Il s’agit d’une déclaration où les mots entier1, entier2 et quotient sont des noms
de variable.

Une variable est un emplacement en mémoire où il est possible de stocker


une valeur pour un programme.

Cette déclaration spécifie que les variables entier1, entier2 et quotient sont des
données de type int, c’est-à-dire des variables qui retiendront des valeurs
d’entiers, comme les valeurs 3, 0, -5.
cin >> entier1; // Lecture du 1e entier.

Permet de saisir au clavier une valeur entière qui sera conservée dans la
variable entier1.
L’opérateur d’entrée >> permet de séparer les données à saisir et / ou des
directives de lecture entre elles. Ex. : cin >> x >> y;
Analyse du programme.
quotient = entier1 / entier2;

Il s’agit d’une instruction d’affectation qui calcule le quotient des variables entier1
et entier2, puis affecte le résultat à la variable quotient en utilisant l’opérateur
d’affectation =
cout << "Le quotient est :" << quotient << endl;
Affiche à l’écran la chaîne Le quotient est : suivie de la valeur entière de la
variable quotient suivie d’un saut de ligne.
Erreur d’exécution ou de logique
Une fois ce programme compilée, vous pouvez l’exécuter. Si vous entrez au clavier
comme 2ième valeur entière la valeur nulle, le programme terminera anormalement.

Si vous choisissez l’option Débogage, un message sera affiché indiquant que l’on
a tenté d’effectuer une division par zéro.

C’est une erreur d’exécution ou de logique.


Algorithmique : méthode de raffinement successif
Problème I: Imaginons un robot domestique à qui nous devons fournir un algorithme
lui permettant de préparer une tasse de café.

Une première version de l'algorithme pourrait être:


(1) faire bouillir de l'eau
(2) mettre le café dans la tasse
(3) ajouter l'eau dans la tasse.

Les étapes de cet algorithme ne sont probablement pas assez détaillées pour que
le robot puisse les interpréter.

Chaque étape doit donc être affinée en une suite d'étapes plus élémentaires,
chacune étant spécifiée d'une manière plus détaillée que dans la première version.

(1) faire bouillir l'eau peut être affinée en


(1.1) remplir la bouilloire d'eau
(1.2) brancher la bouilloire sur le secteur
(1.3) attendre l'ébullition
(1.4) débrancher la bouilloire
Algorithmique : méthode de raffinement successif
(2) mettre le café dans la tasse pourrait être affiné en
(2.1) ouvrir le pot à café
(2.2) prendre une cuiller à café
(2.3) plonger la cuiller dans le pot
(2.4) verser le contenu de la cuiller dans la tasse
(2.5) fermer le pot à café

(3) ajouter de l'eau dans la tasse pourrait être affiné en


(3.1) verser de l'eau dans la tasse jusqu'à ce que celle-ci soit pleine.

Certaines étapes étant encore trop complexes et sans doute incompréhensibles


pour notre robot, il faut les affiner davantage.

(1.1) remplir la bouilloire d'eau

(1.1.1) mettre la bouilloire sous le robinet


(1.1.2) ouvrir le robinet
(1.1.3) attendre que la bouilloire soit pleine
(1.1.4) fermer le robinet
Méthode de raffinement successif : degré de raffinement
Quand il procède à des raffinements des différentes étapes, le concepteur d'un
algorithme doit naturellement savoir où s'arrêter. Autrement dit, il doit savoir quand
une étape constitue une primitive adéquate au point de ne pas avoir besoin de
raffinement supplémentaire.

Cela signifie évidemment qu'il doit connaître quelle sorte d'étape le processeur
peut interpréter.
Exemple : Le concepteur de l'algorithme précédent doit savoir que le robot peut
interpréter "brancher la bouilloire" ce qui de ce fait n'exige pas de
raffinement, mais qu'en revanche, il ne peut pas interpréter "remplir la
bouilloire" et que dès lors un raffinement devient nécessaire.
Méthode de raffinement successif : problème II
Problème II : Impression d’une suite de nombres entiers.
Soit la suite G définie de la manière suivante :

G(0) = 1
G(1) = N où N est un entier positif,
G(2) = N + 2
G(i) = G(i-1) + N * G(i-2) + 3 G(i-3) i > 2.

À partir de chaque valeur lue pour N (au nombre de 3), faites imprimer les 21
premiers nombres de la suite G. Vous devez les faire imprimer en « escalier »,
c’est-à-dire que les nombres de la suite seront disposés de la façon suivante :

G(0)
G(1) G(2)
G(3) G(4) G(5)
G(6) ...

Il y aura donc 3 escaliers. 2 lignes vides devront séparer 2 escaliers consécutifs.


Méthode de raffinement successif : problème II
Problème II : Impression d’une suite de nombres entiers.

1. Répétez trois fois


1.1 { Lecture d’une valeur entière N. }
Lire une valeur entière et conserver cette valeur dans N.

1.2 { Calcul et affichage en « escalier » des 21 premiers nombres de G.

1.3 Répétez 2 fois l’opération qui consiste à faire un saut de ligne.

1.2 { Calcul et affichage en « escalier » des 21 premiers nombres de G.


Afficher la valeur de 1.
Faire un saut de ligne.
Pour chaque ligne i allant de 2 à 6
1.2.1 { Calcul et affichage de la iième ligne. }
1.2.2 Faire un saut de ligne.

1.2.1 { Calcul et affichage de la iième ligne. }


Pour chaque indice k allant de j=1,2,…, i-1 j à (j=1,2,…, i-1 j) + i - 1
1.2.1.1 { Calculer G(k) et conserver cette valeur dans Resultat. }
1.2.1.2 Afficher la valeur de Resultat suivie de 5 espaces.
Méthode de raffinement successif : problème II
Problème II : Impression d’une suite de nombres entiers.
1.2.1.1 {Calculer G(k) et conserver cette valeur dans Resultat. }
Si k est égale à 0 alors Resultat prend la valeur 1.
Si k est égale à 1 alors Resultat prend la valeur N.
Si k est égale à 2 alors Resultat prend la valeur N + 2.
Si k est plus grand que 2 alors
1.2.1.1.1 Conserver dans u, v et w les valeurs de 1, N et N+2 resp.
1.2.1.1.2 Pour chaque valeur de m allant de 3 à k
1.2.1.1.2.1 Conserver dans Resultat la valeur de w + N*v + 3*u.
1.2.1.1.2.2 Placer dans u la valeur de v.
1.2.1.1.2.3 Placer dans v la valeur de w.
1.2.1.1.2.4 Placer dans w la valeur de Resultat.

Y a-t-il une méthode plus efficace de calculer chaque élément de la suite G ?