Vous êtes sur la page 1sur 176

0

UNIVERSITE DE KINSHASA
FACULTE POLYTECHNIQUE

COURS D’INFORMATIQUE DE GESTION

Pr. E. KANGA MATONDO

ANNEE ACADEMIQUE 2015 – 2016

Objectifs du cours
1

1. Acquérir des connaissances relatives au management du système


d’information d’une entreprise (rôle, conception et gestion d’un système
d’information informatisé) ;

2. Amener les étudiants à s’intéresser à l’algorithmique et à la


programmation dans le contexte de gestion d’une entreprise ;

3. Apprendre aux étudiants à structurer les données (fichier, base de


données) ;

4. Apprendre aux étudiants à faire la modélisation pour répondre aux


besoins des utilisateurs et de la direction.

Chapitre 1.

Les caractéristiques de l’informatique de gestion

Depuis un certain temps, il est devenu usuel de parler d’informatique de


gestion en tant que discipline au même titre que le génie logiciel, la mécanique
rationnelle. Dans ce chapitre, nous tenterons de définir le plus clairement
possible la portée et le rôle de cette discipline.

L’informatique de gestion est une branche particulière de l’informatique


comme les sont l’informatique scientifique, l’informatique industrielle,
l’informatique médicale etc. Son objet principal est le traitement automatique
des données des organisations en vue de renforcer leur efficacité dans la prise
de décisions relatives aux activités de gestion.
2

Il ressort de ce qui précède que l’informatique de gestion est l’espace où la


gestion et l’informatique se rencontrent. Autrement dit, elle recouvre les
connaissances qui se trouvent à l’intersection des disciplines de l’informatique
et de la gestion. Et cette rencontre se passe plus précisément dans des
organisations.

Dès lors nous pouvons nous poser la question de savoir si dans cette discipline
particulière, c’est l’informatique qui prend le pas sur la gestion ou c’est
l’inverse.

En effet, la pratique sur le terrain prouve que la composante informatique et la


dimension gestion interagissent. Les exigences de gestion, par exemple,
déterminent comment l’on doit organiser les données ; comment doit-on
structurer et exploiter les fichiers clients, stock ou fournisseurs ; quel genre
d’états en sortie doit-on produire dans une application de facturation, de paie,
de gestion commerciale etc. Ainsi, pour bien faire de l’informatique de gestion,
il est nécessaire d’osciller entre le pôle de gestion et le pôle informatique.

En dépit de ce que nous venons de dire, nous devons nous comprendre sur un
point : En fait, dans la pratique professionnelle, nous observons que
l’informatique est au service de la gestion et non l’inverse. En d’autres mots,
l’informatique doit couler dans le sillon de la gestion et non l’inverse.

Naturellement, la subordination de l’informatique aux impératifs de gestion ne


signifie pas la préséance des gestionnaires sur les informaticiens. La
subordination de l’informatique aux impératifs de gestion implique que les
moyens informatiques doivent satisfaire pleinement et uniquement les besoins
des utilisateurs.

Avec l’informatique, les organisations ont vu leurs données être traitées


automatiquement et rapidement. Faut-il rappeler que le traitement
automatique implique que l’homme n’intervient pas entre le moment où
l’introduit les données (input) et le moment où l’obtient les résultats (output).
De plus, ce traitement se fait de manière systématique. Cela veut dire que
l’ordinateur n’est pas influencé par les événements extérieurs. Tant que le
programme à exécuter et les données à traiter n’ont pas subi une moindre
3

modification, nous obtiendrons les mêmes résultats dans le temps et dans


l’espace.

Le champ d’application de l’informatique de gestion est vaste et concerne les


informations qui entrent, circulent, et qui sont traitées, transmises et
conservées dans les organisations telles que les entreprises, l’administration
publique, les universités, les écoles, les partis politiques, les ONG etc.

L’informatique de gestion, au regard des transactions abondantes et variées


qui se font dans l’univers des affaires, est pratiquée par près de 75 %
d’informaticiens au monde.

Si hier dans la plupart des milieux professionnels, les gens avaient l’impression
que l’informatique, et plus particulièrement l’ordinateur, était quelque chose
de très mystérieux et accessible seulement aux personnes bien initiées dans ce
domaine, aujourd’hui avec le progrès électronique, notamment avec la
miniaturisation, l’informatique est à la portée de tout le monde qui fait l’effort
de comprendre le travail que l’ordinateur fait.

Ainsi, à titre d’exemple, on fait de l’informatique de gestion lorsqu’à l’aide d’un


logiciel approprié, on calcule les points des étudiants en vue d’une
délibération ; lorsque la SNEL et la Régideso prélèvent les indices de
consommation et facturent, au moyen de l’ordinateur, les abonnés ; lorsque
prenant appui sur des programmes spécialisés, les sociétés de téléphones tels
Airtel, Vodacom, Tigo et autres suivent la traçabilité et la durée des appels ;
lorsqu’un exploitant agricole fait avec son micro-ordinateur la comptabilité de
sa ferme.

Cela étant dit, qu’est ce qui caractérise maintenant l’informatique de gestion ?


Pour distinguer l’informatique de gestion des autres branches d’informatique,
certains auteurs tels que Aumiaux (1980) ont choisi de la comparer avec
l’informatique scientifique. Le schéma ci-après fait ressortir les caractéristiques
de l’informatique de gestion et celles de l’informatique scientifique.

a) En informatique de gestion

Entrée Traitement Sortie


4

En entrée, on enregistre des données abondantes et variées. Celles-ci se


présentent sous forme de fichiers. Nous avons, par exemple, le fichier clients,
stocks, fournisseurs, voyageurs, vente, comptes (plan comptable).

Dans le traitement, le programme quel que soit le langage utilisé (C++, pascal,
Vbasic) utilise des calculs peu complexes. Par exemple, pour calculer le salaire
d’un agent ou la facture d’un client, on a souvent recours aux opérations de
simples addition, soustraction, multiplication et division.

Salaire brut = base salariale x jours prestés


Montant = Quantité x prix unitaire

En sortie, on a souvent des résultats abondants en termes d’états financiers, de


gestion. La SNEL édite beaucoup d’états en sortie pour ses abonnés. Les
résultats sont libellés de façon simple. On ne recourt pas à l’annotation
scientifique. Quel désagrément pourra-t-on causer à un agent dont le bulletin
de paie indique qu’il a un salaire net de : 3 x 109 francs congolais.

b) En informatique scientifique

Entrée traitement Sortie

En entrée, les données sont peu nombreuses. On saisit juste les données du
problème à résoudre. Dans le traitement, on recourt aux calculs parfois très
complexes. En sortie, le résultat est souvent un condensé.
L’ingénieur civil se retrouve souvent dans le deuxième cas de figure, dans la
pratique de son métier.

En conclusion, l’informatique de gestion est au service de la gestion des


entreprises ; elle doit fournir les compétences et les moyens d’automatisation
des systèmes d’information informatisés (SII). Les compétences ont trait à
5

l’expression des besoins et à leur traduction en spécifications informatiques.


Les moyens sous-entendent l’utilisation des technologies de l’informatique et
nécessitent des compétences aussi diverses que la programmation, la
modélisation, les bases de données ou les réseaux. Donc, l’informatique de
gestion est une activité éminemment pluridisciplinaire qui doit être menée
avec méthode en recourant à de multiples compétences.

Chapitre 2.

L’entreprise comme champ d’application de l’informatique de gestion


6

2.1. Portraits de l’entreprise

En Rd-Congo, on parle de plus en plus des entreprises : elles sont à la mode et


font partie de l’univers des Congolais. N’est-ce pas que les étudiants y sont
intéressés pour des raisons de futur emploi ? Les médias relatent leurs
aventures heureuses ou malheureuses, en font des stars ou au contraire les
couvrent d’opprobre. « Il faut réformer les entreprises de l’Etat…Elles sont mal
gérées. » disent certaines télévisions. D’autres médias s’évertuent à vanter les
bilans reluisants des entreprises privées. Des chaînes de télévision se battent
parfois pour créer des émissions consacrées aux « Patrons ». Au regard de tout
cela, on peut se poser la question de savoir si l’entreprise a perdu son
mystère ?

Pour celui qui n’est pas en contact étroit avec elle, une entreprise c’est un
bâtiment, des machines, une enseigne, des produits, des salariés, un patron…
donc des éléments disparates. Or une entreprise c’est beaucoup plus que cela.
C’est une communauté humaine qui produit des richesses. Cette communauté
a une culture et une histoire : elle naît, se développe, connaît des échecs mais
aussi des réussites, elle surmonte des périodes critiques ou au contraire elle
cesse ses activités.

En observant les quelques entreprises congolaises, elles semblent toutes


différentes mais, en réalité, elles présentent beaucoup de points communs.
En établissant la typologie des entreprises, nous pouvons les distinguer selon
leur statut juridique, leur taille ou leur activité.

Selon la taille (chiffre d’affaire, nombre de salariés), nous avons les petites et
moyennes entreprises et les grandes entreprises ;
Selon le statut juridique, il y a des entreprises privées (entreprises
individuelles ; sociétés en nom collectif ; sociétés anonymes) et des entreprises
publiques et semi-publiques, donc mixtes).

Selon l’activité (secteur ou branche), nous distinguons les entreprises agricoles,


les entreprises industrielles, les entreprises prestataires de services, les
entreprises commerciales, etc.
7

2.2. Les ressources nécessaires à l’entreprise

Toute entreprise a besoin de ressources qu’elle se procure auprès de


nombreux partenaires et qui lui permettent de fonctionner. En d’autres
termes, elle dispose de moyens de production : ressources humaines,
financières et techniques. Elle doit fabriquer des biens ou des services qu’elle
vend à ses clients. Elle achète des biens et des services à ses fournisseurs.

2.3. L’entreprise est une unité de production et de répartition

L’activité d’une entreprise peut être décomposée en deux phases distinctes :

- l’activité productive, c’est-à-dire la création des biens ou services


- l’activité de redistribution des richesses en contrepartie des biens ou
services produits

a) L’entreprise produit des biens ou des services

Par l’opération de production, l’entreprise transforme des flux d’entrée


(intrants ou inputs) en flux de sortie (extrants ou outputs). Les intrants peuvent
être classés en 3 catégories, à savoir :

- le travail fourni par le personnel de l’entreprise ;


- le capital technique, c’est-à-dire les équipements (matériels, bâtiments,
etc.)
- les consommations intermédiaires, c’est-à-dire les biens (matières
premières, produits semi-finis, énergie etc.) et / ou les services (fournis
par une agence publicitaire, une société de transport) incorporés au
cours du processus de production. Elles correspondent à tous les achats
de l’entreprise à l’extérieur qu’il s’agisse de biens ou de services.

L’entreprise acquiert ses intrants en s’appuyant sur les 5 marchés des facteurs
de production

1. Réservoir de la population --- marché d’emploi --- entreprise


2. Réserve d’énergie et matières premières -- marché de l’énergie  Ese
8

et des matières premières


3. Réserve de capital -- marché des capitaux - entreprise
4. Réserve de savoir - marché de l’innovation  entreprise
5. Autres entreprises  marché des biens de production - entreprise

figure
9

b) L’entreprise, unité de répartition

La contrepartie de l’activité de production de l’entreprise s’exprime en unités


monétaires. Par exemple, la société « Ombe » a réalisé un chiffre d’affaires de
10 milliards de francs congolais. Il s’agit de la vente des biens ou services
(extrants) qui sont des flux physiques. L’entreprise reçoit en échange des flux
financiers (billets de banque, chèques, créances sur les clients).

Le produit de cette vente doit permettre à l’entreprise de :

- rémunérer les facteurs de production qu’elle a utilisés ;


- payer ses charges sociales et fiscales
- dégager un surplus destiné à assurer son avenir.

Après paiement des achats à ses fournisseurs, l’entreprise répartit la valeur


ajoutée entre plusieurs bénéficiaires:

- le personnel de l’entreprise est rémunéré par des salaires et des avantages


sociaux ;

- l’Etat, les communes et les organismes sociaux perçoivent des impôts et des
cotisations sociales (INSS).

- les prêteurs (organismes financiers ou particuliers) reçoivent des intérêts qui


rétribuent les capitaux qu’ils ont mis à la disposition de l’entreprise pour un
temps déterminé. Les intérêts versés sont proportionnels au montant des
capitaux empruntés ;

- le ou les propriétaires de l’entreprise prélèvent une partie des profits pour


rémunérer les capitaux qu’ils ont apportés définitivement à l’entreprise. La
partie non prélevée est conservée dans l’entreprise pour lui permettre de
renouveler son matériel et de financer sa croissance : il s’agit de
l’autofinancement.
10

2.4. Le cycle de vie d’une entreprise

L’entreprise est un organisme vivant. Comme l’être humain, elle semble avoir
un cycle de vie : elle naît par la volonté de ses créateurs, elle se développe et
arrive à maturité, puis voit parfois son activité décliner. Ce qui la conduit à
disparaître ou à être reprise par une autre entreprise. Mais ce cycle de vie est
théorique : certaines entreprises ne connaîtront pas de phase de maturité,
d’autres ne semblent jamais devoir mourir. La vie de l’entreprise dépend
fortement de la qualité des hommes qui la composent et de son adaptation à
son environnement.

2.4.1. La création d’entreprise

Toute création d’entreprise repose sur la mise en valeur d’une idée. A titre
d’exemple :

« Mata Mata a une passion pour le maïs. A l’en croire, il a créé son entreprise,
une minoterie, pour résoudre le problème d’approvisionnement de la ville de
Kinshasa en farine de maïs, suite à le pénurie de cette denrée alimentaire, en
décembre 2010. IL achète une étendue (100 hectares) pour cultiver le maïs, il
monte son usine. Comme toutes les idées simples, celle-ci marche. 20 millions
de francs congolais de chiffre d’affaires en 2011 pour un effectif de 10
personnes. »

2.4.2 Le développement de l’entreprise

La croissance de l’entreprise ne peut s’effectuer que si l’idée qui a favorisé son


démarrage s’est traduite en succès. Il faut ensuite que l’entreprise développe
son idée en élargissant le nombre de ses clients. Pour cela, il faut que la firme :

- augmente ses moyens de production par l’investissement ;


- s’adapte de façon continue aux besoins des clients actuels et potentiels ;
- modifie son organisation pour répondre au changement de sa taille
(augmentation de l’effectif, évolution du statut).
11

2.4.3. Le déclin

L’entreprise peut se trouver confrontée à des difficultés plus ou moins graves :

- mévente de ses produits : elle n’a pas réussi à imposer ses produits ou
elle ne les a pas renouvelés à temps ;

- mauvaise perception de l’évolution de son environnement ou perception


trop tardive : elle n’a pas pu ou su anticiper le changement des goûts des
consommateurs ou l’évolution des coûts (renchérissements du coût des
matières premières), elle subit les attaques de concurrents plus puissants
etc.

- erreur de gestion : les dirigeants de l’entreprise n’ont pas su évaluer


correctement leurs coûts : ils ont fixé des prix de vente ne permettant
pas de couvrir toutes les charges ; ils n’ont pas réussi à motiver le
personnel, ils n’ont pas maîtrisé les conséquences de l’introduction des
technologies de l’information et de communication (TIC). Notons que les
erreurs de gestion traduisent souvent l’incompétence du chef
d’entreprise.

- Insuffisance de ressources financières : les prêteurs (banquier, Etat, etc.)


ou les fournisseurs n’ont pas assez confiance dans l’avenir de la firme. Le
chef d’entreprise (entrepreneur individuel) par crainte de perdre la
maîtrise de son affaire, refuse d’y associer des partenaires extérieurs.

Si l’entreprise n’arrive pas à surmonter ses difficultés, alors elle est


contrainte :

- soit à faire faillite, cette faillite peut se traduire selon le cas par une
disparition totale ou par un nouveau départ sur des bases nouvelles ;

- soit à être rachetée par une autre entreprise.


12

2.5 L’entreprise, système ouvert sur l’environnement

a) L’entreprise et son environnement

L’entreprise est communauté humaine qui produit des richesses. Cette


communauté n’est pas isolée, elle entretient de multiples relations avec son
environnement, avec son personnel, ses fournisseurs, ses clients, ses
apporteurs de capitaux, ses concurrents, avec l’Etat. Ces relations sont plus
souvent harmonieuses mais elles peuvent aussi être conflictuelles.

L’entreprise est également un système, c’est-à-dire un ensemble d’éléments


liés logiquement entre eux et qui réagissent les uns sur les autres. Cet
ensemble est organisé de façon cohérente en fonction d’un but à atteindre. Ce
système ne vit pas en vase clos : il est ouvert et doit s’adapter en permanence à
son environnement.

b) Description de l’environnement

Une analyse classique permet de décomposer en sous-ensembles


l’environnement de l’entreprise. Chaque sous-ensemble est à la fois source
d’information mais aussi contrainte ou opportunité pour l’entreprise. Nous
pouvons distinguer :

- l’environnement économique : conjoncture générale, évolution des prix,


évolution des revenus, fiscalité, taux de change, concurrence etc.
- l’environnement juridique et réglementaire : lois, les normes de
fabrication, réglementation de la concurrence, protection des inventions,
etc.
- l’environnement culturel : styles de vie, niveau d’éducation, formes de
communication etc.
- l’environnement social : situation de l’emploi, climat social, répartition
des revenus, ampleur des conflits sociaux, fréquences de négociation etc.
- l’environnement politique : tendance à l’interventionnisme, personnalité
des gouvernants, programmes des partis politiques etc.
13

- l’environnement écologique : lutte contre la pollution.


- L’environnement international : réglementation de Sadec, Ceac etc.

c) L’entreprise en tant que système

- Qu’est ce qu’un système ?

Un système est un ensemble d’éléments liés logiquement entre eux, qui,


réunis, concourent à la réalisation d’un objectif commun.

- Les composantes d’un système sont en interrelation

Un système est composé d’éléments en interaction. Il ne s’agit pas d’une


simple juxtaposition d’éléments mais d’un ensemble organisé de façon
cohérente en fonction d’un but : le tout est différent de la somme des
composantes. Ainsi les composantes d’un ordinateur empilées les unes sur les
autres ne peuvent en aucun remplir les fonctions d’un ordinateur. Il faut les
assembler dans un certain ordre (mettre chaque élément à sa place) pour faire
fonctionner l’ordinateur. Dès lors, on passe d’un simple tas pièces à un
ordinateur.

- Notion de contrôle et de rétroaction

Un système transforme des intrants (inputs) en extrants (outputs). Par


exemple, l’ordinateur traite les données qui lui sont fournies en entrée, pour
obtenir en sortie des résultats. Un système n’existe pas si on ne lui a pas
assigné de but. Ainsi, la raison d’exister d’un ordinateur est le traitement
automatique des données.

La notion de système est inséparable de celle d’objectif et de rétroaction (feed


back). La rétroaction consiste à réguler le système. Elle permet de maintenir le
système en état de réaliser correctement son but.

2.6. L’entreprise et son organisation


14

- Les fonctions

Quelle que soit sa taille, son statut juridique, son secteur d’activité, l’entreprise
pour réaliser son objectif général, doit effectuer de multiples tâches.
Une fonction est un regroupement de tâches et non un regroupement
d’emplois : un même emploi peut donc assurer des tâches appartenant à des
fonctions différentes. Ainsi, par exemple, un fermier a la charge de la
production mais il est en plus gestionnaire et responsable du personnel.
Inversement une même fonction peut être remplie par plusieurs emplois : dans
une grande boulangerie, comme UPAK, plusieurs vendeuses assurent la
fonction commerciale.

- La classification de Henri Fayol

Pour H. Fayol, les fonctions de l’entreprise sont :

a) la fonction technique (production),


b) la fonction commerciale (« savoir acheter et vendre est aussi important
que savoir fabriquer »),
c) la fonction financière (recherche et gestion des capitaux),
d) la fonction de sécurité (protection des biens et des personnes),
e) la fonction de comptabilité (« elle doit donner sur la situation
économique de l’entreprise des renseignements exacts, clairs et précis »,
f) la fonction administrative (« administrer, c’est prévoir, organiser,
commander, coordonner et contrôler »).

Si H. Fayol a eu le premier, le mérite de mettre en évidence l’existence dans


l’entreprise de différentes fonctions, on peut lui reprocher d’avoir accorder
trop d’importance à la fonction comptable qui n’est qu’un aspect particulier du
contrôle et à la fonction sécurité.

- La classification de Evgrafoff

On peut classer les activités nécessaires à la vie de l’entreprise en 4 grandes


catégories.

a) Les fonctions de direction regroupent les activités dont le rôle est de


gouverner l’entreprise. Elles peuvent être analysées suivant six
composantes : s’informer, décider, faire comprendre, faire pouvoir, faire
15

vouloir. Les fonctions de direction ont essentiellement pour rôle de fixer


des buts à atteindre et des modalités d’action.

b) Les fonctions de distribution comprennent les activités dont le rôle est


de mettre à la disposition des clients, les biens ou les services produits
par l’entreprise. Il s’agit notamment des d’études commerciales, de
vente, de publicité.

c) Les fonctions de production concernent les activités dont le rôle est de


créer les produits (ou les services) que l’entreprise a choisi de mettre sur
le marché. Il s’agit entre autres des fonctions de fabrication et de
contrôle de qualité.

d) Les fonctions logistiques correspondent aux activités dont le rôle est de


mettre à la disposition de l’entreprise tous les moyens nécessaires. Ces
fonctions se décomposent en fonction d’approvisionnement, fonction
d’équipement, fonction de maintenance, fonction de gestion du
personnel, fonction financière, fonction de recherche et de
développement, fonction d’administration générale.

L’analyse de B. Evgrafoff (1970) est plus moderne. Elle traduit les mutations de
l’environnement de l’entreprise. Cependant certaines des fonctions qu’il
propose sont souvent des fonctions annexes, voire services. Alors qu’une
fonction est un regroupement de tâches, un service est un regroupement
d’hommes placés sous une même autorité.

De l’analyse de l’entreprise en termes de fonctions, que devons-nous retenir in


fine ?

Il apparaît qu’il existe des fonctions qui doivent de toute façon être assurées pour que
l’entreprise puisse jouer son rôle ou simplement exister. Il s’agit de :
16

Fonctions objet et finalité


__________________________________________________________________
la fonction commerciale, vendre les produits finis ou
________________________________________________________________
La fonction de production, transformer la matière
première
________________________________________________________________
la fonction d’approvisionnement, acheter et approvisionner
________________________________________________________________
la fonction financière, gérer la trésorerie et les
moyens financiers
________________________________________________________________
la fonction administrative, prévoir, administrer, contrôler
et coordonner
________________________________________________________________
la fonction du personnel, gérer le personnel

- L’entreprise et ses systèmes

N’importe lequel de ses éléments peut avoir une influence sur l’entreprise : la
réclamation d’un client, la maladie d’un salarié, la hausse du prix des matières
premières, la panne d’une machine, un défaut de qualité chez un concurrent,
par exemple, ont des répercussions sur la bonne marche de l’entreprise.

- L’entreprise est un système ouvert : comme dit précédemment, elle se


procure à l’extérieur les matières premières qui vont lui permettre de fabriquer
puis de vendre des produits qu’elle met à la disposition de son environnement.
Ses différentes opérations la conduisent à s’adapter en permanence à son
environnement.

- L’entreprise est un système ouvert finalisé et dirigé. Elle poursuit des


buts (profit, puissance, pérennité etc.), s’organise pour les atteindre
(définition de plans d’action, de budgets…), se dote de structures
d’exécution, de direction et de contrôle.
17

- L’entreprise est un ensemble de sous-systèmes en interaction. En


relation avec ce qu’on vu plus haut, les différentes fonctions sont des
sous-systèmes : un sous-système de production, un sous-système
commercial, un sous-système financier, un sous-système
approvisionnement, un sous-système administratif, etc. Chaque sous-
système entretient des relations suivies avec les autres sous-systèmes.
Ainsi, le sous-système commercial vend ce que le sous-système
production a fabriqué grâce aux capitaux fournis par le sous-système
financier et aux services rendus par le sous-système du personnel.

2.7. L’organigramme, représentation schématique de la structure de


l’entreprise

L’organigramme représente sur un seul support soit l’organisation globale de


l’entreprise, soit une organisation détaillée d’une unité. L’organigramme
montre la place de chaque fonction et par extension la place de’ chacun dans
l’entreprise. Il convient de signaler que l’organigramme, aussi précis qu’il soit,
ne rend pas toujours complètement compte de la réalité exacte du pouvoir
dans l’entreprise. Celle-ci, étant un organisme vivant, est traversée par des
courants d’influence, des rapports de force, des jeux de sympathie qui ont aussi
leur rôle et qui doivent également être pris en compte si l’on veut comprendre
exactement ce qui s’y passe.

- L’organigramme selon C. Parkinson et L. Peter

Cyril Parkinson (Professeur de sciences politiques) et Laurence Peter


(Professeur de sciences de l’éducation) ont critiqué avec humour le
fonctionnement des entreprises.

1. Loi de Parkinson

Parkinson soutient l’idée qu’il y a très peu de relation entre la quantité de


travail effectué dans une organisation et le nombre d’employés. Pour expliquer
ce phénomène, il propose une explication sous forme de loi, la loi de parkinson

«Tout travail tend à se dilater pour remplir tout le temps disponible. » (…)
Aussi ne doit-on pas s’étonner de ce que les responsables administratifs se
18

trouvent eux-mêmes surchargés. Parkinson pense que ces responsables


réagissent alors en engageant plus de personnel selon l’axiome « tout
responsable souhaite multiplier ses subordonnés et non ses rivaux ». Au lieu
de partager son travail avec un collègue B, le responsable A nommera des
subordonnés C et D. De cette façon, A préserve sa position en étant le seul
comprenant l’ensemble du travail. Puis quand C se plaint de trop de travail, A
préserve l’équité en accordant à C 2 subordonnés E et F, et aussi à D 2 autres
subordonnés G et H. Avec un tel personnel, la promotion de A est presque
certaine. Comme entre en jeu un deuxième axiome « les responsables se
donnent mutuellement du travail », 7 personnes font maintenant le travail
d’une seule mais la routine des projets, comptes rendus, rapports, fait que
tous travaillent beaucoup et que A travaille plus dur que jamais.

2. Le principe de Peter

Le principe de Peter, établi après l’étude de centaines de cas d’incompétence


dans les organisations tant privées que publiques, peut être ainsi formulé :

« Dans une hiérarchie, un employé tend à s’élever à son niveau


d’incompétence ». Son principe suppose une recherche constante de
meilleures performances : les gens compétents dans leur travail sont promus
pour qu’ils fassent mieux encore. La compétence dans une position est
nécessaire pour une promotion dans la suivante et ainsi de suite jusqu’à une
position où l’individu est dépassé ; alors il ne peut plus espérer une nouvelle
promotion et c’est son niveau d’incompétence. Etant donné deux conditions,
suffisamment d’échelons dans la hiérarchie et suffisamment de temps pour
les franchir, tous les employés s’élèvent et se tiennent à leur niveau
d’incompétence. D’où le corollaire du principe de Peter : « avec le temps,
chaque poste tend à être occupé par un incompétent ».
19

Chapitre 3

LE SYSTEME D’INFORMATION

2.1. l’objet d’un système d’information

Nous avons vu que l’informatique de gestion automatise le traitement de


l’information des entreprises. Si les termes d’information et d’entreprise sont
relativement clairs et connus de nous tous, il est certainement plu difficile
d’exprimer le lien existant entre eux.

Par système d’information, nous considérons à la fois les informations (au


sens le plus large du mot) utilisées par l’entreprise et l’ensemble des moyens
mis en œuvre pour gérer ces informations.

Il ressort de cette définition que le système d’information est l’ensemble


des moyens humains et matériels, et des méthodes se rapportant au
traitement des différentes formes d’information rencontrées dans l’entreprise.

Explicitons un peu quelques termes de cette définition

 moyens humains : il s’agit des différentes personnes qui manipulent,


émettent ou transmettent de l’information utile à l’entreprise. A part
quelques cas particuliers, quasiment tous les individus d’une
organisation appartenant à son système d’information.
 Moyens matériels : on trouve principalement :

 Les machines telles que ordinateur, machine à calculer, à écrire ;


 Les supports de l’information : papier, fiches cartonnées, bande
magnétique, Cd-rom ;
 Des utilitaires divers : classeurs téléphone bureaux, armoires de
rangement.

 Méthodes :

On peut trouver :
20

 Des algorithmes, logiciels, des programmes ;


 Des modèles mathématiques, statistiques, graphes, probabilités ;
 Des modèles comptables (comptabilité générale ou
analytique…) ;
 Des modèles de la recherche opérationnelle : perte, files
d’attente…

2.2. le rôle du système d’information

Le rôle du SI est double :

a. satisfaire les besoins informationnels de l’entreprise

Il s’agit notamment de :

 produire des informations légales ou quasi-légales réclamées par


l’environnement socio-économique : les factures, les bulletins de
paie, les cotisations INS, DGRAD, DGI, etc.
 déclencher les décisions programmées

Ex : émission d’un ordre d’approvisionnement lorsqu’un stock atteint


son point de commande ; envoi d’une lettre de relance aux clients
dont le règlement n’est pas intervenu n jours après l’envoi de la
facture.
 Aider à la prise des décisions non programmées en fournissant aux
décideurs de l’organisation, un ensemble d’information brutes ou
modélisées (statistiques, tableaux de bord, simulation, etc.)

b. favoriser la communication

Il s’agit plus exactement d’assurer la coordination des tâches en permettant


les communications entre les individus dans l’entreprise.

Mais quels sont les besoins informationnels de l’entreprise à satisfaire ?


Répondons à cette question en distinguant les besoins selon leur nature et leur
évolution.
21

- Nature des besoins

Les besoins en information d’une entreprise sont variés.


Ainsi, pour une même opération (traitement de commande, décision d’achat
d’un nouveau matériel, etc.) des informations de nature différente sont
souvent nécessaires.

Généralement, on distingue les types d’informations suivants :

 l’information technique : elle concerne plus particulièrement les


machines, les ordinateurs, le matériel de bureau, mais aussi
l’innovation technologique.

 L’information comptable et financière : elle porte essentiellement sur


les documents tels que les factures, les écritures comptables, le bilan,
le compte de résultat, etc.

 L’information juridique : elle a trait à différents domaines tels que la


législation sociale, le droit fiscal, le droit commercial.

 L’information mercatique : elle a pour but de mieux connaître la


clientèle, la concurrence, la distribution, afin de mieux répondre aux
besoins des consommateurs et d’adopter une politique commerciale
plus efficace.

 L’information humaine et sociale : elles renseignent l’entreprise sur les


caractéristiques du personnel (nom, adresse, numéro IN SS, grade,
profil psychologique,…), ses besoins. Elles concernent non seulement
le travail mais aussi la vie sociale et familiale (situation familiale,
nombre d’enfants).

 L’information culturelle et politique : elle a trait aux activités sportives


artistiques. L’information politique renseigne sur les risques
d’implantation dans un pays politiquement instable.

 L’information économique : elle renseigne sur les tarifs des


fournisseurs, des concurrents, les taux d’inflation, de change.
22

- Evolution des besoins

Le système d’information devient de plus en plus sophistiqué du fait de la


complexification des besoins.

 Informations spécialisées

Les utilisateurs ont besoin d’informations de plus en plus fines, spécialisées


en fonction de leurs centres d’intérêts. Cette information doit être
personnalisée pour la rendre le plus directement utilisable par l’intéressé et
mieux adaptée à ses besoins.

 Emergences de besoins transversaux

Il s’agit de développement d’informations pluridisciplinaires. En effet, au-


delà des informations spécialisées liées à la fonction de l’utilisateur (un
vendeur a besoin en priorité d’informations commerciales), celui-ci fait de
plus en plus appel à des informations rattachées à d’autres domaines (les
vendeurs recherchent de plus en plus des informations culturelles,
juridiques).

Quelles sont les sources d’informations ?

Dans l’entreprise, on perd du temps, on commet des erreurs, on fait des redits
et un travail inutile du fait qu’on ignore si l’information nécessaire existe et où
il est possible de se le procurer.
C’est pourquoi pour répondre aux besoins informationnels, l’entreprise doit
connaître les différentes sources d’informations possibles et utiles. Il y a des
sources d’informations internes.
Nous pouvons citer :

 Les documents comptables (journal, bilan, grand livre)


 Les documents commerciaux (bon de commande, facture, cheque)
 Les rapports des délégués commerciaux
 Les compétences et les opinions personnelles

Il y a aussi des sources externes. Elles sont nombreuses. La difficulté réside


dans le choix des sources à partir des critères tels que la qualité de
l’information, son coût, le délai pour l’obtenir :
23

Exemple des sources externes : Banque du Congo, INS

Organisation et élaboration d’un système d’information

L’analyse d’un circuit d’information nous permet de mieux comprendre la


fonction d’un système d’information. Mais celui-ci, en raison notamment de
l’évolution technologique et de l’importance grandissante de l’information est
passé du simple traitement des données à un rôle de management de
l’information

A. Les composantes d’un circuit d’information

Dans un système d’information, les flux informationnels empruntent différents


circuits. C’est pourquoi, l’organisation de ces circuits ainsi que la qualité des
moyens de transmission utilisés sont essentiels pour assurer une bonne
circulation de l’information.
L’information pour être utilisable doit être saisie, collecte, traitée, transmise
puis stockée.

1. les circuits d’information

Avant de faire l’organisation des circuits d’information, il faut bien


comprendre que ceux-ci peuvent avoir été définis clairement, de façon
formelle, ou bien exister de façon informelle.

L’ensemble des circuits d’information d’une entreprise constitue un réseau.


Le réseau formel correspond à l’information fonctionnelle (l’information
technique et de gestion) alors que le réseau informel est généralement
mieux adapté aux informations de relations humaines.

1.1. le réseau formel

Le réseau formel est le réseau officiel de l’information conformément à la


structure hiérarchique et fonctionnelle de l’entreprise. Le réseau formel
24

peut être représenté par un organigramme par des graphes, par des
diagrammes de circulation de l’information.
Au sein d’un système hiérarchisé, on peut distinguer 3 types d’informations
entre subordonnés et supérieurs hiérarchiques :

 l’information descendante : émise par le supérieur vers le


subordonné. Ex : un chef de service peut dire a son secrétaire
« préparez de document relatif au paiement des agents ».
 information ascendante : émise par le subordonné vers le supérieur.
Elle permet au supérieur de joué d’une part le rôle de régulateur en
vérifiant si les directives ont été correctement suivies, puis d’agir en
conséquence, et, d’autre part, un rôle de récepteur en recueillant des
idées, des suggestions, des informations nouvelles issues de la base.
 Information latérale : transmise entre émetteur et un récepteur de
même niveau hiérarchique.

1. 2. Le réseau informel

Le réseau informel est le réseau non officiel de l’information. Celui-ci peut


véhiculer des informations utiles, de façon non hiérarchique, jouant alors un
rôle régulateur. Mais il peut également véhiculer des informations parasites
nuisibles pour l’entreprise.
Le réseau informel peut avoir :

- un rôle régulateur quand il supplée de façon correcte au réseau formel


inefficace ;
- un rôle révélateur lorsque la communication dans le cadre du réseau
informel peut permettre de détecter des difficultés, des problèmes, mais
aussi des satisfactions, des idées novatrices que ne décèle pas toujours le
réseau formel ;
- un rôle parasite lorsqu’il perturbe le bon fonctionnement de l’entreprise
(rumeurs, informations confidentielles diffusées). La cause en est
souvent la rétention d’informations.
25

Les problèmes du système d’information dans les entreprises

Depuis les premières heures de l’informatique, le système d’information de


l’entreprise est en crise. Depuis son apparition, la technologie de l’information
se révèle difficile à maîtriser. Le génie logiciel est apparu progressivement
comme une solution aux problèmes vécus par les entreprises. Mais quels sont
ces problèmes ?

Le premier souci des dirigeants d’entreprise, c’est l’information. Pourquoi ?


Tout simplement parce que le système d’information pose problème. La
plupart des entreprises émettent un jugement favorable sur la qualité de leurs
ressources humaines ou sur la performance de leurs moyens de production ;
pratiquement rares sont celles qui sont satisfaites de leu système
d’information. En voici quelques raisons :

1. L’incapacité à évoluer

L’entreprise performante est en situation de mutation permanente. Seules les


entreprises qui sauront apprivoiser le chaos pour en faire un principe de
management pourront à l’avenir gagner. Pour apprivoiser le chaos et en faire
une contrainte permanente pour la concurrence, il faut une culture
d’entreprise très forte et un système d’information d’une très grande qualité,
capable d’intégrer le changement comme simplement une donnée nouvelle.
Peu d’entreprise disposent d’un tel système. Le système d’information ne
devrait jamais être un obstacle pour saisir des opportunités. Donc, il faut un
système d’information qui est capable d’intégrer des changements et
d’évoluer. En d’autres mots, la valeur intrinsèque d’un système d’information
résultera plus de son aptitude à évoluer rapidement que de la masse
d’instructions écrites en java, C ou VBasic.

2. Le manque de stratégie

La technologie de l’information a désormais droit de cité dans la stratégie


d’entreprise. L’information n’est plus seulement considérée comme une
ressource opérationnelle, mais de plus en plus comme une ressource
stratégique : le système d’information devient un facteur de différenciation par
rapport à la concurrence. Le destin de milliers d’entreprises est suspendu à leur
capacité à utiliser l’information comme une ressource stratégique. De sorte
que le risque, pour beaucoup d’entreprises, est de ne pas dépenser assez dans
l’utilisation stratégique de leur système d’information.
26

3. Incapacité à alimenter le pilotage

Le monde économique devient complexe. Les forces concurrentielles évoluent


très rapidement et sont en perpétuelle interaction. La nécessité pour les
dirigeants d’entreprises de disposer d’une information pertinente, précise,
fiable et disponible à temps se pose aujourd’hui avec acuité.
Le défi que doit relever un système d’information efficace est de fournir la
bonne information à la bonne personne au bon moment. Peu d’entreprises
disposent aujourd’hui d’un tel système d’information.

Il règne souvent, parmi les cadres supérieurs, un sentiment de malaise dû au


fait que, malgré des coûts informatiques importants, il leur est impossible
d’obtenir l’information dont ils ont besoin. Cette impossibilité du système
d’information à alimenter l’action des dirigeants contrarie parfois leur carrière
personnelle. Elle affecte, dans tous les cas, la performance de l’entreprise.

La conséquence est que beaucoup de décisions d’ordre stratégique,


susceptibles d’être appuyées de façon pertinente par l’informatique, sont
prises de façon empirique ou irrationnelle faute d’information adéquate. Si on
devrait chiffrer les pertes économiques générées par de telles décisions, on se
rendra bien compte de l’étendue de la catastrophe.

Qui n’a pas en tête le cas d’un dirigeant incapable d’obtenir dans le délai
raisonnable, malgré un système informatique aussi important que coûteux, les
indicateurs d’activité de son entreprise qui lui permettraient de corriger une
démarche mal conçue.

4. La pyramide de Maslow

La pyramide d’Abraham Maslow (psychologue américain) nous indique qu’il ne


sert à rien de vouloir satisfaire les besoins nobles d’un individu (besoins
spirituels, intellectuels, etc.) tant que ses besoins d’ordre physiologique ne sont
pas satisfaits. De même, en matière de système d’information, il est vain de
vouloir satisfaire le pilotage tant que l’opérationnel n’est pas opérationnel. En
effet, les besoins en informations de pilotage résultent pour l’essentiel de
l’agrégation d’informations du système opérationnel. Le système d’information
de pilotage repose sur le système d’information opérationnel de même que les
besoins intellectuels d’un individu reposent sur une physiologie assumée : une
âme saine dans un corps sain. Une hiérarchie doit être instaurée dans la
27

satisfaction des besoins, y compris pour le système d’information. Ce précepte


de base est trop souvent oublié.

5. Mieux vaut attendre que le plaisir

Malgré leur bonne volonté et malgré l’énergie déployée, les départements


informatiques se trouvent confrontés à l’impossibilité de répondre dans un
délai raisonnable aux besoins sans cesse croissants des utilisateurs. Ces
derniers mettent en place, sous la pression du marché, des solutions
autonomes à base de
Micro-informatique qui ne font bien souvent qu’aggraver l’incohérence et la
lourdeur du système d’information pour un coût global toujours supérieur au
coût apparent. Il est, en effet, constant d’observer dans les entreprises que des
cadres supérieurs investissent le plus clair de leur temps à développer des
applications sur micro-ordinateurs sans professionnalisme au détriment de
l’exercice de leur véritable métier. En plus du fait que ces expériences
n’aboutissent pas toujours, elles conduisent la plupart du temps à l’obtention
d’un système jetable car non documenté ou non réalisé dans les règles de l’art.
Les utilisateurs devraient être convaincus que, plutôt que de construire des
systèmes bourgeonnant, il est urgent d’attendre que les techniques d’analyse
soient mises en œuvre au sein de l’entreprise.

6. La surpuissance du matériel

Les matériels sont de plus en plus puissants. De nombreux micro-ordinateurs


disposent actuellement d’une mémoire centrale de plus 1 giga-octets et de
plusieurs giga-octets su disque dur. Des machines très puissantes verront le
jour et elles mettront à la disposition des entreprises une puissance de
traitement jusqu’à maintenant inégalée pour un coût très inférieur au coût
d’un mini-ordinateur actuellement. Tous ces avantages sont les fruits du
progrès électronique. Cependant la plupart des entreprises ne tirent pas le
meilleur parti d’énormes possibilités qu’offre aujourd’hui la technologie
informatique. L’aptitude à développer des systèmes d’information n’a pas
évolué au même rythme que celui de la puissance des équipements matériels.

7. La maintenance

L’essentiel des forces vives des départements informatiques consacre


aujourd’hui le plus clair de son temps à des tâches de maintenance pour
aménager ce qui existe. Dans beaucoup d’entreprises, il est assez curieux de
28

constater que la charge de maintenance représente 80 % des efforts de


développement, ne laissant que 20 % d’allocation pour les nouveaux projets.
Donc trop d’efforts sont déployés dans les tâches de maintenance et trop peu
de forces sont consacrées aux nouveaux projets porteurs d’espoirs dans
l’entreprise. Les idées nouvelles sont ainsi étouffées par la charge que
représente la maintenance.

8. L’inexistence de dialogue

Les départements informatiques sont complètement absorbés par les tâches


fastidieuses de maintenance qu’ils réalisent ; ce qui ne le prédispose que
faiblement à s’ouvrir sur l’extérieur. Conséquence, l’informatique se replie sur
elle-même. Rien ne prédispose au dialogue les informaticiens et les
utilisateurs : absence de langage commun. Cet état des choses a dans
l’entreprise des conséquences catastrophiques.

9. Documentation insuffisante

Bien souvent les systèmes développés ne font l’objet que de très peu de
documentation, voire aucune dans certains cas extrêmes. Il est rare que les
applications soient exhaustivement documentées en termes de spécifications
fonctionnelles, spécifications techniques, spécifications de réalisation, et
manuel d’utilisation. Or un logiciel, qui est par nature un objet immatériel, n’a
de valeur et d’intérêt que par les documents qui permettent de comprendre :

a) son mode d’emploi, afin de l’utiliser correctement ;


b) sa logique de fonctionnement et les options prises dans sa conception, pour
le faire évoluer ou, plus simplement, pour corriger un défaut constaté.

L’insuffisance de documentation technique est un défaut dont les


conséquences touchent en premier à la pérennité du logiciel développé et, bien
souvent, en second lieu à la pérennité de l’entreprise.

L’insuffisance de documentation d’utilisation est très souvent à l’origine des


erreurs de manipulation u système informatique dont les conséquences sont
catastrophiques lorsque le système a, de surcroît, été conçu sans toutes les
sécurités nécessaires. A l’instar de la documentation, la formation des
utilisateurs est très souvent insuffisante pour leur permettre de tirer le meilleur
parti du système qui est mis entre leurs mains.
29

10. Projet sans issue

Beaucoup d’entreprises se lancent dans des projets importants de


développement de système d’information sans véritable méthode de
développement et sans véritablement se doter d’une conduite de projet.
Conséquence, ces projets échouent immanquablement.

Vers une nouvelle approche du système d’information

L’évolution de la place de l’information dans l’entreprise

L’information est un symbole qui a une signification pour les acteurs de


l’entreprise. Elle peut se transformer en connaissance utile à
l’accomplissement de leur travail. Cette fonction est particulièrement
importante quand les tâches sont divisées entre plusieurs personnes ou
étalées dans le temps. Traditionnellement, on observe trois rôles joués par
l’information.

a. L’information est un support pour l’action.

Elle fournit des éléments pour effectuer les missions assignées. Par exemple,
les informations tarifaires permettent d’établir la facturation. De même, les
informations du catalogue facilitent la vente.

b. L’information conserve une trace des activités

Elle renseigne sur les actions accomplies par soi-même ou par d’autres. La
tenue d’une comptabilité en est le meilleur exemple.

c. L’information apporte une aide à la prise de décision

Elle réduit l’incertitude quand il faut décider. Par exemple, les ventes récentes
par catégories de produit apportent un élément pour ajuster les tarifs.
30

Actuellement, les technologies de l’information et de communication ont


amplifié et étendu le rôle de l’information dans l’entreprise. Elles offrent, en
effet, des possibilités de mémorisation, de traitement automatique, et de
diffusion qui ouvrent de nouveaux horizons. Ce phénomène est
particulièrement perceptible dans trois courants qui influent sur la gestion des
entreprises : la dématérialisation des objets de gestion, l’exigence de qualité et
la recherche continue d’innovation.

1. La dématérialisation des objets de gestion

De nombreux objets de gestion ne sont plus aujourd’hui concrétisés par les


objets physiques : leur existence est liée à la naissance et au cycle de vue
d’informations qui les caractérisent. Par exemple, les valeurs mobilières, même
les plus classiques telles les actions et les obligations, n’ont plus d’existence
matérielle. Leur propriété n’est plus assurée par la détention d’un certificat,
mais par une inscription dans la comptabilité de la banque dépositaire d’une
ligne au compte client. Ce sont les écritures qui font foi et non un papier détenu
par le propriétaire.

Ici l’information n’est plus simplement un reflet ou une trace : elle est elle-
même un objet de gestion. Les technologies de l’information assurent sa
mémorisation et s transformation.

2. L’exigence de qualité

Sous la pression de la concurrence, un nombre croissant d’entreprises, à travers


le monde, se préoccupent non seulement de la qualité de leurs produits, mais
aussi de celle de leurs processus. Pour améliorer la qualité de leur
fonctionnement, les entreprises doivent notamment identifier et maîtriser les
informations qui rendent compte du déroulement de leurs processus.

Par exemple, la norme ISO 9000 a imposé d’avoir un dispositif garantissant la


maîtrise des documents utilisés dans l’entreprise : documents de travail,
documents techniques, documents de gestion, etc. Les acteurs doivent pouvoir
disposer en temps voulu des documents qui leur sont nécessaires. Il faut pour
cela mettre en place des procédures d’approbation, de diffusion et de
remplacement des documents, ce qui entraîne une gestion d’informations pour
chaque document.
31

L’entreprise est donc conduite à gérer des informations supplémentaires pour


améliorer la qualité de sa gestion. Les technologies de l’information,
notamment celles de l’intranet, facilitent la mémorisation, l’actualisation et la
diffusion de ce type d’information.

3. La recherche continue d’innovation

Pour se développer ou parfois pour survivre, les entreprises sont condamnées à


entrer dans un cycle continu d’amélioration et d’innovation. Les technologies de
l’information sont aujourd’hui un des moyens de développer de nouveaux
produits et/ou services pour le client. Les services en ligne offerts par certaines
banques au Congo sont un bon exemple. Le développement de l’Internet et du
commerce électronique conduit certaines entreprises à développer des offres
particulières pour ce nouveau circuit de distribution.

Ces innovations placent l’information au cœur de l’activité. L’extension de la


place de l’information dans l’entreprise conduit à faire évoluer la notion de
système d’information.

Le système d’information dans l’entreprise : vers une nouvelle définition

L’approche classique considère que toute organisation peut être vue comme un
système, lui-même décomposé en 3 sous-systèmes en interaction : le système
opérant, le système d’information et le système de pilotage.

Le système opérant peut être assimilé au monde réel : il représente l’activité


productive. Le système de pilotage correspond à l’activité de management. Le
système d’information est une mémoire, un réservoir d’informations entre le
système de pilotage et le système opérant.

Quand l’organisation fonctionne, le système opérant alimente le système


d’information avec les informations concernant les activités effectuées. Par
exemple, les détails d’une vente réalisée. Inversement, le système opérant a
parfois besoin d’informations qu’il va puiser dans le sous-système
d’information. Par exemple, un taux de remise autorisé.

De leur côté, les managers s’appuient sur des informations mémorisées. Par
exemple, l’évolution des ventes, par produit et par secteur, sur les 3 derniers
mois. Certaines de leurs décisions peuvent modifier des éléments du sous-
système d’information. Par exemple, la modification des prix de vente pour
32

certains produits. Elles peuvent également avoir des conséquences sur le


système opérant. Par exemple, la modification du réseau de vente.

Système de pilotage

Système d’information

Entrée sortie

Système opérant

Selon cette approche, le système d’information est considéré comme une image
une représentation du monde réel. Cette vue classique du système
d’information est principalement orientée vers la construction d’une base de
données centrale, gérant des informations de référence. De nos jours, compte
tenu de l’évolution de la place de l’information dans l’entreprise, on besoin
d’une autre vue.

Ainsi, certaines activités de l’entreprise se confondent avec leur représentation


sous forme d’information. Par exemple, l’émission d’un ordre de prélèvement
selon les modalités de remboursement définies dans le contrat de crédit : la
création de l’information n’est pas l’image de l’activité, mais l’activité elle-
même.
33

En définitive, dans une vision systémique, l’information des entreprises est le


résultat de l’activité du système d’information des entreprises. En fait, le
système d’information décrit, mémorise et capte l’ensemble des événements
et des transformations caractéristiques à la fois du système de pilotage et du
système opérant.

Le système d’information informatisée (SII) et le système d’information non


automatisé.

Le système d’information peut être découpé en deux parties ou sous-systèmes


distincts, à savoir le sous-système d’information informel et le sous-système
d’information formalisé.

Les informations informelles sont celles dont l’entreprise n’a défini ni la forme,
ni le fond. Par exemple, les informations échangées entre les collaborateurs
lors de pause-café. Notons que ce genre d’informations peut être traité traitée
au moyen des outils informatiques de l’entreprise : internet, intranet.
L’informatique mise en œuvre pour le traitement des informations informelles
ne peut donc pas être qualifiée de gestion car elle n’automatise pas
l’administration des intérêts ou les affaires de l’entreprise.

Les informations formelles sont celles dont l’entreprise a défini la forme, voire
le fond, et dont elle a besoin pour garantir un fonctionnement correct de ses
activités opérationnelles et de pilotage.

Cette précision apportée, venons-en maintenant au système d’information


formalisé. S’intéressant aux informations formelles, le système d’information
formalisé peut être découpé en deux parties que sont le sous-système
d’information non automatisé et le sous-système d’information automatisé.

Le système d’information non automatisé résulte du traitement de données


effectué par un humain ; naturellement, les moyens informatiques peuvent
être utilisés mais, il est de la responsabilité de l’homme d’assurer le couplage
entre les données qu’il utilise et les traitements qu’il leur applique.

Le système d’information informatisé offre un traitement de données


automatisé par des programmes informatiques ; l’essentiel de l’automatisme
consiste à établir un couplage transparent pour les utilisateurs entre les
traitements informatiques d’une part et les données utilisées d’autre part. Ce
34

couplage entre les données et les multiples traitements informatiques qui les
utilisent nécessite une structuration rigoureuse des données.

Illustrons notre propos par un exemple. Admettons qu’à l’issue d’une réunion
un procès-verbal soit produit : Dans le cadre d’un système d’information non
automatisé, le secrétaire utilisera un outil bureautique qui lui permettra de
respecter la forme mais il lui reviendra d’intégrer le contenu sur base de ses
compétences en bureautique.

Dans le cadre d’un système d’information automatisé ou SII, le secrétaire


disposera d’un programme qui lui demandera de saisir les différentes données
utiles et nécessaires (dates, participants, sujet, décision) et le processus de
traitement manipulera les données pour fournir le procès-verbal attendu.

Cet exemple met en évidence le rôle du mode de couplage entre les données et
les traitements. Dans le premier cas, le secrétaire devra gérer lui-même les
données de son rapport en les sauvant probablement dans un fichier. Ici,
l’informatique lui fournit un programme (traitement de texte) pour l’aider à
rédiger son rapport et une infrastructure de mémorisation de ses données.
Tandis que dans le second cas, les données seront gérées automatiquement
par le SII qui les sauvegardera probablement dans une base de données.

Est-ce que le système d’information informatisé doit-il évoluer ?

Dans la logique économique actuelle, les entreprises doivent régulièrement


adapter leurs règles de gestion, leurs procédures opérantes ou leurs
communications internes et externes pour suivre l’évolution de leur
environnement et rester compétitives.

Cette auto-adaptation est une caractéristique essentielle des systèmes vivants


qui développent des mécanismes de régulation susceptibles de garantir leur
survie ; ces mécanismes de régulation, en fait des changements de
fonctionnement et de comportement, sont de nature complexe, ils sont le fait
du personnel qui met en œuvre sa capacité d’inventivité, de réactivité ou
encore d’intuition.

Tout changement de fonctionnement de l’entreprise a un impact sur son


système d’information (SI) que ce soit sous forme de modification de
procédures de traitement, de stockage ou de communication de l’information.
35

Face à un événement imprévu qui nécessite une réaction de sa part,


l’entreprise va mettre en œuvre les capacités de créativité et d’intuition de son
personnel pour décider d’une adaptation de son fonctionnement. Pendant
cette démarche, l’incidence des changements de fonctionnement de
l’entreprise sur le système d’information informatisé doit impérativement être
évaluée. Si le changement a une incidence sur le SII, l’entreprise est
certainement face à deux options essentielles :
- Mettre en œuvre le changement de son fonctionnement
immédiatement. Cette option aura comme effet de rendre inopérant
tout ou parti du SII.
- Adapter le SII pour qu’il prenne en compte les nouvelles modalités et
mettre en œuvre le changement dès que l’adaptation du SII est réalisée.

En fait ces deux options sont relativement caricaturales ; la première


relève de la position d’une direction d’entreprise qui ne veut pas être
dépendante de son SII. La deuxième relève de la position de force que
peut avoir le SII au sein de l’entreprise.

La première option est envisageable seulement si l’entreprise n’encourt


pas de préjudice à terme en utilisant des procédures du SII rendues
caduques par le changement. Sinon, la direction du système
d’information doit obligatoirement informer la direction de l’entreprise
des risques encourus.

La deuxième option est envisageable seulement si le temps nécessaire à


l’adaptation du SII ne met pas en péril l’entreprise qui tarde à réagir au
changement. Sinon, la direction de l’entreprise doit imposer la première
solution à sa direction du système d’information.

En conclusion, seuls les changements qui ne sauraient attendre


l’adaptation du SII pour être mis en œuvre par l’entreprise posent
problèmes. Ces changements nécessitent une concentration optimale de
la direction de l’entreprise et de la direction du système d’information.
La direction de l’entreprise doit imposer le changement à la direction du
système d’information. A son tour, la direction du système d’information
doit proposer les mesures d’accompagnement susceptibles de limiter les
risques de dégradation du SII du fait du changement.
36

Au regard de tout ce qui précède, quelle est la portée de l’informatique de


gestion ?

Les deux partitions, le système d’information non automatisé et le système


d’information informatisé du système d’information formel s’appuient sur
l’informatique. L’informatique de gestion, en tant que spécialité, s’applique
essentiellement au système d’information informatisé ; elle a comme finalité
de fournir aux sous-systèmes opérationnel (SO) et de pilotage (SP) les
informations utiles et nécessaires en cachant au bénéficiaire les contingences
d’acquisition, de mémorisation, de traitement et de communication des
données utilisées.

Quel est le rôle de l’informaticien de gestion ?

L’informaticien de gestion est formé pour assumer à terme la direction du


système d’information de l’entreprise. Ainsi, durant ses études il est formé à la
gestion des entreprises afin d’être capable de définir avec pertinence les
processus à automatiser d’une part et de proposer des phases transitoires de
traitement de l’information lorsqu’un changement de stratégie ou de
procédures impératif et immédiat rend obsolète tout ou partie du système
d’information informatisé.

Durant ses études, l’informaticien de gestion est aussi formé aux technologies
de l’informatique. Cela lui permettra de mettre en place des processus
automatisés tirant le meilleur parti des technologies modernes de traitement
de l’information d’une part et de mettre en place des solutions bureautiques
ou autres efficientes lors des phases transitoires d’indisponibilité de processus
automatisés pour cause de changement de stratégie, de tactique ou de
procédures de l’entreprise.

En plus de ces deux champs de compétences en gestion et informatique,


l’informaticien de gestion est formé à la communication interpersonnelle afin
de lui permettre de disposer des bases indispensables à communiquer
efficacement avec tous les acteurs impliqués par la définition, l’utilisation ou
encore la réalisation du système d’information informatisé.
37

Quels sont les métiers d’informatique de gestion ?

Les métiers sont en perpétuelle évolution. Néanmoins, on s’accorde pour les


regrouper en classes.

1. Etudes et développement

Cette famille regroupe tous les métiers qui ont pour missions de définir, de
concevoir et de développer de nouvelles applications et de nouveaux
programmes : logiciels systèmes, logiciels outils, logiciels de gestion de base de
données ou encore logiciels d’application.

2. Production et exploitation

Les informaticiens de cette famille s’occupent de la conduite des machines, de


leur surveillance et de leur maintenance. (Ingénieur en informatique
industrielle)

3. Spécialistes réseaux et télécommunications

Aujourd’hui, la télécommunication occupe une place non négligeable en


informatique. (Architecte de réseaux)
4. Conseil

Dans un secteur qui évolue aussi vite, les entreprises qui ont le souci de rester
performantes doivent être bien conseillées dans leur choix d’équipement
informatique. Le consultant détermine quelles sont les solutions informatiques
les plus efficaces pour répondre aux besoins du client, puis il suit la mise en
place des solutions qu’il a proposées.

5. Fonctions administratives

Ce secteur rassemble des métiers qui impliquent d’avoir une bonne expérience
professionnelle. Les fonctions administratives regroupent tous les postes de
gestionnaires qui supervisent et organisent le travail des informaticiens de
l’entreprise (directeur du service informatique, administrateur de base de
données).

6. Assistance aux utilisateurs


38

Dans cette famille, on trouve des conseillers qui assistent les utilisateurs en
matière d’achat des ordinateurs et des logiciels. En plus, ils s’appliquent à
former les nouveaux utilisateurs (technicien de maintenance informatique,
vendeur-conseil en micro-informatique etc).
39

Le système informatique

3.1. Ordinateur automate destiné à exécuter le programme

a) L’ordinateur en tant que calculateur pur et simple

L’ordinateur au départ était conçu comme une machine capable de faire des
calculs numériques complexes. Le terme anglo-saxon « computer » qui veut
dire calculateur en dit long. Ainsi, la plupart des applications étant
scientifiques, l’ordinateur ne se trouvait que dans des centres de recherche et
dans des universités. Et le langage de programmation comme le Fortran en
tirait une bonne fortune.

b) L’ordinateur en tant que machine à traiter les données numériques et


alphanumériques.

Dans sa deuxième phase, l’ordinateur apparaît comme une machine de


traitement logique d’une donne discrète quelconque et non seulement
numérique. Dans cette perspective, on a saisi l’utilité de l’ordinateur dans le
domaine de gestion où le calcul joue un rôle réduit. C’est dans ce cadre que le
langage cobol a été conçu. Avec l’avènement de micro-ordinateur, on note un
foisonnement remarquable des logiciels de traitement de texte, de tableur, de
gestion de base de données.

c) L’ordinateur en tant que outil de communication

Actuellement l’ordinateur est considéré comme un outil de communication.


C’est l’avènement de l’Internet. Celui-ci est un ensemble de réseaux reliés
entre eux (réseau de réseaux). Avec le world wide web (ou web) que l’on peut
littéralement traduire par « la toile d’araignée mondiale ». On peut
communiquer les textes et les images, visionner des photographies et
d’écouter des documents sonores.

Dans ces trois contextes, l’ordinateur manipule des chiffres binaires (0 ou 1).
Cela ne veut pas dire qu’à l’intérieur il y a des 0 et des 1. C’est une façon de se
symboliser les informations qui sont introduites, traitées et stockées en termes
de pulsions électriques dans l’ordinateur. Il apparaît que pour symboliser l’état
40

de n ampoules électriques, allumées ou éteintes, la représentation binaire est


la plus simple qui soit en adoptant la convention suivante :

1 = « état allumé », 0 = » état éteint ». Par conséquent, un ensemble de deux


ampoules peut se trouver dans 22 = 4 états distincts que l’on note alors :

0 0 état « 0 »
0 1 état « 1 »
1 0 état « 2 »
1 1 état « 3 »

Plus généralement, un ensemble de n ampoules peut se trouver dans 2n états


différents. Il faut rapprocher ceci du fait qu’avec n chiffres binaires on peut
compter de 0 à 2n – 1.

3.2. Les systèmes de numération

Si les ai représentent l’ensemble des symboles utilisés pour exprimer un


nombre dans une base B, un nombre réel R s’écrit :

An an-1….a1 a0, a-1 a-2…….


--------------- -------------
Partie entière partie fractionnaire

et sa valeur est :

R = an Bn +an-1 Bn-1 + ….. + a0 B0 + a-1 B-1 + a-2 B2 + …


------------------ --------------------------------
Partie entière partie fractionnaire

En décimal l’ensemble ai est constitué des symboles : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Ainsi 1045 = 1*103 + 0*102+ 4*101 +5*100

En binaire : 0 et 1
Par analogie, un chiffre binaire aura aussi une valeur pouvant être
1, 2, 22, 23, 24
41

NB. Le chiffre binaire est souvent abrégé en bit qui est l’acronyme de l’anglais
Binary digit. Un paquet de 8 bits forme un octet ou byte en anglais.

Lorsqu’on travaille en système binaire, une valeur devient rapidement très


longue à écrire : 101000001001
En système décimal, lorsqu’un nombre est trop long, on regroupe les chiffres
par paquet de trois et on les sépare par des points.
En système binaire, c’est pareil. On regroupe les chiffres par paquet de trois
pour obtenir un chiffre octal (base 8) : 0, 1, 2, 3, 4, 5, 6, 7.
On peut aussi les regrouper par paquet de quatre chiffres pour avoir un chiffre
hexadécimal (base 16) : 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.

Le rapport entre le binaire (base 2) et l’octal (base 8) est de 23, c’est-à-dire il


faut 3 chiffres binaires pour avoir un chiffre octal. Tandis qu’entre le binaire et
l’hexadécimal (base 16) le rapport est de 24, c’est-à-dire que 4 chiffres binaires
équivalent à 1 chiffre hexadécimal.

Donc les nombres hexadécimaux présentent un double avantage : ils sont


courts à écrire et ils permettent un passage immédiat à la représentation
binaire et réciproquement.

3.3. Notion de poids

En base 10 le nombre 2543 est composé de différents chiffres ayant des valeurs
différentes. Le 3 représente les unités, le 4 les dizaines, le 5 les centaines et le 2
les milliers. On peut dire que le 2 sur ce nombre en base 10 a plus de valeur
(poids) que le 3. En binaire c’est pareil : dans 10111111, le 1 est appelé le bit
représentant le poids le plus fort. Ainsi le 1 est appelé le bit à la valeur la plus
faible. Le tableau 1 donne les valeurs des quelques poids exprimées en
Base 10, Base 2, Base 8 et Base 16.

Base B3 B2 B1 B0 B-1 B-2

10 1000 100 10 1 0,1 0,01

2 8 4 2 1 0,5 0,25

8 512 64 8 1 0,125 0,015625


42

16 4096 256 16 1 0,0625 0,00390625

Les puissances de la base B0, B1 …... B-1 ... sont appelées les poids.

3.4. Tableau de correspondances Base 10, Base 2, Base 8, Base 16

Base 10 Base 2 Base 8 Base 16

0 0000 0 0
1 0001 1 1
2 0010 2 2
3 0011 3 3
4 0100 4 4
5 0101 5 5
6 0110 6 6
7 0111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F

Le système hexadécimal (base 16) couvre toutes les combinaisons de 4 bits


possibles entre 0000 et 1111.

3.5. Conversion des nombres de Base 10 en binaire, octal et hexadécimal

Le moyen le plus rapide est d’effectuer des divisions successives par 2, par 8 et
par 16 en retenant la présence d’une partie fractionnée.

Exemple : Que vaut 15 en base 2 ?

15 / 2 = 7 reste 1
43

7 / 2 = 3 reste 1
3 / 2 = 1 reste 1
1 / 2 = 0 reste 1

La lecture des restes de la division successive de façon inversée : 1111

Que vaut le nombre décimal 15, 432 en base 2 ?


La partie entière est 15 et la partie décimale est 0,432. La partie entière vaut
1111. Tandis que la partie décimale fait l’objet d’une multiplication successive
en reportant la partie entière résultante dans le nombre binaire.

Ainsi 0, 432 x 2 = 0,864 -> 0


0,864 x 2 = 1,728 -> 1
0,728 x 2 = 1,459 -> 1
0,459 x 2 = 0,914 -> 0
0,914 x 2 = 1,836 -> 1
0,836 x 2 = 1,672 -> 1

Contrairement à la partie entière, la lecture des reports se fait du haut en bas.


Donc 15,432 vaut approximativement 1111,01101. Il s’agit d’un nombre à
fraction continue vu que représente 15,432 en base 10 ne peut être représenté
que par approximations successives en base 2.

Que vaut 42 en base 8 ?

42 : 8 = 5 reste 2
5 : 8 = 0 reste 5

Donc 42 en base 10 vaut 52 en base 8.

Que vaut 42 en base 16 ?

42 : 16 = 2 reste 10 qui en hexadécimal  A


2 : 16 = 0 reste 2
Donc 42 en base 10 vaut 2A en hexadécimal.

3.6. La conversion de binaire, octal et hexadécimal en décimal

(111)2 = 1*22 + 1*21+1*20 = 7


44

(1111)2 = 1 x 23 + 1 x 22 + 1 x 21 + 1 x 20 = 15

(111,01)2 = 1 x 22 + 1 x 21 + 1 x 20, 0 x 2-1 + 1 x 2- 2 = 4+2+1, 0 x 0,5 + 1 x 0,25


= 15,25
Ce même principe est valable pour l’octal (base 8) et l’hexadécimal (base 16)

(642)8 = 6 x 82 + 4 x 81 + 2 x 80 = 6 x 64 + 4 x 8 + 2 x 1 = 418

(12,4) = 1 x 81 + 2 x 80, 4 x 8-1 = 1 x 8 + 2 x 1, 4 x 0,125 = 10,5


(A 3 F)16 = A x 162 + 3 x 161 + F x 160 = 10 x 256 + 3 x 16 + 15 x 1 = 2623
3.7 La conversion octal, hexadécimal en binaire et vice versa

567 en octal - 101 110 111 en binaire. Ici chaque chiffre octal correspond à
trois bits.

3 4 2 1 en octal  011 100 001 en binaire.

A 8 F en hexadécimal  1010 1000 1111 en binaire. Ici chaque chiffre


hexadécimal correspond à 4 bits ou chiffres binaires.

1001101011, 11001 - 2 6 B, C 8. En effet, un nombre binaire se convertira


en hexadécimal en partant de part et d’autre de la position de la virgule et en
découpant le nombre par tranche de 4 chiffres binaires ou bits et en
interprétant chaque tranche. Le dernier chiffre 8 de l’exemple précédent est
obtenu en faisant une extension de « 0 » à droite du dernier « 1 ».

3.8. Les opérations avec les binaire, octal, hexadécimal

a) addition et soustraction

111 10010 (5 6 5)8 AB2 D


+ 111 + 1011 + (3 3 3)8 + 54D + 7
_______ _________ __________ __________ ____

1110 11101 11 2 0 FFF 14

1000 10010 3F 2
- 111 - 1011 - 1A4
_____ ________ ______
1 1111 24E
45

(523)8 - (77)8 = 4 24

Lorsque la soustraction n’est possible on emprunte la base. Ainsi pour le cas ci-
dessus :
8 + 3 = 11 – 7 = 4
8+1= 9–7=2
Reste 4

(356)16 - (DF) 16 = 277

On emprunte la base 16, ainsi on a 16 + 6 = 22 – 15 = 7


16 +5 = 21 – 13 – 1 = 7
3–1=2

a) multiplication et division

- binaire

11,11
x 1,1
-------
1111
1111
------
101,101

- octal

43
x 26
-------
322
106
-------
1402

A3
46

x3
__
829

division

111 : 10 = 11,1

En octal et hexadécimal, il est facile de transiter par le décimal.

Hexadécimal

40 : 4 = (10)8 équivaut en décimal à 64 : 4 = 16

Octal

40 : 4 = (10)8 équivaut en décimal à 32 : 4 = 8


3.9. La représentation du signe

L’idée qui vient le plus naturellement à l’esprit consiste à dire que le bit de
poids fort symbolise le signe et le reste la valeur absolue du nombre. Si le
premier bit est 0 alors le nombre est positif sinon il est négatif. Selon cette
conversion, représentée sur 4 bits :

+ 5 s’écrit 0101
- 5 s’écrit +1101
___ ____
0 10010

L’addition ne donne pas une valeur qui correspond à la valeur attendue. Pour
surmonter cette difficulté, on a eu recours au complément à 2.
Ainsi :

-5 donne 0101
1 0 10
+ 1
_______
10 11
47

+5 ---- 0 1 0 1
- 5 ---- 1 0 1 1
___ _______
0 10 0 0 0

En ignorant le report au-delà de la position du signe on obtient bien 0.


Remarquons que si nous travaillons sur un nombre binaire représenté en
symbolisme hexadécimal, le complément à 2n devient un complément 16p. On
obtiendra la représentation hexadécimale de l’opposé en complémentant
chaque chiffre à F et en ajoutant.

0 1 0 0 1 1 0 1 -- 4D (FF – 4D =B2)

1011 0010 B2
1 + 1
____________ ___
1 0 1 1 0 0 1 1 ----- B3

Donc, on obtient le complément à 2 en cherchant l’opposé de chaque bit, puis


ajouter 1.
3.10. Le système d’exploitation

- Les fonctions du système d’exploitation

Un système d’exploitation est un programme agissant comme intermédiaire


entre l’utilisateur et le matériel de l’ordinateur. Le but d’un système
d’exploitation est de fournir un environnement permettant à l’utilisateur
d’exécuter des programmes de façon pratique et efficace. En règle générale,
un système d’exploitation satisfait aux deux principales fonctions suivantes :

a) Partager les ressources

Dans ce cadre, le système d’exploitation sert à coordonner l’utilisation


du ou des processeurs, et à accorder un certain temps pour l’exécution
de chaque processus ; à réserver de l’espace dans les mémoires pour les
besoins des programmes et à organiser le contenu des disques durs ou
d’autres mémoires de masse en fichiers et répertoires. Il sert aussi à
créer l’image numérique qui contiendra les interfaces homme-machine
48

des différents programmes et à l’envoyer à l’écran ainsi qu’à


réceptionner les manipulations effectuées par l’utilisateur par le biais du
clavier, la souris ou d’autres périphériques, et les transmettre aux
différents programmes
b) Présenter une machine virtuelle à l’utilisateur
49

Chapitre 5

Le système d’information informatisé

5.1. Les algorithmes

La littérature appropriée renseigne que le premier ordinateur date des années


1947. Au moment où nous rédigeons ce cours en 2011, cela fait au moins 64
ans. Et dans cet intervalle, la révolution informatique a touché plusieurs
aspects de la vie humaine. L’ordinateur s’est infiltré dans la quasi totalité des
secteurs de la vie des gens dans notre pays et ailleurs : de la gestion des appels
téléphoniques à la signalisation routière, de la réservation des places dans une
compagnie aérienne à la production des journaux, de la gestion d’un compte
bancaire à la connexion Internet à domicile.

Dans les domaines scientifiques, c’est pareil. L’informatique est omniprésente.


A titre d’exemple :

- En Economie et gestion : la gestion des stocks, la facturation, la gestion des


ressources humaines, le contrôle de gestion, la gestion de la production etc.

- En science : analyse des données expérimentales (chimie, biologie,


physique), la résolution de grands ensembles d’équations, la navigation
spatiale.

- En sciences sociales : analyse des résultats d’enquête, la modélisation


prospective des populations (démographie), sondage d’opinion
- En ingénierie : calculs de résistance, pertes de chaleur, consommation
d’énergie, simulation.

- En pédagogie et psychologie : enseignement programmé, l’intelligence


humaine et intelligence artificielle.

- En médecine : diagnostic des maladies, la gestion des dossiers médicaux etc.


50

- En littérature et arts : analyse des textes littéraires, la production des films


animés, la composition musicale.

- En loisirs : jeux vidéo, jeux d’échecs etc.

Comme on le remarque, l’informatique est une discipline tentaculaire. Elle


comporte plusieurs aspects depuis l’impact des ordinateurs sur la société aux
détails technologiques impliqués dans leur conception.

Quel que soit le domaine, l’ordinateur a un seul but. C’est manipuler


rapidement, systématiquement et sans erreur une quantité d’informations.
En clair, cela revient à dire que l’ordinateur doit :

a) mémoriser des données numériques et alphanumériques ;

b) rechercher des données mémorisées ;

c) effectuer des opérations de calcul avec des données ;

d) faire des comparaisons entre les données ;

e) trier et classer les données ;

f) actualiser, c’est-à-dire corriger, supprimer les données qui existent et


ajouter de nouvelles informations ;

Pour manipuler les données, quelle que soit l’application, on a besoin d’un
algorithme. Celui-ci est une notion fondamentale en informatique : donc sans
algorithme il n’y aurait pas de programme, et sans programme il n’y aurait rien
à exécuter. Les algorithmes sont fondamentaux en un autre sens : ils sont à la
fois indépendants du langage dans lequel ils sont énoncés et de l’ordinateur qui
les exécute.

Cette indépendance des algorithmes nous pousse à dire que tous les
ordinateurs peuvent globalement mener à bien les mêmes opérations de base.
Il faut noter des différences de détail et de rapidité, mais en règle générale les
capacités des ordinateurs actuels sont les mêmes. Bien plus, ces capacités
n’ont pas été affectées par l’innovation technologique. Cette innovation ne
changera pas ce que les ordinateurs font, même si elle affecte la vitesse, le coût
et la fiabilité. Cela revient à dire que les algorithmes peuvent être conçus et
51

étudiés indépendamment de la technologie du moment. Les résultats resteront


valables en dépit de l’arrivée de nouveaux ordinateurs et de nouveaux langages
de programmation.

Pour les spécialistes de la science informatique, les algorithmes sont plus


essentiels que les langages de programmation et les ordinateurs. Un langage de
programmation n’est qu’un moyen pratique d’énoncer un algorithme, et un
ordinateur est un simple processeur qui exécute. Donc le langage de
programmation et l’ordinateur ne sont que des moyens, le but étant
l’exécution de l’algorithme et le déroulement du traitement correspondant.

Lorsqu’il y a de nouvelles applications, il faut concevoir des algorithmes pour


mener à bien les traitements concernés. La conception d’un algorithme est une
activité intellectuelle difficile, beaucoup plus difficile que de traduire
l’algorithme en programme. La conception requérant la créativité et l’intuition,
nous pouvons dire qu’il n’y a pas de règles générales. En d’autres mots, il
n’existe aucun algorithme pour concevoir des algorithmes.

Dans la vie courante nous sommes confrontés à de nombreux problèmes. Pour


les résoudre nous mettons en place un plan reprenant les étapes à suivre pour :

b) concevoir une procédure qui une fois appliquée amènera à une solution du
problème. C’est ce qu’on appelle algorithme. En d’autres, l’algorithme est
un ensemble des règles opératoires dont l’application permet de résoudre
un problème énoncé au moyen d’un nombre fini d’opérations.

c) Résoudre effectivement le problème en appliquant cette méthode. Cette


mise en pratique de l’algorithme s’appelle processus ou traitement.

Ainsi dans la vie courante, un algorithme peut prendre la forme de :

- mode d’emploi ;
- recette de cuisine ;
- itinéraire routier ;
- notice de montage
- calculer la racine carrée
- la multiplication de deux nombres etc.…

Résoudre un problème en prenant appui sur l’ordinateur, ne peut se faire que


si il a été préalablement décomposé en problèmes plus simples, résolubles par
52

l’ordinateur, se présentant sous forme d’une suite d’opérations à exécuter les


uns après les autres sans intervention extérieure (A. Gribaumont et al 1979).

A partir de ce qui précède, on peut définir l’algorithme comme une suite


logique des prescriptions élémentaires effectuées en un nombre fini de pas en
vue de résoudre un problème et une classe de problème (M.Bertini et Y
Tallineau 1978, p. 11).

5.1.1 Les limites des algorithmes.

La notion d’algorithme est très ancienne. Elle dépasse l’informatique et les


ordinateurs. Depuis l’antiquité l’homme a cherché à automatiser les tâches
répétitives. En témoignent la multiplication égyptienne ou le calcul du PGCD de
deux nombres naturels donné par Euclide :

Règle 1. - poser les 2 nombres a, b. Passer à la règle suivante.

Règle 2 - comparer les nombres posés (a = b ou a < b ou a > b) ; passer à la


règle suivante.

Règle 3 - si les nombres posés sont égaux, chacun d’eux donne le résultat
cherché. Le processus de calcul s’arrête. Sinon passer à la règle suivante.

Règle 4 - si le premier nombre posé est plus petit que le deuxième, permuter
les 2 nombres, continuer à poser les 2 nombres.
Règle 5 – soustraire le deuxième des nombres posés du premier et poser deux
nombres : celui qui est soustrait et la différence. Passer à la règle 2.

Dans l’histoire de l’informatique, l’on s’est rendu compte qu’il y a beaucoup


de choses qu’un ordinateur ne peut pas faire. En fait, ce que l’ordinateur peut
calculer est infime par rapport à ce qu’on aimerait calculer. Ces questions
sont globalement classées sous le titre « calculabilité », c’est-à-dire l’étude de
ce qui est informatisable et de ce qui ne l’est pas. En fait ce thème soulève la
question des limites des méthodes algorithmiques.
53

La formalisation de la calculabilité a commencé dans la décennie 1930 afin de


répondre à des problèmes fondamentaux de logique mathématique, dont celui
de David Hilbert (1862-1943) sur le problème de la décision.
Le projet de D. Hilbert était de concevoir un système mathématique formel
dans lequel tous les problèmes puissent être formulés avec précision en termes
de propositions vraies ou fausses. Son idée était de trouver un algorithme qui
permette de déterminer, pour une proposition donnée d’un système formel, si
cette proposition était vraie ou fausse. Hilbert estimait que ce problème était
fondamental dans le domaine mathématique. Dommage pour ce projet, car
dans les années 1930 de nombreuses recherches montrèrent que le problème
de la décidabilité (en allemand, Entscheindungsproblem) n’était pas calculable.
Cela signifie qu’il n’existe d’algorithme du type de celui que Hilbert désirait tant
obtenir.

En 1931 Kurt Gödel publia le célèbre théorème de l’incomplétude. Ce


théorème démontrait entre autres choses qu’il n’existe pas d’algorithme dont
l’entrée soit une proposition quelconque sur les entiers et dont la sortie dise
toujours si la proposition en question est vraie ou fausse. En d’autres mots,
jusqu’au début du vingtième siècle les mathématiciens étaient persuadés qu’on
pouvait un peu à la manière des élèves en géométrie, démontrer toutes les
vérités mathématiques par déduction. Gödel a démontré deux résultats
mathématiques :

- il se peut que dans certains cas, on puisse démontrer une chose et son
contraire (inconsistance)
- il existe des vérités mathématiques qu’il est impossible de démontrer
(incomplétude).

La conséquence du théorème d’incomplétude est que la vérité ne peut pas être


exprimée en termes de démonstrabilité. Une chose prouvable n’est pas
nécessairement vraie et une chose vraie n’est pas toujours prouvable. A la suite
des travaux de Kurt Gödel, d’autres mathématiciens tels Alonso Church, Alan
Turing et tant d’autres découvrirent de nombreux autres problèmes qui ne
comportaient aucune solution algorithmique. Disons un mot sur la thèse de
Church -Turing.

5.1.2. La thèse de Church -Turing.

On l’appelle thèse parce qu’il s’agit d’un résultat qui ne peut pas être prouvé,
car il affirme l’équivalence entre un concept intuitif, à savoir les fonctions
54

mécaniquement calculables et un concept formel, à savoir, les diverses


définitions des fonctions récursives. Elle s’appelle la thèse de « Church »
puisque c’est Alonso Church, mathématicien américain, qui en a eu le premier
l’idée. Elle s’appelle la thèse de Church - Turing puisque les machines de Turing
donnent une véritable idée de ce que « mécanique « veut dire.

En effet, pour prouver qu’il n’y a pas d’algorithme pour un problème donné,
des mathématiciens ont tenté de définir exactement ce que l’on entend par
algorithme. Gödel le définit comme une suite de règles pour établir la forme
de fonctions mathématiques complexes à partir de fonctions mathématiques
plus simples. A. Church utilisa un formalisme appelé « calcul lambda ». A
.Turing utilisa une machine hypothétique appelée « machine de Turing » pour
définir l’algorithme comme un ensemble d’instructions pour sa machine
simple.

Toutes les définitions en apparence différentes sont en fait équivalentes. En


termes concrets, si on peut faire un calcul à partir d’un algorithme défini d’une
certaine manière, alors on peut aussi le faire à partir d’un des autres
algorithmes. A la suite des progrès réalisés par les chercheurs dans les années
1930
(S. Kleene, Herbrand et d’autres), les deux propositions suivantes furent
généralement admises :

(1) toutes les définitions rationnelles du concept algorithme connues à ce


jour sont équivalentes.
(2) Toute définition rationnelle du concept algorithme établie par la suite
sera en fait équivalente aux définitions connues.

Voilà la quintessence de la thèse de Church - turing. Jusqu’aujourd’hui aucun


fait n’est venu démontrer le contraire et la thèse de Church -Turing est
universellement reconnue. La thèse de Church -Turing affirme simplement que
nous pensons avoir une bonne définition de ce qu’est un algorithme. Chacun
d’entre nous pressent ce que signifie accomplir une tâche d’après une
procédure ou de façon mécanique. On comprend directement le sens de
l’organisation d’instructions ou d’étapes successives nécessaires à
l’accomplissement d’une tâche pour ensuite charger une personne ou une
machine de l’exécution routinière.

La thèse de Church - Turing nous confirme dans l’idée que les définitions
précises du terme « algorithme » utilisées en informatique correspondent en
55

fait aux idées non formalisées que nous avons. Donc, chaque fois que nous
décrivons un certain nombre d’étapes dont nous sentons qu’elles peuvent être
parcourues d’une manière purement routinière, il existe un algorithme formel,
au sens informatique du terme, pour la même tâche.

Dans une formulation simple et moderne, on peut dire que l’algorithme est
toute chose qui peut être exécutée par un ordinateur. Dans cette perspective,
tout algorithme qui a été exécuté sur un ordinateur donné peut être exécuté
sur n’importe quel autre ordinateur.

L’équivalence entre tous les ordinateurs modernes d’une part, et d’autre part
entre eux et les machines de Turing ou autres définitions du concept
d’algorithme est une confirmation de la thèse de Church - Turing. Cette
propriété remarquable des algorithmes est appelée universalité. En rapport
avec les ordinateurs, nous disons que l’universalité signifie que tout ordinateur
est équivalent à tout autre ordinateur en ce sens qu’ils peuvent tous accomplir
les mêmes tâches.

5.2. De l’algorithme au programme

Un programme est une description codée d’un algorithme ; celle-ci est donnée
en respectant des règles strictes de combinaison d’éléments simples. Ces règles
définissent ce que l’on convient d’appeler un langage de programmation.
L’intérêt du programme provient de l’utilisation d’un langage de
programmation.

Les règles strictes qui définissent le langage de programmation sont pré-


établies et standardisées. On dispose, en général, d’un système qui permet de
transformer la description d’un algorithme, donnée par un programme, en un
ensemble d’instructions élémentaires d’une machine de traitement
d’information. Ce système de transformation est appelé compilateur (ou
interpréteur).
Exemple. Pascal et C++ sont deux langages de programmation pour lesquels
des compilateurs existent sur la plupart des ordinateurs.
56

5.2.1. Justification du programme

Dans le cadre du contrat entre le demandeur et le programmeur, le


programmeur est le résultat tangible du travail du programmeur. Mais ce
dernier a l’obligation de justifier le programme conçu, c’est-à-dire de
convaincre le demandeur que programme possède les caractéristiques qu’il
attendait. Les caractéristiques primordiales sont l’exactitude et l’efficacité.

5.2.2. Spécification du programme

En vue d’une utilisation correcte du programme par le demandeur, le


programmeur doit aussi lui fournir la spécification du programme. Celle-ci est
constituée par l’ensemble des informations qui doivent être connues par le
demandeur afin d’utiliser correctement le programme. Le contenu d’une
spécification permet au demandeur de présenter correctement les données
pour une activation du programme et d’interpréter correctement les résultats
obtenus lorsque l’activation se termine. La spécification est le mode d’emploi
du programme.

Remarque : Dans certains textes, le terme « spécifier un programme » est


employé dans le sens de « définir le problème ».

5.3. Les caractéristiques d’un programme

5.3.1. Exactitude

Un programme ne peut présenter un intérêt pour le demandeur que dans la


mesure où celui-ci peut l’activer aveuglément, c’est-à-dire qu’il peut accorder
une confiance totale aux résultats produits. Cependant, la production des
résultats d’un programme n’est pas une conséquence directe de l’existence du
programme : il faut que le programme soit exécuté par une machine de
57

traitement de l’information. Pour décider de l’exactitude d’un programme, on


ne tiendra pas compte de la phase d’exécution sur l’équipement réel.

Supposons que le demandeur et le programmeur sont d’accord quant à la


définition du problème, l’ensemble des cas de données possibles, et la forme à
donner à la représentation des résultats. Un résultat n’est produit qu’après
toute une série d’étapes : un algorithme doit être imaginé ; un programme,
basé sur cet algorithme, doit être conçu ; le programme doit être compilé afin
d’obtenir une séquence d’instructions élémentaires d’une machine d’un type
donné ; finalement un exemplaire de la machine doit prendre en charge
l’exécution de la séquence d’instructions élémentaires. Les deux dernières
étapes entraînent l’intervention d’éléments (compilateur, ordinateur de
traitement) dont l’exactitude et la fiabilité ne sont généralement pas sous le
contrôle du programmeur. C’est pourquoi on fait l’hypothèse de l’exactitude du
compilateur utilisé et de la fiabilité de l’ordinateur. En d’autres termes, on
considère que le choix des équipements pour les deux dernières étapes est la
responsabilité du demandeur.

Pour le programmeur, montrer l’exactitude du programme conçu revient à


montrer que pour tout élément appartenant à un ensemble bien défini de
données, l’exécution (par une machine supposée fiable) du programme (sous
forme issue d’un compilateur supposé correct) produira le résultat
correspondant du problème énoncé.

On exclut de la responsabilité du programmeur les éléments sur lesquels il n’a


pas un contrôle direct, à savoir :
a. la partie de la définition du problème qui dépend du demandeur ;
b. la fiabilité du compilateur et de l’ordinateur de traitement.

Exemple : Supposons qu’un demandeur a transmis au programmeur une norme


de calcul d’un élément comptable ; le programme conçu est correct s’il
respecte fidèlement la norme donnée, on ne peut lui reprocher d’éventuelles
erreurs dans l’établissement de la norme elle-même. Le programmeur n’est pas
responsable du modèle de gestion qu’il n’a pas conçu. De même, il ne peut être
tenu par une défaillance non –apparente de l’équipement de traitement qui
aurait faussé les résultats lors de l’exécution.
58

5.3.2. Comment convaincre de l’exactitude d’un programme ?

En acceptant les limites de la notion d’exactitude d’un programme, il reste à


établir comment le programmeur peut convaincre le demandeur de
l’exactitude du programme.

a. Utilisation de tests.

Supposons que l’on effectue x activations d’un programme donné et que, à


chaque activation, on change le cas d’application du programme (les données
initiales du cas de problème à résoudre). Supposons que chaque activation
s’est terminée en produisant un résultat et que nous possédons une méthode
qui permet de vérifier que ce résultat est bien le résultat attendu. Que peut-on
conclure d’une telle expérience ?

Deux issues sont possibles :

- Ou bien, certaines activations n’ont pas produit le résultat attendu ; on peut


en conclure que le programme ne possède pas la caractéristique de pouvoir
être exécuté aveuglément pour une valeur arbitraire des données ; en
d’autres termes, il est erroné ;

- Ou bien, les x activations ont, toutes sans exception, produit le résultat


attendu ; peut-on en conclure que le programme est correct ? Pas
nécessairement ; les x activations ne permettent pas de présumer quelle
pourrait être l’issue d’une autre série de y activations pour d’autres valeurs
données.

Les tests sont utiles pour montrer l’existence d’erreurs, mais ils ne peuvent pas
établir l’absence d’erreurs.

Remarque : seul le test exhaustif (qui couvre tous les cas de données) pourrait
établir l’absence d’erreurs. Mais, un tel test est presque toujours impraticable
vu le nombre de cas à considérer et l’obligation de posséder une méthode de
vérification de chaque résultat.

b. Appel à l’autorité
59

Nous dirions qu’il y a justification du programme par appel à l’autorité si le


programmeur invoque le fait que le programme conçu est basé sur une
méthode de résolution du problème dont la qualité est reconnue.

Cette forme de justification est insuffisante. En effet, il faut également montrer


que le programme est bien la mise en œuvre de la méthode reconnue. L’objet
de la justification est simplement déplacé. Montrer l’équivalence entre le
programme et la méthode est d’autant plus difficile que la méthode fait appel à
des notions qui sont imparfaitement représentées par le programme. Une
notion est imparfaitement représentée si toutes les propriétés de la notion ne
se retrouvent pas dans la représentation utilisée par le programme.

Exemple : la notion nombre réel et la représentation d’un nombre réel sur un


équipement de traitement ne respectent pas les mêmes propriétés. Une
première différence vient du fait que seuls quelques nombres réels sont
représentés. Le caractère discret de cette représentation est à l’origine des
erreurs d’arrondi et du non respect de certaines propriétés des opérations sur
les réels.

c. Argumentation

L’argumentation que doit fournir le programmeur est une explication


rigoureuse du raisonnement suivi lors de la conception du programme. Cette
explication doit montrer que le programme couvre correctement l’ensemble
des données possibles.

5.3.3. Efficacité

L’exactitude d’un programme n’est pas la seule caractéristique qui compte


pour le demandeur. Celui-ci s’intéresse aussi à l’efficacité du programme.
L’efficacité d’un programme est une mesure des ressources à mettre en œuvre
pour produire le résultat attendu du programme. Un programme sera d’autant
plus efficace que la quantité de ressources à mettre en œuvre sera faible.
60

5.3.4. Les ressources

Elles sont de trois types différents :

- Le nombre d’opérations ;
- L’espace de stockage (espace – mémoire) ;
- Le nombre de transferts d’information entre zones de stockage.

Connaître l’efficacité d’un programme permet de comparer un programme à


d’autres programmes (conçus pour résoudre le même problème) et de faire un
choix parmi ceux-ci. Il est aussi important de pouvoir estimer a priori
l’efficacité d’un programme. De cette manière, on peut renoncer à essayer de
développer des programmes dont l’estimation a priori de l’efficacité a révélé
qu’ils seront peu efficaces.

- Les opérations

Les opérations d’une machine ne prennent pas toutes le même temps. Une
opération de multiplication ou de division peut prendre cinq à six fois plus de
temps qu’une addition ou une soustraction. Par contre, dans le cas d’une
multiplication ou d’une division par un facteur qui est une puissance de la base
de représentation des nombres, ces opérations retrouvent un temps
d’exécution comparable à l’addition.

Donc, le temps total des opérations – machine de l’exécution d’un programme


est une fonction du nombre et du type des opérations mises en œuvre.

- La mémoire
Un compromis peut exister entre l’augmentation de l’espace mémoire requis
par un programme et la diminution du temps total de l’exécution du
programme.

Une augmentation de l’espace mémoire peut provenir de la conservation des


résultats intermédiaires dont la disposition permet de réduire le nombre
d’opérations à effectuer.

- Transferts entre zones de stockage

Les unités de traitement possèdent deux types de stockage :


61

a. Une zone dont l’accès est rapide pour l’unité d’exécution des
instructions : la mémoire centrale ;
b. Une zone de capacité de stockage beaucoup plus importante mais dont
l’accès est relativement lent : la mémoire de masse.
Par exemple, une unité de traitement peut avoir une mémoire centrale
d’une capacité de 5 millions d’informations élémentaires et une
mémoire auxiliaire d’une capacité de 500 millions d’informations
élémentaires.

Par contre, accéder à une information en mémoire auxiliaire pour la


transférer en mémoire centrale peut exiger un temps équivalent à
l’exécution de 20 mille instructions de la machine. Des considérations sur
la minimisation de ces transferts seront primordiales dans les
applications qui manipulent de grandes quantités d’informations qui ne
peuvent résider en mémoire centrale.

3.2.2. Trois types d’efficacité

Nous considérons 3 types d’efficacité pour un programme donné :

- L’efficacité inhérente à l’algorithme ;


- L’efficacité dans un contexte technologique ;
- L’efficacité spécifique à un équipement.

L’efficacité inhérente à l’algorithme est l’estimation d’un ordre de grandeur du


temps (et l’espace mémoire) requis pour une exécution, en fonction de la taille
des données.

L’efficacité dans un contexte technologique tient compte de caractéristiques


propres à toute une famille d’équipements. Ces caractéristiques peuvent
modifier considérablement la pertinence en pratique de l’efficacité inhérente à
l’algorithme.
Par exemple, de nombreux équipements actuels mettent en œuvre le concept
de mémoire virtuelle. Dans de nombreuses applications, le programmeur ne
peut pas ignorer cette situation.

L’efficacité spécifique à un équipement donné intervient quand on désire


exploiter toutes les possibilités d’amélioration de l’efficacité d’un programme.
62

Des modifications sont apportées au programme afin de tenir compte des


particularités d’exécution d’une machine donnée.

Remarque : l’efficacité la plus importante du point de vue de la conception des


programmes est celle inhérente à l’algorithme. Elle intervient en guidant le
programmeur dans ses choix de conception afin de réduire l’ordre de grandeur
du temps d’exécution. En effet, il est très difficile de compenser l’inefficacité
inhérente d’un algorithme par un accroissement de la capacité de traitement.

3.3. La robustesse

C’est l’aptitude à bien réagir lorsque l’on s’écarte des conditions normales
d’utilisation.

3..4. L’extensibilité

C’est la facilité avec laquelle un programme pourra être adapté pour satisfaire
à une évolution des spécifications.

3.5. La portabilité

C’est la facilité avec laquelle on peut exploiter un même logiciel dans


différentes implémentations.
63

Chapitre 6.

La pratique de la programmation

6.1. Définition

La programmation est une activité qui consiste à écrire un programme selon les
spécifications bien définies. La spécification détermine le type de données à
traiter et le résultat attendu.

Une condition nécessaire, mais non suffisante, pour faire la programmation est
la connaissance d’un langage de programmation dans lequel le programme doit
être rédigé. Dans notre cas, c’est le langage C++. Il faut apprendre les régles
relatives à l’utilisation du C pour résoudre les problèmes abordés dans notre
cours. Ces règles précisent :
- le vocabulaire utilisable ;
- la manière de combiner les « mots » du vocabulaire pour construire des
programmes ;
- la signification associée aux différentes constructions du langage.

En plus d’une connaissance correcte du langage de programmation à utiliser, il


est indispensable de disposer d’une méthode guidant le processus de
construction du programme demandé. En effet, en l’absence de méthode, la
résolution d’un problème de programmation s’apparente à un puzzle dont les
pièces sont les constructions légales du langage de programmation. On ne
saurait véritablement espérer construire le programme demandé en secouant
les pièces du puzzle jusqu’à l’obtention d’un programme correct. C’est
cependant ce que tentent de faire beaucoup d’amateurs qui assemblent leurs
programmes en tâtonnant.

D’une manière générale, l’objectif de la programmation est de permettre


l’automatisation d’un certain nombre de tâches, à l’aide des automates
programmables.

Un automate est un dispositif capable d’assurer, sans intervention humaine, un


enchaînement d’opérations, correspondant à la réalisation d’une tâche
donnée. Comme exemple d’automates, on peut citer l’ordinateur.
64

L’automate est dit « programmable » lorsque l’enchaînement d’opérations


effectuées peut être modifié à volonté, pour permettre un changement de la
tâche à réaliser, ou un changement dans la manière de réaliser cette tâche.
Dans ce cas, la description de la tâche à accomplir se fait par le biais d’un
programme, c’est-à-dire une séquence d’instructions et de données
susceptibles d’être traitées.

En résumé, programmer c’est donc décomposer la tâche à automatiser sous la


forme d’une séquence d’instructions et de données adaptées à l’automate
utilisé.
Mais quelles sont ces instructions et données adaptées dans le cas où
l’automate programmable est l’ordinateur ?

6.2 Instructions et langage machine.

Nous savons qu’un ordinateur, en schématisant à l’extrême, est constitué :

- d’un microprocesseur ou processeur, capable d’exécuter (réaliser) un jeu


donné d’opérations élémentaires.
- d’une mémoire centrale, dans laquelle sont stockées les données en cours
de traitement, ainsi que le programme lui-même.
- de bus, ports d’entrée – sorties et périphériques.

Le jeu d’instructions (langage) que l’ordinateur est capable de traiter est donc
tout naturellement déterminé par le processeur.

Les instructions comprises par un processeur sont appelées les instructions


machine de ce processeur.
Le langage de programmation qui utilise ces instructions est appelé le langage
machine qui est une suite de bits ou chiffres binaires.
65

6.3. Les générations de langage

Au cours du temps, différents types de langages de programmation firent leur


apparition et furent regroupés en générations. Bien qu’il s’agisse d’une
classification différente de celle des machines, les générations de langages
sont, du moins pour les premières, liées sur le plan chronologique aux
générations de machines, et aux performances de leurs composants.

- La première génération

Au début c’était le langage machine. Dans le cas des ordinateurs de premières


générations, la mémoire n’est pas encore utilisée pour le stockage du
programme. Celui-ci est placé sur des cartes et/ou rubans perforés. On
l’imagine facilement, la production des programmes était fastidieuse, et leu
relecture et modification presque impossible. Par ailleurs, les programmes
écrits pour une machine ne pouvaient pas être exécutés sur une autre
machine.

- La deuxième génération

Elle est marquée par le langage d’assemblage. Afin de rendre les programmes
plus faciles à écrire et à corriger, on a rapidement pensé à remplacer les
séquences de bits par des symboles, les instructions machines étant codées par
des mnémoniques et les données par des caractères alphanumériques
associés.

Le nouveau langage ainsi produit s’appelle un langage d’assemblage ou langage


assembleur.

Exemple 0101 0110 0101

« LOAD » «6» «5»

- La troisième génération

Dans la lancée apparurent les langages évolués. Le but est de fournir au


programmeur la possibilité d’utiliser des instructions et des structures de
données de plus haut niveau, afin de rendre plus facile l’écriture des
programmes et d’améliorer la productivité. Ces langages sont plus accessibles,
plus proches de notre manière de penser et de conceptualiser les problèmes.
66

Les langages évolués sont nombreux. Citons à titre d’exemple : basic, cobol,
pascal, c, ada.

- La quatrième génération

Parallèlement aux langages évolués, des langages encore plus spécialisés, voir
des méta-langages, ont fait leur apparition. On peut citer les langages
d’intelligence artificielle (prolog, lisp), les langages objets (c++), certains
langages de gestion (L4G)

6.4. Le programme source, programme objet

Si nous utilisons des instructions sophistiquées, comment alors les rendre


compréhensibles pour l’ordinateur qui doit les exécuter ? En effet, nous l’avons
vu, une solution est de disposer d’un programme capable de transformer une
séquence d’instructions de haut niveau (aussi appelée code source ou
programme source) en une séquence d’instructions machine (aussi appelée
code objet ou binaire).

Les programmes qui convertissent un programme source quelconque écrit


dans un langage de programmation, en un programme objet sont appelés
traducteurs.
Selon ses caractéristiques, un programme traducteur est assembleur, un
compilateur ou un interpréteur.
Il est important de bien comprendre la différence entre traduction effectuée
par un assembleur ou un compilateur et celle réalisée par un interpréteur.
Les compilateurs et assembleurs traduisent tous deux les programmes dans
leur ensemble : tout le programme doit être fourni au compilateur pour la
traduction. Une fois cette traduction effectuée, son résultat (code objet) peut
être soumis au processeur pour traitement.

Un langage de programmation pour lequel un compilateur est disponible, est


appelé un langage compilé.

Les interpréteurs traduisent les programmes instruction par instruction, et


soumettent immédiatement chaque instruction traduite au processeur pour
exécution. Un langage de programmation pour lequel un interpréteur est
disponible est appelé un langage interprété.
67

Naturellement, chacune de ces techniques possède des avantages et des


inconvénients, qui la rend plus ou moins adaptée suivant le contexte :

- De manière générale, on peut dire que les langages interprétés sont bien
adaptés pour le développement rapide :

c) le cycle de test est plus court qu’avec les langages compilés,


d) il est souvent possible de modifier ou rectifier le programme en
cours d’exécution (test),
e) et ces langages offrent généralement une plus grande liberté
d’écriture.

A l’inverse, les langages compilés sont à utiliser de préférence pour les


réalisations opérationnelles, ou les programmes de grande envergure :

a) les programmes obtenus sont plus efficaces : d’une part le compilateur


peut effectuer des optimisations plus facilement que l’interpréteur,
puisqu’il possède une visibilité globale sur le programme, et d’autre part,
l’effort de traduction n’est fait qu’une seule fois.
b) Par ailleurs, la visibilité globale offerte au compilateur permet une
meilleure détection des erreurs, lors de la compilation.

6.5. Variété des applications

L’utilisation de l’informatique dans les 3 types d’application, calcul scientifique,


gestion d’informations et commande de processus, a conduit à la production
d’une grande diversité de programmes :
- Petits utilitaires, « drivers » (librairie de fonctions permettant de piloter un
matériel). Cela demande un effort d’une équipe d’une à 2 personnes. (1.000
à 10.000 lignes de code source).

- Petits logiciels (agenda électronique, gestionnaire des fichiers) Cela


demande un effort de 3 à 12 personnes. (1.000 à 50.000 lignes).

- Progiciels, logiciels complets (traitement de textes, commande de central


téléphonique). Une équipe de 5 à 20 personnes.

- Gros systèmes (aéronautique, système d’exploitation, systèmes experts).


Effort : de milliers de personnes.
68

6.6. La programmation structurée (procédurale) et la programmation orientée


objet

- La programmation structurée

La programmation analytique ou top-down programming consiste à analyser


l’image que l’on veut obtenir, à déterminer les parties de cette image, repérer
les sous-ensembles d’objets, en bref à découper l’image jusqu’à la domination
parfaite de sa structuration. Cette méthode revient à décomposer la fonction
globale en sous-fonctions hiérarchisées par le processus d’analyse et ce, en
descendant niveau par niveau. Elle se fonde sur une mise en évidence de la
structure du problème. A l’origine de ces idées Dijkstra a lancé le concept de
programmation structurée.

La programmation structurée a manifestement fait progresser la qualité de la


production des logiciels. Mais avec le recul, il faut bien reconnaître que ses
propres fondements lui imposaient des limitations. En effet, la programmation
structurée reposait sur ce que l’on nomme souvent l’équation de Wirth, à
savoir :

Algorithmes + structures de données = programmes

Bien sûr, elle a permis de structurer et partant d’en améliorer l’exactitude et la


robustesse. On avait espéré que la programmation structurée permettrait aussi
d’en améliorer l’extensibilité et la réutilisabilité. On s’est aperçu que
l’adaptation ou la réutilisabilité d’un logiciel conduisait souvent à « casser » le
module intéressant, et ceci parce qu’il était nécessaire de remettre en cause
une structure de données. Précisément, ce type de difficultés émane
dirctement de l’équation de Wirth, qui découple totalement les données des
procédures agissant sur ces données.

En substance, en programmation structurée ou procédurale, le programme


(fonction, procédure) agit sur des données. Les fonctions et les procédures
69

travaillent à distance sur les données. L’accent étant mis sur l’action, on
cherche à répondre à la question : « Que veut-on faire ? ». Du fait de la
dissociation entre les données et les fonctions / procédures, il se pose un
problème lorsqu’on change les structures de données.

Les données

Fonction 1

Fonction 2

Fonction 3

En plus de cela, les procédures s’appellent entre elles et peuvent modifier les
mêmes données. Mais il va se poser un problème lorsqu’on veut modifier une
procédure : comment avait-elle été appelée ?

En résumé, nous pouvons retenir ce qui suit.


Les méthodes fonctionnelles (également qualifiées de méthodes structurées)
trouvent leur origine dans les langages procéduraux. Elles mettent en évidence
les fonctions à assurer et proposent une approche hiérarchique descendante et
modulaire.
Ces méthodes utilisent intensivement les raffinements successifs pour produire
des spécifications dont l’essentiel est sous forme de notation graphique en
diagrammes de flots de données. Le plus haut niveau représente l’ensemble du
problème (sous forme d’activité, de données ou de processus, selon la
méthode). Chaque niveau est ensuite décomposé en respectant les
entrées/sorties du niveau supérieur. La décomposition se poursuit jusqu’à
arriver à des composants maîtrisables.
L’approche fonctionnelle dissocie le problème de la représentation des
données, du problème du traitement de ces données.La SADT (Structured
Analysis Design Technique) est probablement la méthode d’analyse
fonctionnelle et de gestion de projets la plus connue. Elle permet non
seulement de décrire les tâches du projet et leurs interactions, mais aussi de
70

décrire le système que le projet vise à étudier, créer ou modifier, en mettant


notamment en évidence les parties qui constituent le système, la finalité et le
fonctionnement de chacune, ainsi que les interfaces entre ces diverses parties.
Le système ainsi modélisé n’est pas une simple collection d’éléments
indépendants, mais une organisation structurée de ceux-ci dans une finalité
précise.
En résumé, l’architecture du système est dictée par la réponse au problème
(i.e. la fonction du système).

- La programmation orientée objet

La programmation orientée objet (P.O.O) est fondée sur le concept objet, à


savoir une association des données et des procédures (qu’on appelle
méthodes) agissant sur ces données. Par analogie avec l’équation de Wirth, on
pourrait dire que l’équation de la P.O.O est : méthodes + données = objet.

En P.O.O, un programme est une société d’entités. Lors de son exécution, les
entités collaborent pour résoudre le problème final en s’envoyant des
messages.
Un objet est une collection de variables sans organisation implicite. Les
variables d’un objet sont simplement des membres de l’objet. On désigne les
membres d’un objet par leur nom. Par exemple :

Outre la notion d’objet, la P.O.O est caractérisée par les notions de classe,
héritage, encapsulation et de polymorphisme. Toutes ces caractéristiques sont
bien développées dans le langage orienté objet tel que C++, Java, Vbasic, Visual
Dbase etc.

1.3.2 L’approche orientée objet


L’approche orientée objet considère le logiciel comme une collection d’objets
dissociés, identifiés et possédant des caractéristiques. Une caractéristique est
soit un attribut (i.e. une donnée caractérisant l’état de l’objet), soit une entité
comportementale de l’objet (i.e. une fonction). La fonctionnalité du logiciel
émerge alors de l’interaction entre les différents objets qui le constituent.
71

L’une des particularités de cette approche est qu’elle rapproche les données et
leurs traitements associés au sein d’un unique objet.
Comme nous venons de le dire, un objet est caractérisé par plusieurs notions :
L’identité –
L’objet possède une identité, qui permet de le distinguer des autres
objets, indépendamment de son état. On construit généralement cette
identité grâce à un identifiant découlant naturellement du problème (par
exemple un produit pourra être repéré par un code, une voiture par un
numéro de série, etc.)
Les attributs –
Il s’agit des données caractérisant l’objet. Ce sont des variables stockant
des informations sur l’état de l’objet.
Les méthodes –
Les méthodes d’un objet caractérisent son comportement, c’est-à-dire
l’ensemble des actions (appelées opérations) que l’objet est à même de
réaliser. Ces opérations permettent de faire réagir l’objet aux
sollicitations extérieures (ou d’agir sur les autres objets). De plus, les
opérations sont étroitement liées aux attributs, car leurs actions peuvent
dépendre des valeurs des attributs, ou bien les modifier.
La difficulté de cette modélisation consiste à créer une représentation
abstraite, sous forme d’objets, d’entités ayant une existence matérielle (chien,
voiture, ampoule, personne, …) ou bien virtuelle (client, temps, …).
La Conception Orientée Objet (COO) est la méthode qui conduit à des
architectures logicielles fondées sur les objets du système, plutôt que sur la
fonction qu’il est censé réaliser.
En résumé, l’architecture du système est dictée par la structure du problème.

1.3.3 Approche fonctionnelle vs. Approche objet


Selon la thèse de Church-Turing, tout langage de programmation non trivial
équivaut à une machine de Turing. Il en résulte que tout programme qu’il est
possible d’écrire dans un langage pourrait également être écrit dans n’importe
quel autre langage. Ainsi, tout ce que l’on fait avec un langage de
programmation par objets pourrait être fait en programmation impérative. La
différence entre une approche fonctionnelle et une approche objet n’est donc
pas d’ordre logique, mais pratique.
L’approche structurée privilégie la fonction comme moyen d’organisation du
logiciel. Ce n’est pas pour cette raison que l’approche objet est une approche
72

non fonctionnelle. En effet, les méthodes d’un objet sont des fonctions. Ce qui
différencie sur le fond l’approche objet de l’approche fonctionnelle, c’est que
les fonctions obtenues à l’issue de la mise en œuvre de l’une ou l’autre
méthode sont distinctes. L’approche objet est une approche orientée donnée.
Dans cette approche, les fonctions se déduisent d’un regroupement de champs
de données formant une entité cohérente, logique, tangible et surtout stable
quant au problème traité. L’approche structurée classique privilégie une
organisation des données postérieure à la découverte des grandes, puis petites
fonctions qui les décomposent, l’ensemble constituant les services qui
répondent aux besoins.
En approche objet, l’évolution des besoins aura le plus souvent tendance à se
présenter comme un changement de l’interaction des objets. S’il faut apporter
une modification aux données, seul l’objet incriminé (encapsulant cette
donnée) sera modifié. Toutes les fonctions à modifier sont bien identifiées :
elles se trouvent dans ce même objet : ce sont ses méthodes. Dans une
approche structurée, l’évolution des besoins entraîne souvent une
dégénérescence, ou une profonde remise en question, car la décomposition
des unités de traitement (du programme principal aux sous-fonctions) est
directement dictée par ces besoins. D’autre part, une modification des données
entraîne généralement une modification d’un nombre important de fonctions
éparpillées et difficiles à identifier dans la hiérarchie de cette décomposition.
En fait, la modularité n’est pas antinomique de l’approche structurée. Les
modules résultant de la décomposition objet sont tout simplement différents
de ceux émanant de l’approche structurée. Les unités de traitement sont
initialement bons. C’est leur résistance au temps, contrairement aux modules
objet, qui est source de problème. La structure d’un logiciel issue d’une
approche structurée est beaucoup moins malléable, adaptable, que celle issue
d’une approche objet.
Ainsi la technologie objet est la conséquence ultime de la modularisation du
logiciel, démarche qui vise à maîtriser sa production et son évolution. Mais
malgré cette continuité logique les langages objet ont apporté en pratique un
profond changement dans l’art de la programmation : ils impliquent en effet un
changement de l’attitude mentale du programmeur.
73

1.3.4 Concepts importants de l’approche objet


Nous avons dit plus haut que l’approche objet rapproche les données et leurs
traitements. Mais cette approche ne fait pas que ça, d’autres concepts
importants sont spécifiques à cette approche et participent à la qualité du
logiciel.

Notion de classe
Tout d’abord, introduisons la notion de classe. Une classe est un type de
données abstrait qui précise des caractéristiques (attributs et méthodes)
communes à toute une famille d’objets et qui permet de créer (instancier) des
objets possédant ces caractéristiques. Les autres concepts importants qu’il
nous faut maintenant introduire sont l’encapsulation, l’héritage et l’agrégation.

Encapsulation
L’encapsulation consiste à masquer les détails d’implémentation d’un objet, en
définissant une interface. L’interface est la vue externe d’un objet, elle définit
les services accessibles (offerts) aux utilisateurs de l’objet.
L’encapsulation facilite l’évolution d’une application car elle stabilise
l’utilisation des objets : on peut modifier l’implémentation des attributs d’un
objet sans modifier son interface, et donc la façon dont l’objet est utilisé.
L’encapsulation garantit l’intégrité des données, car elle permet d’interdire, ou
de restreindre, l’accès direct aux attributs des objets.

Héritage, Spécialisation, Généralisation et Polymorphisme


L’héritage est un mécanisme de transmission des caractéristiques d’une classe
(ses attributs et méthodes) vers une sous-classe. Une classe peut être
spécialisée en d’autres classes, afin d’y ajouter des caractéristiques spécifiques
ou d’en adapter certaines. Plusieurs classes peuvent être généralisées en une
classe qui les factorise, afin de regrouper les caractéristiques communes d’un
ensemble de classes.
Ainsi, la spécialisation et la généralisation permettent de construire des
hiérarchies de classes. L’héritage peut être simple ou multiple. L’héritage évite
la duplication et encourage la réutilisation.
74

Le polymorphisme représente la faculté d’une méthode à pouvoir s’appliquer à


des objets de classes différentes. Le polymorphisme augmente la généricité, et
donc la qualité, du code.

Agrégation
Il s’agit d’une relation entre deux classes, spécifiant que les objets d’une classe
sont des composants de l’autre classe. Une relation d’agrégation permet donc
de définir des objets composés d’autres objets. L’agrégation permet donc
d’assembler des objets de base, afin de construire des objets plus complexes.

1.3.5 Historique la programmation par objets


Les premiers langages de programmation qui ont utilisé des objets sont Simula
I (1961-64) et Simula 67 (1967), conçus par les informaticiens norvégiens Ole-
Johan Dahl et Kristan Nygaard. Simula 67 contenait déjà les objets, les classes,
l’héritage, l’encapsulation, etc.
Alan Kay, du PARC de Xerox, avait utilisé Simula dans les années 1960. Il réalisa
en 1976 Smalltalk qui reste, aux yeux de certains programmeurs, le meilleur
langage de programmation par objets.
Bjarne Stroustrup a mis au point C++, une extension du langage C permettant la
programmation orientée objets, aux Bell Labs d’AT&T en 1982. C++ deviendra
le langage le plus utilisé par les programmeurs professionnels. Il arrivera à
maturation en 1986, sa standardisation ANSI / ISO date de 1997.
Java est lancé par Sun en 1995. Comme il présente plus de sécurité que C++, il
deviendra le langage favori de certains programmeurs professionnels.

6.7 LA DESCRIPTION DE L’ALGORITHME

L’algorithme de façon simpliste est une manière de tout prévoir. Comme dit,
précédemment, il est indépendant du langage de programmation et de
75

l’ordinateur. Pour le décrire, on peut recourir à plusieurs formalismes. Dans ce


cours nous allons en développer deux et cela de façon parallèle. Il s’agit de :

a) langage de description d’algorithme (pseudo code) ;


b) l’ordinogramme.

Le langage de description d’algorithme (LDA) est un ensemble de mots (verbes


et expressions) et l’ordinogramme est un schéma pour représenter
l’algorithme.

6.7.1. Les symboles utilisés en ordinogramme

Traitement (calcul, affectation) entrée - sortie

Test (pour prendre une décision) Début - fin

Disque dur (mémoire de masse)

Renvoi

Entrée - sortie
76

6.7.2. Les structures de base en programmation

a) La séquentialité

L’ordinateur est une machine séquentielle. Ce qui signifie que les instructions
sont exécutées :
- une à la fois
- dans l’ordre où elles apparaissent dans le texte du programme.

a.1) Les instructions de lecture (entrée)

Elles sont notées lire variables et signifient la saisie des données, c’est-à-dire la
communication des données à l’ordinateur.
Exemple : Lire quantité
Lire résultat

a.2) Les instructions d’écriture (sortie).

Elles sont notées écrire expression, écrire variable. Elles indiquent l’affichage
ou l’impression d’un message et / ou du contenu d’une variable ou du résultat
d’un calcul.

Exemple : Ecrire « introduire la quantité achetée »


Ecrire « le montant dû est de : «, montant
Ecrire résultat
Ecrire x, y, (x +y) / 2

a.3) Les instructions d’assignation (affectation ou transfert)

Représentée par variable  expression, cette instruction sert à assigner une


valeur ou une expression à une valeur.
77

Exemple : x  4 cette instruction signifie pour l’ordinateur, ranger la


valeur 4 à la place x. Le nom de la variable correspond à la place qui lui est
réservée (adresse).

A0
I  I+1
Montant  quantité * prix_unitaire

Dans une instruction d’assignation, le type d’expression (membre de droite)


doit correspondre au type de la variable de destination (peut recevoir une
valeur entière.

Action Effet

A 5 la valeur 5 est placée dans la zone A


B 8 la valeur 8 est placée dans la zone B
A B le contenu de B (8) est placé dans A qui
voit en même temps son premier contenu disparaître. Donc on aura dans A la
valeur 8 et dans B la valeur 8.

b) Les choix ou test

La sélection ou le choix est une structure qui permet de tester une condition et
d’exécuter un traitement en cas de satisfaction de la condition.
Nous distinguons deux sortes de sélection :

b.1. La sélection simple

Si condition alors traitement(s)


Sinon traitement(s)
Fsi

Exemple :

si point >= 50 alors écrire « il passe de classe »


Sinon écrire « il reprend l’année »
Fsi
78

b.2 La sélection multiple

Selon que condition traitement1


Ou que condition traitement2
Ou que condition traitement3
Ou que condition traitement4
…………
Autrement traitement n
Fselon que

Selon que point >= 90 écrire « la plus grande distinction »


Ou que point >= 80 et <90 écrire « grande distinction »
Ou que point >=70 et < 80 écrire « distinction »
Ou que point >=60 et <70 écrire « satisfaction »
Autrement écrire « ajourné ».
Fselon que

C. La boucle

Cette structure permet d’exécuter plusieurs fois un traitement. Elle nécessite la


fixation d’une condition d’arrêt de la boucle. Il y a 3 sortes de boucle :

C.1. tant que … condition faire


Traitement(s)
Ftant que

Exemple :

Tant que not (compteur =10) faire


Compteur  compteur + 1
Ftant que
Cette boucle pré-testée contrôle d’abord la condition avant l’exécution du
traitement.

C.2 répéter
traitement(s)
79

jusqu’à condition

Cette boucle post-testée exécute d’abord le traitement et contrôle la condition


après. Ainsi, cette boucle exécute au moins une fois le traitement.

Exemple : répéter
Compteur  compteur + 1
Jusqu’à compteur = 10.

C.3 pour variable de … à … faire

fpour

Exemple :

pour compteur de 1 à 10 faire


KK+1
fpour

Les boucles tant que et répéter sont utilisées lorsqu’on ne connaît pas d’avance
le nombre de fois que la boucle va tourner. Tandis que la boucle pour est
employée quand on connait d’avance le nombre de tours. Elle est souvent
utilisée dans le traitement des tables (vecteur et matrice).

6.7.3. La déclaration des variables et constantes

Une variable est une zone mémoire portant un nom appelé identifiant et dont
la valeur peut changer en cours d’exécution du programme. Chaque variable
doit être déclarée de façon individuelle avant de figurer dans un programme.
Une variable est associée à un type de donnée.

Exemple : entier A …… A est une variable de type entier.


Réel B …… .B est une variable de type réel.
Entier C …….C est une variable de type entier.
Car D …… D est une variable de type caractère.
Bool E ……E est une variable de type logique ou booléen.
80

A  40 C  15

Un type n’a pas d’existence physique. C’est une définition d’un ensemble des
propriétés. Donc, selon l’information que l’on souhaite manipuler, il est
essentiel de choisir son type. Cela induit ce qui suit :

a) le code de représentation binaire approprié pour conserver cette


information en mémoire d’ordinateur ;

A titre d’exemple, la valeur entière 40 qui se trouve dans la variable A, dans


une représentation binaire, aura 101000 et prendra en mémoire 6 bits
significatifs. La valeur entière qui se trouve dans C se représente en binaire par
1111 et occupera 4 bits significatifs. L’opération A  A – C donnera
40 – 15 = 25, c’est-à-dire 101000 – 1111 = 11001.
b) l’interprétation de ce code pour établir la correspondance entre langage
et la représentation informatique ;
c) les opérations autorisées sur l’information : par exemple, les types entier
et réel sont utilisés pour effectuer des calculs. Dans ce registre il faut
signaler qu’une variable de type entier ne peut que recevoir des nombres
entiers. Tandis qu’une variable de type réel peut recevoir les nombres
entiers et les nombres décimaux.

Exemple : A  40 (bon) A  5,5 (mauvais)


B  40 (bon) B  5,5 (bon)

Une constante est une zone mémoire portant un nom appelé identifiant et
dont le contenu ne varie pas pendant le déroulement du programme. Une
constante doit être déclarée avant d’être utilisée dans le programme. A cette
occasion une valeur lui est attribuée de façon définitive.

Une constante sert au paramétrage du programme. Paramétrer un


programme, c’est éviter le plus possible les valeurs numériques dans le corps
du programme et les regrouper dans la zone de définition notamment aux
constantes. Ainsi, si on veut modifier le paramètre, on change seulement la
valeur au niveau de constante.

Remarque : Pour nommer les variables et les constantes, il est souhaitable


d’employer des noms porteurs de signification. Par exemple la variable « qté
« fait penser à la quantité et la variable « pu » nous fait penser au prix unitaire.
81

6.7.4. Etude des cas

Cas 1.

On demande de lire deux nombres entiers A et B, et d’afficher en sortie leur


somme, produit, différence et quotient

Début
Entier a, b, som, reste, quot, prod
Lire a, b
Som  a + b
Reste  a – b
Quot  a / b
Prod  a * b

Ecrire som, reste, quot, prod


Fin.

Cas 2.

On demande de lire deux nombres entiers A et B positifs et d’afficher en sortie


leur produit et leur quotient sans utiliser les opérateurs * et /.

Début
Entier A, B, prod, quot, cpt
Lire A, B
(* calcul de produit en utilisant la boucle
Tant que not (cpt = B) faire
Prod  prod + A
Cpt  cpt + 1
Ftantque
Écrire prod
(*calcul du quotient en utilisant la boucle

Cpt  0
Tant que not (A<B) faire
AA–B
82

Cpt  Cpt + 1
Ftantque
Ecrire Cpt.
Fin

Cas 3.

On demande de lire deux nombres entiers positifs A et B. En sortie, il faut


trouver et afficher le PGCD de ces deux nombres.

(Première solution)

Début
Entier A, B, résultat
Lire A, B
Tant que not (A = B) faire
Si A > B alors A  A – B
Sinon B  B – A
Fsi
Ftant que
Ecrire « le pgcd de ces deux nombres = « A
Fin

(deuxième solution)

Début
Entier A, B, M, N, R, PGCD
Lire A, B
MA
NB
Tant que not (N = 0) faire
R  M mod N
MN
N R
Ftant que
Pgcd  M
Ecrire PGCD
Fin
83

Exercice sur les compteurs et les accumulateurs

Un compteur est une variable qui par incrémentation permet de compter le


nombre de fois, des objets, des individus etc. Par exemple, si on demande de
compter le nombre des étudiants dans une classe. Dans le pseudo code, on
utilise la formule suivante :
compteur  compteur + 1
AA+1

Cas 4

On demande de lire une série de 10 nombres entiers positifs puis de calculer et


d’afficher leur moyenne arithmétique.

Début
entier nbre, cpt, moy
tant que not (cpt = 10) faire
lire nbre
moy  moy + nbre
cpt  cpt + 1
ftant que
moy  moy / Cpt
écrire moy
Fin

Cas 5

On demande de lire une série de 10 nombres entiers positifs puis déterminer


combien des nombres pairs et des nombres impairs ont été saisis.

Début
entier nbre, cpt, pair, impair
tant que not (cpt = 10) faire
lire nbre
nbre  nbre mod 2
si nbre = 0 alors pair  pair + 1
sinon impair  impair + 1
fsi
cpt  cpt + 1
84

ftant que
écrire « le nombre des nombres pairs = « pair
écrire « le nombre des nombres impairs = « impair
Fin

Exercice sur la recherche de plus grand de deux ou trois nombres

On demande de lire deux nombres entiers positifs A et B puis déterminer le


plus grand de ces nombres.

Début
entier a, b
lire a, b
si a > b alors écrire « le plus grand est : « a
sinon écrire « le grand est : « b
fsi
Fin

Cas 7

On demande de lire trois nombres entiers positifs A, B et C, puis déterminer le


plus grand de ces nombres.

Début
entier a, b, c, max
lire a, b, c
si a > b alors max  a
sinon max  b
fsi
si c > max alors max  c
fsi
écrire max
Fin

(Deuxième solution)
Début
entier a, b, c, max
lire a, b, c
85

selon que (a > b) et (a > c) max  a


écrire max
ou que (b > a) et (b > c) max  b
écrire max
autrement Max  C
Ecrire Max
Fselon que
Fin
Cas 8 : exercice sur l’interversion des nombres

On demande de lire trois nombres entiers positifs a, b, c, puis les afficher en


ordre croissant, c’est-à-dire le plus petit, le moyen et le plus grand.

Début
entier a, b, c, sauve
lire a, b, c
si a < b alors sauve  a
ab
b sauve
fsi
si a < c alors sauve  a
a c
c  sauve
fsi
si b < c alors sauve  b
b c
c sauve
fsi
écrire a, b, c
Fin

Cas 9 : Calcul de l’amortissement

Voyons un peu comment calculer l’amortissement annuel d’un bien qui se


déprécie avec le temps (par exemple, un immeuble, des machines, etc.). Il
existe trois méthodes pour calculer l’amortissement : linéaire, dégressif à taux
constant et dégressif à taux variable. Dans le cadre de ce cours, nous voulons
86

écrire un algorithme nous permettant de sélectionner n’importe laquelle de ces


méthodes pour chaque jeu de calculs.

Les calculs commencent par la lecture de la valeur originale (non dépréciée) de


l’élément, sa durée de vie, c’est-à-dire le nombre d’années couvertes par
l’amortissement, ainsi qu’un entier indiquant la méthode retenue. On calcule
ensuite l’amortissement annuel et le solde (non amorti) pour chaque année.

La méthode de l’amortissement linéaire est la plus facile (nombre total


d’années) : le quotient correspond au montant de l’amortissement annuel. Par
exemple, si on amortit en 10 ans un bien qui coûte 8.000 $, l’amortissement
annuel équivaut à 8.000 $ / 10 = 800 $, de sorte que le bien se déprécie de 800
$ chaque année. Dans ce cas, on constate que l’amortissement annuel
demeure le même d’année en année.

Avec la méthode de l’amortissement décroissant à taux constant, la valeur du


bien décroît d’un pourcentage constant chaque année. (Donc le montant
effectif de l’amortissement varie d’une année à l’autre). Pour obtenir le facteur
d’amortissement, nous divisons 2 par la durée de vie du bien. On multiplie ce
facteur par la valeur du bien au début de chaque année (et non pas la valeur
d’origine du bien). Ce qui donne l’amortissement annuel.

Supposons, par exemple, que nous voulons calculer l’amortissement d’un bien
qui a coûté 8000 $ et dont la durée de vie s’élève à 10 ans, avec la méthode de
l’amortissement décroissant à taux constant. Le facteur d’amortissement est
2/10 = 0,20. L’amortissement pour la première année se calcule comme suit :
0,20 x 8000 $ = 1600 $. Celui de la deuxième année est de : 0,20 x (8000 $ -
1600 $) = 0,20 x 6400 $ = 1280 $ ; pour la troisième année, nous avons : 0,20 x
5120 $ = 1024 $ et ainsi de suite.

Avec la méthode d’amortissement dégressif à taux variable, la valeur du bien


décroît d’un pourcentage qui est différent à chaque année. Le facteur
d’amortissement est une fraction dont le dénominateur correspond à la
somme des chiffres de 1 à n, où n représente la durée de vie de l’élément.
Pour une durée de vie de 10 ans, le dénominateur devient :
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
Pour la première année, le numérateur est n, pour la deuxième année, ce sera
(n - 1), pour la troisième année (n - 2) et ainsi de suite. On obtient
l’amortissement annuel en multipliant le facteur d’amortissement par la valeur
originale du bien.
87

A titre d’exemple, reprenons le bien d’une valeur initiale de 8000 $ avec une
durée de 10 ans. L’amortissement pour la première année sera de
(10 / 55) x 8000 $ = 1454,55 $ ; pour la seconde année : (9 / 55) x 8000 $ =
1309,09 $ et ainsi de suite.

L’algorithme qui permet de résoudre ce problème est le suivant :

Val : c’est la valeur du bien.


Org : c’est la valeur originale du bien, c’est-à-dire la valeur originale de Val.
Amort : c’est l’amortissement annuel
N : c’est le nombre d’années pendant lesquelles on fait l’amortissement
Cpt : c’est un compteur
Choix : c’est un entier qui indique la méthode utilisée
Drapeau : c’est variable booléenne

Début
Entier val, org, amort, n, cpt, choix
Bool drapeau

(* initialisation de drapeau
Drapeau  vrai

Répéter
Lire choix
Si choix <> 4 alors lire val
Lire n
Fsi
Selon que choix = 1 (*méthode linéaire)
Amort = val / n
pour cpt de 1 à n faire
Val = val – amort
Ecrire cpt, amort, val
Fpour

Ou que choix = 2 (*méthode amortissement décroissant à taux constant)

Pour cpt de 1 à n faire


88

Amort  2 * val / n
Val  val- amort
Ecrire cpt, amort, val
Fpour

Ou que choix = 3 (*méthode d’amortissement dégressif à taux variable)


Org  val
Pour cpt de 1 à n faire
Amort  (n- cpt+1) * org / (n * (n+1) / 2)
Val  val – amort
Ecrire cpt, amort, val
Fpour
Autrement
Drapeau  faux
Ecrire « fin du programme et au revoir «
Jusqu’à drapeau = faux
Fin

Cas 10 : exercices d’application à faire seul à domicile

- Lire le côté d’un carré puis calculer et afficher la surface


- Lire la longueur et la largeur d’un rectangle puis calculer et afficher le
périmètre et la surface de ce rectangle.

-
lire les coefficients de l’équation du second degré ax2 + bx + c puis calculer
et afficher les racines de cette équation.

- Déterminer si un triangle est rectangle, connaissant la longueur des 3 côtés

- Dans une promotion de 100 étudiants, on demande de lire une série des 5
cotes obtenues par chaque étudiant à la session d’examen. Le maximum de
chaque cours est de 20 points. Calculer et afficher les nombres d’étudiants
qui ont obtenu :
a) la plus grande distinction
b) la grande distinction
c) la distinction
d) la satisfaction
e) la mention ajourné
f) la mention refusé.
89

- Ecrire un algorithme qui permet de faire la table de multiplication par 10.

6.7.5. Notion de modularité

On peut écrire aisément des programmes sous une forme modulaire,


permettant ainsi la décomposition d’un problème global en une séquence de
sous-programmes individuels. La modularisation offre des avantages
importants :

Tout d’abord, elle épargne la programmation redondante (répétée) du même


jeu d’instructions, pour les tâches à exécuter plus d’une fois. De plus, le recours
au module de programme réduit de façon appréciable la longueur d’un
programme.
Il faut aussi retenir la clarté logique résultant de la décomposition d’un
programme en modules individuels et concis. De tels programmes sont faciles à
écrire et à déboguer. On distingue généralement deux types de module, à
savoir la procédure et la fonction.

6.7.6. Les procédures

Une procédure ou sous-routine est une structure de programme autonome


incluse dans un programme global. On peut référencer une procédure
simplement en écrivant son nom. Quand une procédure est appelée, le
contrôle se trouve automatiquement transféré au début de la procédure. Les
instructions d’action à l’intérieur de la procédure s’exécutent ensuite, prenant
en considération toute déclaration spéciale propre à la procédure. Quand
toutes les instructions d’action ont été exécutées, le contrôle retourne
automatiquement à l’instruction qui immédiatement l’instruction d’appel à la
procédure.
Exemple :

Début
Entier a, b, c
Procédure maximum
début
Entier max
Si a > b alors max  a
90

Sinon max  b
Fsi
Si c > max alors max  c
Fsi
Ecrire max
Fin
(* appel de la procédure)
Lire a, b, c
Tant que not (a = 0) faire
Maximum
Lire a, b, c
Ftant que

Cet algorithme contient une procédure appelée maximum. Les variables a, b et


c sont déclarées à l’extérieur de cette procédure.

VIII. Notion de fichier

a) Définition

Jusqu’ici on lisait les données à partir du clavier. Cela nous obligeait à taper
plusieurs fois les données, une fois obtenu le résultat des premières données.
Pour éviter cela, nous allons recourir au fichier.

Un fichier est une collection homogène des données. En ce sens, chaque fichier
porte sur un objet bien déterminé : fichier client, fichier produit, fichier vente,
fichier commande, fichier facture, fichier agents, fichier étudiants etc. Donc les
informations qui se trouvent dans un fichier donné se rapportent à son objet.
On le définit aussi comme un ensemble d’enregistrements. La notion de fichier
est intimement liée au support sur lequel il est enregistré. Ainsi, on parle de
fichier physique et de fichier logique. Le premier se réfère au support physique
et le second se rapporte à la copie qui est transférée dans la mémoire centrale
pour être traité par le programme.

Les données dans un fichier sont organisées soit séquentiellement, soit en


accès direct, soit encore de façon indexée séquentielle. Dans l’organisation
séquentielle, les données sont traitées les unes après les autres, c’est-à-dire
selon l’ordre de leur enregistrement sur le support. Ce type d’organisation est
simple à faire, mais prend beaucoup de temps lorsqu’il est question de
91

retrouver une information dont on a besoin. Pour corriger cette faiblesse, on


recourt à l’organisation à accès direct. Ici les données sont retrouvées grâce
aux adresses.

Un fichier est un ensemble d’enregistrements, avons-nous dit et un


enregistrement est un ensemble de zones ou champs. Dans un fichier, une
zone est utilisé comme identifiant ou clé. On la souligne pour la distinguer des
autres zones.

Exemple : Fichier étudiant : {num, nom, sexe, nation, promotion, adresse}

La zone num est l’identifiant. Notons que chaque zone a un type de données à
recevoir. Dans cet exemple, toutes les zones sont de type chaîne.

Fichier commande : {num_cde, date, produit, qte}

La zone num_cde est l’identifiant. La zone qté est de type entier.


L’ensemble des zones forme la structure du fichier.

b) Traitement du fichier

Un fichier doit être ouvert avant son traitement et fermé après celui-ci. Pour
accéder aux données du fichier, on doit le lire. En informatique, on peut
imprimer les données d’un fichier, les visualiser, faire une recherche, faire une
mise à jour des données. Dans ce cours, il est question d’écrire des algorithmes
pour des traitements simples du fichier.

Quelques exercices sur le fichier.

Cas 12.

Soit en entrée, un fichier séquentiel appelé « nombre » dont la structure est la


suivante : {num, Nbre1, Nbre2}. Ce fichier contient des entiers positifs Nbre1 et
Nbre2. En sortie, on demande trouver le PPCM de Nbre1 et Nbre2 pour chaque
enregistrement.

NB : le PPCM de 2 nombres est le quotient du produit de ces 2 nombres par


leur PGCD. (PPCM = Nbre1 * Nbre2 / PGCD de Nbre1 et Nbre2)
92

Début
Fichier nombre des enregistrements
Entier A, B, PGCD, PPCM, Produit
Ouvrir nombre
Lire enregistrement dans nombre
Tant que not eof de nombre faire
A  Nbre1
B  Nbre2
Produit  A * B
Tant que not (A = B) faire
Si A > B alors A  A – B
Sinon B  B – A
Fsi
Ftant que
PPCM  Produit / A
Ecrire « le PPCM de « Nbre1 « et « Nbre2 « = » PPCM
Lire enregistrement dans nombre
Ftant que
Fermer nombre
Fin

Cas 13.

Soit un fichier séquentiel appelé « vente » dont la structure est la suivante :


{num, produit, qtév, pu}. En sortie, on demande de calculer le montant total de
toutes les ventes réalisées.

Début
Fichier vente des enregistrements
Entier montant_partiel, montant_total
Ouvrir vente
Lire enregistrement dans vente
Tant que not eof de vente faire
montant_partiel  qtev * pu
montant_total  montant_total + montant_partiel
Lire enregistrement dans vente
93

Ftant que
Ecrire montant_total
Fermer vente
Fin

Cas 14.

Soit un fichier séquentiel appelé « client » et structuré de la manière


suivante :
{num-cl, nom, produit, qte, pu}. En sortie, on demande d’imprimer le listing
reprenant pour chaque client les données suivantes :
{N° d’ordre, nom, mont, rabais, net à payer}

Règle de gestion : le rabais de 2% est accordé au montant supérieur à 50.000


FC. Et le net à payer est la différence entre le montant et le rabais

Début
Fichier vente des enregistrements
Entier cpt
Réel rabais, mont, net
Chaine noms
Ouvrir vente
Lire enregistrement dans vente
Tant que not eof de vente faire
Mont  qte * pu
Si mont > 50.000 alors rabais  mont * 0.02
Sinon rabais  0
fsi
net  mont – rabais
cpt  cpt + 1
noms  nom
Ecrire cpt, noms, mont, rabais, net
Lire enregistrement dans vente
Ftant que

Fermer vente
Fin
94

6.7.7 NOTION DE TABLE

La table est un regroupement des données de même type disposées en ligne et


en colonne auxquelles il est facile de se référer. En programmation, la table est
une structure interne, c’est-à-dire qu’elle est déclarée comme un ensemble des
variables mémoires contiguës.

Etant une structure interne, la table offre un traitement plus rapide que le
fichier. En ce sens, les données étant toutes chargées dans la table en mémoire
centrale sont traitées rapidement, ce contrairement au fichier où l’on doit par
le biais de l’instruction de lecture, faire un va et vient entre la mémoire externe
et la mémoire interne.

a) Les dimensions de table

La table à une dimension s’appelle aussi vecteur. Pour référencer chaque


élément du vecteur on se sert d’un indice qui est en fait une variable. La table
ci-dessus s’appelle « A » et a une taille de 6 éléments qui sont des entiers
positifs.

A [1..5] des entiers


La variable i est l’indice de la table

A [1] contient la valeur 3


A [3] contient la valeur 198

Au lieu décrire ainsi, on peut recourir à l’indice i. Ainsi A [i]

3 9 198 67 5 88

La table à deux dimensions s’appelle tableau ou matrice. Pour référencer


chaque élément de matrice on se sert de deux indices. Le premier se rapporte à
la ligne et le second à la colonne. Cette matrice ci-dessous s’appelle « tab » et
elle a 4 lignes et 7 colonnes. Elle a deux indices, i pour la ligne et j pour colonne.
95

Tab [i, j]

23 78 90 76 112 65 44
45 27 345 23 345 33 32
56 11 100 41 12 22 51
98 90 287 9 14 55 72
Tab [i, j] fait référence à la ligne 4 et à la colonne 5, si i = 4 et j = 5. Il s’agit de
l’élément 14.

Exercices sur la table


Cas 15

Soit dans la mémoire centrale un vecteur A de 10 éléments. On demande de le


charger des entiers positifs tout d’abord et ensuite de calculer et afficher la
somme de tous éléments du vecteur.

Début
Vecteur A [1..10] des entiers
Entier i, som, nbre
i0
som  0
nbre  0
(* chargement du vecteur
Pour i de 1 à 10 faire
Lire nbre
A [i]  nbre
Fpour
Pour i de 1 à 10 faire
Som  som + A [i]
Fpour
Ecrire som
Fin

Cas 16
Soit dans la mémoire centrale une matrice « A « de 10 lignes et 10 colonnes,
chargée de nombres entiers positifs. On demande en sortie de calculer et
d’afficher la somme de chaque ligne.
96

Début
Matrice A [1..10, 1..10] des entiers
Entier i, j, som
Pour i de 1 à 10 faire
Pour j de 1 à 10 faire
Som  som + A [i, j]
Fpour
Ecrire som
Som  0
Fpour
Fin

Cas 17

Soit en mémoire centrale une matrice qui s’appelle « tab » de 10 lignes et 10


colonnes, chargée des entiers positifs. On y trace une diagonale qui va de (1,1)
à (10,10). On demande alors de calculer la somme des éléments qui se trouvent
dans la matrice triangulaire supérieure.

Tab [1..10, 1..10]

23 55 88 99 10 54 98 96 12
11
17 23 56 90 76 786 45 987 123

45 12 56 76 5 7 9 122

34 123 111 453 765 123 876

89 354 100 876 900 453

15 54 71 21 34

66 333 765 999

44 77 111
97

33 44

22

Début
Matrice tab [1.. 10, 1..10] des entiers
Entier i, j, som
Pour i de 1 à 10 faire
Pour j de i de 10 faire
Som  som + tab [I, j]
Fpour
Fpour
Ecrire som
Fin
Cas 18
Même énoncé qu’au cas 17. Cependant, on demande de calculer les
éléments qui se trouvent seulement sur la diagonale.

Début
Matrice tab [1..10, 1..10] des entiers
Entier i, som

Pour i de 1 à 10 faire
Som  som + tab [i, i]
Fpour
Ecrire som
Fin

6.8 Exemple de langage de programmation C ++

6.8.1. Présentation

Développé dans les laboratoires d’AT et T Bell au début des années 1980 par
Bjarne Stroustrup, le langage C++ est un langage :
98

- à typage fort,
- compilé
- et orienté objet (pOO c’est-à-dire programmation orientée objet)

Schématiquement : C++ = C + typage fort + objets (classes)

Pour pouvoir être compilé en une séquence binaire exécutable, le code source
doit fournir au compilateur un point d’entrée. Par convention, ce point
d’entrée est en C++ une fonction intitulée main

Compilateur C++

Fichier source ------ traduction ------------ fichier exécutable

Hello.cc commande: C++ hello.cc – O hello hello

#include <iostream>
Void main ( ) 0101010000011111
{ 0111111000001010
Cout << “ hello world ! “ 0010111011111100

<< endl;
}

6.8.2. La structure générale d’un programme C++

Le programme C++ le plus simple et le plus inutile (puisqu’il ne fait rien) est :

Void main ( )
{
}
99

Ce programme va progressivement être enrichi et en particulier, on peut y


ajouter des commentaires, qui en C++ peuvent revêtir deux formes
différentes :

- Commentaires orientés ligne : de la forme « // … «

// Exemple de commentaires orienté ligne,


// C’est-à-dire commentaire délimité à gauche par //
// Seulement (implicitement délimité à droite par
// Le caractère de fin de ligne

- Commentaires orientés bloc : de la forme « /* …. */ »


/* Exemple de commentaire orienté bloc
C’est-à-dire commentaire délimité à gauche et à droite (le commentaire peut
s’étendre sur plusieurs lignes) */

Une version commentée du programme précédent pourrait donc être :

// Exemple de petit programme C++ ne faisant rien


// (Le formatage n’est bien sûr là
// que pour faciliter la lecture)

Void main ( )

{
/*
Corps du programme
(à définir par la suite
*/
}

6.8.3. Les données et les traitements

Comme dans tout langage de programmation évolué, C++ offre la possibilité


de :
a) Définir des données (aspect statique du langage), et
100

b) Mettre en œuvre des traitements (aspect dynamique)

L’aspect orienté objet de C++ va ensuite permettre d’intégrer les données et les
traitements dans une structure unique appelée objet. Cet aspect de chose ne
sera pas développé dans ce cours d’introduction.

Voici un exemple de programme C++

On veut réaliser un programme qui résout une équation du second degré :

Ax2 + b x + c = 0

Pour a, b et c fixés, les solutions réelles d’une telle équation sont :

#include <cmath>
# include <iostream>
Void main ( )
{
Float a (0.0)
Float b (0.0)
Float c (0.0)
Float delta (0.0)

Cin >> a >> b >> c;

Delta = b*b – 4*a*c;


If (delta < 0.0)
{
Cout << “pas de solutions réelles ! “ << endl;
}
Else if (delta = = 0.0)
{
Cout << une solution unique : « << - b / 2* a << endl ;
}
Else
{
Cout << « deux solutions : « ( -b – sqrt (delta)) / 2*a
<< « , « (-b +sqrt (delta)) / 2*a << endl ;
}
}
101

6.8.4. Les variables: definition

Pour pouvoir être utilisée dans un programme C++, une donnée doit être
associée à une variable, c’est-à-dire un élément informatique qui sera manipulé
par le programme. Une variable est décrite à l’aide de trois caractéristiques :

a) Sa valeur littérale : qui permet de définir sa valeur. Par exemple, si la


donnée est un nombre, sa valeur littérale pourra être (selon les
conventions de représentation) : 123, - 18, 3.1415, 2e- 13, Ox3A5.

b) Son identificateur : qui est le nom par lequel la donnée est désignée
dans le programme.

c) Son type : qui correspond à une classification de la donnée.

6.8.4. La déclaration et l’initialisation de variables

Dans les langages fortement typés comme C++, la création d’une variable se
fait à l’aide d’une déclaration, et l’association effective d’une valeur à la
variable créée se fait à l’aide d’une initialisation.

- Les déclarations doivent obligatoirement être faites avant toute utilisation


de la variable ;

- Les initialisations doivent impérativement être faites avant toute utilisation


de la variable.

Pour ce point précis, notons que le compilateur n’interdit pas l’utilisation d’une
variable non initialisée, mais il exclut l’utilisation des variables non déclarées.

En C++, la syntaxe de la déclaration d’une variable est :

< type> <identificateur> ;

Où type est l’identificateur du type de la variable déclarée, et identificateur


est l’identificateur de la variable.
102

Exemple : int i ;
float exemple_de_variable ;

6.8.5. Les principaux types élémentaires définis en C++

Bool : les valeurs logiques « vraie » (true) et « fausse » (false)

Int : les nombres entiers


Long : les nombres entiers
Float : les nombres réels (ce type permet de représenter 7 chiffres)

Double : les nombres réels (ce type permet approximativement quinze


chiffres significatifs pour représenter des nombres réels).

Char : les caractères (alphanumériques)

Un identificateur de variable ou de constante peut être n’importe quelle


séquence composée de lettres, de chiffres ou du caractère souligné « _ », et
débutant par une lettre ou le caractère souligné. Remarquons qu’on ne peut
pas utiliser des mots réservés comme identificateur.

Exemple : X
B5
Tailleur
Nb_etudiants

6.8.6 Les valeurs littérales

. Valeurs littérales de type entier : 1, 34, 89

. Valeurs littérales de type réel : 0.0, 1.23


Remarquons que :
0.123 peut aussi s’écrire .123
12.3e 4 correspond à 12.3 104 (soit 1230000)
12. 3e -4 correspond à 12.3 10-4 (soit 0.00123)

. Valeurs littérales de type caractères : ‘a’ , ‘ ! ‘


103

Il est possible, en C++, d’affecter une valeur à une variable au moment de a


déclaration. La syntaxe de la déclaration – initialisation est :

< type > < identificateur > ( <valeur> ) ;

Où valeur est n’importe quel littéral ou expression du type indiqué.

Exemple :

Int i ( 3 ) ;
Float exemple_de_variable (3.14) ;
Char c (‘ a’) ;
Int j ( i ) ;
Float x ( 2.0 * exemple_de_variable) ;

6.8.7. Les variables et les constantes

En C++, la nature modifiable (variable) ou non modifiable (constante) d’une


donnée peut être définie lors de la déclaration-initialisation, au moyen du mot
réservé const.

Exemple : const int j (2) ;

La constante j de type entier est déclarée, et initialisée à la valeur 2. Cette


valeur ne pourra plus être modifiée par le programme, plus exactement toute
tentative de modification sera rejetée par le compilateur, qui signalera une
erreur.

6.8.8. L’instruction d’affectation

L’instruction d’affectation consiste à attribuer (affecter) une valeur à une


variable.
104

En C++, la syntaxe d’une affectation est :

< identificateur > = <valeur> ;

Où valeur est une valeur littérale ou une expression de même type que la
variable référencée par l’identificateur.

Exemple : i = 3 ;

6.8.9. Les instructions d’entrée / sortie

Les instructions d’entrée – sortie (E/S) permettent les interactions du


programme avec son environnement (extérieur). Les mécanismes d’E/S doivent
en particulier donner au programmeur la possibilité :
a) De prendre en compte, au sein du programme, des données issues de
l’extérieur, comme des informations saisies au clavier ou lues dans des
fichiers.
b) D’afficher des données à l’écran.
c) De sauvegarder les résultats produits pour d’éventuelles réutilisations.

6.8.10. Instruction pour affichage à l’écran

Cout << <expression1> << < expression2> <<….. << <expressionn >

Affiche à l’écran les valeurs des expressions < expressioni >

Les chaînes de caractères doivent être indiquées entre guillemets, tandis que
les caractères simples sont eux indiqués entre apostrophes « ‘ «.

Les valeurs affichées ne sont pas délimitées par défaut (pas d’espaces
séparateurs). Les délimiteurs sont donc à indiquer explicitement par exemple
par ‘ ‘ ou « « .

Exemple 1 :

Int a (1) ;
Cout << ‘ [ ‘ << - a << « , «
105

<< a << ‘ ] ‘ << end ;

Ces instructions produisent comme résultat :

[- 1, 1]

Exemple 2 :
Int i (2);
Float x (3.14);
Cout << « => « << 2 * i +5 << « , « << x << endl;

Le résultat de ces instructions est : => 9, 3.14

Le manipulateur endl représente le retour de ligne. Il permet donc de passer à


la ligne suivante lors de l’affichage.

6.8.11 Instruction pour la lecture au clavier

Cin >> <var1> >> < var2 > >> … >> < var- n> ;

Permet à l’utilisateur de saisir au clavier une liste de valeurs val1, val2,.. valn
qui seront stockées dans les variables < var1>.

Exemple :
Int i ;
Double x ;

L’instruction cin >> i >> x ; permettra de lire au clavier un entier suivi d’un
réel, et affectera l’entier lu à la variable i et le réel à la variable x.

Exemple de programme

#include <iostream>
Void main ( )
106

{
Int i ;
Double x;
Cout << “valeurs pour i et x : “ flush;
Cin >> i >> x ;
Cout << « => « << i << « , « << x << endl ;

Remarque

Pour pouvoir utiliser les instructions d’E/S, il faut inclure, en début de


programme, le fichier header iostream, au moyen de la directive :
# include <iostream>.

Le manipulateur flush permet d’assurer l’affichage de la ligne courante, en


l’absence de saut de ligne.

6.8.12. Les opérateurs et expressions

En plus des instructions, tout langage de programmation fournit des opérateurs


permettant de manipuler les éléments prédéfinis. Les définitions des
opérateurs sont souvent étroitement associées au type des éléments sur
lesquels ils sont capables d’opérer.

Ainsi, les opérateurs arithmétiques ( +, - , / , * , …) sont définis pour les types


numériques (entiers et réels par exemple), les opérateurs logiques ( ! , &&, | | )
sont définis eux (en particulier) pour le type booléen.

Les expressions sont des séquences bien formées combinant (éventuellement à


l’aide de parenthèses) des opérateurs et des arguments (qui peuvent être des
valeurs littérales, des variables ou des expressions).

Par exemple : (2*(13 – 3) / (1 + 4 )) est une expression numérique bien formée,


alors que )3+)5*(- 2 ne l’est pas.

Les opérateurs arithmétiques sont (dans l’ordre de priorité d’évaluation) :


107

* Multiplication

/ Division

% Modulo

+ Addition

- Soustraction

Le modulo est le reste de la division entière.

Du fait que les opérateurs ont non seulement une syntaxe, mais aussi une
définition opératoire, une expression peut être évaluée, c’est-à-dire associée à
la valeur littérale correspondant au résultat de l’expression.
Ainsi, l’évaluation de l’expression (2*(13 – 3) / (1+4) correspond à la valeur
littérale de type entier 4.

Fonctionnement de l’ordre de priorité des opérateurs

(1) (2) (1) (1) (2)


2 * 3 - 21 / 3 % 4 + 5

(2 * 3) - (21 / 3 % 4) + (5)

Exemple d’utilisation d’expression pour l’affectation :

Z = (x + 3 ) % y ;

Z = (3 * x + y) / 10 ;

Z = (x = 3 *y) + 2 ;
108

Remarque : C++ fournit un certain nombre de notations abrégées pour des


affectations particulières

Affectation Notation abrégée

x+=y
x=x+y; x-=y
idem pour (/, *, %, - ) x*=y
x/=y
x%=y

x=x+1 ++x

Affectation – opération Affectation simple

Num + = 3 ; num = num + 3 ;

Val * = num + 4 ; val = val * (num + 4) ;

Res / = div * = div ; res = res / (div = div * div)

6.8.13 Les expressions logiques

Au sens strict, une expression logique (ou une condition) est une expression
booléenne, c’est-à-dire de type booléen) qui peut avoir comme résultat : soit la
valeur « vraie », dans ce cas on dit que la condition est vérifiée, soit la valeur
« fausse », et dans ce cas, la condition n’est pas vérifiée.
109

Des conditions logiques plus complexes peuvent être construites, à l’aide


d’opérateurs spécifiques : les opérateurs de comparaison et les opérateurs
logiques.

Les opérateurs de comparaison, appelés aussi opérateurs relationnels) sont


(dans l’ordre de priorité d’évaluation)

Opérateur opération

< strictement inférieur

<= inférieur ou égal

> strictement supérieur

>= supérieur ou égal

== égalité

!= différence (non-égalité)

Exemple de conditions correspondant à des expressions relationnelles :

(x >= y)

(x +y = = 4)

( ( x > y ) = = (y > z))

Les opérateurs logiques permettent de combiner plusieurs conditions entre


elles.
Selon leur ordre de priorité d’évaluation, ces opérateurs sont repris dans le
tableau ci-après.
110

opérateur Opération
! NON logique (négation)

&& Et logique (conjonction)

|| Ou logique

Exemple de conditions complexes :

a) ((z ! = 0) && (2*(x-y) / z < 3))


b) ((z) && (2*(x-y) / z < 3))
c) ((x >= 0) | | ((x*y > 0) && ! (y*z > 0)))

Remarque : les conditions (a) et (b) sont logiquement équivalentes.

Les opérateurs logiques ET, OU et NON sont définis par les tables de vérités
usuelles.

A B Non A A ET B A OU B
V V F V V
V F F F V

F V V F V
F F V F F

6.8.14. Séquence ou bloc


111

Pour pouvoir être utilisée, les instructions d’un programme C++ doivent être
regroupées en entités appelées séquences d’instructions ou blocs. Ces
séquences sont explicitement délimitées par les accolades « { « et « } « :

{
Int tmp (a) ; // échange du contenu
a=b; // de deux variables
b = tmp ;
}

Par convention, on alignera les accolades l’une sous l’autre, et on indentera la


séquence d’instructions correspondent au bloc.

6.8.15. Branchement conditionnel : if

Le branchement conditionnel est une structure de contrôle qui permet la mise


en œuvre de traitements variables, définis par des conditions d’applications
spécifiques.

La syntaxe générale d’un branchement conditionnel est :

If (<condition>) {<instructions-1 : si condition vérifiée>}


[ else { <instructions-2 : si condition non vérifiée>}]

N.B : la notation […] indique une partie optionnelle.

L’expression <condition> est tout d’abord évaluée. Si la condition est vérifiée,


la séquence d’instructions <instructions-1 :… > est exécutée ; sinon , c’est
l’éventuelle séquence alternative <instructions-2 :.. >, introduite par le mot
réservé else, qui sera exécutée.

Exemple :
If (x ! = 0) {cout << 1/x << endl ;}
Else {cout << « erreur « << endl ;

Il est également possible d’enchaîner plusieurs conditions :


112

If (<condition-1>)
{
<instructions-1 : si condition-1 vérifiée>
}
Else if (<condition-2>)
{
<instructions-2 : si condition-2 vérifiée>
}

Else if (<condition-n>)
{
<instruction-n : si condition-n vérifiée>
}
[ else
{
<instructions par défaut>
}]

L’expression « condition-1 » est tout d’abord évaluée ; si elle est vérifiée, le


bloc « instructions-1 » est exécutée, et les alternatives ne sont pas examinées.
Sinon (condition-1 non vérifiée), c’est l’expression <condition-2) qui est
évaluée, ainsi de suite. Si aucune de N conditions n’est vérifiée, et que la partie
optionnelle else est présente, c’est le bloc « instructions par défaut » associé
qui sera finalement exécuté.

6.8.16. Sélection à choix multiple : switch

La sélection à choix multiple permet parfois de remplacer avantageusement un


enchaînement de branchements conditionnels, en permettant de sélectionner
une instruction en fonction des valeurs possibles d’une expression de type
entier ou caractère.
La syntaxe générale d’une sélection à choix multiple est :

Switch (<expression>)
{
Case <Constante-1> : <instruction-1> ;

Case <constante-n> : <instruction-n> ;
113

[ default : <instructions> ; ]
}
L’expression « expression » est évaluée, puis comparée successivement à
chacune des valeurs <constante » introduites par le mot réservé case. En cas
d’égalité, le bloc (ou l’instruction) associé est exécuté. Dans le cas où il n’y a
aucune « constante » égale à la valeur de l’expression, l’éventuel bloc introduit
par le mot réservé default est exécuté.

Exemple de sélection :

Switch (a + b)

{
Case 0 : a = b ; // exécute seulement lorsque (a+b) vaut 0
break ;
case 2 :
case 3 : b = a ; // lorsque (a + b) vaut 2 ou 3

case 4 :
case 5 : a = 0 ; // lorsque (a + b) vaut 2, 3, 4 ou 5
break ;
default

Remarque :

Lorsque, dans une instruction switch, le contrôle a été effectivement transféré


à une étiquette, l’exécution se poursuit de façon linéaire jusqu’à ce qu’on
rencontre une instruction break. Celle-ci transfère explicitement le contrôle à la
première instruction qui suit le corps du switch. S’il n’existe pas de break, les
case suivant celui vers lequel le programme a été dérouté sont tous exécutés
les uns à la suite des autres.

6.8.17 Les boucles : while

Les boucles permettent la mise en œuvre répétitive d’un traitement, contrôlé à


posteriori ou a priori par une condition de continuation.

La syntaxe de la boucle « repéter « est :


114

Do
{
< actions >
{ while (<conditions>)
Exemple :
Do
{
Cout << « valeur de i (>= 0) : « ;
Cin >> i ;
Cout << « => « << i << endl ;
}
While (i < 0) ;

La syntaxe de la boucle tant que est :

While (<condition>)

{
< actions >
}

Exemple :

While ( x > 0)
{
Cout << x ;
X/=2;
}

La syntaxe générale de la boucle pour est:

For (<initialisation> ; <condition> ; <mise à jour>)

{
<actions>
}
115

Exemple : affichage du carré des nombres entre 0 et 10

For (int i (0) ; i <=10 ; + + i)


{
Cout << i * i << endl ;
}

N.B: il est à noter que la variable de contrôle de la boucle est déclarée et


initialisée dans la boucle for.

Lorsque plusieurs instructions d’initialisation ou de mise à jour sont


nécessaires, elles sont séparées par des virgules (et évaluées de la gauche vers
la droite).

For (int i (0), s (0) ; i < 0 ; s + = i, ++ i)


{
Cout << i << s << endl;
116

Langage JAVA

Les variables et les opérateurs


Une variable est un élément qui stocke des informations de toute sorte en
mémoire : des chiffres, des résultats de calcul, des tableaux, des
renseignements fournis par l'utilisateur. Nous ne pourrons pas programmer
sans variables.

Les différents types de variables

Comment créer des variables dans la mémoire ?

Pour créer une variable , il faut la déclarer.

Une déclaration de variable se fait comme ceci :

<Type de la variable> <Nom de la variable> ;

Cette opération se termine toujours par un point-virgule (_ ; _).


Ensuite, on l'initialise en entrant une valeur.

En Java, nous avons deux types de variables :

Des variables de type simple ou des primitifs ;

Des variables de type complexe ou des objets.

Ce qu'on appelle des types simples ou types primitifs, en Java, ce sont tout
bonnement des nombres entiers, des nombres réels, des booléens ou encore
des caractères.

Les variables de type numérique

- Le type byte (1 octet) peut contenir les entiers entre - 128 et +127.
117

Exemple : byte temperature;

temperature = 64;
- Le type short (2 octets) contient les entiers compris entre -32768 et +32767.

Exemple : short vitesseMax;


vitesseMax = 32000;

- Le type int (4 octets)

Le type long (8 octets) .

Exemple : long anneeLumiere;

anneeLumiere = 9460700000000000;

- Le type float (4 octets) est utilisé pour les nombres avec une virgule flottante.
float pi;
pi = 3.141592653f;

Ou encore :
float nombre;
nombre = 2.0f;

Vous remarquerez que nous ne mettons pas une virgule, mais un point ! Et
vous remarquerez aussi que même si le nombre en question est rond, on écrit
.0 derrière celui-ci, le tout suivi de _ f _.

- Le type double (8 octets) est identique à float, si ce n'est qu'il contient plus de
chiffres derrière la virgule et qu'il n'a pas de suffixe.

double division;
division = 0.333333333333333333333333333333333333333333334;

Nous avons aussi des variables stockant un caractère

- Le type char contient un caractère stocké entre apostrophe.

Exemple : char caractere;


caractere = 'A';
118

Des variables de type booléen.

Le type boolean, lui, ne peut contenir que deux valeurs : true (vrai) ou false
(faux), sans guillemets.

Exemple : boolean question;


question = true;

Des variables de chaîne des caractères

Le type String

Le type String permet de gérer les chaînes de caractères, c'est-à-dire le


stockage de texte.

Il s'agit d'une variable d'un type plus complexe que l'on appelle objet.
:
Exemple String phrase;
phrase = "Institut Supérieur de Commerce";

//Deuxième méthode de déclaration de type String

String str = new String();

str = "Une autre chaîne de caractères";

//La troisième méthode

String string = "Une autre chaîne";

//Et une quatrième méthode

String chaine = new String("INFORMATIQUE");

Attention : String commence par une majuscule ! Et lors de l'initialisation,


on utilise ici des guillemets doubles (_ " " _).
119

Cela a été mentionné plus haut : String n'est pas un type de variable, mais un
objet. Notre variable est un objet, on parle aussi d'une instance : ici, une
instance de la classe String. On te croit sur parole, mais pourquoi

String commence par une majuscule, C'est simple : il s'agit d'une convention de
nommage. En fait, c'est une façon d'appeler nos classes, nos variables, etc. Il
faut que vous essayiez de la respecter au maximum.

Cette convention, la voici :

1.Tous vos noms de classes doivent commencer par une majuscule ;


2.Tous vos noms de variables doivent commencer par une minuscule ;

3. si le nom d'une variable est composé de plusieurs mots, le premier


commence par une minuscule, le ou les autres par une majuscule, et ce, sans
séparation ;

4. Tout ceci sans accentuation

Voici quelques exemples de noms de classes et de variables :


public class Moto { }
public class Mayebo { }
public class BilingaLinga { }

String chaine;
String chaineDeCaracteres;
int nombre;
int nombrePlusGrand;
//...

Remarque très importante : veillez à bien respecter la casse (majuscule et


minuscule), car une déclaration de CHAR à la place de char ou autre chose
provoquera une erreur, tout comme une variable de type string à la place de
String !
Faites donc bien attention lors de vos déclarations de variables. . . Une petite
astuce : on peut très bien compacter les phases de déclaration
et d'initialisation en une seule phase, comme suit:
120

int entier = 32;


float pi = 3.1416f;
char carac = 'z';
String mot = new String("Coucou");
Et lorsque nous avons plusieurs variables d'un même type, nous pouvons
résumer tout ceci à une déclaration :

int nbre1 = 2, nbre2 = 3, nbre3 = 0;


double a=4, b=6, c=7, d=9 ;

Ici, toutes les variables de la première ligne sont des entiers, et toutes sont
initialisées. Et toutes les variables de la deuxième ligne sont des réels (double)
et toutes sont initialisées.

Les opérateurs arithmétiques

_ _ + _ : permet d'additionner deux variables numériques (mais aussi de


concaténer des chaînes de caractères.

_ _ - _ : permet de soustraire deux variables numériques.

_ _ * _ : permet de multiplier deux variables numériques.

_ _ / _ : permet de diviser deux variables numériques (mais je crois que vous


aviez deviné).

_ _ % _ : permet de renvoyer le reste de la division entière de deux variables de


type numérique ; cet opérateur s'appelle le modulo.

Quelques exemples de calcul

int nbre1, nbre2, nbre3; //déclaration des variables


nbre1 = 1 + 3; //nbre1 vaut 4
nbre2 = 2 * 6; //nbre2 vaut 12
nbre3 = nbre2 / nbre1; //nbre3 vaut 3
121

nbre1 = 5 % 2; //nbre1 vaut 1, car 5 = 2 * 2 + 1


nbre2 = 99 % 8; //nbre2 vaut 3, car 99 = 8 * 12 + 3
nbre3 = 6 % 3; //là, nbre3 vaut 0, car il n'y a pas de reste

Ici, nous voyons bien que nous pouvons affecter des résultats d'opérations sur
des nombres à nos variables, mais aussi affecter des résultats d'opérations sur
des variables de même type.
.
int nbre1, nbre2, nbre3; //déclaration des variables
nbre1 = nbre2 = nbre3 = 0; //initialisation
nbre1 = nbre1 + 1; //nbre1 = lui-même, donc 0 + 1 => nbre1 = 1
nbre1 = nbre1 + 1; //nbre1 = 1 (cf. ci-dessus), maintenant, nbre1 = 1 + 1
,! = 2
nbre2 = nbre1; //nbre2 = nbre1 = 2
nbre2 = nbre2 * 2; //nbre2 = 2 => nbre2 = 2 * 2 = 4
nbre3 = nbre2; //nbre3 = nbre2 = 4
nbre3 = nbre3 / nbre3; //nbre3 = 4 / 4 = 1
nbre1 = nbre3; //nbre1 = nbre3 = 1
nbre1 = nbre1 - 1; //nbre1 = 1 - 1 = 0

Et là aussi, il existe une syntaxe qui raccourcit l'écriture de ce genre


d'opérations.
Regardez bien :
nbre1 = nbre1 + 1;
nbre1 += 1;
nbre1++;
++nbre1;
Les trois premières syntaxes correspondent exactement à la même opération.
La troisième sera certainement celle que vous utiliserez le plus, mais elle ne
fonctionne que pour augmenter d'une unité la valeur de nbre1 ! Si vous voulez
augmenter de 2 la valeur d'une variable, utilisez les deux syntaxes précédentes.
On appelle cela l'incrémentation.

La dernière fait la même chose que la troisième, mais il y a une subtilité dont
nous reparlerons dans le chapitre sur les boucles.

Pour la soustraction, la syntaxe est identique :


122

nbre1 = nbre1 - 1;
nbre1 -= 1;
nbre1--;
--nbre1;
Même commentaire que pour l'addition, sauf qu'ici, la troisième syntaxe
s'appelle la décrémentation.

Les raccourcis pour la multiplication fonctionnent de la même manière ;

nbre1 = nbre1 * 2;
nbre1 *= 2;
nbre1 = nbre1 / 2;
nbre1 /= 2;

Très important : on ne peut faire du traitement arithmétique que sur des


variables de même type sous peine de perdre de la précision lors du calcul.
On ne s'amuse pas à diviser un int par un float, ou pire, par un char. Ceci
est valable pour tous les opérateurs arithmétiques et pour tous les types de
variables numériques. Essayez de garder une certaine rigueur pour vos calculs
arithmétiques.

Pour afficher le contenu d'une variable dans la console, appelez l'instruction


System.out.println (maVariable);, ou encore System.out.print (maVariable);.

Nous supposons que nous voudrions aussi mettre du texte en même temps que
vos variables. Rappelons-nous que l'opérateur _ + _ sert aussi d'opérateur de
concaténation, c'est-à-dire qu'il permet de mélanger du texte brut et des
variables.

Voici un exemple d'affichage avec une perte de précision :

double nbre1 = 10, nbre2 = 3;


int resultat = (int)(nbre1 / nbre2);
System.out.println("Le résultat est = " + resultat);

Sachons aussi que nous pouvons tout à fait mettre des opérations dans un
affichage, comme ceci :
123

System.out.print ("Résultat = " + nbre1/nbre2); (le caractère + joue ici le rôle


d'opérateur de concaténation) ; ceci vous permet d'économiser une variable et
par conséquent de la mémoire.

Vous allez constater que le résultat affiché est 3 au lieu de 3.33333333333333.

int resultat = (int)(nbre1 / nbre2);.

Si nous remplaçons la ligne citée ci-dessus par :


int resultat = nbre1 / nbre2;.

Nous constatons que qu'Eclipse ou Netbeans n'aime pas du tout. Pour


comprendre cela, nous devons passer par les les conversions.

Les conversions, ou _ cast _


Comme expliqué plus haut, les variables de type double contiennent plus
d'informations que les variables de type int.

Nous pouvons convertir une variable de type int en type float :

int i = 123;
float j = (float)i;

Nous pouvons convertir une variable de type int en type double :

int en double :
int i = 123;
double j = (double)i;

Et inversement :

double i = 1.23;
double j = 2.9999999;
int k = (int)i; //k vaut 1
k = (int)j; //k vaut 2
124

Ce type de conversion s'appelle une conversion d'ajustement, ou cast de


variable.
Ainsi, nous pouvons passer directement d'un type int à un type double.
L'inverse, cependant, ne se déroulera pas sans une perte de précision. En effet,
comme nous avons pu le constater, lorsque nous castons un double en int, la
valeur de ce double est tronquée, ce qui signifie que l'int en question ne
prendra que la valeur entière du double, quelle que soit celle des décimales.

Pour en revenir à notre problème de tout à l'heure, il est aussi possible de


caster le résultat d'une opération mathématique en la mettant entre _ () _ et
en la précédant du type de cast souhaité. Donc :

double nbre1 = 10, nbre2 = 3;


int resultat = (int)(nbre1 / nbre2);
System.out.println ("Le résultat est = " + resultat);

Voilà qui fonctionne parfaitement. Pour bien faire, nous devrions mettre le
résultat de l'opération en type double.

Et si on fait l'inverse : si nous déclarons deux entiers et que nous mettons le


résultat dans un double ? Voici une possibilité :

int nbre1 = 3, nbre2 = 2;


double resultat = nbre1 / nbre2;
System.out.println("Le résultat est = " + resultat);
Vous aurez 1 comme résultat. Je ne caste pas ici, car un double peut contenir
un int.

En voici une autre :

int nbre1 = 3, nbre2 = 2;


double resultat = (double)(nbre1 / nbre2);
System.out.println("Le résultat est = " + resultat);

Java fait ces opérations dans un certain ordre, il y a


des priorités.
Dans le cas qui nous intéresse, il y a trois opérations :
_ un calcul ;
_ un cast sur le résultat de l'opération ;
125

_ une affectation dans la variable resultat.

Java exécute notre ligne dans cet ordre : Il fait le calcul (ici 3/2), il caste le
résultat en double, puis il l'affecte dans notre variable resultat.

Nous pouvons nous demander sûrement pourquoi nous n’avons pas 1.5. . .
C'est simple : lors de la première opération de Java, la JVM voit un cast à
effectuer, mais sur un résultat de calcul.

La JVM fait ce calcul (division de deux int qui, ici, nous donne 1), puis le cast
(toujours 1), et affecte la valeur à la variable (encore et toujours 1).

Donc, pour avoir un résultat correct, il faudrait caster chaque nombre avant de
faire l'opération, comme suit :

int nbre1 = 3, nbre2 = 2;


double resultat = (double)(nbre1) / (double)(nbre2);
System.out.println("Le résultat est = " + resultat);
//affiche : Le résultat est = 1.5

Comment transformer l'argument d'un type donné, int par exemple, en


String. ?

int i = 12;
String j = new String();
j = j.valueOf(i);

j est donc une variable de type String contenant la chaîne de caractères 12.

Notons que ceci fonctionne aussi avec les autres types numériques. Voyons
maintenant comment faire marche arrière en partant de ce que nous venons
de faire.

int i = 12;
String j = new String();
j = j.valueOf(i);
int k = Integer.valueOf(j).intValue();

Maintenant, la variable k de type int contient le nombre 12.


126

Il existe des équivalents à intValue() pour les autres types numériques :


floatValue(), doubleValue(). . .

Lire les entrées clavier


Afin de rendre nos programmes plus ludiques, il est de bon ton de pouvoir
interagir avec ceux-ci.

La classe Scanner
.
Pour que Java puisse lire ce que vous tapez au clavier, vous allez devoir utiliser
un objet de type Scanner.

Cet objet peut prendre différents paramètres, mais ici nous n'en utiliserons
qu'un : celui qui correspond à l'entrée standard en Java.

Lorsque vous faites System.out.println ();, nous appliquons la


méthode println() sur la sortie standard ; ici, nous allons utiliser l'entrée
standard System.in.

Donc, avant d'indiquer à Java qu'il faut lire ce que nous allons taper au
clavier, nous devrons instancier un objet Scanner.

Scanner sc = new Scanner(System.in);

Remarque : Si nous avons une jolie vague rouge sous le mot Scanner. Cliquons
sur la croix rouge sur la gauche et faites un double-clic sur _ Import 'Scanner'
java.util _. Et là, l'erreur disparaît !

Pour importer la classe Scanner, nous devrions faire cette déclaration de votre
classe suivante :

import java.util.Scanner;

Voilà ce que nous avons fait. Nous avons indiqué à Java où se trouve
127

la classe Scanner. Pour faire ceci, nous devons importer la classe Scanner grâce
à l'instruction import.

La classe que nous voulons se trouve dans le package java.util.


Un package est un ensemble de classes. En fait, c'est un ensemble de dossiers
et de sous-dossiers contenant une ou plusieurs classes.

Importer la classe java.util.Scanner dans Eclipse est très commode.


:
//Ceci importe la classe Scanner du package java.util
import java.util.Scanner;

//Ceci importe toutes les classes du package java.util


import java.util.*;

Comment récupérer ce que l’on a tapé ?


Voici l'instruction pour permettre à Java de récupérer ce que vous avez saisi
pour ensuite l'afficher :

Scanner sc = new Scanner(System.in);


System.out.println("Veuillez saisir un mot :");
String str = sc.nextLine();
System.out.println("Vous avez saisi : " + str);

Notons que pour lire un int, vous devez utiliser nextInt(). De façon
générale, dites-vous que pour récupérer un type de variable, il vous suffit
d'appeler next<Type de variable commençant par une majuscule>
.
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
double d = sc.nextDouble();
long l = sc.nextLong();
byte b = sc.nextByte();
//Etc.

Remarque : il y a un type de variables primitives qui n'est pas pris en compte


par la classe Scanner : il s'agit du type char. Voici comment on pourrait
récupérer un caractère :
128

System.out.println("Saisissez une lettre :");


Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
char carac = str.charAt(0);
System.out.println("Vous avez saisi le caractère : " + carac);

En fait, nous avons récupéré une chaîne de caractères, puis utilisé une
méthode de l'objet String (ici, charAt(0) ) afin de récupérer le premier caractère
saisi. Même si vous tapez une longue chaîne de caractères, l'instruction
charAt(0), ne renverra que le premier caractère.
Une précision s'impose, toutefois : la méthode nextLine() récupère le contenu
de toute la ligne saisie et replace la _ tête de lecture _ au début d'une autre
ligne.

Par contre, si vous avez invoqué une méthode comme nextInt(), nextDouble()
et que vous invoquez
directement après la méthode nextLine(), celle-ci ne vous invitera pas à saisir
une chaîne de caractères : elle videra la ligne commencée par les autres
instructions.

En effet, celles-ci ne repositionnent pas la tête de lecture, l'instruction


nextLine() le fait à leur place. Pour faire simplifier les choses, nous faisons ce
qui suit :

import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("Saisissez un entier : ");
int i = sc.nextInt();
System.out.println("Saisissez une chaîne : ");
String str = sc.nextLine();

System.out.println("FIN ! ");
}
}
. . En effet, ce programme ne vous demandera pas de saisir une chaîne et
a_chera directement _ Fin _.
129

Pour y rémédier, il suffit de vider la ligne après les instructions ne le faisant


pasautomatiquement :

import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("Saisissez un entier : ");
int i = sc.nextInt();
System.out.println("Saisissez une chaîne : ");
//On vide la ligne avant d'en lire une autre
sc.nextLine();
String str = sc.nextLine();
System.out.println("FIN ! ");
}
}

En substance,

_ La lecture des entrées clavier se fait via l'objet Scanner.

_ Ce dernier se trouve dans le package java.util que vous devrez importer.

_ Pour pouvoir récupérer ce vous allez taper dans la console, vous devrez
initialiser

l'objet Scanner avec l'entrée standard, System.in.

_ Il y a une méthode de récupération de données pour chaque type (sauf les


char) :
nextLine() pour les String, nextInt() pour les int. . .
130

Les conditions

La structure if... else

Avant de pouvoir créer et évaluer des conditions, on doit savoir que pour y
parvenir, on va utiliser ce qu'on appelle des opérateurs logiques. Ceux-ci sont
surtout utilisés lors de conditions (si [condition] alors [faire traitement]) pour
évaluer différents cas possibles.

Voici en guise de rappel les différents opérateurs à connaître :

__ == : permet de tester l'égalité.


__ != : permet de tester l'inégalité.
__ < : strictement inférieur.
__ <= : inférieur ou égal.
__ > : strictement supérieur.
__ >= : supérieur ou égal.
__ && : l'opérateur et. Il permet de préciser une condition.
__ || : le ou. Même combat que le précédent.
__ ?: : l'opérateur ternaire.

Comme dit précédemment, les opérations en Java sont soumises à des


priorités. Tous ces opérateurs se plient à cette règle, de la même manière que
les opérateurs arithmétiques.

LA STRUCTURE IF... ELSE

Exemple if (A > 0) System.out.println(‘’ Le nombre est positif ‘’) ;


else System.out.println (‘’ Le nombre est négatif ‘’) ;

_ Dans un premier temps, la condition du if est testée (elle dit si i est


strictement supérieur à 0 et dans un second temps, vu que celle-ci est fausse, le
programme exécute le else.
131

Voici un autre exemple


.
int i = 0;
if (i < 0)
System.out.println("Ce nombre est négatif !");
else if(i > 0)
System.out.println("Ce nombre est positif !");
else
System.out.println("Ce nombre est nul !");

Exemple, on va vérifier si un entier est compris entre 50 et 100.

int i = 58;

if (i < 100 && i > 50)


System.out.println("Le nombre est bien dans l'intervalle.");
else
System.out.println("Le nombre n'est pas dans l'intervalle.");

Ici, nous avons utilisé l'opérateur &&. La condition de notre if est devenue : si i
est inférieur à 100 et supérieur à 50, alors la condition est remplie.

Avec l'opérateur &&, la clause est remplie si et seulement si les conditions la


constituant sont toutes remplies ; si l'une des conditions n'est pas vérifiée, la
clause sera considérée comme fausse.

Cet opérateur vous initie à la notion d'intersection d'ensembles. Ici, nous avons
deux conditions qui définissent un ensemble chacune :

_ i < 100 dé_nit l'ensemble des nombres inférieurs à 100 ;


_ i > 50 dé_nit l'ensemble des nombres supérieurs à 50.

L'opérateur && permet de faire l'intersection de ces ensembles. La condition


regroupe donc les nombres qui appartiennent à ces deux ensembles, c'est-à-
dire les nombres de 51 à 99 inclus.

Examinons un peu l'intervalle que nous voulons définir. Voyez ce code :


132

int i = 58;
if(i < 100 && i > 100)
System.out.println("Le nombre est bien dans l'intervalle.");
else
System.out.println("Le nombre n'est pas dans l'intervalle.");

Ici, la condition ne sera jamais remplie, car je ne connais aucun nombre qui soit
à la fois plus petit et plus grand que 100 !

Reprenez le code précédent et remplacez l'opérateur && par ||. À l'exécution


du programme et après plusieurs tests de valeur pour i, vous pourrez vous
apercevoir que tous les nombres remplissent cette condition, sauf 100.

La structure switch
Le switch est surtout utilisé lorsque nous voulons des conditions à la carte,
c’est-à-dire dans le cas de choix multiple.

Prenons l'exemple d'une interrogation comportant deux questions : pour


chacune d'elles, on peut obtenir uniquement 0, 10 ou 20 points, ce qui nous
donne à la fin trois notes et donc trois appréciations possibles, comme ceci.
_ 0/20 : tu peux revoir ce chapitre, petit Zéro !
_ 10/20 : je crois que tu as compris l'essentiel ! Viens relire ce chapitre à
l'occasion.
_ 20/20 : bravo !

Dans ce genre de cas, on utilise un switch pour éviter des else if à répétition et
pour alléger un peu le code.
.
Voici la syntaxe de switch

switch (/*Variable*/)
{
case /*Argument*/:
/*Action*/;
break;
default:
/*Action*/;
}
133

Voici les opérations qu'effectue cette expression.

_ La classe évalue l'expression se trouvant après le switch (ici /*Variable*/).

_ Si la première languette (case /*Valeur possible de la variable*/:) correspond


à la valeur de /*Variable*/, l'instruction figurant dans celle-ci sera exécutée.

_ Sinon, on passe à la languette suivante, et ainsi de suite.

_ Si aucun des cas ne correspond, la classe va exécuter ce qui se trouve dans


l'instruction default:/*Action*/;. Voyez ceci comme une sécurité.

Notez bien la présence de l'instruction break; Elle permet de sortir du switch si


une languette y correspond .

Exemple.

int note = 10; //On imagine que la note maximale est 20

switch (note)
{
case 0:
System.out.println("Ouch !");
break;
case 10:
System.out.println("Vous avez juste la moyenne.");
break;
case 20:
System.out.println("Parfait !");
break;
default:
System.out.println("Il faut davantage travailler.");
}

Remarque

Nous n’avons écrit qu'une ligne de code par instruction case, mais rien ne nous
empêche d'en mettre plusieurs.
Si nous essayons ce programme en supprimant l'instruction break;, nous allons
nous rendre compte que le switch exécute le code contenu dans le case 10:,
134

mais aussi dans tous ceux qui suivent ! L'instruction break; permet de sortir de
l'opération en cours. Dans notre cas, on sort de l'instruction switch.
L'instruction switch ne prend que des entiers ou des caractères en paramètre.
Il est important de le remarquer.

La condition ternaire
Les conditions ternaires sont assez complexes et relativement peu utilisées.

La particularité des conditions ternaires réside dans le fait que trois opérandes
(c'est-à-dire des variables ou des constantes) sont mis en jeu, mais aussi que
ces conditions sont employées pour affecter des données à une variable.

Exemple:

int x = 10, y = 20;


int max = (x < y) ? y : x ; //Maintenant, max vaut 20

Décortiquons ce qu'il se passe.


_ Nous cherchons à affecter une valeur à notre variable max, mais de l'autre
côté de l'opérateur d'affectation se trouve une condition ternaire. . .
_ Ce qui se trouve entre les parenthèses est évalué : x est-il plus petit que y ?
Donc, deux cas de figure se profilent à l'horizon :

_ si la condition renvoie true (vrai), qu'elle est vérifiée, la valeur qui se trouve
après le ? sera affectée ;
_ sinon, la valeur se trouvant après le symbole : sera affectée.
_ L'affectation est effective : vous pouvez utiliser votre variable max.

Vous pouvez également faire des calculs (par exemple) avant d'affecter les
valeurs :
int x = 10, y = 20;
int max = (x < y) ? y * 2 : x * 2 ; //Ici, max vaut 2 * 20 donc 40
N'oubliez pas que la valeur que vous allez affecter à votre variable doit être du
même type que votre variable. Sachez aussi que rien ne vous empêche
d'insérer une condition ternaire dans une autre condition ternaire :

int x = 10, y = 20;


int max = (x < y) ? (y < 10) ? y % 10 : y * 2 : x ; //Max vaut 40
135

//Vous pouvez entourer votre deuxième instruction ternaire


//de parenthèses pour mieux voir
max = (x < y) ? ((y < 10) ? y % 10 : y * 2) : x ; //Max vaut 40

En résumé

_ Les conditions vous permettent de n'exécuter que certains morceaux de


code.
_ Il existe plusieurs sortes de structures conditionnelles :
_ la structure if... elseif... else ;
_ la structure switch... case... default ;
_ la structure ? :.
_ Si un bloc d'instructions contient plus d'une ligne, vous devez l'entourer
d'accolades afin de bien en délimiter le début et la fin.
_ Pour pouvoir mettre une condition en place, vous devez comparer des
variables à l'aide d'opérateurs logiques.

_ Vous pouvez mettre autant de comparaisons renvoyant un boolean que vous


le souhaitez dans une condition.
_ Pour la structure switch, pensez à mettre les instructions break; si vous ne
souhaitez exécuter qu'un seul bloc case.

Les boucles

L e rôle des boucles est de répéter un certain nombre de fois les mêmes
opérations. Tous les programmes, ou presque, ont besoin de ce type de
fonctionnalité. Nous utiliserons les boucles pour permettre à un programme de
recommencer depuis le début, pour attendre une action précise de l'utilisateur,
parcourir une série de données, etc. Une boucle s'exécute tant qu'une
condition est remplie.
136

La boucle while
Voyons comment une boucle se construit. En effet, une boucle commence par
une déclaration : ici while. Cela veut dire, tant que.

Puis nous devons prévoir une condition d’arrêt: c'est elle qui permet à la
boucle de s'arrêter. Une boucle n'est utile que lorsque nous pouvons la
contrôler, et donc lui faire répéter une instruction un certain nombre de fois.
C'est ce qui justifie la condition. Ensuite nous avons une ou plusieurs
instructions à répéter.

Voici le format général :

while (/* Condition */)


{
//Instructions à répéter
}

Prenon un exemple concret.

Nous allons afficher _ Bonjour, <un prénom> _, prénom qu'il faudra taper au
clavier ; puis nous demanderons si l'on veut recommencer. Pour cela, il nous
faut une variable qui va recevoir le prénom, donc dont le type sera String, ainsi
qu'une variable pour récupérer la réponse.

A ce propos, nous avons plusieurs choix. Soit un caractère, soit une chaîne de
caractères, soit un entier. Ici, nous prendrons une
variable de type char.

//Une variable vide


String prenom;

//On initialise celle-ci à O pour oui

char reponse = 'O';


137

//Notre objet Scanner doit être importé à l’aide de import java.util.Scanner

Scanner sc = new Scanner(System.in);


//Tant que la réponse donnée est égale à oui...
while (reponse == 'O')
{
//On affiche une instruction
System.out.println("Donnez un prénom : ");
//On récupère le prénom saisi
prenom = sc.nextLine();
//On affiche notre phrase avec le prénom
System.out.println("Bonjour " +prenom+ ", comment vas-tu ?");
//On demande si la personne veut faire un autre essai
System.out.println("Voulez-vous réessayer ? (O/N)");
//On récupère la réponse de l'utilisateur
reponse = sc.nextLine().charAt(0);
}

System.out.println ("Au revoir...");


//Fin de la boucle

Remarque : Il peut même y avoir des boucles dans une boucle.

.
Voici notre programme dans son intégralité :

String prenom;
char reponse = 'O';
Scanner sc = new Scanner(System.in);
while (reponse == 'O')
{
System.out.println("Donnez un prénom : ");
prenom = sc.nextLine();
System.out.println("Bonjour " +prenom+ ", comment vas-tu ?");
//Sans ça, nous n'entrerions pas dans la deuxième boucle
reponse = ' ';
//Tant que la réponse n'est pas O ou N, on repose la question
while(reponse != 'O' && reponse != 'N')
{
138

//On demande si la personne veut faire un autre essai


System.out.println("Voulez-vous réessayer ? (O/N)");
reponse = sc.nextLine().charAt(0);

}
}
System.out.println("Au revoir...");

Remarque :

Eviter d’écrire un programme avec une boucle infinie.


En voici un autre exemple.

int a = 1, b = 15;
while (a < b)
{
System.out.println("Bonjour " +a+ " fois !!");
}
Si vous lancez ce programme, vous allez voir une quantité infinie de bonjour.
Nous aurions dû ajouter une instruction dans le bloc d'instructions de notre
while pour changer la valeur de a à chaque tour de boucle, comme ceci :

int a = 1, b = 15;
while (a < b)
{
System.out.println("coucou " +a+ " fois !!");
a++;
}

Remarque :

Une petite astuce : lorsque vous n'avez qu'une instruction dans votre boucle,
vous pouvez enlever les accolades, car elles deviennent superflues, tout
comme pour les instructions if, else if ou else.

On aurait pu aussi pu utiliser cette syntaxe :

int a = 1, b = 15;
while (a++ < b)
139

System.out.println("coucou " +a+ " fois !!");

Rappelons-nous la notion de priorité des opérateurs. Ici, l'opérateur « < » a la


priorité sur l'opérateur d'incrémentation « ++ ». Pour se résumer, la boucle
while teste la condition et ensuite incrémente la variable a.

Par contre, si nous écrivons et essayons ce code :

int a = 1, b = 15;
while (++a < b)
System.out.println("coucou " +a+ " fois !!");

Nous allons remarquer qu'il y a un tour de boucle en moins, car avec cette
syntaxe, l'opérateur d'incrémentation est prioritaire sur l'opérateur d'inégalité
(ou d'égalité), c'est-à-dire que la boucle incrémente la variable a, et ce n'est
qu'après l'avoir fait qu'elle teste la condition.

La boucle do... while

C’est la boucle répéter jusqu’à ….condition. C’est une boucle post-testée.

Do {
//blablablablablablablabla
} while(a < b);

Première différence
La boucle do... while s'exécutera au moins une fois, contrairement à la boucle
while, qui est une boucle pré-testée. En d’autres mots, ici la phase de test de la
condition se fait à la fin, car la condition se met après le while.

Deuxième différence

C'est une différence de syntaxe, qui se situe après la condition du while.


En fait, Il y a un point virgule « ; » après le while.

En substance, mis à part ces deux éléments, les boucles while et Do while
fonctionnent exactement de la même manière.
140

Reprenons notre programme précédent avec une boucle do... while pour
montre que les boucles while et Do while se ressemblent.

String prenom = new String();


//Pas besoin d'initialiser : on entre au moins une fois dans la boucle !
char reponse = ' ';
Scanner sc = new Scanner(System.in);
do{
System.out.println("Donnez un prénom : ");
prenom = sc.nextLine();
System.out.println("Bonjour " +prenom+ ", comment vas-tu ?");
do{
System.out.println("Voulez-vous réessayer ? (O/N)");
reponse = sc.nextLine().charAt(0);
}while(reponse != 'O' && reponse != 'N');
}while (reponse == 'O');
System.out.println("Au revoir...");

LA BOUCLE FOR

Cette boucle est un peu particulière puisqu'elle prend tous ses attributs dans sa
condition et agit en conséquence.
Cette boucle est indiquée lorsqu’on connaît d’avance le nombre de fois à
boucler.

Exemple :

for(int i = 1; i <= 10; i++)


{
System.out.println("Voici la ligne "+i);
}

Remarquons la présence des points virgules « ; » dans la condition pour la


séparation des champs. Il ne faut pas les oublier, sinon le programme ne
compilera pas.
Nous pouvons aussi inverser le sens de la boucle, c'est-à-dire qu'au lieu de
partir de 0 pour aller à 10, nous allons commencer à 10 pour atteindre 0 :

Exemple 1.
141

for(int i = 10; i >= 0; i--)


System.out.println("Il reste "+i+" ligne(s) à écrire");

Exemple 2.

for(int i = 0, j = 2; (i < 10 && j < 6); i++, j+=2){


System.out.println("i = " + i + ", j = " + j);
}

Ici, cette boucle n'effectuera que deux tours puisque la condition (i < 10 && j <
6) est remplie dès le deuxième tour, la variable j commençant à 2 et étant
incrémentée de deux à chaque tour de boucle.

En résumé

. Les boucles vous permettent simplement d'effectuer des tâches répétitives.

. Il existe plusieurs sortes de boucles :

.La boucle while (condition) {...} évalue la condition puis elle exécute
éventuellement un tour de boucle (ou plus) ;

.La boucle do {...} while (condition); fonctionne exactement comme la boucle


while, mais effectue un tour de boucle quoi qu'il arrive ;

. La boucle for permet d'initialiser un compteur, une condition et un incrément


dans sa déclaration afin de répéter un morceau de code un nombre limité de
fois.

. Tout comme les conditions, si une boucle contient plus d'une ligne de code à
exécuter, vous devez l'entourer d'accolades afin de bien en délimiter le début
et la fin.

Les tableaux
:

En programmation, un tableau n'est rien d'autre qu'une variable un peu


particulière. Nous allons en effet pouvoir lui affecter plusieurs valeurs
ordonnées séquentiellement que nous pourrons appeler au moyen d'un indice
(ou d'un compteur, si vous préférez). Il nous suffira d'introduire l'emplacement
142

du contenu désiré dans notre variable tableau pour la sortir, travailler avec,
l'afficher. . .

Tableau à une dimension

Déclaration du tableau :

<type du tableau> <nom du tableau> [] = { <contenu du tableau>};

La déclaration ressemble beaucoup à celle d'une variable quelconque, si ce


n'est la présence de crochets [] après le nom de notre tableau et d'accolades {}
encadrant l'initialisation de celui-ci.

Dans la pratique, ça nous donnerait quelque chose comme ceci :

int tableauEntier[] = {0,1,2,3,4,5,6,7,8,9};


double tableauDouble[] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0};
char tableauCaractere[] = {'a','b','c','d','e','f','g'};
String tableauChaine[] = {"chaine1", "chaine2", "chaine3" , "chaine4"};

Vous remarquez bien que la déclaration et l'initialisation d'un tableau se font


comme avec une variable ordinaire : il faut utiliser des ' ' pour initialiser un
tableau de caractères, des " " pour initialiser un tableau de String, etc.

Vous pouvez aussi déclarer un tableau vide, mais celui-ci devra


impérativement contenir un nombre de cases bien défini.

Par exemple, si vous voulez un tableau vide de six entiers :


int tableauEntier[] = new int[6];

//Ou encore

int[] tableauEntier2 = new int[6];


143

Les tableaux multidimensionnels

UTILISER ET RECHERCHER DANS UN TABLEAU


Ce tableau s'appellera premiersNombres. Voilà ce que cela donnerait :
int premiersNombres[][] = { {0,2,4,6,8},{1,3,5,7,9} };

Nous voyons bien ici les deux lignes de notre tableau symbolisées par les
doubles crochets [][]. Ce genre de tableau est composé de plusieurs
tableaux. Ainsi, pour passer d'une ligne à l'autre, nous jouerons avec la valeur
du premier crochet.

Exemple : premiersNombres[0][0] correspondra au premier élément de


la ligne paire, et premiersNombres[1][0] correspondra au premier élément de
la ligne impaire.

Exemple

char tableauCaractere[] = {'a','b','c','d','e','f','g'};


for(int i = 0; i < tableauCaractere.length; i++)
{
System.out.println("A l'emplacement " + i +" du tableau nous avons = "
+ tableauCaractere[i]);
}
Cela affichera :

A l'emplacement 0 du tableau nous avons = a


A l'emplacement 1 du tableau nous avons = b
A l'emplacement 2 du tableau nous avons = c
A l'emplacement 3 du tableau nous avons = d
A l'emplacement 4 du tableau nous avons = e
A l'emplacement 5 du tableau nous avons = f
A l'emplacement 6 du tableau nous avons = g

Faisons une recherche dans un de ces tableaux. En


gros, il va falloir effectuer une saisie clavier et regarder si celle-ci est présente
dans le tableau.

char tableauCaractere[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};


int i = 0, emplacement = 0;
char reponse = ' ',carac = ' ';
144

Scanner sc = new Scanner(System.in);


do {//Boucle principale
do {//On répète cette boucle tant que l'utilisateur n'a pas rentré
,! une lettre figurant dans le tableau
i = 0;
System.out.println("Rentrez une lettre en minuscule, SVP ");
carac = sc.nextLine().charAt(0);
//Boucle de recherche dans le tableau
while(i < tableauCaractere.length && carac != tableauCaractere[i])
i++;
//Si i < 7 c'est que la boucle n'a pas dépassé le nombre de cases du tableau
if (i < tableauCaractere.length)
System.out.println(" La lettre " +carac+ "
,! se trouve bien dans le tableau !");
else //Sinon
System.out.println(" La lettre " +carac+ " ,! ne se trouve pas dans le tableau !");

}while(i >= tableauCaractere.length);


//Tant que la lettre de l'utilisateur
//ne correspond pas à une lettre du tableau
do{
System.out.println("Voulez-vous essayer à nouveau ? (O/N)");
reponse = sc.nextLine().charAt(0);
}while(reponse != 'N' && reponse != 'O');
}while (reponse == 'O');
System.out.println("Au revoir !");

Les méthodes de classe

A ce niveau, nous allons découvrir la notion de méthode (on l'appelle


« fonction . » dans d'autres langages).
Le principal avantage des méthodes est de pouvoir factoriser le code : grâce à
elles, vous n'avez qu'un seul endroit où effectuer des modifications lorsqu'elles
sont nécessaires.

Quelques méthodes utiles


145

Il existe énormément de méthodes dans le langage Java, présentes dans des


objets comme String. Nous pouvons catégoriser les méthodes en deux familles
: les natives et les nôtres.

Des méthodes concernant les chaînes de caractères

toLowerCase()

Cette méthode permet de transformer tout caractère alphabétique en son


équivalent minuscule.

Elle n'a aucun effet sur les chiffres : ce ne sont pas des caractères
alphabétiques. Vous pouvez donc l'utiliser sans problème sur une chaîne de
caractères comportant des nombres.

Elle s'emploie comme suit :

String chaine = new String("COUCOU TOUT LE MONDE !"), chaine2 = new


String();
chaine2 = chaine.toLowerCase(); //Donne "coucou tout le monde !"
toUpperCase()

Une chaîne de caractères en capitales, et s'utilise comme suit :

String chaine = new String("coucou coucou"), chaine2 = new String();


chaine2 = chaine.toUpperCase(); //Donne "COUCOU COUCOU"
length()

Celle-ci renvoie la longueur d'une chaîne de caractères (en comptant les


espaces).

String chaine = new String("coucou ! ");


int longueur = 0;
longueur = chaine.length(); //Renvoie 9
equals() Cette méthode permet de vérifier (donc de tester) si deux chaînes de
caractères sont identiques. C'est avec cette fonction que nous effectuerons nos
tests de condition sur les String.

Exemple concret :
146

String str1 = new String("coucou"), str2 = new String("toutou");


if (str1.equals(str2))
System.out.println("Les deux chaînes sont identiques !");
else
System.out.println("Les deux chaînes sont différentes !");

Nous pouvons aussi demander la vérification de l'inégalité grâce à l'opérateur


de négation.

VOICI QUELQUES MÉTHODES UTILES

String str1 = new String("coucou"), str2 = new String("toutou");


if (!str1.equals(str2))
System.out.println("Les deux chaînes sont différentes !");
else
System.out.println("Les deux chaînes sont identiques !");

Ce genre de condition fonctionne de la même façon pour les boucles. Dans


l'absolu, cette fonction retourne un booléen, c'est pour cette raison que nous
pouvons y recourir dans les tests de condition.

charAt()

Le résultat de cette méthode sera un caractère : il s'agit d'une méthode


d'extraction de caractère. Elle ne peut s'opérer que sur des String ! Par ailleurs,
elle présente la même particularité que les tableaux, c'est-à-dire que, pour
cette méthode, le premier caractère sera le numéro 0. Cette méthode prend un
entier comme argument.

String nbre = new String("1234567");


char carac = nbre.charAt(4); //Renverra ici le caractère 5
substring()
Cette méthode extrait une partie d'une chaîne de caractères. Elle prend deux
entiers en arguments : le premier définit le premier caractère (inclus) de la
sous-chaîne à extraire, le second correspond au dernier caractère (exclu) à
extraire. Là encore, le premier caractère porte le numéro 0.

String chaine = new String("la paix niche"), chaine2 = new String();


chaine2 = chaine.substring(3,13); //Permet d'extraire "paix niche"
147

indexOf() _ lastIndexOf()
indexOf() explore une chaîne de caractères à la recherche d'une suite donnée
de caractères, et renvoie la position (ou l'index) de la sous-chaîne passée en
argument.

indexOf() explore à partir du début de la chaîne, lastIndexOf() explore en


partant de la fin, mais renvoie l'index à partir du début de la chaîne. Ces deux
méthodes prennent un caractère ou une chaîne de caractères comme
argument, et renvoient un int.

Tout comme charAt() et substring(), le premier caractère porte le numéro 0.


Nous croyons qu'ici, un exemple s'impose, plus encore que pour les autres
fonctions :
String mot = new String("anticonstitutionnellement");
int n = 0;
n = mot.indexOf('t'); //n vaut 2
n = mot.lastIndexOf('t'); //n vaut 24
n = mot.indexOf("ti"); //n vaut 2
n = mot.lastIndexOf("ti"); //n vaut 12
n = mot.indexOf('x'); //n vaut -1

Des méthodes concernant les mathématiques


Les méthodes listées ci-dessous nécessitent la classe Math, présente dans
java.lang. Elle fait donc partie des fondements du langage. Par conséquent,
aucun import particulier n'est nécessaire pour utiliser la classe Math qui
regorge de méthodes utiles :

double X = 0.0;
X = Math.random();
//Retourne un nombre aléatoire
//compris entre 0 et 1, comme 0.0001385746329371058

double sin = Math.sin(120); //La fonction sinus


double cos = Math.cos(120); //La fonction cosinus
double tan = Math.tan(120); //La fonction tangente
double abs = Math.abs(-120.25); //La fonction valeur absolue (retourne
,! le nombre sans le signe)
double d = 2;
double exp = Math.pow(d, 2); //La fonction exposant
148

//Ici, on initialise la variable exp avec la valeur de d élevée au carré


//La méthode pow() prend donc une valeur en premier paramètre,
//et un exposant en second

Ces méthodes retournent toutes un nombre de type double.


Je ne vais pas vous faire un récapitulatif de toutes les méthodes présentes dans
Java, sinon j'y serai encore dans mille ans. . . Toutes ces méthodes sont très
utiles, certes. Cependant, les plus utiles sont encore celles que nous écrivons
nous-mêmes.

CREATION DE SA PROPRE METHODE


Voici un exemple de méthode :

public static double arrondi(double A, int B) {


return (double) ( (int) (A * Math.pow(10, B) + .5)) / Math.pow(10, B);
}

Expliquons un peu cela

_ Tout d'abord, il y a le mot clé public. C'est ce qui définit la portée de la


méthode,
.
_ Ensuite, il y a static.
_ Juste après, nous voyons double. Il s'agit du type de retour de la méthode.

Pour simplifier les choses, ici, notre méthode va renvoyer un double !

_ Vient ensuite le nom de la méthode. C'est avec ce nom que nous


l'appellerons.

_ Puis arrivent les arguments de la méthode. Ce sont en fait les paramètres


dont la méthode a besoin pour travailler. Ici, nous demandons d'arrondir le
double A avec B chiffres derrière la virgule.

_ Finalement, vous pouvez voir une instruction return à l'intérieur de la


méthode. C'est elle qui effectue le renvoi de la valeur, ici un double.
149

Nous verrons dans ce chapitre les différents types de renvoi ainsi que les
paramètres que peut accepter une méthode.

Remarque

Nous devons savoir deux choses concernant les méthodes :


_ Elles ne sont pas limitées en nombre de paramètres ;
_ Il en existe trois grands types :
_ Les méthodes qui ne renvoient rien. Les méthodes de ce type n'ont pas
d'instruction return, et elles sont de type void ;

_ Les méthodes qui retournent des types primitifs (double, int. . .). Elles sont de
type double, int, char. . . Celles-ci possèdent une instruction return ;
_ Les méthodes qui retournent des objets. Par exemple, une méthode qui
retourne un objet de type String. Celles-ci aussi comportent une instruction
return.

public class Sdz1


{
public static void main(String[] args)
{
String[] tab = {"toto", "tata", "titi", "tete"};
parcourirTableau(tab);
}
static void parcourirTableau(String[] tabBis)
{
for(String str : tabBis)
System.out.println(str);
}
}

.
public class Sdz1 {
public static void main(String[] args)
{
String[] tab = {"toto", "tata", "titi", "tete"};

parcourirTableau(tab);
System.out.println(toString(tab));
150

}
static void parcourirTableau(String[] tab)
{
for(String str : tab)
System.out.println(str);
}
static String toString(String[] tab)
{
System.out.println("Méthode toString() !\n----------");
String retour = "";
for(String str : tab)
retour += str + "\n";
return retour;
}
}
Vous voyez que la deuxième méthode retourne une chaîne de caractères, que
nous devons afficher à l'aide de l'instruction System.out.println(). Nous
affichons la valeur renvoyée par la méthode toString(). La méthode
parcourirTableau, quant à elle, écrit au fur et à mesure le contenu du tableau
dans la console.

une ligne d'écriture dans la console au sein de la méthode toString(), afin de


montrer où elle était appelée.

La surcharge de méthode

La surcharge de méthode consiste à garder le nom d'une méthode (donc un


type de traitement à faire : pour nous, lister un tableau) et à changer la liste ou
le type de ses paramètres.

Dans le cas qui nous intéresse, nous voulons que notre méthode
parcourirTableau puisse parcourir n'importe quel type de tableau. Nous allons
151

donc surcharger notre méthode afin qu'elle puisse aussi travailler avec des int,
comme le montre cet exemple :

static void parcourirTableau(String[] tab)


{
for(String str : tab)
System.out.println(str);
}
static void parcourirTableau(int[] tab)
{
for(int str : tab)
System.out.println(str);
}
Avec ces méthodes, vous pourrez parcourir de la même manière :

_ les tableaux d'entiers ;


_ les tableaux de chaînes de caractères.

Vous pouvez faire de même avec les tableaux à deux dimensions. Voici à quoi
pourrait ressembler le code d'une telle méthode (je ne rappelle pas le code des
deux méthodes ci-dessus) :

static void parcourirTableau(String[][] tab)


{
for(String tab2[] : tab)
{
for(String str : tab2)
System.out.println(str);
}
}

La surcharge de méthode fonctionne également en ajoutant des paramètres à


la méthode. Cette méthode est donc valide :

static void parcourirTableau(String[][] tab, int i)


{
for(String tab2[] : tab)
{
for(String str : tab2)
System.out.println(str);
152

}
}
En fait, c'est la JVM qui va se charger d'invoquer l'une ou l'autre méthode :
vous pouvez donc créer des méthodes ayant le même nom, mais avec des
paramètres différents, en nombre ou en type. La machine virtuelle fait le reste.
Ainsi, si vous avez bien défini toutes les méthodes ci-dessus, ce code
fonctionne :

String[] tabStr = {"toto", "titi", "tata"};


int[] tabInt = {1, 2, 3, 4};
String[][] tabStr2 = {{"1", "2", "3", "4"}, {"toto", "titi", "tata"}};

//La méthode avec un tableau de String sera invoquée

parcourirTableau(tabStr);

//La méthode avec un tableau d'int sera invoquée

parcourirTableau(tabInt);
//La méthode avec un tableau de String à deux dimensions sera invoquée
parcourirTableau(tabStr2);
Vous venez de créer une méthode qui vous permet de centraliser votre code
afin de ne pas avoir à retaper sans arrêt les mêmes instructions.

En résumé
_ Une méthode est un morceau de code réutilisable qui effectue une action
bien définie.
_ Les méthodes se définissent dans une classe.
_ Les méthodes ne peuvent pas être imbriquées. Elles sont déclarées les unes
après les autres.
_ Une méthode peut être surchargée en modifiant le type de ses paramètres,
leur nombre, ou les deux.
_ Pour Java, le fait de surcharger une méthode lui indique qu'il s'agit de deux,
trois ou X méthodes différentes, car les paramètres d'appel sont différents. Par
conséquent, Java ne se trompe jamais d'appel de méthode, puisqu'il se base
sur les paramètres passés à cette dernière.

Java et la Programmation Orientée Objet


153

La notion de classe

Une classe est une structure informatique représentant les principales


caractéristiques d'un élément du monde réel grâce :

_ à des variables, qui représentent les divers attributs de l'élément que vous
souhaitez utiliser ;

_ à des méthodes, qui permettent de définir les comportements de vos


éléments.

Une classe contient donc des variables et des méthodes, qui forment un tout.

Comment créer une classe ?

Structure de base

Une classe peut être comparée à un moule qui, lorsque nous le remplissons,
nous donne un objet ayant la forme du moule ainsi que toutes ses
caractéristiques.

class ClasseMain{
public static void main(String[] args){
//Vos données, variables, différents traitements...
}//Fin de la méthode main
}//Fin de votre classe

LES CONSTRUCTEURS

Nous devons savoir que lorsque nous créons une classe comme nous l'avons
fait, Eclipse nous facilite la tâche en ajoutant automatiquement ce mot clé, qui
correspond à la portée de la classe.

En programmation, la portée détermine qui peut faire appel à une classe, une
méthode ou une variable. Vous avez déjà rencontré la portée public : cela
signifie que tout le monde peut faire appel à l'élément.
154

Nous allons ici utiliser une autre portée : private. Elle signifie que notre
méthode ne pourra être appelée que depuis l'intérieur de la classe dans
laquelle elle se trouve.

Les méthodes déclarées private correspondent souvent à des mécanismes


internes à une classe que les développeurs souhaitent cacher ou simplement
ne pas rendre accessibles de l'extérieur de la classe. . .

Il en va de même pour les variables. Nous allons voir que nous pouvons
protéger des variables grâce au mot clé private. Le principe sera le même
que pour les méthodes. Ces variables ne seront alors accessibles que dans la
classe où elles seront nées. . .

Retenez pour l'instant que public class UneClasse{} et class UneClasse{} sont
presque équivalents

Ici dans le cas qui nous intéresse il s'agit d'une méthode. Une méthode
marquée comme public peut donc être appelée depuis n'importe quel endroit
du programme.

classe Ville à présent :


public class Ville{
String nomVille;
String nomPays;
int nbreHabitants;
}
Contrairement aux classes, les variables d'instance présentes dans une classe
sont public si vous ne leur spécifiez pas de portée. Alors, on parle de variable
d'instance,
parce que dans nos futures classes Java qui définiront des objets, il y aura
plusieurs types de variables.

Notons que qu'il y a trois grands types de variables dans une classe objet, à
savoir :

_ Les variables d'instance : ce sont elles qui définiront les caractéristiques de


notre objet.
155

_ Les variables de classe : celles-ci sont communes à toutes les instances de


votre classe.

_ Les variables locales : ce sont des variables que nous utiliserons pour
travailler dans notre objet.

Dans l'immédiat, nous allons travailler avec des variables d'instance afin de
créer des objets différents.

Créons notre premier objet, pour ce faire, nous allons devoir utiliser ce qu'on
appelle des constructeurs.

Un constructeur est une méthode d'instance qui va se charger de créer un


objet et, le cas échéant, d'initialiser ses variables de classe ! Cette méthode a
pour rôle de signaler à la JVM qu'il faut réserver de la mémoire pour notre
futur objet et donc, par extension, d'en réserver pour toutes ses variables.

Notre premier constructeur sera ce qu'on appelle communément un


constructeur par défaut, c'est-à-dire qu'il ne prendra aucun paramètre, mais
permettra tout de même d'instancier un objet.

Voici votre premier constructeur :

public class Ville{


//Stocke le nom de notre ville
String nomVille;
//Stocke le nom du pays de notre ville
String nomPays;
//Stocke le nombre d'habitants de notre ville
int nbreHabitants;
//Constructeur par défaut
public Ville(){
System.out.println("Création d'une ville !");
nomVille = "Inconnu";
nomPays = "Inconnu";
nbreHabitants = 0;
}
}

Nous constatons le constructeur est en fait une méthode qui n'a aucun type
156

de retour (void, double. . .) et qui porte le même nom que notre classe ! Ceci
est une règle immuable : le (les) constructeur(s) d'une classe doit (doivent)
porter le même nom que la classe !

Son corollaire est qu'un objet peut avoir plusieurs constructeurs. Il s'agit de la
même méthode, mais surchargée.

public class Sdz1{


public static void main(String[] args){
Ville ville = new Ville();
}
}

Ville ville1 = new Ville("Marseille", 123456789, "France");


Vous avez remarqué qu'ici, les paramètres sont renseignés : eh bien il suffit de
créer une méthode qui récupère ces paramètres et initialise les variables de
notre objet, ce qui achèvera notre constructeur d'initialisation.

Voici le constructeur de notre objet Ville, celui qui permet d'avoir des objets
avec des paramètres différents :

public class Ville {


//Stocke le nom de notre ville
String nomVille;
//Stocke le nom du pays de notre ville
String nomPays;
//Stocke le nombre d'habitants de notre ville
int nbreHabitants;
//Constructeur par défaut
public Ville(){
System.out.println("Création d'une ville !");
nomVille = "Inconnu";
nomPays = "Inconnu";
nbreHabitants = 0;
}
//Constructeur avec paramètres
//J'ai ajouté un _ p _ en première lettre des paramètres.
//Ce n'est pas une convention, mais ça peut être un bon moyen de les repérer.
public Ville(String pNom, int pNbre, String pPays)
{
157

System.out.println("Création d'une ville avec des paramètres !");


nomVille = pNom;
nomPays = pPays;
nbreHabitants = pNbre;
}
}

NB : il vous faudra respecter scrupuleusement l'ordre des paramètres passés


lors de l'initialisation de votre objet, sinon, c'est l'erreur de compilation à coup
sûr.

Ville ville1 = new Ville("Marseille", 123456789, "France");


//Erreur dans l'ordre des paramètres ! erreur de compilation au final
Ville ville2 = new Ville(12456, "France", "Lille");

Par contre, notre objet présente un gros défaut : les variables d'instance qui le
caractérisent sont accessibles dans votre classe contenant votre main ! Ceci
implique que vous pouvez directement modifier les attributs de la classe.

public class Sdz1 {


public static void main(String[] args)
{
Ville ville = new Ville();
System.out.println(ville.nomVille);
ville.nomVille = "la tête à toto ! ! ! !";
System.out.println(ville.nomVille);
Ville ville2 = new Ville("Marseille", 123456789, "France");
ville2.nomPays = "La tête à tutu ! ! ! ! ";
System.out.println(ville2.nomPays);
}
}

Protégeons nos variables d'instance en les déclarant private,


comme ceci :
public class Ville {
private String nomVille;
private String nomPays;
private int nbreHabitants;
158

// ...
}
Désormais, ces attributs ne sont plus accessibles en dehors de la classe où ils
sont déclarés ! Nous allons maintenant voir comment accéder tout de même à
nos données.

Chapitre 7.

Les étapes de mise en œuvre d’un projet informatique

1. Le schéma directeur

Un schéma directeur est un dessein d’ensemble qui comporte les traits


essentiels du dessein de l’entreprise, c’est-à-dire du système d’information
cible dont elle a l’ambition de se doter, ainsi que des efforts qui seront
nécessaires à la réussite de cette ambition.

La phase schéma directeur a donc pour objet de planifier le développement du


système d’information cible, c’est-à-dire d’identifier, de qualifier, de justifier,
de prioriser et de planifier les projets de développement du système
d’information qui serviront au mieux la stratégie de l’entreprise.

A cet effet, le schéma directeur partitionne l’entreprise en domaines d’activité.


Il répond à une question : à quels besoins stratégiques de l’entreprise satisfait
chacun des projets ?

2. Etude préalable

Dans tout projet de développement, avant de lancer définitivement un


chantier, il sied de s’assurer sur certains points que la réalisation cadrera
réellement avec le budget initialement prévu, que les paramètres sociaux ou
les contraintes de l’environnement ont été appréhendées exhaustivement et
correctement, que la faisabilité technique est assurée, que les mesures
159

d’accompagnement ont été prévues, que la justification du projet est


réellement fondées. Tel est l’objet de l’étude préalable.

L’étude préalable détermine le plan de développement et de mise en place


(étapes intermédiaires, moyens, planning, enjeux, bilan des coûts). Tout ceci
est formalisé dans un dossier d’étude préalable qui doit permettre :

- au maître d’ouvrage de comprendre ce qui lui est proposé par le maître


d’œuvre afin de prendre les bonnes décisions pour la suite (arrêt,
continuation selon la trajectoire prévue ou selon une trajectoire corrigée).
- De constituer la base de travail pour les phases suivantes.

Lors de l’étude préalable appelée aussi étude d’opportunité, on fait l’étude de


l’existant. Pour ce faire, on s’appuie sur l’organigramme pour comprendre la
structure de l’entreprise (les postes et leurs relations réciproques, ascendantes,
horizontales etc.). Dans cette approche, on établit le schéma de circulation des
informations. Le rapport, à la fin de cette étude, doit ressortir les points forts et
faibles sur les plans humains (y-a-t il des gens formés en informatique ?),
financier (quel est coût de l’informatisation ?), matériel (est-on doté des
matériels appropriés ?).

En cas d’acceptation du rapport par le comité directeur de l’entreprise, on peut


passer alors à la conception.
160

Chapitre 8.

Cas impliquant les outils de conception

Les bases de données

1. Le point de vue du gestionnaire sur la gestion de base de données

L’information est considérée de nos jours comme une ressource stratégique


dans beaucoup d’entreprises. Cela revient à dire qu’une mauvaise gestion de
l’information peut entraîner une désorganisation ou un chaos au sein de
l’entreprise.

Quelle serait notre réaction, en tant que dirigeant d’une entreprise qui utilise
l’informatique, si l’on nous disait qu’il est trop difficile et trop coûteux d’obtenir
certains renseignements utiles que nous réclamons sur les employés ?

Et pour justifier cela, on invoque les raisons suivantes :

a) l’information requise se trouve dans plusieurs fichiers qui sont organisés


différemment.
b) Tous les fichiers sont organisés de manière à fonctionner avec des
programmes d’application différents, mais aucun d’entre eux ne produit
l’information voulue dans le bon format.

Au regard de ces explications, en tant que dirigeant ou gestionnaire, nous


serons probablement mécontent et déçu du traitement par ordinateur. C’est le
sentiment qu’éprouvent les utilisateurs lorsqu’une organisation a recours à des
systèmes de traitement de fichiers où les données sont organisées, stockées et
traitées dans des fichiers indépendants.

Ce qui précède justifie le recours à la méthode de gestion de base de données


où les fichiers sont consolidés en un fonds commun d’enregistrements
accessibles par divers programmes d’application.

En plus, un progiciel important, nommé système de gestion de base de


données (SGBD), sert d’interface entre les utilisateurs et les bases de données.
161

Les utilisateurs ont ainsi facilement accès aux enregistrements d’une base de
données. Par exemple, si toutes les données concernant un étudiant étaient
stockées dans une base de données commune, on pourrait utiliser une fonction
de langage d’interrogation du SGBD pour obtenir facilement l’information
désirée.

Pendant de nombreuses années, les systèmes d’information se concentraient


essentiellement sur le traitement des fichiers. Les données nécessaires pour
chaque application d’utilisateur étaient stockées dans des fichiers
indépendants. Le traitement consistait à utiliser des programmes informatiques
différents. Notons que la méthode de traitement des fichiers est toujours
utilisée, mais plusieurs difficultés importantes limitent son efficacité et son
efficience pour des applications des utilisateurs.

Quels sont les problèmes engendrés par le traitement des fichiers pour les
applications des utilisateurs ?

- La duplication des données

Les fichiers de données indépendantes comprennent une foule de données qui


e répètent : les mêmes données (comme le nom, adresse du client) sont
enregistrées et stockées dans plusieurs fichiers. Cette redondance des données
pose de sérieux problèmes lors de la mise à jour, puisqu’il faut mette au point
et coordonner des programmes distincts afin d’assurer la mise à jour de caque
fichier. La mise à jour des fichiers est processus coûteux et laborieux qui accroît
les exigences de mémoire externe de l’ordinateur.

- Le manque d’intégration des données

La dispersion des données dans des fichiers indépendants complique l’accès


des utilisateurs à l’information lors des demandes qui font appel à des données
stockés dans plusieurs fichiers différents. Il faut créer des programmes
différents pour extraire les données de chaque fichier indépendant. En raison
de la longueur et la lenteur de cette démarche, certaines entreprises
se voient dans l’incapacité de fournir l’information désirée aux utilisateurs ou à
la direction. Parfois les utilisateurs doivent extraire manuellement l’information
requise dans divers rapports produits par chaque application, et rédiger des
rapports personnalisés à l’intention de la direction.

- La dépendance des données


162

Dans les systèmes de traitement des fichiers, les principales composantes


(l’organisation des fichiers, leur emplacement physique dans les mémoires et le
logiciel d’application utilisé pour accéder aux fichiers) sont interdépendantes.
Ainsi, les changements de disposition et de structure des données et les
changements dans les enregistrements d’un fichier entraînent des
modifications dans tous les programmes qui utilisent ce fichier.

Les figures ci-dessous montrent les opérations bancaires effectuées par les
systèmes de traitement de fichiers. On remarque que le recours à des
programmes informatiques distincts et à des fichiers indépendants selon la
méthode de traitement de fichiers appliquée aux comptes d’épargne, aux prêts
à tempérament et aux comptes chèques.

Traitement des comptes chèques

Etats des comptes du client

Mise à jour du fichier programme de comptes chèques


Des comptes chèques

Traitement des prêts à tempérament

Rapports d’analyse des prêts


163

Mise à jour du fichier programme de prêts à tempérament


Des prêts à tempérament

Traitement des comptes épargne

Quittance du client

Opérations du client

Mise à jour du fichier programme de comptes épargne


Des comptes d’épargne

La solution à ces problèmes est le recours à la base de données. Celle-ci est un


ensemble intégré d’enregistrements et de fichiers liés selon une logique. Les
données stockées dans l base de données sont indépendantes de programmes
qui les utilisent.

Traitement des opérations des clients


164

Programme des
Comptes chèques
Pgr. Compte prg. Prêt à
Epargne tempérament

Système de gestion de bases de données

Base de données sur la clientèle

2. Concepts des bases de données

Une base de données est un ensemble de fichiers qui sont en relation entre
eux. Cela implique que cet ensemble est structuré, exhaustif et non redondant.
Dans ce cours, nous allons parler de base de données relationnelle. Celle-ci
apparaît comme une collection de tables de données, ou fichiers plats. Il s’agit
d’une structure extrêmement simple. Toutes les manipulations s’effectuent au
moyen d’un unique langage, SQL (structured query language). Ce langage
permet à l’utilisateur de demander au SGBD de créer des tables, de leur ajouter
165

des colonnes, d’y ranger des données et de les modifier, de consulter les
données, de définir les autorisations d’accès. Les instructions de consultation
des données sont essentiellement de nature déclarative et non procédurale. Le
langage SQL semble destiné tant au développeur informaticien qu’à l’utilisateur
final.

Exemple :

Rechercher le nom et l’adresse de tous les clients de Boma s’exprime par la


requête suivante, qui appliquée à la table client comportant les colonnes nom,
adresse et ville :

Select Nom, Adresse


From client
Where ville =’Boma’

Modélisation, cycles de vie et méthodes

1. Pourquoi et comment modéliser ?

Qu’est-ce qu’un modèle ?

Un modèle est une représentation abstraite et simplifiée, c’est-à-dire, qui


exclut certains détails, d’une entité (phénomène, processus, système,
etc.) du monde réel en vue de le décrire, de l’expliquer ou de le prévoir.
Modèle est synonyme de théorie, mais avec une connotation pratique : un
modèle, c’est une théorie orientée vers l’action qu’elle doit servir.

Concrètement, un modèle permet de réduire la complexité d’un phénomène


en éliminant les détails qui n’influencent pas son comportement de manière
significative. Il reflète ce que le concepteur croit important pour la
compréhension et la prédiction du phénomène modélisé. Les limites du
phénomène modélisé dépendant des objectifs du modèle.
166

Voici quelques exemples de modèles :

a) Modèle météorologique

A partir de données d’observation (satellite, …), il permet de prévoir les


conditions climatiques pour les jours à venir.

b) Modèle économique

Il peut par exemple permettre de simuler l’évolution de cours boursiers en


fonction d’hypothèses macro-économiques (évolution du chômage,
taux de croissance, …).

c) Modèle démographique

Il définit la composition d’un panel d’une population et son comportement,


dans le but de fiabiliser des études statistiques, d’augmenter l’impact de
démarches commerciales, etc.

d) Plans

Les plans sont des modèles qui donnent une vue d’ensemble du système
concerné. Par exemple, dans le bâtiment, pour la construction d’un immeuble,
il faut préalablement élaborer de nombreux plans :

e)plans d’implantation du bâtiment dans son environnement

f) plans généraux du bâtiment et de sa structure

g) plans détaillés des différents locaux, bureaux, appartements,

h) plans d’écoulements des eaux, etc.


167

Les trois premiers exemples sont des modèles que l’on qualifie de prédictifs. Le
dernier, plus conceptuel, possède différents niveaux de vues comme la plupart
des modèles en génie logiciel.

Pourquoi modéliser ?

Modéliser un système avant sa réalisation permet de mieux comprendre le


fonctionnement du système. C’est également un bon moyen de maîtriser sa
complexité et d’assurer sa cohérence. Un modèle est un langage commun,
précis, qui est connu par tous les membres de l’équipe et il est donc, à ce titre,
un vecteur privilégié pour communiquer. Cette communication est essentielle
pour aboutir à une compréhension commune aux différentes parties prenantes
(notamment entre la maîtrise d’ouvrage et la maîtrise d’œuvre informatique)
et précise d’un problème donné.

Dans le domaine de l’ingénierie du logiciel, le modèle permet de mieux répartir


les tâches et d’automatiser certaines d’entre elles. C’est aussi un facteur de
réduction des coûts et des délais. Par exemple, les plateformes de modélisation
savent maintenant exploiter les modèles pour faire de la génération de code
(au moins au niveau du squelette) voire des allers - retours entre le code et le
modèle sans perte d’information.

Le modèle est enfin indispensable pour assurer un bon niveau de qualité et une
maintenance efficace. En effet, une fois mise en production, l’application va
devoir être maintenue, probablement par une autre équipe et, qui plus est, pas
nécessairement de la même société que celle ayant créée l’application.

Le choix du modèle a donc une influence capitale sur les solutions obtenues.
Les systèmes non triviaux sont mieux modélisés par un ensemble de modèles
indépendants. Selon les modèles employés, la démarche de modélisation n’est
pas la même.

Qui doit modéliser ?

La modélisation est souvent faite par la maîtrise d’œuvre informatique(MOE).


C’est malencontreux, car les priorités de la MOE résident dans le
fonctionnement de la plate-forme informatique et non dans les processus de
l’entreprise.
168

Il est préférable que la modélisation soit réalisée par la maîtrise d’ouvrage


(MOA) de sorte que le métier soit maître de ses propres concepts. La MOE doit
intervenir dans le modèle lorsque, après avoir défini les concepts du métier, on
doit introduire les contraintes propres à la plate-forme informatique.

Il est vrai que certains métiers, dont les priorités sont opérationnelles, ne
disposent pas toujours de la capacité d’abstraction et de la rigueur
conceptuelle nécessaires à la formalisation.

La professionnalisation de la MOA a pour but de les doter de ces compétences.


Cette professionnalisation réside essentiellement dans l’aptitude à modéliser le
système d’information du métier : le maître mot est /modélisation/.

Lorsque le modèle du système d’information est de bonne qualité, sobre, clair,


stable, la maîtrise d’œuvre peut travailler dans de bonnes conditions. Lorsque
cette professionnalisation a lieu, elle modifie les rapports avec l’informatique
et déplace la frontière des responsabilités, ce qui contrarie parfois les
informaticiens dans un premier temps, avant qu’ils n’en voient apparaître les
bénéfices.

Maîtrise d’ouvrage et maîtrise d’œuvre

a) Maître d’ouvrage (MOA) :

Le MOA est une personne morale (entreprise, direction etc.), une entité de
l’organisation. Ce n’est jamais une personne.

b) Maître d’œuvre (MOE) :

Le MOE est une personne morale (entreprise, direction etc.) garante de la


bonne réalisation technique des solutions. Il a, lors de la conception du SI, un
devoir de conseil vis-à-vis du MOA, car le SI doit tirer le meilleur parti des
possibilités techniques.

Le MOA est client du MOE à qui il passe commande d’un produit nécessaire à
son activité.
169

Le MOE fournit ce produit ; soit il le réalise lui-même, soit il passe commande à


un ou plusieurs fournisseurs (« entreprises ») qui élaborent
le produit sous sa direction.

La relation MOA et MOE est définie par un contrat qui précise leurs
engagements mutuels.

Lorsque le produit est compliqué, il peut être nécessaire de faire appel à


plusieurs fournisseurs. Le MOE assure leur coordination ; il veille à la cohérence
des fournitures et à leur compatibilité. Il coordonne l’action des fournisseurs en
contrôlant la qualité technique, en assurant le respect des délais fixés par le
MOA et en minimisant les risques.

Le MOE est responsable de la qualité technique de la solution. Il doit, avant


toute livraison au MOA, procéder aux vérifications nécessaires (« recette usine
»).

2. Le cycle de vie d’un logiciel

Le cycle de vie d’un logiciel (en anglais software life cycle), désigne toutes les
étapes du développement d’un logiciel, de sa conception à sa disparition.

L’objectif d’un tel découpage est de permettre de définir des jalons


intermédiaires permettant la validation du développement logiciel, c’est-à-dire
la conformité du logiciel avec les besoins exprimés, et la vérification du
processus de développement, c’est-à-dire l’adéquation des méthodes mises en
œuvre.

L’origine de ce découpage provient du constat que les erreurs ont un coût


d’autant plus élevé qu’elles sont détectées tardivement dans le processus de
réalisation.
Le cycle de vie permet de détecter les erreurs au plus tôt et ainsi de maîtriser la
qualité du logiciel, les délais de sa réalisation et les coûts associés.

Le cycle de vie du logiciel comprend généralement au minimum les étapes


suivantes :
170

a) Définition des objectifs :

Cette étape consiste à définir la finalité du projet et son inscription dans une
stratégie globale.

b) Analyse des besoins et faisabilité

c’est-à-dire l’expression, le recueil et la formalisation des besoins du


demandeur (le client) et de l’ensemble des contraintes, puis l’estimation de la
faisabilité de ces besoins.

c) Spécifications ou conception générale

Il s’agit de l’élaboration des spécifications de l’architecture générale du


logiciel.

d) Conception détaillée

Cette étape consiste à définir précisément chaque sous-ensemble du logiciel.

e) Codage (Implémentation ou programmation)

C’est la traduction dans un langage de programmation des fonctionnalités


définies lors de phases de conception.

f) Tests unitaires

Ils permettent de vérifier individuellement que chaque sous-ensemble du


logiciel est implémenté conformément aux spécifications.

g) Intégration

L’objectif est de s’assurer de l’interfaçage des différents éléments (modules)


du logiciel. Elle fait l’objet de tests d’intégration consignés dans un document.
171

h) Qualification (ou recette)

C’est-à-dire la vérification de la conformité du logiciel aux spécifications


initiales.

i) Documentation

Elle vise à produire les informations nécessaires pour l’utilisation du logiciel


et pour des développements ultérieurs.

j) Mise en production

C’est le déploiement sur site du logiciel.

k) Maintenance

Elle comprend toutes les actions correctives (maintenance corrective) et


évolutives (maintenance évolutive) sur le logiciel.

La séquence et la présence de chacune de ces activités dans le cycle de vie


dépendent du choix d’un modèle de cycle de vie entre le client et l’équipe de
développement. Le cycle de vie permet de prendre en compte, en plus des
aspects techniques, l’organisation et les aspects humains.

3. Modèles de cycles de vie d’un logiciel

A) Modèle de cycle de vie en cascade

Une illustration...

Figure 1.1: Modèle du cycle de vie en cascade


172

Le modèle de cycle de vie en cascade a été mis au point dès 1966, puis
formalisé aux alentours de 1970.

Dans ce modèle le principe est très simple : chaque phase se termine à une
date précise par la production de certains documents ou logiciels.
Les résultats sont définis sur la base des interactions entre étapes, ils sont
soumis à une revue approfondie et on ne passe à la phase suivante que s’ils
sont jugés satisfaisants.

Le modèle original ne comportait pas de possibilité de retour en arrière. Celle-


ci a été rajoutée ultérieurement sur la base qu’une étape ne remet en cause
que l’étape précédente, ce qui, dans la pratique, s’avère insuffisant.

L’inconvénient majeur du modèle de cycle de vie en cascade est que la


vérification du bon fonctionnement du système est réalisée trop tardivement:
lors de la phase d’intégration, ou pire, lors de la mise en production.

B. Modèle de cycle de vie en V

Une illustration...
Figure 1.2: Modèle du cycle de vie en V

Le modèle en V le cycle de vie le plus connu et certainement le plus utilisé. Il


s’agit d’un modèle en cascade dans lequel le développement des tests et du
logiciel sont effectués de manière synchrone.

Le principe de ce modèle est qu’avec toute décomposition doit être décrite la


recomposition et que toute description d’un composant est accompagnée de
tests qui permettront de s’assurer qu’il correspond à sa description.

Ceci rend explicite la préparation des dernières phases (validation (construction


du logiciel), et permet ainsi d’éviter un écueil bien connu de la spécification du
logiciel : énoncer une propriété qu’il est impossible de vérifier objectivement
après la réalisation.
173

Cependant, ce modèle souffre toujours du problème de la vérification trop


tardive du bon fonctionnement du système.

C. Modèle de cycle de vie en spirale

Proposé par B. Boehm en 1988, ce modèle est beaucoup plus général que le
précédent. Il met l’accent sur l’activité d’analyse des risques :

Chaque cycle de la spirale se déroule en quatre phases :

1. détermination, à partir des résultats des cycles précédents, ou de l’analyse


préliminaire des besoins, des objectifs du cycle, des alternatives pour les
atteindre et des contraintes ;

2. analyse des risques, évaluation des alternatives et, éventuellement


maquettage ;

3. développement et vérification de la solution retenue, un modèle « classique


» (cascade ou en V) peut être utilisé ici ;

4. revue des résultats et vérification du cycle suivant.

L’analyse préliminaire est affinée au cours des premiers cycles. Le modèle


utilise des maquettes exploratoires pour guider la phase de conception du cycle
suivant. Le dernier cycle se termine par un processus de développement
classique.

d. Modèle par incrément

Dans les modèles précédents un logiciel est décomposé en composants


développés séparément et intégrés à la fin du processus.

Dans les modèles par incrément un seul ensemble de composants est


développé à la fois : des incréments viennent s’intégrer à un noyau de logiciel
développé au préalable. Chaque incrément est développé selon
l’un des modèles précédents.
174

Les avantages de ce type de modèle sont les suivants :

* chaque développement est moins complexe ;


* les intégrations sont progressives ;
* il est ainsi possible de livrer et de mettre en service chaque incrément ;
* il permet un meilleur lissage du temps et de l’effort de développement grâce
à la possibilité de recouvrement (parallélisation) des différentes phases.

Les risques de ce type de modèle sont les suivants :

* remettre en cause les incréments précédents ou pire le noyau ;


* ne pas pouvoir intégrer de nouveaux incréments.

Les noyaux, les incréments ainsi que leurs interactions doivent donc être
spécifiés globalement, au début du projet. Les incréments doivent être aussi
indépendants que possibles, fonctionnellement mais aussi sur le plan du
calendrier du développement.

4. Méthodes d’analyse et de conception

Les méthodes d’analyse et de conception fournissent une méthodologie et des


notations standard qui aident à concevoir des logiciels de qualité.

Il existe différentes manières pour classer ces méthodes, dont :

*La distinction entre composition et décomposition :*

Elle met en opposition d’une part les méthodes ascendantes qui consistent à
construire un logiciel par composition à partir de modules existants et, d’autre
part, les méthodes descendantes qui décomposent récursivement le système
jusqu’à arriver à des modules programmables simplement.

*La distinction entre fonctionnel (dirigée par le traitement) et orientée objet : *

Dans la stratégie fonctionnelle (également qualifiée de structurée) un


système est vu comme un ensemble hiérarchique d’unités en interaction, ayant
chacune une fonction clairement définie.
175

Les fonctions disposent d’un état local, mais le système a un état partagé, qui
est centralisé et accessible par l’ensemble des fonctions.

Les stratégies orientées objet considèrent qu’un système est un ensemble


d’objets interagissants. Chaque objet dispose d’un ensemble d’attributs
décrivant son état et l’état du système est décrit (de façon décentralisée) par
l’état de l’ensemble.

Vous aimerez peut-être aussi