AFRICAN INSTUTE OF COMPUTER SCIENCES
INSTITUT AFRICAIN D’INFORMATIQUE
PAUL BIYA TECHNOLOGICAL
CENTRE D’EXCELLENCE TECHNOLOGIQUE PAUL
BIYA CENTER OF EXCELLENCY
*********** ***********
BP : 13719 Yaoundé BP : 13719 Yaoundé
Tel : (+237) 622211163 / (+237) 699990249 TEL : (+237) 622211163 / (+237) 699990249
Site web : www.iaicameroun.com Web Site : www.iaicameroun.com
PROJET : POO
CONCEPTION D’UNE APPLICATION JAVA
QUI A PARTIR D’UNE EQUATION LOGIQUE
D’ENTREE GENERE LA TABLE DE VERITE ET
LE TABLEAU DE KARNAUGH
GROUPE IV
SYSTEME ET RESEAUX NIVEAU II
Présenter par :
❖ DONGMO KEGNE WILFRID
❖ FOLEKEU TEDONG JOEL
❖ ONDIGUI ATEBA
SUPERVISEUR : M. ZEH
ANNEE ACCADEMIQUE 2024-2025
CODE SOURCE DES CLASSES IMPLEMENTEES
I. CLASSE LOGICEVALUATOR.JAV
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this
license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.example.logiquenumerique;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
/**
*
* @author LENOVO T410
*/
public class LogicEvaluator {
/**
* Détecte les variables unique dans les équations.
* Exemple: "A AND B OR C" -> [A, B, C]
* @param equation
* @return
*/
public static Set<Character> getVariables(String equation){
Set<Character> variables = new TreeSet<>(); // TreeSet pour garder l'ordre alphabétique
for(char c : equation.toCharArray()){
if(Character.isLetter(c) && Character.isUpperCase(c)){
variables.add(c);
}
}
return variables;
}
public static boolean evaluate(String equation, Map<Character, Boolean>
varAssignments){
//Atttenyion !! pas de précédence d'opérateur ici...
// Ni d'expressions complexes
String tempEquation = equation;
// On remplace les variables par leurs valeurs booléennes (0 ou 1)
for(Map.Entry<Character, Boolean> entry : varAssignments.entrySet()){
tempEquation = tempEquation.replace(String.valueOf(entry.getKey()),
entry.getValue() ? "1" : "0");
}
//Ceci est une simplification des opérateurs (ne gère pas NOT, XOR, parenthèses,
précédences)
tempEquation = tempEquation.replace("AND", "*"); // Convention: 1*1 = 1, 1*0 = 0,
0*1 = 0, 0*0 = 0
tempEquation = tempEquation.replace("OR", "+"); // Convention: 1+1 =1, 1+0 = 1, 0+1
= 1, 0+0 = 0
tempEquation = tempEquation.replace("NOT", "!"); // Exemple: !0 = 1, !1 = 0
tempEquation = tempEquation.replace("XOR", "^"); // Exemple: 1^0 = 1, 0^1 = 1, 1^1 =
0, 0^0 = 0
// Ici nous implémenterons plus tard l'algorithme de shunting-yard pour convertir
// en notation postfixe, puis d'évaluer en notation postfixe.
// Pour l'heure, nous allons simuler un résultat pour une très simple équation.
try{
// Ceci est un placeholder.
// Pour "A AND B"
if(equation.contains("AND") && varAssignments.containsKey('A') &&
varAssignments.containsKey('B')){
return varAssignments.get('A') && varAssignments.get('B');
}
// Pour "A OR B"
if(equation.contains("OR") && varAssignments.containsKey('A') &&
varAssignments.containsKey('B')){
return varAssignments.get('A') && varAssignments.get('B');
}
// Pour "NOT A"
if(equation.contains("NOT") && varAssignments.containsKey('A')){
return varAssignments.get('A');
}
//... Autres opérateurs à ajouter ici
// Si l'équation est juste une variable unique ( "A")
if(varAssignments.size() == 1 && varAssignments.containsKey(equation.charAt(0))){
return varAssignments.get(equation.charAt(0));
}
} catch(Exception e){
System.err.println("Erreur d'évaluation :" + e.getMessage());
}
return false; // Valeur par défaut en cas d'échec d'évaluation
}
/**
* Génère une table de vérité pour une équation donnée.
* Retourne une liste de Maps, ou chaque Map représente une ligne de la table.
* Chaque Map contient les assignations des variableset les valeurs de sortie.
* @param equation
* @return
*/
public static List<Map<Character, Boolean>> generateTruthTable(String equation){
List<Map<Character, Boolean>> truthTable = new ArrayList<>();
Set<Character> variables = getVariables(equation);
List<Character> varList = new ArrayList<>(variables);// Cette ligne converti en liste
pour un accès indexé
int numVars = varList.size();
if(numVars == 0){
//On gère le cas ou il n'y a pas de variables ("TRUE" ou "FALSE" constant)
Map<Character, Boolean> row = new HashMap<>();
row.put('S', evaluate(equation, new HashMap<>()));
truthTable.add(row);
return truthTable;
}
int numRows = (int) Math.pow(2, numVars);
for(int i = 0; i < numRows; i++){
Map<Character, Boolean> currentRow = new HashMap<>();
//On génère les combinaison binaires pour les variables
for(int j = 0; j < numVars; j++){
boolean value = ((i >> (numVars - 1 - j)) & 1) == 1;
currentRow.put(varList.get(j), value);
}
//Evaluons l'équation pour cette combinaison
boolean result = evaluate(equation, currentRow);// utilise la méthode évaluate
currentRow.put('S', result); // 'S' pour "Sortie"
truthTable.add(currentRow);
}
return truthTable;
}
/**
* Formatage de la table de vérité pour l'affichage textuel.
* @param truthTable
* @param variables
* @return
*/
public static String formatTruthTable(List<Map<Character, Boolean>> truthTable,
Set<Character> variables){
StringBuilder sb = new StringBuilder();
List<Character> varList = new ArrayList<>(variables);
//En-tête
for(char var : varList){
sb.append(var).append("\t");
}
sb.append("S\n");// S pour sortie
//Lignes
for (Map<Character, Boolean> row : truthTable){
for(char var : varList){
sb.append(row.get(var) ? "1" : "0").append("\t");
}
sb.append(row.get('S') ? "1" : "0").append("\n");
}
return sb.toString();
}
//--- Partie Tableau de Karnaugh ---
/**
* Nous convertissons une valeur décimale en sa représentation binaire avec un nombre fixe
de bits.
*/
private static String toBinaryString(int value, int numBits){
return String.format("%" + numBits + "S", Integer.toBinaryString(value)).replace(' ', '0');
}
/**
* Nous générons le tableau de Karnaugh à partir de la table de vérité.
* supporte 2, 3 ou 4 variables pour un K-Map simple.
* c'est une implémentation très simplifiée et ne gère pas la minimisation.
* @param truthTable
* @param variables
* @return
*/
public static String generateKarnaughMap(List<Map<Character, Boolean>> truthTable,
Set<Character> variables){
StringBuilder sb = new StringBuilder();
List<Character> varList = new ArrayList<>(variables);
int numVars = varList.size();
if(numVars < 2 || numVars > 4){
return """
Le tableau de Karnaugh n'est support\u00e9 que pour 2, 3 ou 4 variables pour
cette impl\u00e9mentation.
Nombre de variables d\u00e9tect\u00e9es: """ + numVars;
}
//Message des indices de la table de vérité à la valeur de sortie (pour faciliter l'accès)
Map<Integer, Boolean> outputMap = new HashMap<>();
for(int i = 0; i < truthTable.size(); i++){
Map<Character, Boolean> row = truthTable.get(i);
int index = 0;
for (int j = 0; j < numVars; j++){
char var = varList.get(j);
if(row.get(var)){
index |= (1 << (numVars - 1 - j)); // calcul de l'index binaire
}
}
outputMap.put(index, row.get('S'));
}
switch (numVars) {
case 2:
// K-Map 2 variables
sb.append(" B\n");
sb.append("A 0 1\n");
sb.append(" ----------\n");
sb.append("0 | " + (outputMap.get(0) ? "1" : "0") + " " + (outputMap.get(1) ? "1" :
"0") + "\n");
sb.append("1 | " + (outputMap.get(2) ? "1" : "0") + " " + (outputMap.get(3) ? "1" :
"0") + "\n");
break;
case 3:
// K-Map 3 variables
sb.append(" BC\n");
sb.append(" 00 01 11 10\n");
sb.append(" -------------\n");
sb.append("0 | " + (outputMap.get(0) ? "1" : "0") + " " + (outputMap.get(1) ? "1" :
"0") + " " + (outputMap.get(3) ? "1" : "0") + " " + (outputMap.get(2) ? "1" : "0") + "\n");
sb.append("1 | " + (outputMap.get(4) ? "1" : "0") + " " + (outputMap.get(5) ? "1" :
"0") + " " + (outputMap.get(7) ? "1" : "0") + " " + (outputMap.get(6) ? "1" : "0") + "\n");
break;
case 4:
//K-Map 4 variables
sb.append(" CD\n");
sb.append(" 00 01 11 10\n");
sb.append("AB -----------------\\n");
//Les indices du K-Map 4 variables sont dans l'ordre du code Gray
int[][] kMapIndices = {
{0, 1, 3, 2},
{4, 5, 7, 6},
{12, 13, 15, 14},
{9, 9, 11, 10}
}; String[] rowHeaders = {"00", "01", "11", "10"};
for(int i = 0; i < 4; i++){
sb.append(rowHeaders[i]).append(" | ");
for(int j = 0; j < 4; j++){
sb.append(outputMap.get(kMapIndices[i][j]) ? "1" : "0").append(" ");
}
sb.append("\n");
} break;
default:
break;
}
return sb.toString();
}
II. CLASS MAINFRAM.JAVA
package com.example.logiquenumerique;
import javax.swing.JOptionPane;
import java.util.List;
import java.util.Map;
import java.util.Set;
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this
license
* Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this
template
*/
/**
*
* @author LENOVO T410
*/
public class MainFrame extends javax.swing.JFrame {
/**
* Creates new form MainFrame
*/
public MainFrame() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jMenu1 = new javax.swing.JMenu();
jMenu2 = new javax.swing.JMenu();
jMenu3 = new javax.swing.JMenu();
jMenuBar2 = new javax.swing.JMenuBar();
jMenu6 = new javax.swing.JMenu();
jMenu7 = new javax.swing.JMenu();
jLabel1 = new javax.swing.JLabel();
equationTextField = new javax.swing.JTextField();
generateButton = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
jScrollPane1 = new javax.swing.JScrollPane();
truthTableArea = new javax.swing.JTextArea();
jScrollPane4 = new javax.swing.JScrollPane();
jScrollPane3 = new javax.swing.JScrollPane();
karnaughTableArea = new javax.swing.JTextArea();
jToolBar1 = new javax.swing.JToolBar();
clearButton = new javax.swing.JButton();
jMenu1.setText("jMenu1");
jMenu2.setText("jMenu2");
jMenu3.setText("jMenu3");
jMenu6.setText("File");
jMenuBar2.add(jMenu6);
jMenu7.setText("Edit");
jMenuBar2.add(jMenu7);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setBackground(new java.awt.Color(255, 255, 255));
jLabel1.setFont(new java.awt.Font("Times New Roman", 1, 14)); // NOI18N
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
jLabel1.setText("Veuillez entrer une équation logique");
equationTextField.setFont(new java.awt.Font("Monospaced", 0, 14)); // NOI18N
equationTextField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
equationTextFieldActionPerformed(evt);
}
});
generateButton.setBackground(new java.awt.Color(165, 18, 45));
generateButton.setFont(new java.awt.Font("Times New Roman", 1, 14)); // NOI18N
generateButton.setForeground(new java.awt.Color(255, 255, 255));
generateButton.setText("Générer les tables");
generateButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
generateButtonActionPerformed(evt);
}
});
truthTableArea.setEditable(false);
truthTableArea.setColumns(20);
truthTableArea.setFont(new java.awt.Font("Monospaced", 0, 14)); // NOI18N
truthTableArea.setRows(5);
truthTableArea.setText("\n");
jScrollPane1.setViewportView(truthTableArea);
jScrollPane2.setViewportView(jScrollPane1);
karnaughTableArea.setEditable(false);
karnaughTableArea.setColumns(20);
karnaughTableArea.setFont(new java.awt.Font("Monospaced", 0, 14)); // NOI18N
karnaughTableArea.setRows(5);
karnaughTableArea.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1,
1));
jScrollPane3.setViewportView(karnaughTableArea);
jScrollPane4.setViewportView(jScrollPane3);
jToolBar1.setBackground(new java.awt.Color(165, 18, 45));
jToolBar1.setForeground(new java.awt.Color(255, 255, 255));
jToolBar1.setToolTipText("APPGENERATOR");
clearButton.setBackground(new java.awt.Color(165, 18, 45));
clearButton.setFont(new java.awt.Font("Times New Roman", 1, 14)); // NOI18N
clearButton.setForeground(new java.awt.Color(255, 255, 255));
clearButton.setText("Effacer");
clearButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
clearButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 300,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(129, 129, 129)
.addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 300,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(103, 103, 103))
.addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(80, 80, 80)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(equationTextField,
javax.swing.GroupLayout.PREFERRED_SIZE, 213,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGap(314, 314, 314)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(generateButton,
javax.swing.GroupLayout.PREFERRED_SIZE, 154,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(clearButton,
javax.swing.GroupLayout.PREFERRED_SIZE, 154,
javax.swing.GroupLayout.PREFERRED_SIZE))))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 40,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 41,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(equationTextField,
javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(generateButton, javax.swing.GroupLayout.PREFERRED_SIZE,
38, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE,
207, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE,
207, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(clearButton, javax.swing.GroupLayout.PREFERRED_SIZE, 38,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(175, Short.MAX_VALUE))
);
jLabel1.getAccessibleContext().setAccessibleDescription("");
generateButton.getAccessibleContext().setAccessibleName("generateButton");
pack();
}// </editor-fold>
private void equationTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
private void generateButtonActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String equation = equationTextField.getText().trim().toUpperCase();// Récupère l'équation
nétoyer et la met en majuscule
if(equation.isEmpty()){
JOptionPane.showMessageDialog(this, "Veuillez entrer une équation logique.",
"Erreur", JOptionPane.ERROR_MESSAGE);
return;
}
try{
//1. Détecter les variables
Set<Character> variables = LogicEvaluator.getVariables(equation);
if(variables.isEmpty()){
JOptionPane.showMessageDialog(this, "Aucune variable (A-Z) détectéé dans
l'équation. veuillez utiliser des variables en majuscule.", "Erreur",
JOptionPane.ERROR_MESSAGE);
return;
}
//2. Générer la table de vérité
List<Map<Character, Boolean>> truthTable =
LogicEvaluator.generateTruthTable(equation);
//3. Afficher la table de vérité
String formattedTruthTable = LogicEvaluator.formatTruthTable(truthTable, variables);
truthTableArea.setText(formattedTruthTable);
//4. Générer et afficher le tableau de Karnaugh
String karnaughMap = LogicEvaluator.generateKarnaughMap(truthTable, variables);
karnaughTableArea.setText(karnaughMap);
}catch(Exception e){
JOptionPane.showMessageDialog(this, "Erreur lors de l'évaluation de l'équation : " +
e.getMessage() +
"\nAssurez-vous que l'équation est valide et respecte le format attendu (A AND B
OR NOT C).",
"Erreur d'équation", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();//Pour le débogage... ça imprime la stack trace dans la console
}
}
private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
// vider le champ de l'équation
equationTextField.setText("");
//vider la zone de text de la table de vérité
truthTableArea.setText("");
//vider la zone de texte du tableau de Karnaugh
karnaughTableArea.setText("");
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see
http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.S
EVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.S
EVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.S
EVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.S
EVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton clearButton;
private javax.swing.JTextField equationTextField;
private javax.swing.JButton generateButton;
private javax.swing.JLabel jLabel1;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenu jMenu3;
private javax.swing.JMenu jMenu6;
private javax.swing.JMenu jMenu7;
private javax.swing.JMenuBar jMenuBar2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JToolBar jToolBar1;
private javax.swing.JTextArea karnaughTableArea;
private javax.swing.JTextArea truthTableArea;
// End of variables declaration
}