Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   мини калькулятор (https://javascript.ru/forum/jquery/70092-mini-kalkulyator.html)

biben 09.08.2017 15:18

мини калькулятор
 
Добрый день , только начинаю учиться JS подскажите пожалуйста есть мини калькулятор . Когда вводишь данные например от 0 до 2000 цена 1.5 от 2000 до 5000 цена 1.3 от 5000 до 30000 цена 1 и после 30000 цена 0.8 .Подскажите что я делаю не так .Спасибо
<script>$(function() {
        function count() {
            var a = " 2000";
            var b = "5000";
            var c = "30000";
            var sum = +$("#count_inp").val() || 0;
            if (sum <= a) {
                var result = (1.5) * sum;
                $("#result p").html(result + " Рублей")
            if (sum >= b) {
                    var result = (1.3) * sum;
                    $("#result p").html(result + " Рублей")

                }
            if (sum >= c) {
                    var result = (1) * sum;
                    $("#result p").html(result + " Рублей")

                } else $("#result p").html("Укажите расстояние");
            } else $("#result p").html("Укажите расстояние");




        }
        var s = $("#process_all_b");
        s.click(count)
    });
    </script>

<div id="calc_div">

    <div id="quantity_div"><p class="c">
        Сколько километров <br>
        <input type="text" id="count_inp"><br>
    </div>

    <div id="final_div">
        <p class="c"><button id="process_all_b" >Посчитать</button><br></p>
        <div id="result"><p class="c">0 Рублей</p></div>
    </div>
</div>

ksa 09.08.2017 15:23

Цитата:

Сообщение от biben
Подскажите что я делаю не так

Начнем с того, что в твоем алгоритме нет цикла... :(

Nexus 09.08.2017 15:24

biben, а что не работает?
В переменной «a» удали пробел перед значением, да и вообще, если работаешь с числами, то значения лучше бы устанавливать как numeric, а не string.

Nexus 09.08.2017 15:25

Цитата:

Сообщение от ksa (Сообщение 461099)
Начнем с того, что в твоем алгоритме нет цикла... :(

а зачем ему цикл, если он производит подсчет после нажатия на кнопку «Посчитать»?

biben 09.08.2017 15:27

А можете подсказать правильное решение , уже с ночи голову ломаю

ksa 09.08.2017 15:29

Цитата:

Сообщение от Nexus
а зачем ему цикл

Так он же напрашивается! :blink:
Цитата:

Сообщение от biben
от 0 до 2000 цена 1.5 от 2000 до 5000 цена 1.3 от 5000 до 30000 цена 1 и после 30000 цена 0.8

Ты так же не видишь цикла? :blink:

ksa 09.08.2017 15:30

Цитата:

Сообщение от biben
А можете подсказать правильное решение

У нас так не принято... :no:

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

biben 09.08.2017 15:31

Цитата:

Сообщение от ksa (Сообщение 461103)
Так он же напрашивается! :blink:

Ты так же не видишь цикла? :blink:

Когда ввожу число и расчет от 0 до 2000 должно умножаться на 1.5 , а как его циклом вывести?Просто новичек только учусь

biben 09.08.2017 15:31

Ладно спасибо и на этом:)

ksa 09.08.2017 15:32

Цитата:

Сообщение от biben
а как его циклом вывести?

Не число нужно циклом выводить... А вычислять нужный коэффициент. ;)

Nexus 09.08.2017 15:43

Цитата:

Сообщение от ksa
Так он же напрашивается!

Конкретно для этой задачи цикл вовсе не обязателен, я так считаю.

biben, у тебя в коде логическая ошибка связанная с переменной «а», найди её.


Решение твоей задачи с циклом:
// [url]https://jsfiddle.net/sza10bke/[/url] 
$(function(){
	function count(){
		var data={
				2000:1.5,
				5000:1.3,
				30000:1
			},
			sum=+$("#count_inp").val() || 0,
			result=false;
		
		for(var val in data){
			if(data.hasOwnProperty(val) && sum>=val)
				result=data[val]*sum;
		};
		
		$("#result p").html(result===false?'Укажите расстояние':result+' Рублей');
	};
	var s=$("#process_all_b");
	s.click(count);
});

j0hnik 09.08.2017 15:47

<htm>
<head>
</head>
<body>
	<div id="calc_div">

		<div id="quantity_div"><p class="c">
			Сколько километров <br>
			<input type="text" id="count_inp" value="0"><br>
		</div>

		<div id="final_div">
			<p class="c"><button id="process_all_b" >Посчитать</button><br></p>
			<div id="result"><p class="c">Укажите расстояние</p></div>
		</div>
	</div>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
	<script>

		$(function() {
			$("#process_all_b").click(function(){
				var sum = $("#count_inp").val(), k = [1.5, 1.3, 1, 0.8], r = [0, 2000, 5000, 30000],  i = k.length ;
				while(i--) if (sum >= r[i]) {
					sum *= k[i];
					 break;
					}
				$("#result p").html(sum.toFixed(0)+' Рублей');
			});
		});

	</script>
</body>
</html>

ksa 09.08.2017 15:54

Цитата:

Сообщение от Nexus
Конкретно для этой задачи цикл вовсе не обязателен, я так считаю.

Дело твое... :)

ksa 09.08.2017 15:56

Цитата:

Сообщение от j0hnik
k = [1.5, 1.3, 1, 0.8], r = [0, 2000, 5000, 30000];

Массив объектов был бы более гармоничен... ;)

Nexus 09.08.2017 15:57

После кода j0hnik я понял, что у меня в коде в объекте «data» не хватает свойства «0» со значением 2.
А у j0hnik в коде я бы переменную «i» объявил самой последней и значение ей установил бы как «k.length». + условие немного некорректное, у автора сравнение идет «больше или равно», а не строго «больше». Также отсутствует проверка на корректность введенных данных, к примеру если ввести отрицательное число, то...

ksa 09.08.2017 15:58

Цитата:

Сообщение от Nexus
var data={
                2000:1.5,
                5000:1.3,
                30000:1
            }

Это опасная практика. :(
"Изготовитель" не гарантирует "правильность" сортировки ключей в объекте. Для правильного 100%-ного порядка следования нужно использовать массив. ;)

Nexus 09.08.2017 15:59

Цитата:

Сообщение от ksa (Сообщение 461112)
Дело твое... :)

На самом деле это дело автора)

Nexus 09.08.2017 16:01

Цитата:

Сообщение от ksa (Сообщение 461115)
Это опасная практика. :(
"Изготовитель" не гарантирует "правильность" сортировки ключей в объекте. Для правильного 100%-ного порядка следования нужно использовать массив. ;)

Ошибки в любом случае не будет, хоть как расставляй ключи, т.к. цикл не разрывается на первом фейле.

UPD. Затупил, ошибка возможна :)

ksa 09.08.2017 16:02

Цитата:

Сообщение от Nexus
цикл не разрывается на первом фейле

Зачем делать лишние итерации? :blink:

ksa 09.08.2017 16:04

Цитата:

Сообщение от Nexus
На самом деле это дело автора)

Тогда уже его "работодателя"... :D
Т.к. не каждого устроит индусский код

Nexus 09.08.2017 16:07

Цитата:

Сообщение от ksa (Сообщение 461118)
Зачем делать лишние итерации? :blink:

Размер объекта очень вряд ли когда нибудь перевалит хотя бы за сотню, а что такое пробежаться по сотне свойств во временных затратах?

j0hnik 09.08.2017 16:09

Цитата:

Сообщение от Nexus (Сообщение 461114)
к примеру если ввести отрицательное число, то...

То водитель сам приплачивать заказчику должен :D

ksa 09.08.2017 16:12

Цитата:

Сообщение от Nexus
а что такое пробежаться по сотне свойств во временных затратах?

Я не сторонник индусских кодов...

Час назад закончил собеседование со студентом магистратуры, ему объяснял те же постулаты. :(

j0hnik 09.08.2017 16:19

biben,
Оставь телефончик, цена перевозок порадовала =)

Nexus 09.08.2017 16:27

Цитата:

Сообщение от ksa (Сообщение 461123)
Я не сторонник индусских кодов...

Час назад закончил собеседование со студентом магистратуры, ему объяснял те же постулаты. :(

Ок, не спорю, лишние итерации - не хорошо, но вот вопрос:
Нет гарантии того, что данные будут введены отсортированными, т.е. перед тем, как гонять данные в цикле, нужно будет обязательно отсортировать их, а это в любом случае придется пробежаться по всему объекту данных (typeof []=='object'). Т.е. в этом случае нам нужно будет аж 2 раза в цикле работать с массивом данных.
Что более индусский код, два раза гонять в цикле один и тот же объект или сделать это единожды?

$(function(){
	function count(){
		var data={
				0:2,
				2000:1.5,
				5000:1.3,
				30000:1
			},
			sum=+$("#count_inp").val() || 0,
			last_v=-999999,
			result=false;
		
		for(var val in data){
			if(data.hasOwnProperty(val) && sum>=val && last_v<val){
				result=data[val]*sum;
				last_v=val;
			};
		};
		
		$("#result p").html(result===false?'Укажите расстояние':result+' Рублей');
	};
	
	$("#process_all_b").click(count);
});

ksa 10.08.2017 08:32

Цитата:

Сообщение от Nexus
Нет гарантии того, что данные будут введены отсортированными, т.е. перед тем, как гонять данные в цикле, нужно будет обязательно отсортировать их

Хоть сами элементы массива могут располагаться как угодно (как и ключи) но цикл от 0 до N выберет их в нужной нам последовательности.
Так же у массивов есть метод sort() который так же сможет нам помочь...

Но ты волен остаться при своем мнении, т.к. нас не связывают производственные отношения и я тебе не босс. :)

Nexus 10.08.2017 09:27

Цитата:

Сообщение от ksa (Сообщение 461179)
Хоть сами элементы массива могут располагаться как угодно (как и ключи) но цикл от 0 до N выберет их в нужной нам последовательности.
Так же у массивов есть метод sort() который так же сможет нам помочь...

Но ты волен остаться при своем мнении, т.к. нас не связывают производственные отношения и я тебе не босс. :)

Я имел ввиду, что "нужная нам последовательность" может быть некорректной, т.е. не «1,2,3», а «2,1,3».
Про метод «sort» знаю, но если хранить данные в виде объекта (как я и сделал), то этому методу нужно будет передавать функцию, которая будет сортировать элементы массива.
Если в кач-ве контейнеров для данных использовать 2 массива (как это сделал Джоник), то можно использовать «sort» без функции, но теряется связь «ключ-значение».
Метод «sort», я считаю, в любом случае пробежится по всем элементам объекта для того, чтобы его отсортировать.

Я веду с тобой диалог (спор), поскольку считаю, что в моих словах есть смысл.
В споре, как известно, рождается истина.
Если у тебя нет желания продолжать, то жаль конечно, но ничего не поделаешь.

рони 10.08.2017 10:04

:write: вариант предложенный ksa, напомню some остановит цикл на первом правильном результате ...

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script>
$(function() {
    $("#process_all_b").click(function() {
        var d = [{
                value: 30000,
                ratio: .8
            }, {
                value: 5000,
                ratio: 1
            }, {
                value: 2000,
                ratio: 1.3
            }, {
                value: 0,
                ratio: 1.5
            }],
            a = +$("#count_inp").val() || 0,
            b = "Укажите расстояние";
        a && d.some(function(c) {
            return a > c.value && (b = (a * c.ratio).toFixed(2) + " Рублей")
        });
        $("#result p").html(b)
    })
});
    </script>
</head>

<body>


<div id="calc_div">

    <div id="quantity_div"><p class="c">
        Сколько километров </p>
        <input type="text" id="count_inp"><br>
    </div>

    <div id="final_div">
        <p class="c"><button id="process_all_b" >Посчитать</button><br></p>
        <div id="result"><p class="c">0 Рублей</p></div>
    </div>
</div>

</body>
</html>

Nexus 10.08.2017 10:14

Цитата:

Сообщение от Nexus
Я имел ввиду, что "нужная нам последовательность" может быть некорректной, т.е. не «1,2,3», а «2,1,3».

На примере рони, если переменную «d» задать так и ввести в поле 2500, то результат будет неверным:
var d = [{
                value: 30000,
                ratio: 1
            }, {
                value: 5000,
                ratio: 1.3
            }, {
                value: 0,
                ratio: 2
            }, {
                value: 2000,
                ratio: 1.5
            }];

ksa 10.08.2017 10:31

Цитата:

Сообщение от Nexus
Я веду с тобой диалог (спор), поскольку считаю, что в моих словах есть смысл.

Потому и написал, что дело твое как тебе строить алгоритмы... :)
Свои аргументы я высказал.

ksa 10.08.2017 10:37

Цитата:

Сообщение от рони
вариант предложенный ksa

Спасибо за такую хорошую иллюстрацию моей идеи с массивом объектов. :victory:

Nexus 10.08.2017 10:43

Цитата:

Сообщение от ksa (Сообщение 461192)
Потому и написал, что дело твое как тебе строить алгоритмы... :)
Свои аргументы я высказал.

Я понял, спасибо.

ksa 10.08.2017 10:44

Цитата:

Сообщение от Nexus
На примере рони, если переменную «d» задать так и ввести в поле 2500, то результат будет неверным

Дело в том, что суть массива - порядок следования элементов. Т.е. данные, как бы их не ввели, всегда можно упорядочить. Для бекэнда можно даже добавить условие - данные присылать уже упорядочено.
У объекта к ключам такое требование не предъявишь. Т.к. не повлияешь на то как клиентская машина их "разместит".

Отсюда и разница в алгоритмах...

Одно дело если исходные данные уже такие, какие есть и работать приходится только с этим. Тут куда деваться... :(
Но когда сам специально делаешь хранение неудобным и потом "мужественно преодолеваешь препятствия". Это уже не совсем правильное решение задачи. :)

рони 10.08.2017 10:47

Цитата:

Сообщение от Nexus
если переменную «d» задать так

Цитата:

Сообщение от Nexus
Про метод «sort» знаю,

видимо не знаите

Nexus 10.08.2017 10:55

Цитата:

Сообщение от ksa
Одно дело если исходные данные уже такие, какие есть и работать приходится только с этим. Тут куда деваться...
Но когда сам специально делаешь хранение неудобным и потом "мужественно преодолеваешь препятствия". Это уже не совсем правильное решение задачи.

И не поспоришь)

Nexus 10.08.2017 11:04

рони, признаться, не помню проекта, где необходимо было сортировать массив на стороне клиента.
Не могли бы Вы объяснить почему считаете, что я не знаю про метод «sort»?

рони 10.08.2017 11:43

Nexus,
думаю всем сейчас понятно, что массив должен быть от сортирован перед использованием, только это было основной мыслью, моего послания.

laimas 10.08.2017 11:49

Цитата:

Сообщение от рони
массив должен быть от сортирован перед использованием

Ну только не всегда, конечно. )

рони 10.08.2017 11:52

Цитата:

Сообщение от laimas
Ну только не всегда, конечно. )

не понял?

laimas 10.08.2017 11:59

Да просто звучит как аксиома. :) Честное слово, о чем вы тут дебаты ведете даже не вникал, к конкретному случаю, наверное да, нужна.


Часовой пояс GMT +3, время: 08:19.