2012-04-27 8 views
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> 

в приведенном выше коде, который реализует алгоритм Куайном McCluskey, но не является полным существует проблема, в то время как это debugged.if точка останова вставляется в gFormula.reducetoPrimeImplicants(); отладчик не входит в эту функцию (это последняя функция, вызываемая в uptil сейчас), но идет в start(), которая является первой функцией. Существует некоторая проблема в reducetoPrimeImplicants(); потому что он также дает ERROR в Internet Explorer. Я не могу понять ошибку. если я удалю reducecetoPrimeImplicants(); функция из кода, оставшаяся работает отлично. , пожалуйста, может кто-нибудь сказать мне, почему отладчик не вводит reducetoPrimeImplicants() ;. Я использую отладчик Firebug.отладка кода яваскрипта

заранее спасибо

+1

Стена кода - не хорошее приветствие. пожалуйста, сводите к минимуму код только для связанных частей. – Joseph

+0

Какая ошибка вернулась IE? какую строку и сообщение? – fcalderan

+0

Вы также можете попробовать запустить это через jslint. Там есть довольно серьезные синтаксические ошибки ... – jordancpaul

ответ

1

Последняя функция в вашей странице combine() отсутствует закрывающая скобка.

Если вы не возражаете, предложение: Пожалуйста, используйте http://jsbeautifier.org/ или какой-нибудь подобный инструмент, чтобы сделать ваш код лучше.

0

Ваш For loop имеет две стартовые брекеты.

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

Так что удалите его. Это должно решить вашу проблему.

+0

Я пробовал все предложения, они не работают. проблема заключается в вызове функции reducetoprimeimplicant или в начале функции, потому что если я удалю весь код из этой функции, кроме первой строки, this.originalTermList = this.termList.slice (0); отладчик до сих пор не вписывается в сокращенно-прерывистый() – user1325120

+0

код. . . . . . . gFormula.reduceToPrimeImplicants(); // здесь точка останова вставлена ​​ . . . . . . . . function reduceToPrimeImplicants() // почему он даже не работает только с одной строкой? { // var j = 10; this.orginalTermList = this.termList.slice (0); } Я пробовал много, но он все еще не работает, даже с одной строкой в ​​коде. Я вызываю функцию неправильно? жаль, что мне пришлось писать так, потому что я не могу ответить на свой собственный пост – user1325120