2014-01-19 54 views
3

我正在用Javascript編寫一個程序,它將偶數和奇數分開,將它們放入數組中,添加數字的總和並找到平均值。對數字數據的驗證Javascript

我有一個問題,不允許零不算。由於它添加到數組中,並且當用戶輸入6+6時,求和值爲12,由於陣列中存在額外的0,因此平均值計算爲4

反正有沒有讓零計數?以下是我迄今爲止..

var evenarray = []; 
    var oddarray = []; 
    var avgEven = 0; 
    var avgOdd = 0; 
    var isValid; 
    function numberFunction(){ 

     do 
     { 

      var numbers = prompt("Please enter numbers. Enter empty string to exit."); 

      if(numbers % 2 == 0) 
      { 
        evenarray.push(numbers); 
        var sumEven = 0; 
         for (var i=0; i < evenarray.length; i++) 
         { 
          sumEven = sumEven + Number(evenarray[i]); 
         } 
        var avgEven = sumEven/evenarray.length; 
        //alert("even"); 

      } 
      if(numbers % 2 !== 0) 
      { 
        oddarray.push(numbers); 
        var sumOdd = 0; 
         for (var i=0; i < oddarray.length; i++) 
         { 
          sumOdd = sumOdd + Number(oddarray[i]); 
         } 
        var avgOdd = sumOdd/oddarray.length; 
        //alert("odd"); 
      } 

      //if(isNaN(numbers)){ 

       //alert("Only numeric data only"); 
       //} 
     } 

     while(numbers !== ""); 
+1

零從哪裏來?甚至當你試圖計算它時,evenar看起來像什麼?此外,你應該使用'parseInt'而不是'Number'來確保值是數字,但是,你只允許將數字推入數組,所以你甚至不需要檢查... – tkone

+0

Can你發佈一個輸入和輸出的例子,並在這裏重現問題http://jsfiddle.net? – elclanrs

+0

爲了排除'0',爲什麼不爲'0'創建一個過濾器。 'if(numbers%2 == 0 && numbers!== 0)'和'if(numbers%2!== 0 && numbers!== 0)' –

回答

1

就一籌莫展的時候,數量實際上是0

if (numbers == 0) 
{ 
} 
else if(numbers % 2 == 0) 
{ 
    evenarray.push(numbers); 
    var sumEven = 0; 
    for (var i=0; i < evenarray.length; i++) 
    { 
    sumEven = sumEven + Number(evenarray[i]); 
    } 
    var avgEven = sumEven/evenarray.length; 
} 
else // only odds remain 
{ 
    oddarray.push(numbers); 
    var sumOdd = 0; 
    for (var i=0; i < oddarray.length; i++) 
    { 
    sumOdd = sumOdd + Number(oddarray[i]); 
    } 
    var avgOdd = sumOdd/oddarray.length; 
} 
+0

這看起來不是很好的海事組織,如何提前回報? – elclanrs

+0

返回會跳出循環,所以這可能是一個可怕的方法。如果你看起來更好,你可以在數字== 0時繼續。最終的結果是完全一樣的,我試圖在展示工作方法的過程中儘可能少地引入新的想法。 –

+0

啊,錯過了'做'循環,你說得對。不知道,也許我會用'繼續',或者可能採用完全不同的方法。 – elclanrs

0

你可以這樣做:

if(numbers % 2 == 0 && numbers !=0) ... 
if(numbers % 2 != 0 && numbers !=0) ... 

讓你做不在數字== 0時做任何事情;

將您的變量數字而不是數字稱爲有點奇怪。

+0

感謝大家的回覆,我肯定會在我進入時嘗試它。並將我的變量切換爲「數字」,昨天很快就做到了,所以仍然有點草率。 – Atlas182

0

你的功能應該是,

function numberFunction(){ 

    do 
    { 
     var numbers = prompt("Please enter numbers. Enter empty string to exit."); 
     if(numbers !=0 && !isNaN(numbers)) 
      (numbers %2 == 0)? (evenarray.push(parseInt(numbers))) : (oddarray.push(parseInt(numbers))); 
    }while(numbers !== ""); 

    for(var i = 0; i < evenarray.length; i++) 
     sumEven += evenarray[i]; 

    for(var i = 0; i < oddarray.length; i++) 
     sumOdd += oddarray[i]; 

    avgEven = sumEven/evenarray.length; 
    avgOdd = sumOdd/oddarray.length; 

document.getElementById("even").innerHTML = evenarray.toString(); 
document.getElementById("sumEvenTotal").innerHTML = sumEven.toString(); //displays sum of even numbers. 
document.getElementById("averageOdd").innerHTML = avgOdd; //displays average of odd numbers. 
document.getElementById("averageEven").innerHTML = avgEven; //diplays average of even numbers. 
document.getElementById("odd").innerHTML = oddarray.toString(); //displays all odd numbers that were entered. 
document.getElementById("sumOddTotal").innerHTML = sumOdd.toString(); 
} 
0

正如你已經有了你的具體問題的解決方案等的答案,我會建議不同的方法。想想你正在操作的數據:一個數組。嘗試只用數據解決問題,不要用戶輸入,不要使用DOM操作;只是數據。這有助於分離問題,並使代碼更易於理解。

由於我們正在處理數組,因此我們可以使用現代瀏覽器中存在的一些內置JavaScript方法,如filterreduce。這些方法可以替代for循環,具有一些預定義的行爲和回調函數。

現在,我們來考慮解決問題的步驟。

  1. 從用戶處獲取數字。我們可以將這些數據表示爲一個數組,就像您已經在做的那樣。
  2. 我們希望所有的奇數,它們的總和和平均值。
  3. 我們希望所有偶數,它們的總和和平均值。
  4. 我們將數據顯示給用戶。

在這個解決方案中,我假設你已經有了一個數據數組,並將重點放在點2和3.請記住,想想數據,用戶交互不應該與你的數據邏輯混合。不要在每個循環中詢問用戶號碼,而是直接向用戶詢問一個數字列表;您以這種方式避免了多個提示,並且它可以讓您很好地分離數據和交互。理想情況下,您需要驗證所有用戶輸入以符合您的要求。

// Helpers to work with numbers 
var odd = function(x) { 
    return x % 2 === 0; 
}; 

var even = function(x) { 
    return x % 2 !== 0; 
}; 

var add = function(x, y) { 
    return x + y; 
}; 

function solve(ns) { 
    // Solve the problem 
    // with odd or even numbers 
    var result = function(fn) { 
    var xs = ns.filter(fn); // odd or even 
    var sum = xs.reduce(add); 
    return { 
     numbers: xs, 
     sum: sum, 
     average: sum/xs.length 
    }; 
    }; 
    // Return an object 
    // with odd and even results 
    return { 
    odd: result(odd), 
    even: result(even) 
    }; 
} 

var numbers = [1,2,3,4]; // from user input 
var result = solve(numbers); 

console.log(result.odd); 
//^ {numbers: [2,4], sum: 6, average: 3} 

console.log(result.even); 
//^ {numbers: [1,2], sum: 4, average: 2}