0
<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();因为它也会在 Internet Explorer 中出现错误。

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

拜托,有人能告诉我为什么调试器不进入reducetoPrimeImplicants();

我正在使用 Firebug 调试器。

提前致谢。

4

2 回答 2

1

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

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

于 2012-04-27T08:01:44.053 回答
0

For loop有两个起始大括号。

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

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

于 2012-04-27T08:16:13.980 回答