Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 07.11.2017
Сообщений: 121

Неправильный результат в математическом выражении

04.11.2018, 18:02. Показов 974. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программка должна находить среднее арифметическое введенных в четыре инпута числа и в консоли выдавать результат. Но получается какая-то ерунда (не тот результат, какой должен быть). Подскажите, в чем проблема?
JavaScript
1
2
3
4
5
6
7
8
9
function fun(){
    a = +document.getElementById('one').value;
    b = +document.getElementById('two').value;
    c = +document.getElementById('tree').value;
    d = +document.getElementById('four').value;
    
    result = a+b+c+d/4;
    console.log(result);
}
И еще: как можно сделать так, чтобы складывались только значения инпутов, в которые введены числа, а затем сумма этих чисел делилась на количество этих инпутов. Сейчас все делится на 4, потому как не предусмотрена возможность пропуска числа, т.е. чисел обязательно 4, а значит и делиться должно на 4. Как проделать это с 1,2,3 числами?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.11.2018, 18:02
Ответы с готовыми решениями:

Неправильный результат выполнения скрипта
скрипт должен выводить наименьшее из двух чисел. но в строку результата выводит вместо наименьшего числа-object HTMLInputElement]. ...

Заменить слова в математическом выражении
Заменить в заданном математическом предложении все вхождения sin на cos и sqrt на abs.

Баланс скобок в математическом выражении
В математическом выражении встречаются скобки трех типов: круглые, квадратные и фигурные Дана строка, задающая математическое выражение....

11
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
04.11.2018, 21:36
Limongrass, надеюсь, что кнопочка, коя инициирует вычисление среднего арифметического после окончания заполнения какого-то нужного количества текстовых полей, у вас в HTML-коде имеется
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<meta charset="windows-1251">
<script>
function ArMean (f)
{
var el = f.elements;
var num = 0;
var sum = 0;
for (var j = 0; j < el.length - 1; j++)
if (el [j].value != '' && !isNaN (el[j].value)) num++, sum += +el [j].value;
alert (sum / num);
}
</script>
<form>
<p>Заполните нужное вам количество текстовых полей
<p><input>
<p><input>
<p><input>
<p><input>
<p><input type="button" value="Вычислить среднее арифметическое" onclick="ArMean (this.form)">
</form>
тег <form> использован исключительно для сокращения записи в коде
вполне можно поместить инпуты в любой другой контейнер типа <div> и обращаться к ним через коллекцию document.querySelectorAll ('div input[type="text"]'), что, как видите, немного длиннее, чем форма.elements
0
 Аватар для koders
259 / 193 / 50
Регистрация: 15.07.2016
Сообщений: 649
05.11.2018, 00:05
Забываем программирование, вспоминаем математику начальной школы:
x1 = 1
x2 = 2
x3 = 3
x4 = 4
x = x1 + x2 + x3 + x4 / 4
Вопрос: чему равен x?
Цитата Сообщение от Limongrass Посмотреть сообщение
как можно сделать так, чтобы складывались только значения инпутов, в которые введены числа, а затем сумма этих чисел делилась на количество этих инпутов
Добавить условия. Копать в сторону if … else
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
05.11.2018, 03:53
Цитата Сообщение от koders Посмотреть сообщение
Забываем программирование, вспоминаем математику начальной школы:
имхо, вы не поняли сути проблемы ТС: приведённое плюсиком к числу пустое значение незаполненного инпута добавляет к сумме ноль, что принципиально изменяет значение среднего арифметического
Цитата Сообщение от koders Посмотреть сообщение
Добавить условия. Копать в сторону if … else
ваше предложение чересчур усложнит код
решение уже есть -- рабочий код я выложил в своём предыдущем сообщении, кое вы явно не просматривали... и заключается оно в отказе от назначения идентификаторов инпутам
0
 Аватар для koders
259 / 193 / 50
Регистрация: 15.07.2016
Сообщений: 649
05.11.2018, 10:12
Цитата Сообщение от kalabuni Посмотреть сообщение
приведённое плюсиком к числу пустое значение незаполненного инпута добавляет к сумме ноль
А если всё же взять, и проверить?
JavaScript
1
2
3
4
5
a = document.getElementById('one').value;
alert(typeof a); // string
 
a = +document.getElementById('one').value;
alert(typeof a); // nubmer
Цитата Сообщение от kalabuni Посмотреть сообщение
что принципиально изменяет значение среднего арифметического
Принципиально значение среднего арифметического изменяет неумение его вычислять. В частности, базовые приоритеты арифметических операций, которые должны быть знакомы с начальной школы.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
05.11.2018, 12:04
Цитата Сообщение от koders Посмотреть сообщение
А если всё же взять, и проверить?
так возьмите и проверьте
JavaScript
1
2
var s = '';
alert (+s); // покажет 0
0
 Аватар для koders
259 / 193 / 50
Регистрация: 15.07.2016
Сообщений: 649
05.11.2018, 12:18
Задание гласит:
Цитата Сообщение от Limongrass Посмотреть сообщение
среднее арифметическое введенных в четыре инпута числа
Но зачем читать, если можно самому придумать задание и сделать, правда?

Если не видите разницу между «суммой трёх чисел и четвёртой частью последнего числа» и «средне-арифметическим четырёх чисел» — это не мои проблемы.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
05.11.2018, 13:43
koders, мухи отдельно, котлеты отдельно: у ТС есть ошибка и есть проблема:

ошибка заключается в том, что ТС понятия не имеет о приоритете операторов в js, формула вычисления среднего арифметического должна быть прописана так: (a + b + c + d) / 4

а проблема состоит в том, что ТС не знает, как организовать расчёт среднего арифметического только для заполненных полей

моё решение и ошибку устраняет, и проблему решает
вы же, упёрлись только в ошибку, хотя я вам с самого начала толкую исключительно о проблеме

и проблему эту не я придумал, её озвучил ТС, цитирую:
Цитата Сообщение от Limongrass Посмотреть сообщение
как можно сделать так, чтобы складывались только значения инпутов, в которые введены числа, а затем сумма этих чисел делилась на количество этих инпутов. Сейчас все делится на 4, потому как не предусмотрена возможность пропуска числа, т.е. чисел обязательно 4, а значит и делиться должно на 4.Как проделать это с 1,2,3 числами?
прочитайте написанное им последнее предложение так: "Как проделать это с одним, двумя, тремя заполненными инпутами?"

итожу: по контексту я догадался о том, что имел в виду ТС, а вы -- не смогли, стали вычислять среднее арифметическое первых четырёх натуральных чисел... и в этом ваша проблема

PS. и, кстати, ваша отсылка к начальной школе неуместна: в арифметике нет понятия приоритета операторов, оно есть только в программировании
0
0 / 0 / 0
Регистрация: 07.11.2017
Сообщений: 121
07.11.2018, 11:48  [ТС]
kalabuni, ваш код помог, спасибо! Но есть по нему несколько вопросов)

1)
HTML5
1
<input type="button" value="Вычислить среднее арифметическое" onclick="ArMean(this.form)">
this здесь - это document, то есть если убрать .form, то тоже должно работать? Но не работает. Почему?

2)Вы у функции ArMean (f) указали параметр f. Я про параметры, что указываются в скобках, читала в нескольких источниках, но, видимо, не очень тщательно - не могу понять что это за f, и почему его обязательно определять как параметр. И, может, у вас есть ссылка на хороший источник по этой теме?

3)
JavaScript
1
if (el [j].value != '' && !isNaN (el[j].value)){ num++, sum += +el [j].value};
Этот if просматривает каждый инпут по очереди, применяясь к нему? 4 раза?

4)
JavaScript
1
for (var j = 0; j < el.length - 1; j++)
разъясните, пожалуйста, значение этой строчки подробно, особенно j < el.length - 1;

Добавлено через 19 минут
В предыдущем сообщении не пометила строчки кода, читается плохо, прошу прощения. А в
JavaScript
1
result = a+b+c+d/4;
скобки были, я их под конец зачем-то убрала, не получался нужный результат, поэтому извращалась как могла
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
07.11.2018, 16:45
Limongrass,
1. прописанное в атрибуте тега this -- это всегда ссылка на сам тег (а по умолчанию this -- это не document, а window, это разные объекты, не стоит их путать, второй относится к браузеру, а первый -- к вашей странице, в этот браузер загруженной)
у всякого элемента формы (инпуты разных типов, текстареа, селекты) имеется свойство form, которое является ссылкой на форму, в которой этот элемент формы находится
таким образом, записанное в атрибуте ArMean(this.form) -- это вызов функции ArMean () с передачей ей в качестве параметра ссылки на форму, внутри которой и находятся обрабатываемые объекты

2. то, что находится внутри скобок при определении функции, называется аргументами
ещё раз, для запоминания (чтобы безо всяких книжек): при вызове функции передаём ей параметры, а в теле функции обрабатываем аргументы, которые при вызове функции получают значения переданных параметров
в данном коде аргумент f при вызове функции получает значение в виде объекта формы

3. коллекция elements формы включает в себя все элементы формы, имеющиеся между тегами <form> и </form>
в нашей форме элементов всего пять, включая последний <input type="button">
значение его value ("Вычислить среднее арифметическое") при расчёте нам не нужно, циклом for () {} мы просматриваем четыре первых элемента формы, поэтому число итераций цикла ограничиваем значением el.length - 1
условный оператор if (el [j].value != '' && !isNaN (el[j].value)) проверяет значение каждого просматриваемого инпута на заполненность именно числом, т.е. если, к примеру, пользователь ошибётся и вместо цифры 4 впишет букву ч, то такой инпут не будет учтён при расчёте
в принципе, эта проверка сама отсекла бы последний элемент формы (инпут-кнопку), если бы мы в операторе цикла не уменьшили число итераций на единицу, но это было бы некрасиво и неправильно с точки зрения программной логики

Цитата Сообщение от Limongrass Посмотреть сообщение
скобки были, я их под конец зачем-то убрала, не получался нужный результат, поэтому извращалась как могла
так и потянуло на казарменный юмор [типа "заменить скобки на колготки"]
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
07.11.2018, 17:41
Кнопку можно отделить от полей ввода отдельным тегом <button>
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!doctype html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <form name="form1" onsubmit="return false;">
        <input type="number" /> <br />
        <input type="number" /> <br />
        <input type="number" /> <br />
        <input type="number" /> <br />
        <button>Вычислить среднее арифметическое</button>
    </form>
    <script>
        document.forms[0].lastElementChild.onclick = average;
 
        function average() {
            let inputs = document.forms[0].getElementsByTagName("input"),
                count = 0,
                result = 0;
 
            for (let i = 0; i < inputs.length; ++i) {
                let number = parseFloat(inputs[i].value);
                if (Number.isFinite(number)) {
                    ++count;
                    result += number;
                }
            }
            if (count) {
                result /= count;
                console.log(result);
            }
        }
    </script>
</body>
</html>
1
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
07.11.2018, 18:01
amr-now, вы невнимательны... выложив код, я сделал примечание:
Цитата Сообщение от kalabuni Посмотреть сообщение
тег <form> использован исключительно для сокращения записи в коде
вполне можно поместить инпуты в любой другой контейнер типа <div> и обращаться к ним через коллекцию document.querySelectorAll ('div input[type="text"]')
полагаете ваше решение более "крутым"?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2018, 18:01
Помогаю со студенческими работами здесь

Позиции скобок в математическом выражении
Дана строка с математическим выражением, необходимо посчитать количество строк, а также записать по парно позиции открытых и закрытых...

Как записать альфа в математическом выражении
Задача 1. Написать программу, которая вычисляет значение выражения, и определить ее значение для введенного пользователем значений...

Заменить в математическом выражении переменную на заданное число
VS2010 c# Forms - на форме в textbox1 записывается ручками формула (2*x-8) и кнопка выполнить. Каким образом написать код , что бы в...

Пример возможных структур программы на элементарном математическом выражении
Есть острая необходимость листинга программы с комментарими, решающей просто математическое выражение типа: (2+2)*3+6/4-7+.... ровно такой...

Проверить,одинакого ли в математическом выражении число открывающих и закрывающих скобок
Проверить,одинакого ли в математическом выражении число открывающихся и закрывающихся скобок.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru