====== Script bash pour qmc , karnaugh et wiki ======
[[.|retour]]
Le paquet qmc présent sous Debian et Ubuntu doit-être installé
Ces scripts sont libres.
Vous pouvez les modifier, exécuter , redistribuer
===== wiki_logique.sh =====
* Copiez dans un éditeur de texte comme gedit ou vim les lignes de #!/bin/bash à done
* Enregistrez le fichier sous wiki_logique.sh
* Le rendre exécutable, dans un terminal taper après le dollar $ chmod u+x wiki_logique.sh
* Ce fichier a besoin des fichier wiki_qmc.sh et karnaugh.py, il faut donc les avoir soit dans le même répertoire ou dans votre PATH
* Utilisation : dans un terminal taper après le $ ./wiki_logique.sh
Il doit vous créer le fichier "logique_td.txt" que vous pourrez lire avec votre éditeur de texte préféré ou
copier le fichier dans une page DokuWiki si l'extension (plugins) math est installé
On peut modifier les équations de A à F après la ligne : #voici les 6 équations à résoudre
On peut aussi modifier le fichier de destination dans la ligne : fichier="logique_td.txt"
#!/bin/bash
#les fonctions pour QMC: - simplification tool (by using the Quine - McClusky process)
# voir le fichier wiki_qmc.sh pour l'explication des equations
source wiki_qmc.sh
#TD1
#voici les 6 équations à résoudre
A="/b/c/d+a/bcd+/bc/d+abc/d+bd"
B="ab+/c/d+/a/bc/d+/abc/d"
C="c(a/d+/ab)+acd(a+/b)"
D="abc+a/bc+ab/cd"
E="(a+bc)+/a(/b+/c)(ad+c)"
F="/a/bc+a/bc+/(a+c)+/bc/d+/(/a+c)"
fichier="logique_td.txt"
: >"$fichier"
for eq in $(echo {A..F}) # eq prend les valeurs de A à F
do # ${!eq} c'est de l'adressage indirect, eq prend la valeur (du contenu de A à F),ici une des équations
ecrire "${!eq}" $eq >>"$fichier" #on aurait pu utiliser eval t=\$$eq
done
===== wiki_qmc.sh =====
* Copiez dans un éditeur de texte comme gedit ou vim les lignes de #!/bin/bash à # le fichier...
* Enregistrez le fichier sous wiki_qmc.sh
* Le rendre exécutable, dans un terminal taper après le dollar $ chmod u+x wiki_qmc.sh
* Placer ce fichier dans $HOME/bin, il se trouvera alors dans votre PATH lire le fichier .bash_profile ou .profile
* Utilisation : dans un terminal taper après le $ wiki_qmc.sh voir la macro "interactive"
#!/bin/bash
# QMC: - simplification tool (by using the Quine - McClusky process)
# Pour simplifier des équations logiques avec qmc
# ce petit script remplace "c(a/d+/ab)+acd(a+/b)" par "c*[a*/d+/a*b]+a*c*d*[a+/b]"
# il le transforme aussi pour Dokuwiki ou OpenOffice
equ()
{
s=$1 # équation à traiter
l=${#s}
for i in $(seq 0 $((l-1)))
do
x=${s:$i:1} # caractère par caractère de l'équation s
y=${s:$((i+1)):1}; #caractère suivant
t=$t$x
if [[ "$x" == [a-z] ]] && ! [[ -z $y ]] && ! [[ "$y" == [+*\)] ]]
# si le caractère traité est une variable (lettre de a à z) et le caratère suivant
# n'est pas le dernier, ni le caractère + ou * ou ) alors on ajoute le caractère *
then
t="${t}*"
fi
done
echo $t
}
oo() # remplace la barre / par overline entouré d'espace, et * par circ
{
equ $1 |sed 's!/! overline !g;s/*/ circ /g'
}
ecrire()
{
echo "===== $2 = $1 ====="
echo "**Équation logique ** $2 = $(oo $1) "
u=$(equ $1 |tr "()" "[]")
echo "commande :qmc -g -s \" $u \""
qmc -g -s $u |sed '/+--/d'|sed '$d'
#res=$(qmc -g -s $u |sed -n '$p'|cut -d : -f2)
echo $res
echo " Résultat de la simplification de $2 = $(oo $(qmc -g -s $u |sed -n '$p'|cut -d : -f2)) "
}
interactive()
{
if [ $# -lt 2 ]
then echo 'erreur, il faut deux arguments, exemple : eq_qmc.sh "abc+a/bc+ab/cd" eq_wiki.txt '
exit 1
else
ecrire $1 "S" >$2
fi
}
[ -n "$PS1" ] && interactive
# le fichier peut être mis dans Dokuwiki si le plugins math est installé
===== karnaugh.py =====
Ce fichier écrit en python nécessite puthon qui est installé par défaut sur Debian et Ubuntu
* Copiez dans un éditeur de texte comme gedit ou vim les lignes de #!/usr/bin/python à if len(var) == 3
* Enregistrez le fichier sous karnaugh.py
* Le rendre exécutable, dans un terminal taper après le dollar $ chmod u+x karnaugh.py
* Utilisation : dans un terminal taper après le $ ./karnaugh.py "équation logique"
* Attention "équation logique" doit respecter la syntaxe de qmc, sinon regarder la [[.|page précédente]]
#!/usr/bin/python
# -*- coding:utf-8 -*-
#karnaugh.py
import commands,os,sys
if len(sys.argv) != 2 : sys.exit(1)
retour=commands.getoutput("qmc -g -s "+sys.argv[1])
#print retour
s=retour.splitlines()
del s[1] # on enlève la ligne '+---+---+---+---+---+'
resultat = s[-1]
del s[-1]
lb=[]
for ligne in s :
l=ligne.split("|")
del l[0]
del l[-1]
lb.append(l)
bl=[]
for i in range(len(lb[0])) : #i nb de colonnes
bl.append([])
for j in range(len(lb)): #j nombres de lignes
#print i,j,lb[j][i]
bl[i].append(lb[j][i])
bl.sort(reverse=True)
lb=[]
for j in range(len(bl[0])): #j nombres de lignes
lb.append([])
t=len(bl)
val=0
lb[j].append('')
for i in range(len(bl)) : #i nb de colonnes
lb[j].append(bl[i][j])
if (j !=0) and (ioverline %s circ overline %s^overline %s circ %s^%s circ %s^%s circ overline %s^
^ %s || 00 | 01 | 11 | 10 |
^overline %s circ overline %s| 00 | %s| %s| %s| %s|
^overline %s circ %s| 01 | %s| %s| %s| %s|
^%s circ %s| 11 | %s| %s| %s| %s|
^%s circ overline %s| 10 | %s| %s| %s| %s|'''%(entree[-1][1],entree[2][1]+entree[3][1],
entree[2][1],entree[3][1],entree[2][1],entree[3][1],entree[2][1],entree[3][1],entree[2][1],entree[3][1],
entree[0][1]+entree[1][1],
entree[0][1],entree[1][1],liste[0][-1],liste[1][-1],liste[3][-1],liste[2][-1],
entree[0][1],entree[1][1],liste[4][-1],liste[5][-1],liste[7][-1],liste[6][-1],
entree[0][1],entree[1][1],liste[12][-1],liste[13][-1],liste[15][-1],liste[14][-1],
entree[0][1],entree[1][1],liste[8][-1],liste[9][-1],liste[11][-1],liste[10][-1])
return tableau4
def tab3(entree,liste):
tableau3 = ''' Tableau de Karnaugh 3 variables
^ %s ^ %s ^^^^
^ %s | 00 | 01 | 11 | 10 |
| 0 | %s| %s| %s| %s|
| 1 | %s| %s| %s| %s|'''%(entree[-1][1],entree[1][1]+entree[2][1],entree[0][1],
liste[0][-1],liste[1][-1],liste[3][-1],liste[2][-1],liste[4][-1],liste[5][-1],liste[7][-1],liste[6][-1])
return tableau3
def tab2(entree,liste):
tableau2 = ''' Tableau de Karnaugh 2 variables
^ %s ^ %s ^^
^ %s | 0 | 1 |
| 0 | %s| %s|
| 1 | %s| %s|'''%(entree[-1][1],entree[1][1],entree[0][1],
liste[0][-1],liste[1][-1],liste[2][-1],liste[3][-1])
return tableau2
if len(var) == 5 : print tab4(var,la)
if len(var) == 4 : print tab3(var,la)
if len(var) == 3 : print tab2(var,la)