====== 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)