Générateur d`Histogrammes Automatiques sur

Transcription

Générateur d`Histogrammes Automatiques sur
Université Montpellier II
Institut Universitaire
Technologique
Département Informatique
Générateur d’Histogrammes
Automatiques sur Internet
Applet Java
RAPPORT FINAL DE PROJET
Présenté et soutenu par
Brice ARGENSON
Ludovic BONNET
Sous la direction de
Mr Alain BERLINET
Année Universitaire 2006-2007
Générateur d’Histogrammes
Rapport de projet
Brice ARGENSON
Ludovic BONNET
-2-
Générateur d’Histogrammes
Rapport de projet
Brice ARGENSON
Ludovic BONNET
-3-
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
REMERCIEMENTS
Nous tenons tout d'abord à remercier particulièrement M. Alain Berlinet, notre
tuteur de projet, pour son écoute, ses réponses à nos questions, sa disponibilité et toute
l'aide qu'il a pu nous apporter tout au long de notre projet.
Nous remercions également M. Henri Betaille qui a répondu à nos questions de
programmation en Java et PHP ainsi que Mme Huguette Albernhe-Giordan pour son aide
à la réalisation et à la présentation du rapport de projet.
Enfin, nous remercions l’IUT de Montpellier et particulièrement le département
Informatique pour nous avoir fourni des locaux et ordinateurs pour travailler
efficacement tout au long de l'année sur notre projet.
Rapport de projet
-4-
Brice ARGENSON
Ludovic BONNET
Générateur d’Histogrammes
SOMMAIRE
Glossaire
1. Introduction…………………………………………………………………………p.1
2. Matériel et méthodes………………………………………………………………..p.2
2.1. Situation de départ et analyse des besoins………………………………...p.3
2.2. Fonctionnalités de l’histogramme..…………….………………………… p.4
2.3. Description des solutions………………………………………………… p.5
2.3.1. Solutions possibles et choisies..………………………………… p.6
2.3.2 Moyens et matériels à notre disposition…………………………. p.8
3. Réalisation des deux générateurs……………………..…………………………… p.8
3.1. Analyse UML..…………………………………………………………… p.9
3.1.1. Diagramme des cas d’utilisations……………………………….. p.10
3.1.2. Diagramme de séquence d’utilisation…………………………… p.11
3.2. Conception UML..………………………………………………………... p.12
3.2.1. Diagrammes de classes actives………………………………….. p.13
3.2.2. Diagrammes de séquence de programmation…………………….p.14
4. Résultat……………………………………………………………………………...p.15
5. Discussion autour de nos solutions………………………………………..……….. p.16
6. Conclusion…………………………………………………………………………..p.17
Annexes………………………………………………………………………………..p.18
Rapport de projet
-5-
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
GLOSSAIRE
Java : Technologie composée d'un langage de programmation orienté objet et d'un
environnement d'exécution.
Applet : Logiciel qui s'exécute dans la fenêtre d'un navigateur Web.
HTML (HyperText Markup Langage) : Langage informatique créé et utilisé pour écrire
les pages Web.
CSS (Cascading Style Sheets) : Langage utilisé pour décrire la présentation d'un
document structuré écrit en HTML ou en XML.
PHP (HyperText Preprocessor) : Langage de scripts libre principalement utilisé pour être
exécuté par un serveur HTTP.
Framework : ensemble de bibliothèques permettant le développement rapide
d'applications.
ASP (Active server pages) : Technologie développée par Microsoft utilisée dans la
programmation Web.
Classe : En programmation orientée objet, une classe déclare des propriétés communes à
un ensemble d'objets. La classe déclare des attributs représentant l'état des objets et des
méthodes représentant leur comportement.
Objet : Instanciation d'une classe au sens de la programmation orientée objet.
Rapport de projet
-6-
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
TABLE DES TABLEAUX ET FIGURES
Diagramme des cas d’utilisation……………………………………………………....p.15
Diagramme de séquence d’utilisation : cas « réaliser histogramme »………………...p.17
Diagramme de séquence d’utilisation : cas « Consulter explications ».........................p.18
Diagramme de classe actives : 1ère méthode…………………………………………..p.20
Diagramme de classe actives : 2ième méthode…………………………………………p.21
Diagramme de séquence de programmation : 1ère méthode…………………………...p.22
Diagramme de séquence de programmation : 2ième méthode………………………….p.24
Présentation site : Page d’accueil……………………………………………………...p.26
Présentation site : Page « générer.php »……………………………………………… p.27
Présentation site : Page « générer.php » avec applet…………………………………..p.28
Présentation du premier générateur…………………………………………………... p.29
Présentation du second générateur…………………………………………………….p.29
Présentation site : Page « explication.php »…………………………………………...p.30
Présentation site : Page « contact.php »……………………………………………….p.31
Comparaison des deux histogrammes…………………………………………………p.33
Rapport de projet
-7-
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
1. INTRODUCTION
Dans le cadre de notre deuxième année en IUT Informatique, il nous a été
demandé de réaliser un projet informatique. Parmi tous les sujets proposés, nous avons
choisi de réaliser celui portant sur « la création d’un générateur d’histogrammes
automatiques ».
Ce projet était proposé et tuteuré par M. Alain Berlinet.
Plus précisément il s’agissait de réaliser une application exécutable à partir d’une
page Internet, générant un histogramme en référence à un fichier de valeurs, fourni par
l’utilisateur.
Cette application, pourrait constituer un outil pédagogique dans le cadre d’un
enseignement de Mathématiques.
Ce présent rapport a pour objectif de présenter la description et l’explication de
notre démarche d’analyse et de conception, les étapes de la réalisation, puis les résultats
obtenus et enfin la discussion autour des solutions réalisées.
Rapport de projet
-8-
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
2. MATERIEL ET METHODES
2.1 SITUATION DE DEPART ET ANALYSE DES BESOINS
A partir du titre du sujet, de l’explication des objectifs d’un tel projet par notre
tuteur M Berlinet, lors de nos premiers entretiens, nous avons élaboré le cahier des
charges suivant :
Il nous a donc été demandé l’élaboration d’une application pouvant générer des
histogrammes.
Quatre principales contraintes se sont alors profilées:
Tout d’abord, cette application devait être disponible et exécutable à partir d’une
page Internet
De plus, celle-ci devait être compatible avec la plupart des plateformes existantes,
se doit d’être simple d’utilisation et répondre à des critères ergonomiques
Ensuite, l’application devait pouvoir récupérer les valeurs nécessaires à la
génération de l’histogramme dans un fichier texte qui serait donné par l’utilisateur
Enfin, le générateur d’histogrammes devait utiliser un algorithme original
développé par notre tuteur, M Berlinet
Rapport de projet
-9-
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Pour nous aider dans sa réalisation, nous nous sommes beaucoup appuyés sur le
support de cours traitant des histogrammes, qui nous avait été donné dans le cadre de nos
cours de mathématiques en début de seconde année d’IUT.
Cette application, nous le rappelons, devrait être utilisée par M. Berlinet dans un
cadre pédagogique. L’objectif de ce dernier est d’illustrer ses cours par un ensemble
d’applications. Notre générateur avait donc pour but d’être un support pour le cours sur
les histogrammes. Parallèlement à cela, d’autres étudiants travaillent sur le
développement d’autres applications en rapport avec d’autres cours enseignés.
Puis lorsque nous avons terminé le développement de cette solution, notre tuteur nous
a également demandé d’implémenter un autre algorithme générateur d’histogrammes
répondant au même cahier des charges.
Lorsque ces deux solutions ont été développées, il a fallu aussi concevoir un site
Internet contenant des pages d’explications du déroulement de l’algorithme et également
intégrer le générateur.
Rapport de projet
- 10 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
2.2. FONCTIONNALITES
Nous avons complété le cahier des charges par la définition de fonctionnalités
tels que :
Etre capable de générer à partir d’un fichier contenant des valeurs
numériques un histogramme représentant ces données.
Récupérer les données grâce à une page PHP pour permettre de gérer les
valeurs du fichier qu’elles soient séparées par des espaces, des virgules ou
des points virgules.
Disposer d’un affichage graphique agréable, concis et clair en rapport avec
le sujet.
Permettre un redimensionnement de la fenêtre de l’histogramme à la guise
de l’utilisateur.
Etre accessible depuis un quelconque navigateur Internet.
Etre un outil pédagogique pour aider à la compréhension et à la réalisation
d’histogrammes.
Rapport de projet
- 11 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
2.3. DESCRIPTION DES SOLUTIONS
Afin de développer un tel projet, de nombreuses solutions de langages de
programmations étaient possibles. L’exigence était simplement que le langage puisse être
exécuté en ligne conformément au cahier des charges et disposer d’une programmation
graphique agréable.
L’application devant être exécutée en ligne, l’idée d’un programme mis sous la
forme d’un applet s’est tout de suite imposée.
2.3.1 SOLUTIONS POSSIBLES ET CHOISIES
Les choix de langages suivants auraient pu être faits pour réaliser l’applet:
. NET : un langage du Framework .NET de Microsoft tels que l’ASP.NET,
C#, Visual Basic…
Java : langage libre de chez Sun Microsystems
Les possibilités des deux types d’applets sont sensiblement identiques, malgré un
léger avantage pour celle en .NET au niveau rapidité d’exécution. De plus, ces langages
permettraient de réutiliser des concepts forts de programmation tels que ceux de la
programmation orientée objet et de disposer de librairies graphiques puissantes et
étoffées.
Cependant, il s’est avéré que la plateforme .NET n’était exécutable qu’à partir de
machines possédant un « Framework .NET », composant exclusivement compatible avec
Windows et Internet Explorer à partir de la version 5.
Utiliser une telle solution, ne nous aurait pas permis de respecter la contrainte de
compatibilité initialement donnée, ce pourquoi, nous nous sommes donc tournés vers le
langage Java. Un applet Java (tout comme un applet .NET) nécessite pour son exécution
sur une machine, la présence d’un composant appelé « Machine Virtuelle», permettant
d’interpréter le code de l’application afin de le rendre compréhensible par la machine.
Rapport de projet
- 12 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Seulement, la Machine Virtuelle Java, contrairement au Framework .NET, est
multiplateforme et compatible avec tous les navigateurs Internet et celle-ci est déjà très
répandue sur de nombreux ordinateurs car le langage Java est omniprésent sur Internet.
Nous avons également utilisé ces langages de programmation Web pour intégrer l’applet
à une page Internet:
HTML: nous avons fait le choix de ce langage car c’est le langage de
référence pour créer des pages Internet.
CSS : nous avons utilisé ce langage pour réaliser les feuilles de style du site
Internet, ce qui permet de séparer la présentation de la structure HTML.
PHP : nous avons fait le choix de ce langage pour traiter le fichier de
données avant de l’envoyer à l’applet.
Pour des aspects pratiques, nous avons dans un premier temps développé le
générateur d’histogrammes sous forme d’une application graphique prenant ses valeurs
dans une fenêtre de saisie et non sous celle d’un applet utilisant un fichier de valeurs. En
effet, cela nous permettait de nous concentrer d’abord sur la conception algorithmique du
générateur sans se soucier du problème d’envoi du fichier et également de nous faciliter
les premiers tests.
2.3.2 MOYENS ET MATERIELS A NOTRE DISPOSITION :
Afin de développer ce projet, nous avions à notre disposition :
Objecteering, un atelier de génie logiciel pour UML
Eclipse, un environnement de développement intégré libre
WAMP, ensembles d’applications contenant Apache, MySQL et PHP
Firefox, Internet Explorer et Safari, les navigateurs les plus utilisés
Notepad++ un éditeur de texte qui intègre la coloration syntaxique de code
Rapport de projet
- 13 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
3. REALISATION DES DEUX GENERATEURS
Durant nos deux années d’enseignements à l’IUT, nous avons fait l’apprentissage
d’une méthode d’analyse nommée Merise ainsi que le langage UML. C’est donc tout
naturellement que nous nous sommes interrogés sur le choix de l’outil d’analyse et de
conception, qui serait le plus adapté à notre projet parmi ces deux possibilités.
L’analyse tout comme la conception aurait aussi bien pu être modélisées en Merise
qu’en UML cependant l’UML nous a paru plus adapté pour une programmation orientée
objet, ce pourquoi nous avons choisi ce langage.
De plus durant ce projet, nous avons travaillé en processus itératif incrémental,
c'est-à-dire que nous avons découpé le projet en petites parties que nous avons d’abord
modélisées puis programmées et enfin fait tester par M. Berlinet.
Rapport de projet
- 14 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
3.1 DOSSIER D’ANALYSE UML
Rapport de projet
- 15 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
3.1.1. DIAGRAMME DES CAS D’UTILISATION
Le cas d’utilisation « générer histogrammes » permet à l’internaute de se
connecter sur le site afin qu’il puisse envoyer son fichier de données ; le système
communique alors avec l’applet et renvoie à l’utilisateur l’histogramme correspondant à
ses valeurs.
Le cas d’utilisation « explications histogrammes » renvoie à l’utilisateur la page
contenant les explications du déroulement de génération d’un histogramme.
Rapport de projet
- 16 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Acteurs :
L’internaute désirant un histogramme (principal) et l’applet Java qui réalisera un
histogramme (externe).
Pré condition :
Le site est en ligne et ne réalise pas actuellement d’histogrammes pour
l’utilisateur.
Scénario nominal :
1. L’utilisateur se connecte sur le site
2. La page d’accueil est chargée sur le navigateur de l’internaute.
3. L’utilisateur demande la page pour générer un histogramme
4. La page Internet est renvoyée et demande à l’utilisateur d’envoyer son fichier de
données
5. L’utilisateur envoie son fichier de données au site.
6. Le site traite le fichier de données et envoie les données à l’applet Java, acteur
externe.
7. La page Internet par le biais de l’applet Java affiche ensuite l’histogramme à
l’utilisateur.
Enchaînements alternatifs :
A1 : L’utilisateur demande à voir les pages explicatives concernant l’histogramme, le site
le redirige vers les pages d’explications.
Enchaînements d’erreur :
E1 : Les données saisies par l’utilisateur dans le fichier ne sont pas séparées par des
virgules, points-virgules ou espaces ou bien le fichier ne contient pas que de nombres
réels:
La page Internet renvoie une erreur à l’utilisateur et lui demande de renvoyer ses
données en recommençant au 4 du scénario nominal.
Rapport de projet
- 17 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
3.1.2 DIAGRAMME DE SEQUENCE D’UTILISATION
Cas « Réaliser histogramme »
Tout d’abord l’internaute se connecte au site et celui-ci renvoie alors la page
d’accueil.
Le visiteur demande la page pour générer un histogramme; le système renvoie la
page generer.php.
L’utilisateur envoie ses données sous la forme d’un fichier contenant ses valeurs
séparées par des espaces, virgules ou points-virgules. L’histogramme correspondant aux
valeurs saisies dans le fichier est ensuite renvoyé à l’utilisateur.
Rapport de projet
- 18 -
Brice ARGENSON
Ludovic BONNET
Générateur d’Histogrammes
Cas « Consulter explications histogrammes »
Premièrement le visiteur se connecte au site ; le système lui envoie la page
d’accueil.
L’internaute souhaite la page d’explication portant sur la méthode de génération
d’un
histogramme,
Rapport de projet
illustré
par
un
exemple
et
des
explications.
- 19 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
3.2 DOSSIER DE CONCEPTION UML
Rapport de projet
- 20 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
3.2.1 DIAGRAMME DE CLASSES ACTIVES
Première méthode :
Seconde méthode :
Rapport de projet
- 21 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
3.2.2 DIAGRAMME DE SEQUENCE DE PROGRAMMATION
Première méthode :
Rapport de projet
- 22 -
Générateur d’Histogrammes
Rapport de projet
Brice ARGENSON
Ludovic BONNET
- 23 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Sur ce diagramme, nous pouvons voir les différentes étapes du déroulement de
l’algorithme qui sont utilisées après l’envoi d’un fichier de valeurs par un utilisateur.
On constate en effet, que la page « generer.php » fait appel à l’applet (méthode
init() ) et ce, en lui faisant passer en paramètre les valeurs récupérées dans le fichier.
L’applet instancie alors, un objet de la classe Histogramme, qui reçoit lui même ces
valeurs.
Lors de la construction de cet objet, la méthode tri() est exécutée afin de trier par
ordre croissant ces valeurs à traiter. Sa méthode initClasse() est ensuite appelée, et va
créer une instance de classe ArrayList, afin de stocker les informations des différents
intervalles de l’histogramme, puis appellera une autre méthode, createClasse(), qui se
chargera de créer la première instance de la classe Classe. Celle-ci sera ensuite ajouter à
l’ArrayList.
Une fois la méthode initClasse() terminée, la méthode parcoursDesClasses() est
appelée. Elle exécute alors elle-même, la méthode mediane() qui en fonction des
instances de Classe présentes dans l’ArrayList, détermine la valeur de la médiane de
l’histogramme. Celle-ci, permettra ensuite de découper un intervalle en deux en son
point, grâce à la méthode cutClasse() qui récupérera l’intervalle de base, puis diminuera
son étendu avant d’en créer un autre qui occupera l’étendu libérée.
Le nombre de points à gauche de la médiane est par la suite déterminé par la
méthode nbrPts(), puis une mise à jour de toute les classes de l’ArrayList a alors lieu
grâce aux méthode aGauche() qui détermine la position de l’intervalle par rapport à la
médiane, et la méthode editHauteur() qui applique les nouveau coefficients de hauteur
trouvés en fonction de la médiane. Une condition de fin est ensuite vérifiée par la
méthode finish(). Tant que celle-ci retourne faux, la méthode parcoursDesClasses
recommence.
Dès que le traitement est terminé, la méthode se termine et une instance de Fenetre
(dérivée de JFrame) est créée et se chargera à l’aide d’une instance de la classe Panneau
(dérivée de JPanel) d’afficher l’histogramme ainsi obtenu.
Rapport de projet
- 24 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Seconde méthode :
Rapport de projet
- 25 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
A travers ce diagramme de séquence de programmation du second générateur,
nous pouvons voir les différentes méthodes de programmation qui sont utilisées après
l’envoi d’un fichier de valeurs par un utilisateur.
On constate en effet, que la page « generer.php » fait appel à l’applet (méthode
init() ) et ce, en lui faisant passer en paramètre les valeurs récupérées dans le fichier.
L’applet instancie alors, un objet de la classe Histogramme, qui reçoit lui même ces
valeurs.
Lors de la construction de cet objet, les valeurs sont triées par ordre croissant
(méthode tri()) et une nouvelle instance de la classe ArrayList est créée. Celle-ci
permettra de stocker les différents intervalles de l’histogramme.
Une fois l’objet Histogramme crée, sa méthode parcoursDesClasses() est ensuite
exécutée. Celle-ci consiste en une boucle, créant des instances de la classe Classe en
fonction de certaines conditions au niveau des valeurs reçues, puis les rajoutant à
l’ArrayList.
Une fois sortie de la boucle, la méthode pourcoursDesClasses() prend fin et une
instance de Fenetre (dérivée de JFrame) est créée et se chargera à l’aide d’une instance de
la classe Panneau (dérivée de JPanel) d’afficher l’histogramme ainsi obtenu.
Rapport de projet
- 26 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
4. RESULTATS
4.1 PAGE D’ACCUEIL : index.php
Nous avons choisi de mettre en page d’accueil un descriptif de notre projet, ainsi
qu’un exemple d’histogramme pour donner un aperçu au visiteur du contenu de notre
site et lui donner envie de poursuivre sa navigation.
Rapport de projet
- 27 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
4.2 PAGE GÉNÉRER HISTOGRAMME : generer.php
Voici la page qui permet à l’utilisateur d’envoyer son fichier de données.
Cette page est celle à qui est envoyé le fichier de valeurs par l’utilisateur puis
celle-ci se charge de traiter le fichier.
En effet celle-ci récupère uniquement les valeurs et les transforme sous un format
lisible par l’applet.
A la suite de cela l’applet est lancé avec en paramètre les valeurs du fichier.
Rapport de projet
- 28 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Revoici cette page une fois que l’utilisateur a validé son envoi de fichiers, l’applet
a été généré.
Comme vu précédemment notre tuteur nous a demandé de développer deux générateurs
d’histogrammes utilisant chacun un algorithme différent.
Voici les différents résultats en fonction de l’algorithme utilisé après avoir envoyé
les mêmes données à la page generer.php:
Rapport de projet
- 29 -
Brice ARGENSON
Ludovic BONNET
Générateur d’Histogrammes
Résultat 1er générateur : algorithme de la médiane
Résultat 2ème générateur
Rapport de projet
- 30 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
4.3 PAGE D’EXPLICATIONS DE LA GENERATION D’UN HISTOGRAMME :
explications.php
Page d’explication de l’algorithme des médianes
Cette page explique à l’utilisateur les étapes de l’algorithme de génération de
l’histogramme. Elle se doit d’être claire et explicite.
Rapport de projet
- 31 -
Brice ARGENSON
Ludovic BONNET
Générateur d’Histogrammes
4.4 PAGE DE CONTACT : contact.php
Page de contact
Grace à cette page, tout utilisateur a la possibilité de contacter par e-mail l’un des
développeurs du site ainsi que du générateur présent sur celui-ci.
Rapport de projet
- 32 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
5. DISCUSSION AUTOUR DE NOS SOLUTIONS
Différences entre les deux générateurs :
On peut voir ci-dessus deux histogrammes générés à l’aide des mêmes valeurs
mais pas avec le même algorithme. En rouge, on peut voir l’histogramme généré par la
méthode de la médiane et en bleu la seconde méthode.
On peut constater que les deux algorithmes ne nous donnent pas actuellement le
même résulta. En effet, ceux-ci sont tous deux incomplets.
Des améliorations peuvent être apportées à l’algorithme de la médiane afin que les
divisions sur les classes soient mieux répartis sur l’histogramme. Concernant le second
algorithme, on peut constater que dans certains histogrammes générés il apparaît des
intervalles vides.
Ce problème peut être résolu en fixant une hauteur maximum pour les classes et en
répartissant l’aire ainsi découpée sur les côtés.
Rapport de projet
- 33 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Difficultés rencontrées :
Après quelques tests concluant de notre première version du générateur avec la
saisie des données au clavier, nous nous sommes alors penchés sur son adaptation en
applet. C’est alors que nous nous sommes heurtés à un problème pour l’envoi d’un fichier
de données à l’applet, conformément aux exigences imposées au départ.
En effet, depuis le passage à la version 1.5 de Java, il était devenu impossible à un
applet de manipuler des données présentes sur les disques du client (ou utilisateur) et cela
pour des raisons évidentes de sécurité. Un applet, étant une application web exécutée
chez le client, il nous était aussi impossible de faire communiquer celui-ci directement
avec le serveur web, auquel nous aurions pu envoyer au préalable le fichier de valeurs.
Nous avons alors réfléchi à une alternative, notamment celle de faire passer les
valeurs à l’applet, en paramètre à l’aide d’un code PHP. Celui-ci traiterait donc le fichier
de valeurs envoyé via un formulaire, puis enverrait son contenu à l’applet en tant que
paramètre.
Après mûres réflexions et à la suite de nombreux tests concluants, cette alternative
nous a paru la bonne et nous avons donc décidé de l’accepter.
Possibilités de développement restant :
Les résultats auxquels nous sommes arrivés nous semblent
convenablement aux besoins et contraintes énoncées par notre tuteur.
répondre
Cependant, de nombreuses possibilités d’optimisation et d’améliorations sont
encore possibles et même nécessaires pour répondre au besoin final de notre tuteur. En
effet, celui-ci compte faire continuer le développement de nos applications par d’autres
étudiants, dans le cadre d’autres projets. Comme améliorations visées on peut citer celle
d’optimiser le premier algorithme (méthode de la médiane) en laissant le choix à
l’utilisateur d’utiliser des quantiles variables pour la génération de l’histogramme ou celle
de pouvoir fixer une hauteur maximum de classe pour le deuxième algorithme (symbolisé
par une droite horizontale sur la fenêtre graphique, associée à un ascenseur pour en régler
la hauteur). De nombreuses fonctionnalités comme pouvoir imprimer un histogramme
généré ou en générer deux sur la même fenêtre afin de pouvoir les comparer pourront
aussi être ajoutées ultérieurement.
Rapport de projet
- 34 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
6. CONCLUSION
Après avoir défini un cahier des charges et modélisé en langage UML les deux
applications, nous avons choisi de réaliser cette application principalement en Java et en
PHP. Les résultats que nous avons obtenus sont conformes, semble t-il, au cahier des
charges et aux besoins initiaux de notre tuteur.
Nous pouvons conclure que nous avons bien atteint les objectifs initialement
énoncés par notre tuteur, c'est-à-dire le développement d’une application exécutable à
partir d’Internet, capable de générer des histogrammes suivant des valeurs présentes dans
un fichier donné par l’utilisateur et d’expliquer le déroulement de cette génération afin de
construire un outil pédagogique.
Ce projet était original du fait qu’il ne fallait pas n’implémenter qu’une solution
mais deux algorithmes diamétralement différents pour générer les histogrammes.
Avec la réalisation de ces deux solutions algorithmiques différentes, nous avons
pu nous rendre compte qu’à un problème ne correspondait pas une unique solution. Ce
travail nous a également permis de nous initier au travail en binôme, de travailler pour
une personne cliente (M Berlinet) ayant des besoins clairement définis et attendant un
résultat concret de notre part.
En ce qui concerne le devenir de notre projet, M Berlinet nous a indiqué que
chacune de nos solutions sera reprise l’année prochaine dans le cadre de nouveaux
projets pour ajouter des fonctionnalités aux solutions ou encore de les développer.
Rapport de projet
- 35 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
ANNEXES
Rapport de projet
- 36 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
REFERENCES BIBLIOGRAPHIQUES ET
RESEAUGRAPHIQUES
Cours sur les histogrammes de Monsieur Berlinet
Ensemble des cours de seconde année d’IUT Informatique réalisés par l’IUT.
Delannoy, Claude, Programmer en Java, Paris, EYROLLES, 2006. 690 p.
Informatique, Programmation. ISBN 2-212-11988-7.
{JAVA} Codes Sources : Site regroupant des tutoriels ou codes sources sur des
millions d’exemples, la référence en la matière de partages d’algorithmes.
http://www.Javafr.com
Site du Zér0 ! : Site de tutoriels et d’entraide informatique
http://www.siteduzero.com
Rapport de projet
- 37 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
DOSSIER D’ANALYSE
Rapport de projet
- 38 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
DIAGRAMME DES CAS D’UTILISATION
Rapport de projet
- 39 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
DIAGRAMME DE SEQUENCE
D’UTILISATION
Cas « Réaliser histogramme »
Cas « Consulter pages »
Rapport de projet
- 40 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
DOSSIER DE CONCEPTION
Rapport de projet
- 41 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
DIAGRAMME DE CLASSES ACTIVES
Première méthode :
Rapport de projet
- 42 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
DIAGRAMME DE CLASSES ACTIVES
Seconde méthode :
Rapport de projet
- 43 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
DIAGRAMME DE SEQUENCE DE
PROGRAMMATION
Rapport de projet
- 44 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Première méthode :
Rapport de projet
- 45 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Seconde méthode :
Rapport de projet
- 46 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
DOSSIER DE PROGRAMMATION
Rapport de projet
- 47 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
CODE JAVA PREMIER ALGORITHME :
Classe Projet :
/**
* Classe Projet
*/
public class Projet extends java.applet.Applet{
/**
* Point d'entrée du programme
*/
public void init(){
Histogramme h=new Histogramme(getParameter("valeurs")); //création de l'objet
de la classe histogramme avec saisie des valeurs de celui ci
h.parcoursDesClasses(); //génération de l'histogramme
h.afficher(); //afficher dans la console l'interval et la hauteur de chaques classes
Fenetre Fenetre=new Fenetre(h); //création de la fenetre
Fenetre.setVisible(true); //rend la fenetre lisible
}
}
Rapport de projet
- 48 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Classe Histogramme :
import java.util.ArrayList;
import java.util.StringTokenizer;
/**
* Classe Histogramme
*/
public class Histogramme {
public double[] ptsTab; //tableau de valeurs
public ArrayList<Classe> classeListe; //liste de classes
private double mediane; //médiane de l'histogramme
/**
* Saisie des valeurs
*/
public Histogramme(String valeurs){
StringTokenizer st = new StringTokenizer(valeurs);
ptsTab=new double[st.countTokens()];
for(int i=1; st.hasMoreTokens(); i++){
ptsTab[i-1]=Double.parseDouble(st.nextToken());
} //enregistre les valeurs dans ptsTab[]
tri(); //tri les valeurs dans l'ordre croissant
initClasse();
}
/**
* Tri des valeurs (par séléction)
*/
public void tri(){
double permut;
for(int i=0;i<ptsTab.length-1;i++){
int min=i;
for(int j=i+1;j<ptsTab.length;j++)
if(ptsTab[min]>ptsTab[j]) min=j;
if(min!=i){
permut=ptsTab[i];
ptsTab[i]=ptsTab[min];
ptsTab[min]=permut;
}
}
}
Rapport de projet
- 49 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
/**
* Initialisation de l'histogramme
*/
public void initClasse(){
classeListe = new ArrayList<Classe>();
//création de la première classe
createClasse(new Classe(ptsTab[0],ptsTab[ptsTab.length1],1/(ptsTab[ptsTab.length-1]-ptsTab[0])),0);
}
/**
* Création d'une nouvelle classe
* @param c , classe a rajouter dans la liste
* @param i , indice de la position de la classe dans la liste
*/
public void createClasse(Classe c, int i){
classeListe.add(i, c);
System.out.print("Nouvelle classe : ");
c.afficher();
}
/**
* Parcours de l'histogramme tant que l'Histogramme final n'est pas généré
*/
public void parcoursDesClasses(){
int i;
do{
i=mediane(); //calcul de la mediane, avec retour de l'indice de la classe la
contenant
cutClasse(i); //division de la classe contenant la mediane
}while(!finish()); //tant que la condition de fin n'est pas remplie
}
Rapport de projet
- 50 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
/**
* Découpe une classe en deux
* @param indice , indice de la classe dans la liste
*/
public void cutClasse(int indice){
Classe c=(Classe) classeListe.get(indice); //récupération de la classe dans la
liste
createClasse(c.editLargeur(mediane), indice+1); //création de la nouvelle classe
issue de la division
double coefG=nbrPts(0.0, mediane)/(ptsTab.length/2.0); //calcul du coefficient
gauche de l'histogramme
double coefD=nbrPts(mediane, ptsTab[ptsTab.length-1])/(ptsTab.length/2.0);
//calcul du coefficient droit de l'histogramme
System.out.println("cut Classe : CoefG : "+coefG +"CoefD : "+ coefD);
majClasse(coefG, coefD); //mise à jour de toutes les classes de l'histogramme
après division
}
/**
* Modifie les hauteurs de chaques classes
* @param coefG , coefficient gauche
* @param coefD , coefficient droit
*/
public void majClasse(double coefG, double coefD){
Classe c;
for(int i=0;i<classeListe.size();i++){
c=(Classe) classeListe.get(i); //récupération de la classe d'indice i dans la
liste
if(c.aGauche(mediane)) //si la classe est à gauche de la médiane,
c.editHauteur(coefG); //alors lui appliquer le coefficient gauche
else c.editHauteur(coefD); //sinon lui appliquer le coefficient droit
classeListe.set(i, c); //replacer la classe dans la liste
System.out.print("Mise à jour classe : ");
c.afficher(); //afficher valeurs de la classe mise à jour
}
}
Rapport de projet
- 51 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
/**
* Test condition de fin
* @return true si l'histogramme est fini, false sinon
*/
public boolean finish(){
if((ptsTab.length)%2==0){ //si le nombre de valeur est pair
if(ptsTab[(ptsTab.length/2)-1]!=ptsTab[ptsTab.length/2]){
if(ptsTab[(ptsTab.length/2)-1]<mediane &&
ptsTab[ptsTab.length/2]>mediane){
System.out.println("Finish true pair\n");
return(true); //si la mediane a autant de valeurs de chaques
cotés
}
}else if(ptsTab[(ptsTab.length/2)-1]==arrondi(mediane)) return(true);
}else { //si le nombre de valeurs est impair
System.out.println((arrondi(ptsTab[(ptsTab.length/2)]))+" et "+
arrondi(mediane));
if(arrondi(ptsTab[(ptsTab.length/2)])==arrondi(mediane)){
System.out.println("Finish true impair\n");
return(true); //si la mediane est égale à la valeur médianne du
tableau
}
}
System.out.println("Finish false\n");
return(false); //retourner false sinon
}
Rapport de projet
- 52 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
/**
* Calcul de la médiane de l'histogramme
* @return l'indice de la classe où se trouve la mediane
*/
public int mediane(){
double a=0;
int i=0;
Classe c =(Classe) classeListe.get(i); //récupération de la classe dans la liste
i++;
while(a+c.aire()<0.5){
a=a+c.aire();
c=(Classe) classeListe.get(i); //récupération de la classe suivante dans la
liste
i++;
} //tant que l'air de la classe courante + l'air total des classes précédentes, ne
dépasse pas un demi
mediane=((0.5-a)/c.haut())+c.min(); //calcul de la médiane par rapport à l'aire
manquante dans la classe courante
System.out.println("mediane : "+mediane+'\n'+ "indice de la classe la contenant :
"+ i);
return(i-1); //retourne l'indice de la classe où a été trouvé la médiane
}
/**
* Calcul du nombre de point dans un interval donné
* @param deb , début de l'interval
* @param fin , fin de l'interval
* @return cpt , nombre de points se trouvant dans l'interval [deb;fin[
*/
public int nbrPts(double deb, double fin){
int cpt=0; //compteur
if (fin==ptsTab[ptsTab.length-1]) cpt++; //si fin correspond à la plus grande
valeur de ptsTab, incrémenter cpt
for(int i=0; i<ptsTab.length; i++){
if(ptsTab[i]>=deb&&ptsTab[i]<fin) cpt++;
} //compte le nombre de points dans l'interval [deb;fin[ en incrémentant cpt
System.out.println("nbrPts entre "+deb+" et "+fin+" : "+cpt);
return cpt;
}
Rapport de projet
- 53 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
/**
* Affiche les caractéristiques de chaques classes
*/
public void afficher(){
Classe c;
for(int i=0; i<classeListe.size(); i++){
c=(Classe) classeListe.get(i); //récupére la classe dans la liste
c.afficher(); //l'affiche
}
}
/**
* Arrondi
* @param nb
* @return la valeur arrondi de nb
*/
public double arrondi(double nb){
int exp=(int) Math.pow(10, 1);
int i=(int)(nb*exp);
return ((double)i/exp);
}
}
Rapport de projet
- 54 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Classe Classe :
/**
* Classe Classe
*/
public class Classe {
private double min, max, haut; //attributs d'une classe
/**
* Constructeur, initialise les attributs
*/
public Classe(double min, double max, double haut){
this.min=min;
this.max=max;
this.haut=haut;
}
/**
* Modifie la largeur de la classe après une division de celle ci
* @param mediane , valeur de la mediane de l'histogramme, et donc là où doit etre
coupé la classe
*/
public Classe editLargeur(double mediane){
double maxBis=max;
max=mediane;
return new Classe(mediane, maxBis, haut);
}
/**
* Modifie la hauteur de la classe
* @param coef , coefficient par lequel doit etre multiplié la hauteur
*/
public void editHauteur(double coef){
haut=coef*haut;
System.out.println("Nouvelle hauteur de " +haut);
}
Rapport de projet
- 55 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
/**
* @return true si la classe se trouve avant la mediane, false sinon
*/
public boolean aGauche(double mediane){
return min<mediane;
}
/**
* Accesseur de la heuteur
* @return haut , la hauteur de la classe
*/
public double haut(){
return haut;
}
/**
* Calcul de l'air de la classe
* @return l'air de la classe
*/
public double aire(){
return ((max-min)*haut);
}
/**
* Accesseur de la borne inférieur
* @return min , le début de l'intervalle de la classe
*/
public double min(){
return(min);
}
/**
* Accesseur de la borne supérieur
* @return max , la fin de l'intervalle de la classe
*/
public double max(){
return max;
}
/**
* Affichage des attributs de la classe
*/
public void afficher(){
System.out.println("Classe allant de "+min+" Ã "+max+" et de hauteur "+haut);
}
}
Rapport de projet
- 56 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
CODE JAVA SECOND ALGORITHME :
Classe Projet :
public class Projet extends java.applet.Applet{
private static final long serialVersionUID = 1L;
public void init(){
Histogramme h=new Histogramme(getParameter("valeurs")); //création de l'objet
de la classe histogramme avec saisie des valeurs de celui ci
h.parcoursDesClasses(); //génération de l'histogramme
h.afficher(); //afficher dans la console l'intervalle et la hauteur de chaques classes
Fenetre Fenetre=new Fenetre(h); //création de la fenêtre
Fenetre.setVisible(true); //rend la fenêtre lisible
}
}
Rapport de projet
- 57 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Classe Histogramme :
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Histogramme {
public double[] ptsTab; //tableau de valeurs
public ArrayList<Classe> classeListe; //liste de classes
/**
* Saisie des valeurs
*/
public Histogramme(String valeurs){
classeListe = new ArrayList<Classe>();
StringTokenizer st = new StringTokenizer(valeurs);
ptsTab=new double[st.countTokens()];
for(int i=1; st.hasMoreTokens(); i++){
ptsTab[i-1]=Double.parseDouble(st.nextToken());
} //enregistre les valeurs dans ptsTab[]
tri(); //tri les valeurs dans l'ordre croissant
}
/**
* Tri des valeurs (par séléction)
*/
public void tri(){
double permut;
for(int i=0;i<ptsTab.length-1;i++){
int min=i;
for(int j=i+1;j<ptsTab.length;j++)
if(ptsTab[min]>ptsTab[j]) min=j;
if(min!=i){
permut=ptsTab[i];
ptsTab[i]=ptsTab[min];
ptsTab[min]=permut;
}
}
}
Rapport de projet
- 58 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
/**
* Création d'une nouvelle classe
* @param c , classe a rajouter dans la liste
* @param i , indice de la position de la classe dans la liste
*/
public void createClasse(Classe c){
classeListe.add(c);
System.out.print("Nouvelle classe : ");
c.afficher();
}
public void parcoursDesClasses(){
double distSuivant, distPrecedent=Integer.MAX_VALUE;
int i=0;
for(; i<ptsTab.length-1; i++){
if(ptsTab[i]!=ptsTab[i+1]){
distSuivant=ptsTab[i+1]-ptsTab[i];
if(distSuivant<distPrecedent)
createClasse(new Classe(ptsTab[i]-(distSuivant/2),
ptsTab[i]+(distSuivant/2), 1, ptsTab.length));
else
createClasse(new Classe(ptsTab[i]-(distPrecedent/2),
ptsTab[i]+(distPrecedent/2), 1, ptsTab.length));
distPrecedent=distSuivant;
} else {
int j = i;
while(ptsTab[j]==ptsTab[i+1])
i++;
distSuivant=ptsTab[i+1]-ptsTab[j];
if(distSuivant<distPrecedent)
createClasse(new Classe(ptsTab[i]-(distSuivant/2),
ptsTab[i]+(distSuivant/2), i-j+1, ptsTab.length));
else
createClasse(new Classe(ptsTab[i]-(distPrecedent/2),
ptsTab[i]+(distPrecedent/2), i-j+1, ptsTab.length));
distPrecedent=distSuivant;
}
}
if(i==ptsTab.length-1)
createClasse(new Classe(ptsTab[ptsTab.length-1]-(distPrecedent/2),
ptsTab[ptsTab.length-1]+(distPrecedent/2), 1, ptsTab.length));
}
Rapport de projet
- 59 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
/**
* Affiche les caractéristiques de chaques classes
*/
public void afficher(){
Classe c;
for(int i=0; i<classeListe.size(); i++){
c=classeListe.get(i); //récupére la classe dans la liste
c.afficher(); //l'affiche
}
}
}
Rapport de projet
- 60 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
Classe Classe :
public class Classe {
private double min, max, haut; //attributs d'une classe
/**
* Constructeur, initialise les attributs
*/
public Classe(double min, double max, double nbPoint, int totPoints){
this.min=min;
this.max=max;
this.haut=(nbPoint/totPoints)/(this.max()-this.min());
}
/**
* Accesseur de la heuteur
* @return haut , la hauteur de la classe
*/
public double haut(){
return haut;
}
/**
* Accesseur de la borne inférieur
* @return min , le début de l'interval de la classe
*/
public double min(){
return(min);
}
/**
* Accesseur de la borne supérieur
* @return max , la fin de l'interval de la classe
*/
public double max(){
return max;
}
/**
* Affichage des attributs de la classe
*/
public void afficher(){
System.out.println("Classe allant de "+min+" Ã "+max+" et de hauteur "+haut);
}
}
Rapport de projet
- 61 -
Générateur d’Histogrammes
Brice ARGENSON
Ludovic BONNET
CODE PHP DE LA PAGE GENERER.PHP :
<form enctype="multipart/form-data" action="" method="post">
<p> Envoyer le fichier :
<input type="hidden" name="MAX_FILE_SIZE" value="350000">
<input type="file"
name="Fichier" >
<input type="submit" value="Envoyer"></p>
</form>
<?php
if (isset( $_FILES["Fichier"]["tmp_name"] ))
{
$fichierUpload="Donnees.txt";
move_uploaded_file($_FILES["Fichier"]["tmp_name"],
$fichierUpload);
}
if (isset($fichierUpload)){
if ($fichierUpload && $fichierUpload != "none") {
$file = fopen($fichierUpload, "r");
$size=filesize($fichierUpload);
$buffer = fgets($file, $size+1);
$buffer = str_replace(',' , ' ', $buffer);
fclose($file);
echo"<p>Génération de l'applet effectuée <br/> Données : <br/ >$buffer</p>
<applet CODE='Projet.class' codebase='Sources' WIDTH='0' HEIGHT='0'><PARAM
NAME='valeurs' VALUE='$buffer'>
</applet>";
}
unlink($fichierUpload);
}
?>
Rapport de projet
- 62 -
Brice ARGENSON
Ludovic BONNET
Générateur d’Histogrammes
RESUME
Ce rapport décrit le travail réalisé pendant notre deuxième année d’études à l’IUT.
Notre projet a consisté à développer un générateur d’histogrammes automatiques sur
Internet compatible avec n’importe quelle plateforme.
En accord avec notre tuteur Mr Berlinet, nous avons développé le projet en Java
avec l’outil de développement Eclipse, ainsi qu’en HTML et PHP pour concevoir le site
Internet. Nous avons été sollicités de réaliser un logiciel efficace, simple d’utilisation et
accessible depuis toutes connexions à Internet.
Après une période d’analyse UML, nous avons développé le projet en processus
itératif incrémental en découpant le projet en petites parties que nous avons programmées
puis fait tester à Mr Berlinet.
Il nous a également été demandé d’utiliser deux algorithmes générateurs
différents et cela nous a montré qu’à un problème pouvait exister plusieurs solutions.
Nous pensons que les principaux objectifs ont été atteints ; cependant de
nombreuses améliorations fonctionnelles ainsi qu’algorithmiques pourront être ajoutées
dans le cadre éventuel d’un autre projet.
MOTS CLES : HISTOGRAMMES - JAVA – UML - SOLUTIONS
SUMMARY
This report describes the work carried out during our second year studies at the
IUT. Our project consisted in developing a histogram generator on the Internet
compatible with any platform.
In agreement with our tutor Mr Berlinet, we developed the project in Java with the
Eclipse application development tool, and also used HTML and PHP to design the
website.
We were required to develop an efficient, easy to use software program, which would be
accessible from anywhere. We were also asked to explain the algorithm that generates the
histograms.
After a period of UML analysis, we developed the project in an incremental
iterative way, by cutting the project in small parts which we programmed then that we
had tested by our tutor.
We were also asked to use two different generating algorithms. This showed us
there could be several solutions to one problem.
We think that the main objectives have been achieved; however many functional
and algorithmic improvements could be added in another project.
KEY WORDS: HISTOGRAMS - JAVA – UML - SOLUTIONS
Rapport de projet
- 63 -