Académique Documents
Professionnel Documents
Culture Documents
UNIVERSITE DE KINSHASA
FACULTE POLYTECHNIQUE
Objectifs du cours
1
Chapitre 1.
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 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.
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.
a) En informatique de gestion
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.
b) En informatique scientifique
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.
Chapitre 2.
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.
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).
L’entreprise acquiert ses intrants en s’appuyant sur les 5 marchés des facteurs
de production
figure
9
- l’Etat, les communes et les organismes sociaux perçoivent des impôts et des
cotisations sociales (INSS).
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.
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.3. Le déclin
- mévente de ses produits : elle n’a pas réussi à imposer ses produits ou
elle ne les a pas renouvelés à temps ;
- 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 ;
b) Description de l’environnement
- 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 Evgrafoff
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é.
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
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.
1. 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
2. Le principe de Peter
Chapitre 3
LE SYSTEME D’INFORMATION
Méthodes :
On peut trouver :
20
Il s’agit notamment de :
b. favoriser la communication
Informations spécialisées
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 :
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 :
1. 2. Le réseau informel
1. L’incapacité à évoluer
2. Le manque de stratégie
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
6. La surpuissance du matériel
7. La maintenance
8. L’inexistence de dialogue
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 :
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.
Elle renseigne sur les actions accomplies par soi-même ou par d’autres. La
tenue d’une comptabilité en est le meilleur exemple.
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
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é
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.
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
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.
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.
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.
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.
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.
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
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).
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
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.
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
0 0 état « 0 »
0 1 état « 1 »
1 0 état « 2 »
1 1 état « 3 »
et sa valeur est :
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.
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.
2 8 4 2 1 0,5 0,25
Les puissances de la base B0, B1 …... B-1 ... sont appelées les poids.
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 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.
15 / 2 = 7 reste 1
43
7 / 2 = 3 reste 1
3 / 2 = 1 reste 1
1 / 2 = 0 reste 1
42 : 8 = 5 reste 2
5 : 8 = 0 reste 5
(1111)2 = 1 x 23 + 1 x 22 + 1 x 21 + 1 x 20 = 15
(642)8 = 6 x 82 + 4 x 81 + 2 x 80 = 6 x 64 + 4 x 8 + 2 x 1 = 418
567 en octal - 101 110 111 en binaire. Ici chaque chiffre octal correspond à
trois bits.
a) addition et soustraction
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
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
Hexadécimal
Octal
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
1011 0010 B2
1 + 1
____________ ___
1 0 1 1 0 0 1 1 ----- B3
Chapitre 5
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
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.
- mode d’emploi ;
- recette de cuisine ;
- itinéraire routier ;
- notice de montage
- calculer la racine carrée
- la multiplication de deux nombres etc.…
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.
- 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).
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
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.
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.
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.
5.3.1. Exactitude
a. Utilisation de tests.
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
c. Argumentation
5.3.3. Efficacité
- Le nombre d’opérations ;
- L’espace de stockage (espace – mémoire) ;
- Le nombre de transferts d’information entre zones de stockage.
- 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.
- 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.
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.
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é
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.
Le jeu d’instructions (langage) que l’ordinateur est capable de traiter est donc
tout naturellement déterminé par le processeur.
- La première génération
- 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.
- La troisième génération
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)
- De manière générale, on peut dire que les langages interprétés sont bien
adaptés pour le développement rapide :
- La programmation structurée
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 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.
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.
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
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.
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.
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
Renvoi
Entrée - sortie
76
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.
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
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.
A0
I I+1
Montant quantité * prix_unitaire
Action Effet
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 :
Exemple :
C. La boucle
Exemple :
C.2 répéter
traitement(s)
79
jusqu’à condition
Exemple : répéter
Compteur compteur + 1
Jusqu’à compteur = 10.
fpour
Exemple :
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).
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.
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 :
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.
Cas 1.
Début
Entier a, b, som, reste, quot, prod
Lire a, b
Som a + b
Reste a – b
Quot a / b
Prod a * b
Cas 2.
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
AA–B
82
Cpt Cpt + 1
Ftantque
Ecrire Cpt.
Fin
Cas 3.
(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
MA
NB
Tant que not (N = 0) faire
R M mod N
MN
N R
Ftant que
Pgcd M
Ecrire PGCD
Fin
83
Cas 4
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
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
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
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
Début
entier a, b, c, sauve
lire a, b, c
si a < b alors sauve a
ab
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
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.
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.
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
Amort 2 * val / n
Val val- amort
Ecrire cpt, amort, val
Fpour
-
lire les coefficients de l’équation du second degré ax2 + bx + c puis calculer
et afficher les racines de cette équation.
- 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
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
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.
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.
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.
Cas 12.
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.
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.
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
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.
3 9 198 67 5 88
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.
Début
Vecteur A [1..10] des entiers
Entier i, som, nbre
i0
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
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
15 54 71 21 34
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.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)
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++
#include <iostream>
Void main ( ) 0101010000011111
{ 0111111000001010
Cout << “ hello world ! “ 0010111011111100
<< endl;
}
Le programme C++ le plus simple et le plus inutile (puisqu’il ne fait rien) est :
Void main ( )
{
}
99
Void main ( )
{
/*
Corps du programme
(à définir par la suite
*/
}
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.
Ax2 + b x + c = 0
#include <cmath>
# include <iostream>
Void main ( )
{
Float a (0.0)
Float b (0.0)
Float c (0.0)
Float delta (0.0)
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 :
b) Son identificateur : qui est le nom par lequel la donnée est désignée
dans le programme.
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.
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.
Exemple : int i ;
float exemple_de_variable ;
Exemple : X
B5
Tailleur
Nb_etudiants
Exemple :
Int i ( 3 ) ;
Float exemple_de_variable (3.14) ;
Char c (‘ a’) ;
Int j ( i ) ;
Float x ( 2.0 * exemple_de_variable) ;
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 ;
Cout << <expression1> << < expression2> <<….. << <expressionn >
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
[- 1, 1]
Exemple 2 :
Int i (2);
Float x (3.14);
Cout << « => « << 2 * i +5 << « , « << x << endl;
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
* Multiplication
/ Division
% Modulo
+ Addition
- Soustraction
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.
(2 * 3) - (21 / 3 % 4) + (5)
Z = (x + 3 ) % y ;
Z = (3 * x + y) / 10 ;
Z = (x = 3 *y) + 2 ;
108
x+=y
x=x+y; x-=y
idem pour (/, *, %, - ) x*=y
x/=y
x%=y
x=x+1 ++x
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
Opérateur opération
== égalité
!= différence (non-égalité)
(x >= y)
(x +y = = 4)
opérateur Opération
! NON logique (négation)
|| Ou logique
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
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 ;
}
Exemple :
If (x ! = 0) {cout << 1/x << endl ;}
Else {cout << « erreur « << endl ;
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>
}]
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 :
Do
{
< actions >
{ while (<conditions>)
Exemple :
Do
{
Cout << « valeur de i (>= 0) : « ;
Cin >> i ;
Cout << « => « << i << endl ;
}
While (i < 0) ;
While (<condition>)
{
< actions >
}
Exemple :
While ( x > 0)
{
Cout << x ;
X/=2;
}
{
<actions>
}
115
Langage JAVA
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.
- Le type byte (1 octet) peut contenir les entiers entre - 128 et +127.
117
temperature = 64;
- Le type short (2 octets) contient les entiers compris entre -32768 et +32767.
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;
Le type boolean, lui, ne peut contenir que deux valeurs : true (vrai) ou false
(faux), sans guillemets.
Le type String
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";
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.
String chaine;
String chaineDeCaracteres;
int nombre;
int nombrePlusGrand;
//...
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.
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
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.
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.
nbre1 = nbre1 * 2;
nbre1 *= 2;
nbre1 = nbre1 / 2;
nbre1 /= 2;
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.
Sachons aussi que nous pouvons tout à fait mettre des opérations dans un
affichage, comme ceci :
123
int i = 123;
float j = (float)i;
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
Voilà qui fonctionne parfaitement. Pour bien faire, nous devrions mettre le
résultat de l'opération en type double.
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 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();
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.
Donc, avant d'indiquer à Java qu'il faut lire ce que nous allons taper au
clavier, nous devrons instancier un objet Scanner.
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.
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.
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.
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
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,
_ Pour pouvoir récupérer ce vous allez taper dans la console, vous devrez
initialiser
Les conditions
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.
int i = 58;
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.
Cet opérateur vous initie à la notion d'intersection d'ensembles. Ici, nous avons
deux conditions qui définissent un ensemble chacune :
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 !
La structure switch
Le switch est surtout utilisé lorsque nous voulons des conditions à la carte,
c’est-à-dire dans le cas de choix multiple.
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
Exemple.
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:
_ 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 :
En résumé
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.
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.
.
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
}
}
System.out.println("Au revoir...");
Remarque :
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.
int a = 1, b = 15;
while (a++ < b)
139
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.
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
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.
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 :
Exemple 1.
141
Exemple 2.
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é
.La boucle while (condition) {...} évalue la condition puis elle exécute
éventuellement un tour de boucle (ou plus) ;
. 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
:
du contenu désiré dans notre variable tableau pour la sortir, travailler avec,
l'afficher. . .
Déclaration du tableau :
//Ou encore
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
toLowerCase()
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.
Exemple concret :
146
charAt()
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.
double X = 0.0;
X = Math.random();
//Retourne un nombre aléatoire
//compris entre 0 et 1, comme 0.0001385746329371058
Nous verrons dans ce chapitre les différents types de renvoi ainsi que les
paramètres que peut accepter une méthode.
Remarque
_ 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);
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.
La surcharge de méthode
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 :
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) :
}
}
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 :
parcourirTableau(tabStr);
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.
La notion de classe
_ à des variables, qui représentent les divers attributs de l'élément que vous
souhaitez utiliser ;
Une classe contient donc des variables et des méthodes, qui forment un tout.
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.
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.
Notons que qu'il y a trois grands types de variables dans une classe objet, à
savoir :
_ 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.
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.
Voici le constructeur de notre objet Ville, celui qui permet d'avoir des objets
avec des paramètres différents :
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.
// ...
}
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.
1. Le schéma directeur
2. Etude préalable
Chapitre 8.
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 ?
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.
Quels sont les problèmes engendrés par le traitement des fichiers pour les
applications des utilisateurs ?
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.
Quittance du client
Opérations du client
Programme des
Comptes chèques
Pgr. Compte prg. Prêt à
Epargne tempérament
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 :
a) Modèle météorologique
b) Modèle économique
c) Modèle démographique
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 :
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 ?
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.
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.
Le MOA est une personne morale (entreprise, direction etc.), une entité de
l’organisation. Ce n’est jamais une personne.
Le MOA est client du MOE à qui il passe commande d’un produit nécessaire à
son activité.
169
La relation MOA et MOE est définie par un contrat qui précise leurs
engagements mutuels.
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.
Cette étape consiste à définir la finalité du projet et son inscription dans une
stratégie globale.
d) Conception détaillée
f) Tests unitaires
g) Intégration
i) Documentation
j) Mise en production
k) Maintenance
Une illustration...
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.
Une illustration...
Figure 1.2: Modèle du cycle de vie en V
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 :
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.
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.
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.