2014-01-19 2 views
3

Я пишу программу в Javascript, которая разделяет четные и нечетные числа, помещает их в массив, добавляет сумму чисел и находит среднее значение.Проверка числовых данных Javascript

У меня возникла проблема, позволяющая не считать нулей. Поскольку его добавление к массиву и когда пользователь вводит 6+6, сумма равна 12, среднее значение вычисляется до 4 из-за дополнительного 0 в массиве.

Есть ли все-таки, чтобы не допустить нулей? Вот то, что я до сих пор ..

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

Откуда же нуль? Как выглядит evenarray, когда вы пытаетесь его вычислить?Кроме того, вы должны использовать 'parseInt' вместо' Number', чтобы гарантировать, что значения являются числами, однако вы разрешаете только номера в массиве, поэтому вам даже не нужна эта проверка ... – tkone

+0

Can вы публикуете пример ввода и вывода и воспроизводите проблему здесь http://jsfiddle.net? – elclanrs

+0

Чтобы исключить добавление '0', почему вы не создаете фильтр для' 0' ex. '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

Возвращение выпрыгивало из цикла, так что это, наверное, ужасный подход. Вы можете 'продолжать ', когда' numbers == 0', если это выглядит лучше для вас. Конечный результат точно такой же, и я пытался представить как можно больше новых идей в процессе демонстрации рабочего подхода. –

+0

Ahh, пропустил цикл 'do', вы правы. Dunno, может быть, я буду использовать 'continue', я думаю, или просто, возможно, совсем другой подход. – 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, которые присутствуют в современных браузерах, таких как filter и reduce. Эти методы в некотором роде альтернативы циклам 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} 
Смежные вопросы