Conversion base 10 => base n et inversement

Soyez le premier à donner votre avis sur cette source.

Snippet vu 19 667 fois - Téléchargée 26 fois

Contenu du snippet

Un vieux code réalisé en Tp il y a 2 ans que j'ai retrouvé il y a peu.

Il permet de convertir un nombre écrit en base 10 en un nombre écrit dans une base comprise entre 2 et 35, ainsi que l'inverse.

Source / Exemple :


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Conversions {

	//declarations des composants graphiques
	
	private JFrame fenetre;
	private JSlider base;
	private JPanel p1,p2,p3;
	private JTextField jfield1,jfield2;
	private JLabel label3,label2;
	private JTextArea jarea;
	
	private final static String doc = //aide contenue dans le JTextArea
	"\t\tBrève documentation de cette application...   \n"+
	"\nCe petit programme permet de convertir un nombre en base 10 dans une base comprise entre 2 et 36.\n" +
	"Le \"potentiomètre\" permet de selectionner la base.\n" +
	"La modification d'un champ suivie de la validation par la touche ENTREE met à jour l'autre champ.\n" +
	"Lors d'un changement de la base, la valeur en base 10 est convertie.\n\n"+	
	"Les nombres saisis s'écrivent en utilisant les chiffres de 0 à 9,\n"+
	"puis les lettres de A à Z (miniscules ou majuscules).\n";
	
	private final static String[] chiffres = {"0","1","2","3","4","5","6","7","8","9","A",
	"B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W",
	"X","Y","Z"};
	
	
	//Constructeur
	public Conversions() {
		fenetre = new JFrame("Conversions...");
		Container reser = fenetre.getContentPane();
		label2 = new JLabel("En base 10");
		label3 = new JLabel("En base 2");
//--- haut de la fenetre -------------------------------------------------------------------------------
		String s1 = "Changement de base de numération";
		jarea = new JTextArea(doc);
		jarea.setEditable(false);
		JScrollPane jscroll = new JScrollPane(jarea);
		p1 = new JPanel(new BorderLayout());
		p1.add(jscroll,BorderLayout.NORTH);
		p1.setBorder(BorderFactory.createTitledBorder(s1));
		reser.add(p1,BorderLayout.NORTH);
//--- JSlider ----------------------------------------------------------------------------------------------
		p2 = new JPanel(new GridLayout(0,1));
		String s2 = "Sélection de la base";
		base = new JSlider(2,36,2);
//--- listener du slider -----------------------------------------------------------------------------------
		ChangeListener b = new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				label3.setText("En base "+base.getValue());
				label3.setHorizontalAlignment(SwingConstants.CENTER);
				String res = "";
				if (jfield1.getText() == null || jfield1.getText().length() == 0){
				    jfield1.setText(JOptionPane.showInputDialog(fenetre,"Entrez un nombre en base 10","Champ \"Base 10\" vide",JOptionPane.QUESTION_MESSAGE));}//if
				String s = jfield1.getText();
				boolean erreur = false;
				for (int i =0;((i<s.length()) && (!erreur));i++) {
					if (!('0'<=s.charAt(i) && s.charAt(i)<='9')) {
						Toolkit.getDefaultToolkit().beep();
						JOptionPane.showMessageDialog(fenetre,"En base 10, on n'utilise uniquement les chiffres entre 0 et 9","Chiffre non autorisé",JOptionPane.ERROR_MESSAGE);
						erreur =  true;
						}//if
				}//for
				if (!erreur) {
				int b = Integer.parseInt(jfield1.getText());
				int n = base.getValue();
				while (b != 0 ) {
				    res = chiffres[b%n]+res;
				    b = b/n;
				}//while
				}//if
				jfield2.setText(res);
			}
		};
		base.addChangeListener(b);
		base.setMajorTickSpacing(2);
		base.setPaintTicks(true);
		base.setPaintLabels(true);
		p2.add(base);
		p2.setBorder(BorderFactory.createTitledBorder(s2));
		reser.add(p2,BorderLayout.CENTER);
//--- les champs de saisie --------------------------------------------------------------------------------------------
		p3 = new JPanel(new GridLayout(0,2));
		jfield1 = new JTextField("");
		jfield2 = new JTextField("");
		jfield1.setHorizontalAlignment(SwingConstants.CENTER);
		jfield2.setHorizontalAlignment(SwingConstants.CENTER);
		label2.setHorizontalAlignment(SwingConstants.CENTER);
		label3.setHorizontalAlignment(SwingConstants.CENTER);
//--- mise a l'écoute des champs ----------------------------------------------------------------------------------------

//--- champ base 10 -----------------------------------------------------------------------------------------------------
		ActionListener b10 = new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String s = jfield1.getText();
				boolean erreur = false;
				for (int i =0;i<s.length() && !erreur;i++) {
					if (!('0'<=s.charAt(i) && s.charAt(i)<='9')) {
						Toolkit.getDefaultToolkit().beep();
						JOptionPane.showMessageDialog(fenetre,"En base 10, on n'utilise uniquement les chiffres entre 0 et 9","Chiffre non autorisé",JOptionPane.ERROR_MESSAGE);
						erreur =  true;
						}//if
				}//for
				if (!erreur) {
					String res = "";
					int b = Integer.parseInt(jfield1.getText());
					int n = base.getValue();
				   	while (b != 0 ) {
						res = chiffres[b%n]+res;
						b = b/n;
					}//while
					jfield2.setText(res);
					}//if
				}//actionPerformed
			};//class anonyme
		jfield1.addActionListener(b10);

//--- champ de la base n -------------------------------------------------------------------------------------------------
		ActionListener bn = new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			    try{
			    jfield1.setText(""+Integer.parseInt(jfield2.getText(),base.getValue()));
			    }catch (NumberFormatException nfe) {
				JOptionPane.showMessageDialog(fenetre,"En base "+base.getValue()+", on utilise les chiffres entre 0 et "+chiffres[base.getValue()-1],"Chiffre non autorisé",JOptionPane.ERROR_MESSAGE);
			    }//catch
				}//actionPerformed
				};//class anonyme
		jfield2.addActionListener(bn);		

//--------------------------------------------------------------------------------------------------------------------		
		p3.add(label2);
		p3.add(jfield1);
		p3.add(label3);
		p3.add(jfield2);
		reser.add(p3,BorderLayout.SOUTH);
		
	}//Conversions()
	
	//affichage
	public void afficher() {
	fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	fenetre.setSize(650,350);
	fenetre.setResizable(false);
	fenetre.setVisible(true);
	}//afficher
	
	//main
	public static void main (String [] args) {
		Conversions convertisseur = new Conversions();
		convertisseur.afficher();
		}//main
}//class Conversions

Conclusion :


Tout est expliqué dans le JTextArea de l'appli, suffit d'ouvrir la capture^^

C'est pas tres objet dans le sens ou il n'y a qu'une classe seule classe qui gère tout, mais ça date de mes débuts en Java. Ideal pour se faire la main avec le JSlider.

A voir également

Ajouter un commentaire

Commentaires

olkis
Messages postés
19
Date d'inscription
jeudi 27 octobre 2005
Statut
Membre
Dernière intervention
25 janvier 2006
-
programme sympa qui pourrait me servir, l'idée est bonne !
tu aurais pu par contre gérer les exceptions dans des catch..
merci en tout cas !
cs_Theos
Messages postés
26
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
20 décembre 2009
-
Salut,

Ton source est cool mais il y a bien plus simple (et performant) en utilisant la classe Integer...

Exemple :

int a =Integer.parseInt("279871492", 10);
System.out.println("A en base 10 : "+a);
System.out.println("A en base 10 : "+Integer.toString(a, 10));
System.out.println("A en base 36 : "+Integer.toString(a, 36));

int b =Integer.parseInt(Integer.toString(a, 36), 36);
System.out.println("B en base 36 : "+Integer.toString(b, 36));
System.out.println("B en base 10 : "+b);
System.out.println("B en base 10 : "+Integer.toString(b, 10));

for (int i=0;i<36;i++)
{
System.out.println("Chiffre de la base 36 : "+Integer.toString(i,36));
}

produira :

Nombre: 1492 (base=10)
A en base 10 : 279871492
A en base 10 : 279871492
A en base 36 : 4mmm84
B en base 36 : 4mmm84
B en base 10 : 279871492
B en base 10 : 279871492
...

Il y est clair qu'on peut ainsi passer de n'importe quelle base à n'importe quelle autre et pas uniquement de ou vers la base 10 !

A++
Nicolas

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.