Calculatrice de nombres complexes

Soyez le premier à donner votre avis sur cette source.

Vue 9 533 fois - Téléchargée 1 705 fois

Description

Ce programme est un applet, une calculatrice possedant deux modes: un mode standard comme toutes les autres calculatrices, et un mode complexes (butt même du programme). Elle realise notamment les operations d'addition, de soustraction,et de multiplication de nombres complexes.
Basé sur l'architecture MVC (Modèle-Vue-Controleur), ce programme(code source) est facile à comprendre car j'ai pris le soin de bien le documenter.

Source / Exemple :


// toutes les sources sont dans le zip

package vue;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;

import model.AbstractModel;
import model.Calculator;
import model.Complextor;
import observer.observer;
import controler.AbstractControler;
import controler.CalculetteControler;

/**

  • @author YAMEOGO MIttérrand Wendémi
*
  • /
public class Calculette extends JApplet implements observer{ String[] tab_string = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ".", "=", "C", "+", "-", "*", "/"}; String[] tab_complexe = {"z1<>z2","i", "z1+z2", "z1-z2", "z1*z2"}; JButton[] tab_button = new JButton[tab_string.length]; JButton[] tab_cmp = new JButton[tab_complexe.length]; private JPanel container = new JPanel(); private JPanel panElcomp = new JPanel(); private JPanel operateur = new JPanel(); private JPanel chiffre = new JPanel(); private JPanel panEcran = new JPanel(); private JLabel ecran = new JLabel(); private JLabel afficheur = new JLabel(); private Dimension dim = new Dimension(100, 80); private Dimension dim2 = new Dimension(100, 62); private Dimension dim3 = new Dimension(100, 43); private JMenuBar menuBar = new JMenuBar(); private JMenu men_Fichier = new JMenu("Fichier"); private JRadioButtonMenuItem standard = new JRadioButtonMenuItem("Forme standard"); private JRadioButtonMenuItem complexe = new JRadioButtonMenuItem("Forme complexe"); //Notre instance de notre objet contrôleur private AbstractControler controler; private AbstractModel calc; private Calculette moi; private OperateurListener opl; private boolean i_test=true; /**
  • Méthode invoqué lors du chargement de l'applet dans le navigateur
  • @author YAMEOGO Mitterrand
  • /
public void init (){ this.moi = this; this.calc = new Calculator(); this.controler = new CalculetteControler(calc); this.setSize(480, 490); initComposant(); this.setContentPane(container); this.setVisible(true); this.calc.addObserver(this); } /**
  • Fonction permettant d'initialsier les composants sur le frame
  • @author YAMEOGO Mitterrand
  • /
private void initComposant(){ ButtonGroup bg = new ButtonGroup(); bg.add(standard); bg.add(complexe); standard.setSelected(true); this.men_Fichier.add(standard); this.men_Fichier.add(complexe); //definition de la police des #ts composants Font police = new Font("Arial", Font.BOLD, 25); Font pol = new Font("Monotype Corsiva", Font.BOLD, 25); Font poli = new Font("Arial Black",Font.BOLD,25); //ecran de resultat ecran = new JLabel("0.0"); ecran.setFont(police); ecran.setHorizontalAlignment(JLabel.RIGHT); ecran.setPreferredSize(new Dimension(220, 20)); //ecran d'affichage des opérations (chaine d'operations) afficheur = new JLabel(""); afficheur.setFont(pol); afficheur.setHorizontalAlignment(JLabel.LEFT); afficheur.setPreferredSize(new Dimension(440, 30)); //JPanel operateur = new JPanel(); operateur.setPreferredSize(new Dimension(110, 450)); //JPanel chiffre = new JPanel(); chiffre.setPreferredSize(new Dimension(330, 450)); //chiffre.setBackground(Color.blue); //JPanel panEcran = new JPanel(); panEcran.setPreferredSize(new Dimension(440, 110)); // panEcran.setBackground(Color.YELLOW); panElcomp.setPreferredSize(new Dimension(440, 50)); //panElcomp.setBackground(Color.red); //Nous utiliserons le même listener pour tous les opérateurs OperateurListener opeListener = new OperateurListener(); this.opl=opeListener; for(int i = 0; i < tab_string.length; i++) { tab_button[i] = new JButton(tab_string[i]); tab_button[i].setPreferredSize(dim); tab_button[i].setFont(poli); switch(i){ case 11 : tab_button[i].addActionListener(opl); chiffre.add(tab_button[i]); break; case 12 : tab_button[i].setForeground(Color.red); tab_button[i].addActionListener(new ResetListener()); tab_button[i].setPreferredSize(dim2); operateur.add(tab_button[i]); break; case 13 : case 14 : case 15 : case 16 : tab_button[i].setForeground(Color.red); tab_button[i].addActionListener(opl); tab_button[i].setPreferredSize(dim2); operateur.add(tab_button[i]); break; default : chiffre.add(tab_button[i]); tab_button[i].addActionListener(new ChiffreListener()); break; } } for(int i = 0; i < tab_complexe.length; i++) { tab_cmp[i] = new JButton(tab_complexe[i]); tab_cmp[i].setPreferredSize(dim3); tab_cmp[i].setFont(new Font("Arial",Font.BOLD,30)); tab_cmp[i].setForeground(Color.green); switch(i){ case 0: tab_cmp[i].addActionListener(new changeComplexeListener()); tab_cmp[i].setFont(new Font("Arial",Font.BOLD,20)); tab_cmp[i].setForeground(Color.MAGENTA); break; case 1: tab_cmp[i].addActionListener(new imgListener()); tab_cmp[i].setForeground(Color.BLUE); tab_cmp[i].setPreferredSize(dim); break; default : tab_cmp[i].addActionListener(new ComplexOperateurListener()); tab_cmp[i].setFont(new Font("Arial",Font.BOLD,20)); break; } } operateur.add(tab_cmp[2]); operateur.add(tab_cmp[3]); operateur.add(tab_cmp[4]); operateur.add(tab_cmp[0]); chiffre.add(tab_cmp[1]); for(int i = 0; i < tab_cmp.length; i++) { tab_cmp[i].setVisible(false); } panEcran.add(afficheur); panEcran.add(ecran); panEcran.setBorder(BorderFactory.createLineBorder(Color.black)); panEcran.setBackground(Color.WHITE); //gestion du menu this.menuBar.add(men_Fichier); this.setJMenuBar(menuBar); //ajout des différents panneaux au conteneur qui est le panneau génral container.add(panEcran, BorderLayout.NORTH); container.add(chiffre, BorderLayout.CENTER); container.add(operateur, BorderLayout.EAST); //Nous utiliserons le même listener pour tous les radios buttons du menu RadioListener radlis = new RadioListener(); standard.addActionListener(radlis); complexe.addActionListener(radlis); } //********************************************** // LES LISTENERS POUR NOS BOUTONS //********************************************** class ChiffreListener implements ActionListener{ public void actionPerformed(ActionEvent e) { String str = ((JButton)e.getSource()).getText(); if(!afficheur.getText().equals("")){ str = ecran.getText() + str; afficheur.setText(str); } controler.setNombre(((JButton)e.getSource()).getText()); } } /**
  • Ecouteur pour ecouter les boutons operateurs
  • @author YAMEOGO Mitterrand
  • /
class OperateurListener implements ActionListener{ public void actionPerformed(ActionEvent e) { String str = ((JButton)e.getSource()).getText(); if(!ecran.getText().equals("")){ str = ecran.getText() + str; afficheur.setText(str); } controler.setOperateur(((JButton)e.getSource()).getText()); tab_cmp[1].setEnabled(true); } } /**
  • Ecouteur pour ecouter les boutons pour determiner l'operation à effectuer sur les deux complexes Z1 et Z2
  • @author YAMEOGO Mitterrand
  • /
class ComplexOperateurListener implements ActionListener{ public void actionPerformed(ActionEvent e) { String str = ((JButton)e.getSource()).getText(); if(!ecran.getText().equals("")){ str = ecran.getText() + str; afficheur.setText(str); } controler.setComplexexOperateur(((JButton)e.getSource()).getText().substring(2,3)); tab_cmp[1].setEnabled(false); } } /**
  • Ecouteur pour ecouter le bouton 'i'
  • @author YAMEOGO Mitterrand
  • /
class imgListener implements ActionListener{ public void actionPerformed(ActionEvent e) { controler.setImg(((JButton)e.getSource()).getText()); tab_cmp[1].setEnabled(false); } } /**
  • Ecouteur pour ecouter le bouton pour réinitialiser ltoutes les opérations
  • @author YAMEOGO Mitterrand
  • /
class ResetListener implements ActionListener{ public void actionPerformed(ActionEvent arg0) { controler.reset(); tab_cmp[1].setEnabled(true); } } /**
  • Ecouteur pour ecouter le boutons permettant de basculer entre Z1 et Z2 et de saisir leur valeur
  • @author YAMEOGO Mitterrand
  • /
class changeComplexeListener implements ActionListener{ public void actionPerformed(ActionEvent arg0) { controler.changeComplexe(); tab_cmp[1].setEnabled(true); } } /**
  • Ecouteur pour ecouter si on est en mode 'standard' ou en mode 'scientifique'
  • @author YAMEOGO Mitterrand
  • /
class RadioListener implements ActionListener{ public void actionPerformed(ActionEvent e) { String str = ((JRadioButtonMenuItem)e.getSource()).getText(); if(str.equals("Forme complexe")){ tab_button[16].setVisible(false); tab_button[15].setVisible(false); tab_button[11].setVisible(false); for(int i = 12; i < 16; i++) { tab_button[i].setPreferredSize(dim3); } for(int i = 0; i < tab_cmp.length; i++) { tab_cmp[i].setVisible(true); } calc.removeObserver(); AbstractModel calcc = new Complextor(); calcc.addObserver(moi); controler.setModel(calcc); controler.reset(); } else{ for(int i = 0; i < tab_cmp.length; i++) { tab_cmp[i].setVisible(false); } for(int i = 12; i < 16; i++) { tab_button[i].setPreferredSize(dim2); } tab_button[16].setVisible(true); tab_button[15].setVisible(true); tab_button[11].setVisible(true); calc.removeObserver(); AbstractModel calcs = new Calculator(); calcs.addObserver(moi); controler.setModel(calcs); controler.reset(); } } } /**
  • Fonction permettant au model de mettre à jour la vue
  • la vue etant définit ici comme un observer heritant de l'interface Observer
  • @author YAMEOGO Mitterrand
  • @param resulat represente la nouvelle chaine à afficher dans l'ecran superieur de la calculatice lors de la mise à jour
  • @param historique represente la nouvelle chaine à afficher dans l'ecran superieur de la calculatice lors de la mise à jour
  • /
public void update(String str, String suite) { ecran.setText(str); afficheur.setText(suite); } }

Conclusion :


le fichier html est accessible dans le 'bin'

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
293
Et j'aurais géré le nombre complexe comme un autre type d'opérande et pas comme un opérateur. Ça, c'est un peu moins du détail...

Mais bon, chacun a sa façon de faire.

a+
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
293
En tout cas bravo, ce n'est pas une source si simple à adapter et tu t'en es pas trop mal tiré.

Pour les contrôleurs, j'aurais utilisé un design pattern strategy qui m'aurait évité un if et aurait rendu le code encore plus évolutif, mais c'est du détail.
Julien! ta vu juste, Mon Objectif n'etait pas la caluclette standard, mais celle des nombres complexes, et comme on aime le dire souvent 'On ne réinvente pas la roue', j'ai profité de la simplicté de ton code source! pour étendre les fonctionnalités!
Bien vu!
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
293
Salut,

Tu n'aurais pas utilisé une de mes sources pour faire ce code ?

Si c'est le cas, ça ne me dérange pas, tu as apporté une nouvelle fonctionnalité donc ok.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.