Mccluskey algorithm, javascript

Mccluskey algorithm, javascript

本文关键字:javascript algorithm Mccluskey      更新时间:2023-09-26
<html>
<body>
<script type="text/javascript">
start();
function start() {
    var val = "0,1";
    var n = 5;
    var chars = ['a', 'b', 'c', 'd', 'e'];
    gVars = chars.slice(0, n);
    for (var i = 0; i < gVars.length; i++)
    document.write(gVars[i] + "<br />");
    var termsStr = val.split(',');
    for (var i = 0; i < termsStr.length; i++)
    document.write(termsStr[i] + "<br />");
    var gOrigTerms = [];
    var maxterm = Math.pow(2, termsStr.length) - 1;
    document.write("maxterm: " + maxterm + "<br />");
    for (var i = 0; i < termsStr.length; i++) {
        gOrigTerms[i] = parseInt(termsStr[i]);
        document.write(gOrigTerms[i] + "<br />");
        if (gOrigTerms[i] > maxterm) document.write("Invalid term in term list." + "<br />");
    }
    gFormula = new Formula(gVars, gOrigTerms);
    document.write(gFormula);
    gFormula.toString();
    gFormula.reduceToPrimeImplicants(); //here the breakpoint is inserted
}

function Formula(vars, terms)
{
    this.vars = vars;
    this.termList = [];
    for (var i = 0; i < terms.length; i++) {
        this.termList[i] = new Term(Dec2Bin(terms[i], vars.length));
        document.write("this.termList" + this.termList[i] + "<br />");
    }
    this.orginalTermList = [];
    document.write("this.orginalTermList" + this.orginalTermList + "<br />");
}
function Dec2Bin(dec, size) {
    var bits = [];
    for (var bit = 0; bit < size; bit++)
    {
        bits[bit] = 0;
    }
    var i = 0;
    while (dec > 0)
    {
        if (dec % 2 == 0)
        {
            bits[i] = 0;
        } else
        {
            bits[i] = 1;
        }

        i++;
        dec = (dec / 2) | 0;
        // Or with zero casts result to int (who knows why...) 
    }
    bits.reverse();
    return bits;
}

function Term(varVals)
{
    this.varVals = varVals;
    document.write("this.varVals: " + this.varVals);
}
function reduceToPrimeImplicants() //there is some problem with this function
{
    this.originalTermList = this.termList.slice(0);
    var numVars = this.termList[0].getNumVars();
    var table = [];
    for (var dontKnows = 0; dontKnows <= numVars; dontKnows++) {
        table[dontKnows] = [];
        for (var ones = 0; ones <= numVars; ones++) {
            table[dontKnows][ones] = [];
        }
        table[dontKnows][numVars + 1] = [];
    }

    table[numVars + 1] = [];
    table[numVars + 1][numVars + 1] = [];
    for (var i = 0; i < this.termList.length; i++) {
        var dontCares = this.termList[i].countValues(DontCare);
        var ones = this.termList[i].countValues(1);
        var len = table[dontCares][ones].length;
        table[dontCares][ones][len] = this.termList[i];
    }

    for (var dontKnows = 0; dontKnows <= numVars - 1; dontKnows++) {
        for (var ones = 0; ones <= numVars - 1; ones++) {
            var left = table[dontKnows][ones];
            var right = table[dontKnows][ones + 1];
            var out = table[dontKnows + 1][ones];
            for (var leftIdx = 0; leftIdx < left.length; leftIdx++) {
                for (var rightIdx = 0; rightIdx < right.length; rightIdx++) {
                    var combined = left[leftIdx].combine(right[rightIdx]);
                    if (combined != null) {
                        if (out.indexOf(combined) < 0) {
                            var len = out.length;
                            out[len] = combined;
                        }
                        if (this.termList.indexOf(left[leftIdx]) >= 0) {
                            this.termList.splice(this.termList.indexOf(left[leftIdx]), 1);
                        }
                        if (this.termList.indexOf(right[rightIdx]) >= 0) {
                            this.termList.splice(this.termList.indexOf(right[rightIdx]), 1);
                        }
                        if (this.termList.indexOf(combined) < 0) {
                            var len = this.termList.length;
                            this.termList[len] = combined;
                        }
                    }
                }
            }
        }
    }
}
function getNumVars()
{
    return this.varVals.length;
}

function countValues(value)
{
    result = 0;
    for (var i = 0; i < this.varVals.length; i++) {
        if (this.varVals[i] == value) {
            result++;
        }
    }
    return result;
}

function combine(term)
{
    var diffVarNum = -1; // The position where they differ 
    for (var i = 0; i < this.varVals.length; i++) {
        {
            if (this.varVals[i] != term.varVals[i])
            if (diffVarNum == -1) {
                diffVarNum = i;
            } else { // They're different in at least two places return null; } 
            }
        }
        if (diffVarNum == -1)
        {
            // They're identical return null; 
        }
        resultVars = this.varVals.slice(0);
        resultVars[diffVarNum] = DontCare;
        return new Term(resultVars);
    }
</script>
</body>
</html>

在上面的代码中,这并不完整,但它实现了quine Mccluskey算法。调试时出现问题。

如果在gFormula.reducetoPrimeImplicants();插入断点,则调试器不会进入该函数。这是到目前为止在代码中调用的最后一个函数。但是,它确实转到 start() ,这是第一个函数。

reducetoPrimeImplicants();函数存在一些问题,因为它在IE浏览器中也给出了错误。

我无法找出错误。如果我从代码中删除reducetoPrimeImplicants();函数,则工作正常。

拜托,有人可以告诉我为什么调试器不输入reducetoPrimeImplicants();.

我正在使用Firebug调试器。

提前谢谢。

页面combine()中的最后一个函数缺少右大括号。

如果您不介意,建议:请使用 http://jsbeautifier.org/或类似的工具来更好地缩进您的代码。

您的For loop有两个起始大括号。

 for (var i = 0; i < this.varVals.length; i++) {
        {

所以删除一个。这应该可以解决您的问题。