Table des matières

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

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

 
#!/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 ** <m> $2 = $(oo $1) </m>"  
	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 <m> $2 = $(oo $(qmc -g -s $u |sed -n '$p'|cut -d : -f2)) </m>"  
} 
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

 
#!/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 (i<t-1) : val+=int(bl[i][j])*2**(t-(2+i)) 
	lb[j][0]=val 
la=lb[1:] 
def croissant(x, y): 
	return x[0] - y[0] 
la.sort(croissant) 
var=lb[0][1:] 
#for elt in la :	print elt 

# Affichage tableau de Karnaugh 

def tab4(entree,liste): 
	tableau4 = ''' Tableau de Karnaugh 4 variables 
^ %s  ^^       %s     ^^^^ 
^    ^^<m>overline %s circ overline %s</m>^<m>overline %s circ %s</m>^<m>%s circ %s</m>^<m>%s circ overline %s</m>^ 
^  %s  || 00 | 01 | 11 | 10 | 
^<m>overline %s circ overline %s</m>| 00  | %s| %s| %s| %s| 
^<m>overline %s circ %s</m>| 01  | %s| %s| %s| %s| 
^<m>%s circ %s</m>| 11  | %s| %s| %s| %s| 
^<m>%s circ overline %s</m>| 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)